summaryrefslogtreecommitdiff
path: root/packages/rtl-objpas
diff options
context:
space:
mode:
authorsvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2018-12-29 19:20:54 +0000
committersvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2018-12-29 19:20:54 +0000
commit2d60f997a206108d9096db5cca9a309983e43203 (patch)
treee882111ac0d044970d131a8ec59d2c153a617c7f /packages/rtl-objpas
parent99b07ba896c0f22c2a008ede25a772603c4ba10c (diff)
downloadfpc-2d60f997a206108d9096db5cca9a309983e43203.tar.gz
+ 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
Diffstat (limited to 'packages/rtl-objpas')
-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);