Complex RTTI Parsers Update
This commit is contained in:
@@ -371,10 +371,12 @@ end;
|
||||
end;
|
||||
|
||||
function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule;
|
||||
procedure VarParse(key:string;value:TValue;var PreDecl:string;var base:NativeUInt);
|
||||
procedure VarParse(key:string;Value:TValue;var PreDecl:string;var base:NativeUInt);
|
||||
var
|
||||
i:NativeUInt;
|
||||
p0:PByte;
|
||||
rfield:TRttiField;
|
||||
rmetod:TRttiMethod;
|
||||
begin
|
||||
if Value.IsType<AnsiString> or Value.IsType<RawByteString> or Value.IsType<UTF8String> then
|
||||
begin
|
||||
@@ -419,12 +421,15 @@ function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule;
|
||||
inc(base,length(Value.AsType<UCS4String>)*4);
|
||||
end
|
||||
else if Value.IsOrdinal then
|
||||
begin
|
||||
case Value.DataSize of
|
||||
1:PreDecl:=PreDecl+Key+' db '+Value.AsOrdinal.ToString+sLineBreak;
|
||||
2:PreDecl:=PreDecl+Key+' dw '+Value.AsOrdinal.ToString+sLineBreak;
|
||||
4:PreDecl:=PreDecl+Key+' dd '+Value.AsOrdinal.ToString+sLineBreak;
|
||||
8:PreDecl:=PreDecl+Key+' dq '+Value.AsOrdinal.ToString+sLineBreak;
|
||||
end
|
||||
end;
|
||||
inc(base,Value.DataSize);
|
||||
end
|
||||
else if Value.Kind=tkFloat then
|
||||
begin
|
||||
if Value.IsType<Single> then
|
||||
@@ -445,7 +450,14 @@ function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule;
|
||||
PreDecl:=PreDecl+Key+' dd 0.0'+sLineBreak;
|
||||
end
|
||||
else if Value.Kind=tkPointer then
|
||||
PreDecl:=PreDecl+Key+' equ '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak
|
||||
begin
|
||||
case SizeOf(pointer) of
|
||||
2:PreDecl:=PreDecl+Key+' dw '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
4:PreDecl:=PreDecl+Key+' dd '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
8:PreDecl:=PreDecl+Key+' dq '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
end;
|
||||
inc(base,SizeOf(pointer));
|
||||
end
|
||||
else if Value.IsArray then
|
||||
begin
|
||||
if Value.GetArrayLength=0 then
|
||||
@@ -459,12 +471,22 @@ function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule;
|
||||
VarParse(key+'.i'+i.ToString,Value.GetArrayElement(i),PreDecl,Base);
|
||||
end;
|
||||
end
|
||||
{else if Value.Kind=tkRecord then
|
||||
else if Value.Kind=tkRecord or Value.IsClass then
|
||||
begin
|
||||
PreDecl:=PreDecl+Key+':'+sLineBreak;
|
||||
for i:=1 to Value.TypeData.ManagedFldCount do
|
||||
|
||||
end}
|
||||
for rfield in TRTTIContext.Create.GetType(Value.TypeInfo).GetFields do
|
||||
VarParse(key+'.'+rfield.Name,rfield.GetValue(@Value),PreDecl,base);
|
||||
for rmetod in TRTTIContext.Create.GetType(Value.TypeInfo).GetMethods do
|
||||
begin
|
||||
PreDecl:=PreDecl+key+'.'+rmetod.Name+' dd '+NativeUInt(rmetod.CodeAddress).ToString;
|
||||
case SizeOf(pointer) of
|
||||
2:PreDecl:=PreDecl+Key+' dw '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
4:PreDecl:=PreDecl+Key+' dd '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
8:PreDecl:=PreDecl+Key+' dq '+NativeUInt(Value.AsType<Pointer>).ToString+sLineBreak;
|
||||
end;
|
||||
inc(base,SizeOf(pointer));
|
||||
end;
|
||||
end
|
||||
else //if Value.Kind=tkUnknown then
|
||||
PreDecl:=PreDecl+Key+': times '+ Value.DataSize.ToString+' db 0'+sLineBreak;
|
||||
end;
|
||||
@@ -551,8 +573,8 @@ function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule;
|
||||
VarParse(key+'.i'+i.ToString,Value.GetArrayElement(i),PreDecl,Base);
|
||||
end;
|
||||
end
|
||||
else //if Value.Kind=tkUnknown then
|
||||
PreDecl:=PreDecl+Key+' equ 0'+sLineBreak;
|
||||
else
|
||||
VarParse(key,Value,PreDecl,Base);
|
||||
end;
|
||||
var
|
||||
pointerDecl,PreDecl:string;
|
||||
|
||||
Reference in New Issue
Block a user