HOOK: %alien-invoke cpu ( function library -- )
+HOOK: %vm-invoke cpu ( function library -- )
+
HOOK: %cleanup cpu ( params -- )
M: object %cleanup ( params -- ) drop ;
M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ;
+M: x86.32 %vm-invoke
+ temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as the 3rd argument
+ temp-reg PUSH
+ %alien-invoke
+ temp-reg POP ;
+
M: x86.32 return-struct-in-registers? ( c-type -- ? )
c-type
[ return-in-registers?>> ]
rc-absolute-cell rel-dlsym
R11 CALL ;
+M: x86.64 %vm-invoke %alien-invoke ;
+
M: x86.64 %prepare-alien-indirect ( -- )
"unbox_alien" f %alien-invoke
RBP RAX MOV ;
! Pass number of roots as second parameter
param-reg-2 gc-root-count MOV
! Call GC
- "inline_gc" f %alien-invoke ;
+ "inline_gc" f %vm-invoke ;
M: x86 %alien-global
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;
register cell rs asm("edi");
#define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
+#undef VM_PTR
+#define VM_PTR myvm
}
PRIMITIVE_GETVM()->vmprim_become();
}
-VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
+void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
{
for(cell i = 0; i < gc_roots_size; i++)
gc_locals.push_back((cell)&gc_roots_base[i]);
gc_locals.pop_back();
}
-VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size)
+VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm)
{
- return vm->inline_gc(gc_roots_base,gc_roots_size);
+ return VM_PTR->inline_gc(gc_roots_base,gc_roots_size);
}
}
PRIMITIVE(gc_stats);
PRIMITIVE(clear_gc_stats);
PRIMITIVE(become);
-
-VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size);
+struct factorvm;
+VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm);
}