From 2d60f997a206108d9096db5cca9a309983e43203 Mon Sep 17 00:00:00 2001 From: svenbarth Date: Sat, 29 Dec 2018 19:20:54 +0000 Subject: + provide IValueData's ExtractRawData(NoCopy)() in TValue (and also implement it for non-heap types) git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@40693 3ad0048d-3df7-0310-abae-a5850022a9f2 --- packages/rtl-objpas/src/inc/rtti.pp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'packages/rtl-objpas') diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp index a325eed278..96f05e585b 100644 --- a/packages/rtl-objpas/src/inc/rtti.pp +++ b/packages/rtl-objpas/src/inc/rtti.pp @@ -125,6 +125,8 @@ type function IsType(ATypeInfo: PTypeInfo): boolean; inline; function TryAsOrdinal(out AResult: int64): boolean; function GetReferenceToRawData: Pointer; + procedure ExtractRawData(ABuffer: Pointer); + procedure ExtractRawDataNoCopy(ABuffer: Pointer); class operator := (const AValue: String): TValue; inline; class operator := (AValue: LongInt): TValue; inline; class operator := (AValue: Single): TValue; inline; @@ -2303,6 +2305,22 @@ begin end; end; +procedure TValue.ExtractRawData(ABuffer: Pointer); +begin + if Assigned(FData.FValueData) then + FData.FValueData.ExtractRawData(ABuffer) + else if Assigned(FData.FTypeInfo) then + Move((@FData.FAsPointer)^, ABuffer^, DataSize); +end; + +procedure TValue.ExtractRawDataNoCopy(ABuffer: Pointer); +begin + if Assigned(FData.FValueData) then + FData.FValueData.ExtractRawDataNoCopy(ABuffer) + else if Assigned(FData.FTypeInfo) then + Move((@FData.FAsPointer)^, ABuffer^, DataSize); +end; + class operator TValue.:=(const AValue: String): TValue; begin Make(@AValue, System.TypeInfo(AValue), Result); -- cgit v1.2.1