All pastes #19203 Raw Edit

Something

public text v1 · immutable
#19203 ·published 2005-08-03 16:43 UTC
rendered paste body
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.