]> gitweb.factorcode.org Git - factor.git/commitdiff
Added %vm-invoke to pass vm ptr to vm functions (x86.32 only, otherwise uses singleto...
authorPhil Dawes <phil@phildawes.net>
Tue, 18 Aug 2009 20:03:22 +0000 (21:03 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:16:30 +0000 (08:16 +0100)
basis/cpu/architecture/architecture.factor
basis/cpu/x86/32/32.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/x86.factor
vm/cpu-x86.32.hpp
vm/data_gc.cpp
vm/data_gc.hpp

index d6611c3384fa301f3a1a5e1d38366351871e8abd..da1bcfc61fe00c929dd5c14ccf8fca1901ece131 100644 (file)
@@ -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 ;
index 99391545128adaa9b29b3fb4b523a68216872f44..3ec08d5507751b4ac676cc9511f7c9d5efeb7c43 100755 (executable)
@@ -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?>> ]
index f4018b1508d8d5b7127c1bc1ba20f9808010a70b..4d041d23341b8c2849b5a72c216f7a90ce91a4ee 100644 (file)
@@ -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 ;
index 27b6667c050858949c5d6a41e380a77bc71fce3d..da391f632084dd11e6f8103e766b80e22b4cb7d7 100644 (file)
@@ -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 ;
index 351865f776183d8c1e1c005eb4e03815dda5aef7..28f2e2978e5be4260cab0912c69ed23190ca45da 100644 (file)
@@ -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
 }
index dfc10676902b5a28ba502cc359942868fb2dde56..5a7f34ca4ba826cc0e26c29e02b771f53f2b7e9a 100755 (executable)
@@ -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);
 }
 
 }
index 950990a91b6919dc606058ae6c72878c58b6a26b..84c824d779ab21ecd0aa935f9d711366f02b94cb 100755 (executable)
@@ -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);
 
 }