summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/rtl-objpas/src/inc/rtti.pp18
1 files changed, 18 insertions, 0 deletions
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);