diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index d6611c3384..da1bcfc61f 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -297,6 +297,8 @@ M: object %prepare-var-args ; HOOK: %alien-invoke cpu ( function library -- ) +HOOK: %vm-invoke cpu ( function library -- ) + HOOK: %cleanup cpu ( params -- ) M: object %cleanup ( params -- ) drop ; diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index 9939154512..3ec08d5507 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -47,6 +47,12 @@ M: x86.32 reserved-area-size 0 ; 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?>> ] diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index f4018b1508..4d041d2334 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -172,6 +172,8 @@ M: x86.64 %alien-invoke 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 ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 27b6667c05..da391f6320 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -610,7 +610,7 @@ M:: x86 %call-gc ( gc-root-count -- ) ! 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 ; diff --git a/vm/cpu-x86.32.hpp b/vm/cpu-x86.32.hpp index 351865f776..28f2e2978e 100644 --- a/vm/cpu-x86.32.hpp +++ b/vm/cpu-x86.32.hpp @@ -7,4 +7,6 @@ register cell ds asm("esi"); register cell rs asm("edi"); #define VM_ASM_API VM_C_API __attribute__ ((regparm (2))) +#undef VM_PTR +#define VM_PTR myvm } diff --git a/vm/data_gc.cpp b/vm/data_gc.cpp index dfc1067690..5a7f34ca4b 100755 --- a/vm/data_gc.cpp +++ b/vm/data_gc.cpp @@ -694,7 +694,7 @@ PRIMITIVE(become) 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]); @@ -705,9 +705,9 @@ VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size) 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); } } diff --git a/vm/data_gc.hpp b/vm/data_gc.hpp index 950990a91b..84c824d779 100755 --- a/vm/data_gc.hpp +++ b/vm/data_gc.hpp @@ -19,7 +19,7 @@ PRIMITIVE(gc); 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); }