unit vmbhostinterface;
interface
uses
vmbbuffer,
vmbdefs,
vmbexec;
type
tvmbhostproc_vm = function(state : tvmbstate): integer;
function vmb_registerproc_vm(vm : tvmbstate; name : pchar; addr : pointer): longbool;
implementation
uses
vmbMain;
function vmb_registerproc_vm(vm : tvmbstate; name : pchar; addr : pointer): longbool;
var
hostfrag : tvmbbuffer;
newlabelid : integer;
begin
// get our special hostproc buffer
hostfrag := vm.getFragment('hostfuncs');
// return false if funcname is registered
result := hostfrag.indexofexport(name) <> -1;
if not result then exit;
// get highest label + 1
newlabelid := vmb_buffer_getlabelmax(hostfrag) + 1;
// add export [funcname, label]
hostfrag.addexport(name, newlabelid);
// create new method in hostfrag buffer that calls the actual host method when executed
vmb_buffer_addbytecode(hostfrag, vmb_label, [newlabelid]);
vmb_buffer_addbytecode(hostfrag, vmb_invokestatic_vm, [integer(addr)]);
vmb_buffer_addbytecode(hostfrag, vmb_ret);
end;
end.