Skip to content

Instantly share code, notes, and snippets.

@nielsAD
Created April 30, 2012 17:43
Show Gist options
  • Save nielsAD/2560391 to your computer and use it in GitHub Desktop.
Save nielsAD/2560391 to your computer and use it in GitHub Desktop.
Lape ffi tests.
function testInc(a, b: Integer; c: Double): Integer; cdecl;
begin
WriteLn('In testInc ', a, ',', b, ',', c);
Result := a + Round(b*c);
end;
const
header = 'function tst(a, b: Int32; c: Double): Int32;';
procedure testCall;
var
Compiler: TLapeCompiler;
Cif: TFFICifManager;
Arg1, Arg2: Integer;
Arg3: Double;
Res: Integer;
begin
Arg1 := 1; Arg2 := 20; Arg3 := 0.5;
Compiler := TLapeCompiler.Create(nil);
try
Cif := LapeHeaderToFFICif(Compiler, header);
try
Cif.Call(@testInc, @Res, [@Arg1, @Arg2, @Arg3]);
WriteLn('Result: ', Res);
finally
Cif.Free();
end;
finally
Compiler.Free();
end;
end;
procedure testWrapper;
var
Compiler: TLapeCompiler;
Wrapper: TImportClosure;
begin
Compiler := TLapeCompiler.Create(TLapeTokenizerString.Create('begin WriteLn(tst(1, 2, 3)); end;'));
try
Wrapper := LapeImportWrapper(@testInc, Compiler, header);
try
Compiler.addGlobalFunc(header, Wrapper.Func);
if Compiler.Compile() then
RunCode(Compiler.Emitter.Code)
else
WriteLn('no compilo');
finally
Wrapper.Free();
end;
finally
Compiler.Free();
end;
end;
procedure testClosure;
type
TTst = function(a, b: Int8; var c: Double): Int32; cdecl;
var
Compiler: TLapeCompiler;
Wrapper: TExportClosure;
c: Double;
begin
Compiler := TLapeCompiler.Create(TLapeTokenizerString.Create('function tst(a, b: Int8; var c: Double): Int32; begin WriteLn(''hoi from inside''); c:=c+1; Result := a + b + Round(c); end;'));
try
if (not Compiler.Compile()) then
begin
WriteLn('no compilo');
Exit;
end;
Wrapper := LapeExportWrapper(Compiler['tst']);
try
c := 3;
WriteLn('Native lape: ', TTst(Wrapper.Func)(1, 2, c));
WriteLn('C after func: ', c);
finally
Wrapper.Free();
end;
finally
Compiler.Free();
end;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment