RTTI.Invoke string treatment depends on {$H} setting
Summary
With {$H+}, string passed to RTTI.Invoke is accessed correctly. Otherwise, it's like trying to treat a shortstring as an ansistring.
System Information
- Operating system: Linux
- Processor architecture: x86_64
- Compiler version: bb182470
- Device: Laptop
Steps to reproduce
Compile and run the following code:
{$ H+}
uses
rtti,
typinfo,
{$ifndef win64}
ffi.manager;
{$endif}
procedure p(s: String);
begin
WriteLn(s);
end;
var
a: TValueArray;
begin
a := ['hello'];
Invoke(@p,a,ccReg,nil,false,false);
end.
The output will be garbage like: ello�?@�?� @�?���
Change the {$ H+} into {$H+} and it will output: hello
Example Project
What is the current bug behavior?
Seems like a shortstring is treated as an ansistring
What is the expected (correct) behavior?
With or without {$H+}, it should output: hello
Relevant logs and/or screenshots
Possible fixes
I think this is due to missing operator := definition for shortstring in TValue record, but somehow the compiler managed to think that the shortstring can be treated like an ansistring.
Declaring:
operator := (const AValue: ShortString) Result: TValue; inline;
begin
TValue.Make(@AValue, System.TypeInfo(AValue), Result);
end;
in above program is sufficient to solve the problem. A proper implementation has been done in the linked merge request, tested and proven to be working.
Edited by Mario Ray Mahardhika