diff options
author | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-13 21:08:41 +0000 |
---|---|---|
committer | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-13 21:08:41 +0000 |
commit | a16d49557e264ae59c8f28d005bcc55add1744e7 (patch) | |
tree | 68062116d62d6b176fce898b83cdcb930a552912 | |
parent | 7f0efac84af534fdae92548a02931706c20daec9 (diff) | |
download | fpc-a16d49557e264ae59c8f28d005bcc55add1744e7.tar.gz |
* correctly handle both Ansi- and WideChar in TValue
+ added tests
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@42220 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | packages/rtl-objpas/src/inc/rtti.pp | 5 | ||||
-rw-r--r-- | packages/rtl-objpas/tests/tests.rtti.pas | 40 |
2 files changed, 44 insertions, 1 deletions
diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp index 3ac3084105..f0b72d0ec9 100644 --- a/packages/rtl-objpas/src/inc/rtti.pp +++ b/packages/rtl-objpas/src/inc/rtti.pp @@ -1371,6 +1371,9 @@ begin raise Exception.CreateFmt(SErrUnableToGetValueForType,[ATypeInfo^.Name]); end; end; + tkChar, + tkWChar, + tkUChar, tkEnumeration, tkInteger : begin case GetTypeData(ATypeInfo)^.OrdType of @@ -1548,7 +1551,7 @@ end; function TValue.IsOrdinal: boolean; begin - result := (Kind in [tkInteger, tkInt64, tkQWord, tkBool, tkEnumeration]) or + result := (Kind in [tkInteger, tkInt64, tkQWord, tkBool, tkEnumeration, tkChar, tkWChar, tkUChar]) or ((Kind in [tkClass, tkClassRef, tkInterfaceRaw, tkUnknown]) and not Assigned(FData.FAsPointer)); end; diff --git a/packages/rtl-objpas/tests/tests.rtti.pas b/packages/rtl-objpas/tests/tests.rtti.pas index 5c67f90073..b95c26a8ff 100644 --- a/packages/rtl-objpas/tests/tests.rtti.pas +++ b/packages/rtl-objpas/tests/tests.rtti.pas @@ -61,6 +61,8 @@ type procedure TestMakeCurrency; procedure TestMakeComp; procedure TestMakeEnum; + procedure TestMakeAnsiChar; + procedure TestMakeWideChar; procedure TestDataSize; procedure TestDataSizeEmpty; @@ -685,6 +687,44 @@ begin Check(TTestEnum(v.AsOrdinal) = te1); end; +procedure TTestCase1.TestMakeAnsiChar; +var + c: AnsiChar; + v: TValue; +begin + c := #20; + + TValue.Make(@c, TypeInfo(c), v); + Check(not v.IsClass); + Check(not v.IsArray); + Check(not v.IsEmpty); + Check(not v.IsOpenArray); + Check(not v.IsObject); + Check(v.IsOrdinal); + + Check(v.GetReferenceToRawData <> @c); + Check(AnsiChar(v.AsOrdinal) = #20); +end; + +procedure TTestCase1.TestMakeWideChar; +var + c: WideChar; + v: TValue; +begin + c := #$1234; + + TValue.Make(@c, TypeInfo(c), v); + Check(not v.IsClass); + Check(not v.IsArray); + Check(not v.IsEmpty); + Check(not v.IsOpenArray); + Check(not v.IsObject); + Check(v.IsOrdinal); + + Check(v.GetReferenceToRawData <> @c); + Check(WideChar(v.AsOrdinal) = #$1234); +end; + procedure TTestCase1.TestGetIsReadable; var c: TRttiContext; |