diff --git a/Source/RuntimeBuilder.Fasm.pas b/Source/RuntimeBuilder.Fasm.pas index 9246295..8a0edfd 100644 --- a/Source/RuntimeBuilder.Fasm.pas +++ b/Source/RuntimeBuilder.Fasm.pas @@ -68,9 +68,9 @@ type procedure AddConst(NameSpace:string;Name:string;Val:TValue);override; procedure DelConst(NameSpace:string;Name:string);override; - {procedure AddVariable(NameSpace:string;Name:string;var Data);override; + procedure AddVariable(NameSpace:string;Name:string;var Data);override; procedure ExportVariable(NameSpace:string;Name:string;var Data);override; - procedure DelVariable(NameSpace:string;Name:string);override;} + procedure DelVariable(NameSpace:string;Name:string);override; procedure &Register(NameSpace:string;Name:string;&Type:TRTBType);override; procedure UnRegister(NameSpace:string;Name:string);override; @@ -277,6 +277,27 @@ if consts.Count<>0 then end; end; +procedure TRTBFasmCompiler.TRTBFasmSource.AddVariable(NameSpace:string;Name:string;var Data); +begin +if NameSpace<>'' then + consts.Add(TPair.Create(NameSpace+'.'+Name,addr(Data))) +else + consts.Add(TPair.Create(Name,addr(Data))); +end; + +procedure TRTBFasmCompiler.TRTBFasmSource.ExportVariable(NameSpace:string;Name:string;var Data); +begin +if NameSpace<>'' then + consts.Add(TPair.Create(NameSpace+'.'+Name,Addr(Data))) +else + consts.Add(TPair.Create(Name,Addr(Data))); +end; + +procedure TRTBFasmCompiler.TRTBFasmSource.DelVariable(NameSpace:string;Name:string); +begin +DelConst(NameSpace,Name); +end; + procedure TRTBFasmCompiler.TRTBFasmSource.&Register(NameSpace:string;Name:string;&Type:TRTBType); begin if NameSpace<>'' then @@ -319,6 +340,103 @@ with funcs do end; function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule; + procedure VarParse(key:string;value:TValue;var PreDecl:string;var base:NativeUInt); + var + i:NativeUInt; + p0:PByte; + begin + if Value.IsType or Value.IsType or Value.IsType then + begin + PreDecl:=PreDecl+Key+' db '+#39+Value.AsType+#39+',0'+sLineBreak; + inc(base,length(Value.AsType)); + end + else if Value.IsType then + begin + PreDecl:=PreDecl+Key+' db '+#39+Value.AsType+#39+',0'+sLineBreak; + inc(base,length(Value.AsType)); + end + else if Value.IsType then + begin + PreDecl:=PreDecl+Key+' db '; + p0:=Pointer(PWideChar(Value.AsType)); + for i:={$IFDEF NEXTGEN}0{$ELSE}1{$ENDIF} to length(Value.AsType){$IFDEF NEXTGEN}-1{$ENDIF} do + begin + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + end; + PreDecl:=PreDecl+'0,0'+sLineBreak; + inc(base,length(Value.AsType)*2); + end + else if Value.IsType then + begin + PreDecl:=PreDecl+Key+' db '; + p0:=Pointer(PWideChar(Value.AsType)); + for i:={$IFDEF NEXTGEN}0{$ELSE}1{$ENDIF} to length(Value.AsType){$IFDEF NEXTGEN}-1{$ENDIF} do + begin + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + PreDecl:=PreDecl+inttostr(p0^)+','; + inc(p0); + end; + PreDecl:=PreDecl+'0,0,0,0'+sLineBreak; + inc(base,length(Value.AsType)*4); + end + else if Value.IsOrdinal then + 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 + else if Value.Kind=tkFloat then + begin + if Value.IsType then + PreDecl:=PreDecl+Key+' dd '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+' dq '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+{$IF 8=SizeOf(Extended)}' dq '{$ELSEIF 10=SizeOf(Extended)}' dt '{$ELSE}' ddq '{$IFEND}+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+' dq '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+' df '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+' dq '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else if Value.IsType then + PreDecl:=PreDecl+Key+' dq '+FloatToStrF(Value.AsType,ffFixed,1000,1000)+sLineBreak + else + PreDecl:=PreDecl+Key+' dd 0.0'+sLineBreak; + end + else if Value.Kind=tkPointer then + PreDecl:=PreDecl+Key+' equ '+NativeUInt(Value.AsType).ToString+sLineBreak + else if Value.IsArray then + begin + if Value.GetArrayLength=0 then + begin + PreDecl:=PreDecl+Key+' equ 0'+sLineBreak; + end + else + begin + PreDecl:=PreDecl+Key+':'+sLineBreak; + for i:=0 to Value.GetArrayLength-1 do + VarParse(key+'.i'+i.ToString,Value.GetArrayElement(i),PreDecl,Base); + end; + end + {else if Value.Kind=tkRecord then + begin + PreDecl:=PreDecl+Key+':'+sLineBreak; + for i:=1 to Value.TypeData.ManagedFldCount do + + end} + else //if Value.Kind=tkUnknown then + PreDecl:=PreDecl+Key+': times '+ Value.DataSize.ToString+' db 0'+sLineBreak; + end; procedure ConstParse(key:string;value:TValue;var PreDecl:string;var base:NativeUInt); var i:NativeUInt; @@ -399,12 +517,10 @@ function TRTBFasmCompiler.TRTBFasmSource.Compilate:TRTBModule; begin PreDecl:=PreDecl+Key+':'+sLineBreak; for i:=0 to Value.GetArrayLength-1 do - ConstParse(key+'.i'+i.ToString,Value.GetArrayElement(i),PreDecl,Base); + VarParse(key+'.i'+i.ToString,Value.GetArrayElement(i),PreDecl,Base); end; end - else if Value.Kind=tkRecord then - - else if Value.Kind=tkUnknown then + else //if Value.Kind=tkUnknown then PreDecl:=PreDecl+Key+' equ 0'+sLineBreak; end; var diff --git a/Tests/Unit1.pas b/Tests/Unit1.pas index 1af532a..bb0873e 100644 --- a/Tests/Unit1.pas +++ b/Tests/Unit1.pas @@ -36,15 +36,11 @@ Module:=Src.Compilate; Func1:=Module.Funtion['main']; Func2:=Module.Funtion['varmain']; if 454<>Func1.Call(TypeInfo(integer),[454],CRTBCallTypeStdCall).AsInteger then -begin raise Exception.Create('Error in test1'); -end; Var1:=Module.&Var['Pmain']; Var1.Val:=424; if Var1.Val.AsInteger<>Func2.Call(TypeInfo(integer),[],CRTBCallTypeStdCall).AsInteger then -begin raise Exception.Create('Error in test1'); -end; FreeAndNil(Func1); FreeAndNil(Src); FreeAndNil(Fasm);