From 08d77618370ae9f992673de726557ac29416de5a Mon Sep 17 00:00:00 2001 From: Artem3213212 Date: Sun, 1 Apr 2018 01:23:44 +0300 Subject: [PATCH] API Remake --- .gitmodules | 3 + FasmOnDelphi | 1 - Source/RuntimeBuilder.Fasm.pas | 43 +++++---- Source/RuntimeBuilder.Lua.pas | 166 +++++++++++++++++++++++++++++++++ Source/RuntimeBuilder.pas | 61 +++++++++--- Tests/Project2.dpr | 13 ++- Tests/Project2.dproj | 19 +++- Tests/Unit1.pas | 8 +- lib/FasmOnDelphi | 1 + lib/pLua-XE | 1 + 10 files changed, 269 insertions(+), 47 deletions(-) delete mode 160000 FasmOnDelphi create mode 100644 Source/RuntimeBuilder.Lua.pas create mode 160000 lib/FasmOnDelphi create mode 160000 lib/pLua-XE diff --git a/.gitmodules b/.gitmodules index 71784c8..02c7b92 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "FasmOnDelphi"] path = FasmOnDelphi url = git@git.teamfnd.ru:artem3213212/FasmOnDelphi.git +[submodule "lib/pLua-XE"] + path = lib/pLua-XE + url = https://github.com/felipedaragon/pLua-XE.git diff --git a/FasmOnDelphi b/FasmOnDelphi deleted file mode 160000 index 62a5d17..0000000 --- a/FasmOnDelphi +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 62a5d170bac13dee90ab1c59ed06f92bef27bb46 diff --git a/Source/RuntimeBuilder.Fasm.pas b/Source/RuntimeBuilder.Fasm.pas index 8c1e9a1..2608a67 100644 --- a/Source/RuntimeBuilder.Fasm.pas +++ b/Source/RuntimeBuilder.Fasm.pas @@ -2,6 +2,8 @@ unit RuntimeBuilder.Fasm; interface +//{$INLINE auto} + uses System.Classes,System.TypInfo,System.IOUtils,System.Rtti,Winapi.Windows, RuntimeBuilder,FasmOnDelphi; @@ -35,23 +37,23 @@ type constructor Create(Name:string); destructor Destroy;override; end; + protected + libs:TStringList; + function GetIncLibs():string; protected FText:string; function GetText:string;override; procedure SetText(S:string);override; public + function LoadLib(Name:string):TRTBLib;override; constructor Create(Compiler:TRTBFasmCompiler); function CompilateAsFunc:TRTBFunc;override; function CompilateAsLib:TRTBLib;override; end; - protected - function GetIncLibs():string; public CompilerMem:NativeUInt; MaxSteps:word; - libs:TStringList; constructor Create(FasmPath:String=FasmPath;AsDll:boolean=false); - function LoadLib(Name:string):TRTBLib; function GenNewSrc():TRTBSource;override; end; @@ -68,9 +70,6 @@ FreeMem(p); end; function TRTBFasmCompiler.TRTBFasmSource.TRTBFasmFunc.Call(OutType:PTypeInfo;args:TArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue; -{$IFDEF CPUX64} - //function() -{$ENDIF} begin {$IFDEF CPUX64} Result:=Invoke(p,args,ccReg,OutType); @@ -127,10 +126,25 @@ begin FText:=S; end; +function TRTBFasmCompiler.TRTBFasmSource.GetIncLibs():string; +var + i:integer; +begin +Result:=''; +for i:=0 to libs.count-1 do + Result:=Result+sLineBreak+'include '+#39+libs.Strings[i]+#39; +end; + constructor TRTBFasmCompiler.TRTBFasmSource.Create(Compiler:TRTBFasmCompiler); begin inherited Create(Compiler); FText:=''; +libs:=TStringList.Create; +end; + +function TRTBFasmCompiler.TRTBFasmSource.LoadLib(Name:string):TRTBLib; +begin +libs.Add(Name); end; function TRTBFasmCompiler.TRTBFasmSource.CompilateAsFunc:TRTBFunc; @@ -162,21 +176,6 @@ begin CompilerMem:=1024*1024*16; MaxSteps:=65535; OpenFASM(FasmPath,AsDll); -libs:=TStringList.Create; -end; - -function TRTBFasmCompiler.LoadLib(Name:string):TRTBLib; -begin -libs.Add(Name); -end; - -function TRTBFasmCompiler.GetIncLibs():string; -var - i:integer; -begin -Result:=''; -for i:=0 to libs.count-1 do - Result:=Result+sLineBreak+'include '+#39+libs.Strings[i]+#39; end; function TRTBFasmCompiler.GenNewSrc():TRTBSource; diff --git a/Source/RuntimeBuilder.Lua.pas b/Source/RuntimeBuilder.Lua.pas new file mode 100644 index 0000000..4920cc4 --- /dev/null +++ b/Source/RuntimeBuilder.Lua.pas @@ -0,0 +1,166 @@ +unit RuntimeBuilder.Lua; + +interface + +uses + System.Classes,System.TypInfo,System.IOUtils,System.Rtti,Winapi.Windows, + pLuaObject,pLuaRecord,pLuaTable,uWordList,Lua,LuaObject,LuaWrapper,pLua,RuntimeBuilder; + +type + TRTBLuaCompiler=class(TRTBCompiler) + protected type + TRTBLuaSource=class(TRTBSource) + protected type + {TRTBLuaFunc=class(TRTBFunc) + protected + p:Pointer; + sb:NativeUInt; + public + constructor Create(p:Pointer;sb:NativeUInt); + function Call(OutType:PTypeInfo;args:TArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue;override; + destructor Destroy;override; + end; + TRTBLuaLib=class(TRTBLib) + private type + TRTBLuaLibFunc=class(TRTBLuaFunc) + public + constructor Create(p:Pointer); + destructor Destroy;override; + end; + private + filename:string; + Lib:NativeUInt; + function GetFuntion(Name:string):TRTBFunc;override; + public + constructor Create(Name:string); + destructor Destroy;override; + end;} + protected + FText:string; + function GetText:string;override; + procedure SetText(S:string);override; + public + constructor Create(Compiler:TRTBLuaCompiler); + function CompilateAsFunc:TRTBFunc;override; + //function CompilateAsLib:TRTBLib;override; + end; + protected + Lua:Plua_state; + //function GetIncLibs():string; + public + libs:TStringList; + constructor Create(); + //function LoadLib(Name:string):TRTBLib; + function GenNewSrc():TRTBSource;override; + end; + +implementation + +uses System.SysUtils; + +{constructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaFunc.Create(p:Pointer;sb:NativeUInt); +begin +Self.p:=VirtualAlloc(nil,sb,MEM_COMMIT ,PAGE_EXECUTE_READWRITE); +CopyMemory(Self.p,p,sb); +Self.sb:=sb; +FreeMem(p); +end; + +function TRTBLuaCompiler.TRTBLuaSource.TRTBLuaFunc.Call(OutType:PTypeInfo;args:TArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue; +begin +end; + +destructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaFunc.Destroy; +begin +VirtualFree(p,sb,MEM_RELEASE); +p:=nil; +end; + +constructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaLib.TRTBLuaLibFunc.Create(p:Pointer); +begin +Self.p:=p; +end; + +destructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaLib.TRTBLuaLibFunc.Destroy; +begin +p:=nil; +end; + +function TRTBLuaCompiler.TRTBLuaSource.TRTBLuaLib.GetFuntion(Name:string):TRTBFunc; +begin +Result:=TRTBLuaLibFunc.Create(GetProcAddress(Lib,pwidechar(Name))); +end; + +constructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaLib.Create(Name:string); +begin +filename:=Name; +Lib:=LoadLibrary(pwidechar(Name)); +end; + +destructor TRTBLuaCompiler.TRTBLuaSource.TRTBLuaLib.Destroy; +begin +FreeLibrary(Lib); +end;} + +function TRTBLuaCompiler.TRTBLuaSource.GetText:string; +begin +Result:=FText; +end; + +procedure TRTBLuaCompiler.TRTBLuaSource.SetText(S:string); +begin +FText:=S; +end; + +constructor TRTBLuaCompiler.TRTBLuaSource.Create(Compiler:TRTBLuaCompiler); +begin +inherited Create(Compiler); +FText:=''; +end; + +function TRTBLuaCompiler.TRTBLuaSource.CompilateAsFunc:TRTBFunc; +begin +//lua_(lua_tocfunction()); +//(Compiler as TRTBLuaCompiler).Lua.RegisterFunction(); +end; + +(*function TRTBLuaCompiler.TRTBLuaSource.CompilateAsLib:TRTBLib; +var + templib:string; + Res:TLuaResult; +begin +templib:=TPath.GetTempFileName; +Res:=LuaAssembleToFile({$IFDEF CPUX64}'format PE64 DLL'{$ELSE}'format PE DLL'{$ENDIF}+ + (Compiler as TRTBLuaCompiler).GetIncLibs+sLineBreak+Text,templib, + (Compiler as TRTBLuaCompiler).CompilerMem,(Compiler as TRTBLuaCompiler).MaxSteps); +if Res.Error<>Lua_OK then + raise Exception.Create(Res.OutStr); +Result:=TRTBLuaLib.Create(templib); +end;*) + +{function TRTBLuaCompiler.GetIncLibs():string; +var + i:integer; +begin +Result:=''; +for i:=0 to libs.count-1 do + Result:=Result+sLineBreak+'include '+#39+libs.Strings[i]+#39; +end;} + +constructor TRTBLuaCompiler.Create(); +begin +Lua:=luaL_newstate; +libs:=TStringList.Create; +end; + +{function TRTBLuaCompiler.LoadLib(Name:string):TRTBLib; +begin +libs.Add(Name); +end;} + +function TRTBLuaCompiler.GenNewSrc():TRTBSource; +begin +Result:=TRTBLuaSource.Create(Self); +end; + +end. diff --git a/Source/RuntimeBuilder.pas b/Source/RuntimeBuilder.pas index ac4ea5e..df3ddfc 100644 --- a/Source/RuntimeBuilder.pas +++ b/Source/RuntimeBuilder.pas @@ -2,26 +2,38 @@ unit RuntimeBuilder; interface -uses System.TypInfo,System.Rtti; +uses + System.TypInfo,System.Rtti; const - CRTBCallTypeNil=$0; - CRTBCallTypeRegister=$1; - CRTBCallTypeStdCall=$2; - CRTBCallTypeCdecl=$3; - CRTBCallTypePascal=$4; - CRTBCallTypeSafeCall=$5; - CRTBCallType64Call=$40; - CRTBCallTypeDefault=$80; + CRTBCallTypeNil=ccReg; + CRTBCallTypeRegister=ccReg; + CRTBCallTypeStdCall=ccStdCall; + CRTBCallTypeCdecl=ccCdecl; + CRTBCallTypePascal=ccPascal; + CRTBCallTypeSafeCall=ccSafeCall; + CRTBCallType64Call=CRTBCallTypeNil; + CRTBCallTypeScript=CRTBCallTypeNil; + CRTBCallTypeDefault=CRTBCallTypeNil; type TRTBCompiler=class; - TRTBCallType=CRTBCallTypeNil..CRTBCallTypeDefault; + TRTBCallType=TCallConv; + + TRTBType=PTypeInfo; TRTBFunc=class abstract public - function Call(OutType:PTypeInfo;args:TArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue;virtual;abstract; + function Call(Name:string;OutType:PTypeInfo;args:TArray;CallType:TRTBCallType=CRTBCallTypeDefault):TValue;virtual;abstract; + end; + + TRTBVar=class abstract + protected + function SetVal(TValue);virtual;abstract; + function GetVal:TValue;virtual;abstract; + public + property Val:TValue read GetVal write SetVal; end; TRTBLib=class abstract @@ -29,6 +41,7 @@ type function GetFuntion(Name:string):TRTBFunc;virtual;abstract; public property Funtion[Name:string]:TRTBFunc read GetFuntion; + property &Var[Name:string]:TRTBVar read GetFuntion; end; TRTBSource=class abstract @@ -38,8 +51,29 @@ type procedure SetText(S:string);virtual;abstract; public constructor Create(Compiler:TRTBCompiler); - function CompilateAsFunc:TRTBFunc;virtual;abstract; - function CompilateAsLib:TRTBLib;virtual;abstract; + + procedure LoadLib(Name:string);virtual;abstract; + procedure UnLoadLib(Name:string);virtual;abstract; + + procedure AddNameSpace(Name:string);virtual;abstract; + procedure DelNameSpace(Name:string);virtual;abstract; + + procedure AddType(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract; + procedure ExportType(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract; + procedure DelType(NameSpace:string;Name:string);virtual;abstract; + + procedure AddConst(NameSpace:string;Name:string;Val:TValue);virtual;abstract; + procedure ExportConst(NameSpace:string;Name:string;Val:TValue);virtual;abstract; + procedure DelConst(NameSpace:string;Name:string);virtual;abstract; + + procedure AddVariable(NameSpace:string;Name:string;var Data);virtual;abstract; + procedure ExportVariable(NameSpace:string;Name:string;var Data);virtual;abstract; + procedure DelVariable(NameSpace:string;Name:string);virtual;abstract; + + procedure &Register(NameSpace:string;Name:string;&Type:TRTBType);virtual;abstract; + procedure &RegisterFunction(NameSpace:string;Name:string);virtual;abstract; + + function Compilate:TRTBLib;virtual;abstract; procedure LoadFromFile(&File:string); procedure SaveToFile(&File:string); property Text:string read GetText write SetText; @@ -47,7 +81,6 @@ type TRTBCompiler=class abstract public - function LoadLib(Name:string):TRTBLib;virtual;abstract; function GenNewSrc():TRTBSource;virtual;abstract; end; diff --git a/Tests/Project2.dpr b/Tests/Project2.dpr index b8232d7..aebb07a 100644 --- a/Tests/Project2.dpr +++ b/Tests/Project2.dpr @@ -14,8 +14,17 @@ uses Unit1 in 'Unit1.pas', RuntimeBuilder in '..\Source\RuntimeBuilder.pas', RuntimeBuilder.Fasm in '..\Source\RuntimeBuilder.Fasm.pas', - FasmOnDelphi in '..\FasmOnDelphi\Source\FasmOnDelphi.pas', - Fasm4Delphi in '..\FasmOnDelphi\Fasm4Delphi\Source\Fasm4Delphi.pas'; + FasmOnDelphi in '..\lib\FasmOnDelphi\Source\FasmOnDelphi.pas', + Fasm4Delphi in '..\lib\FasmOnDelphi\Fasm4Delphi\Source\Fasm4Delphi.pas'{, + RuntimeBuilder.Lua in '..\Source\RuntimeBuilder.Lua.pas', + pLuaObject in '..\lib\pLua-XE\src\pLuaObject.pas', + pLuaRecord in '..\lib\pLua-XE\src\pLuaRecord.pas', + pLuaTable in '..\lib\pLua-XE\src\pLuaTable.pas', + uWordList in '..\lib\pLua-XE\src\uWordList.pas', + Lua in '..\lib\pLua-XE\src\Lua.pas', + LuaObject in '..\lib\pLua-XE\src\LuaObject.pas', + LuaWrapper in '..\lib\pLua-XE\src\LuaWrapper.pas', + pLua in '..\lib\pLua-XE\src\pLua.pas'{}; var runner : ITestRunner; diff --git a/Tests/Project2.dproj b/Tests/Project2.dproj index 357f874..bcec15f 100644 --- a/Tests/Project2.dproj +++ b/Tests/Project2.dproj @@ -98,8 +98,19 @@ - - + + +
, + RuntimeBuilder.Lua in '..\Source\RuntimeBuilder.Lua.pas', + pLuaObject in '..\lib\pLua-XE\src\pLuaObject.pas', + pLuaRecord in '..\lib\pLua-XE\src\pLuaRecord.pas', + pLuaTable in '..\lib\pLua-XE\src\pLuaTable.pas', + uWordList in '..\lib\pLua-XE\src\uWordList.pas', + Lua in '..\lib\pLua-XE\src\Lua.pas', + LuaObject in '..\lib\pLua-XE\src\LuaObject.pas', + LuaWrapper in '..\lib\pLua-XE\src\LuaWrapper.pas', + pLua in '..\lib\pLua-XE\src\pLua.pas'{
+
Cfg_2 Base @@ -456,13 +467,13 @@ 1 - + + - False diff --git a/Tests/Unit1.pas b/Tests/Unit1.pas index 27b098b..f37dee0 100644 --- a/Tests/Unit1.pas +++ b/Tests/Unit1.pas @@ -23,7 +23,7 @@ var Src:TRTBSource; Func1:TRTBFunc; begin -Fasm:=TRTBFasmCompiler.Create('..\..\..\FasmOnDelphi\fasmw172\fasm'); +{Fasm:=TRTBFasmCompiler.Create('..\..\..\FasmOnDelphi\fasmw172\fasm'); Src:=Fasm.GenNewSrc; Src.Text:='use32'+sLineBreak+'pop ecx'+sLineBreak+'pop eax'+sLineBreak+'jmp ecx'; Func1:=src.CompilateAsFunc; @@ -33,7 +33,7 @@ begin end; FreeAndNil(Func1); FreeAndNil(Src); -FreeAndNil(Fasm); +FreeAndNil(Fasm);} end; procedure TRuntimeBuilderTestObject.Test2(); @@ -43,7 +43,7 @@ var lib:TRTBLib; Func1:TRTBFunc; begin -Fasm:=TRTBFasmCompiler.Create('..\..\..\FasmOnDelphi\fasmw172\fasm'); +{Fasm:=TRTBFasmCompiler.Create('..\..\..\FasmOnDelphi\fasmw172\fasm'); Src:=Fasm.GenNewSrc; Src.LoadFromFile('..\..\testlib.fasm'); Fasm.LoadLib('W:\RuntimeBuilder\FasmOnDelphi\fasmw172\INCLUDE\win32a.inc'); @@ -55,7 +55,7 @@ begin end; FreeAndNil(Func1); FreeAndNil(Src); -FreeAndNil(Fasm); +FreeAndNil(Fasm);} end; initialization diff --git a/lib/FasmOnDelphi b/lib/FasmOnDelphi new file mode 160000 index 0000000..dd1e5ff --- /dev/null +++ b/lib/FasmOnDelphi @@ -0,0 +1 @@ +Subproject commit dd1e5ff80a517e7fd0bc5c6df39df842789f4fc0 diff --git a/lib/pLua-XE b/lib/pLua-XE new file mode 160000 index 0000000..79883e7 --- /dev/null +++ b/lib/pLua-XE @@ -0,0 +1 @@ +Subproject commit 79883e7f4e20d27cd48104024c54d78c210e498c