diff options
author | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2018-12-29 19:20:54 +0000 |
---|---|---|
committer | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2018-12-29 19:20:54 +0000 |
commit | 2d60f997a206108d9096db5cca9a309983e43203 (patch) | |
tree | e882111ac0d044970d131a8ec59d2c153a617c7f /packages/rtl-objpas | |
parent | 99b07ba896c0f22c2a008ede25a772603c4ba10c (diff) | |
download | fpc-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.pp | 18 |
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); |