! Generate code for boxing input parameters in a callback.
[
dup \ %save-param-reg move-parameters
- "nest_stacks" f %alien-invoke
+ "nest_stacks" %vm-invoke
box-parameters
] with-param-regs ;
[ callback-context new do-callback ] %
] [ ] make ;
-: %unnest-stacks ( -- ) "unnest_stacks" f %alien-invoke ;
+: %unnest-stacks ( -- ) "unnest_stacks" %vm-invoke ;
M: ##callback-return generate-insn
#! All the extra book-keeping for %unwind is only for x86.
ESP 12 SUB
! Save top of data stack in non-volatile register
%prepare-unbox
- push-vm-ptr
EAX PUSH
+ push-vm-ptr
! Restore data/call/retain stacks
"unnest_stacks" f %alien-invoke
! Place top of data stack in EAX
- EAX POP
temp-reg POP
+ EAX POP
! Restore C stack
ESP 12 ADD
! Unbox EAX
! Pass number of roots as second parameter
param-reg-2 gc-root-count MOV
! Call GC
- "inline_gc" %vm-invoke ;
+ "inline_gc" %vm-invoke ; ! (PHIL) TODO: vm-invoke won't work with ppc or x86.64. need %vm-invoke-3rd
M: x86 %alien-global ( dst symbol library -- )
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;
void nest_stacks(factorvm *myvm)
{
- printf("PHIL nest_stacks %d %d\n",vm,myvm);fflush(stdout);
- return vm->nest_stacks();
+ ASSERTVM();
+ return VM_PTR->nest_stacks();
}
/* called when leaving a compiled callback */
void unnest_stacks(factorvm *myvm)
{
- printf("PHIL unnest_stacks %d %d\n",vm,myvm);fflush(stdout);
- return vm->unnest_stacks();
+ ASSERTVM();
+ return VM_PTR->unnest_stacks();
}
/* called on startup */