summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-06-13 21:08:41 +0000
committersvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-06-13 21:08:41 +0000
commita16d49557e264ae59c8f28d005bcc55add1744e7 (patch)
tree68062116d62d6b176fce898b83cdcb930a552912
parent7f0efac84af534fdae92548a02931706c20daec9 (diff)
downloadfpc-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.pp5
-rw-r--r--packages/rtl-objpas/tests/tests.rtti.pas40
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;