delphi - Reading TValue from TRttiProperty fails (Property Type: set of Byte) -
i defined type set of byte, interface , class implements interface. interface has property of type ttestsetofbyte + getter , setter. nothing special @ all.
type ttestsetofbyte = set of byte; itestinterface = interface ['{bcf0cec2-f999-4e8a-a732-416f343c1629}'] function getpropsetofbyte: ttestsetofbyte; procedure setpropsetofbyte(const value: ttestsetofbyte); property propsetofbyte: ttestsetofbyte read getpropsetofbyte write setpropsetofbyte; end; ttestclass3 = class(tinterfacedobject, itestinterface) private fsetofbyte: ttestsetofbyte; function getpropsetofbyte: ttestsetofbyte; procedure setpropsetofbyte(const value: ttestsetofbyte); public constructor create; property propsetofbyte: ttestsetofbyte read getpropsetofbyte write setpropsetofbyte; end;
the problem when try read value of propsetofbyte property delphi throws eaccessviolation , not understand why. properties of other types(int, string) work fine.
here test code:
procedure ttestutlrtticomparer.deleteme; var i: integer; instance1: itestinterface; object1: tobject; rtticontext: trtticontext; rttiprop: trttiproperty; rttivalue1: tvalue; type1: trttitype; begin instance1 := ttestclass3.create; check(instance1.propsetofbyte = [1,4], 'making sure getter works!'); instance1.propsetofbyte := [3,4]; check(instance1.propsetofbyte = [3,4], 'making sure setter works!'); object1 := (instance1 tobject); check(assigned(object1)); rtticontext := trtticontext.create; try type1 := rtticontext.gettype(object1.classinfo); // properties pruefen := 0 high(type1.getproperties) begin rttiprop := type1.getproperties[i]; if rttiprop.name = 'propsetofbyte' begin rttivalue1 := rttiprop.getvalue(object1); // check fails eacessviolation!!! end; end; rtticontext.free; end; end;
i using xe-2.
thank you!
it crashes when trttitype.getvalue()
(more specifically, invoke()
function in system.rtti
unit) tries call ttestclass3.getpropsetofbyte()
. correct self
pointer being passed in, result
parameter nil, crash occurs when getpropsetofbyte()
tries assign fsetofbyte
result
.
in short, call stack not being setup correctly rtti system set
-based properties. have reproduced crash in xe2, xe6, , xe7, , have filed bug report embarcadero:
trttiproperty.getvalue() crash on set-based property https://quality.embarcadero.com/browse/rsp-10206
Comments
Post a Comment