]> gitweb.factorcode.org Git - factor.git/commitdiff
added code to pass vm ptr to some unboxers
authorPhil Dawes <phil@phildawes.net>
Fri, 21 Aug 2009 20:24:53 +0000 (21:24 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:16:32 +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/alien.cpp
vm/cpu-x86.32.hpp
vm/math.cpp
vm/math.hpp
vm/primitives.hpp

index b9d07f578e0d1f97dac458c805c98d18a11573d9..6d88944881b50f5153e546e5454d1a28e74dd2ee 100644 (file)
@@ -298,7 +298,7 @@ M: object %prepare-var-args ;
 
 HOOK: %alien-invoke cpu ( function library -- )
 
-HOOK: %vm-invoke cpu ( function library -- )
+HOOK: %vm-invoke cpu ( function -- )
 
 HOOK: %cleanup cpu ( params -- )
 
index a48528d3fdb49503048c6c70f33e05e4e17bd8d5..306771a4b54470c559cb405834f9918b65ffb217 100755 (executable)
@@ -47,10 +47,10 @@ 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
+M: x86.32 %vm-invoke ( function -- )
+    temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as an argument
     temp-reg PUSH
-    %alien-invoke
+    %alien-invoke
     temp-reg POP ;
 
 M: x86.32 return-struct-in-registers? ( c-type -- ? )
@@ -163,7 +163,10 @@ M: x86.32 %prepare-unbox ( -- )
     ESI 4 SUB ;
 
 : call-unbox-func ( func -- )
-    4 [
+    8 [
+        ! push vm ptr
+        temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as an argument
+        temp-reg PUSH
         ! Push parameter
         EAX PUSH
         ! Call the unboxer
index 4d041d23341b8c2849b5a72c216f7a90ce91a4ee..06592078d8a0f6022ee748cddd1b5b14b2eba761 100644 (file)
@@ -172,7 +172,7 @@ M: x86.64 %alien-invoke
     rc-absolute-cell rel-dlsym
     R11 CALL ;
 
-M: x86.64 %vm-invoke %alien-invoke ;
+M: x86.64 %vm-invoke ( function -- ) f %alien-invoke ;
 
 M: x86.64 %prepare-alien-indirect ( -- )
     "unbox_alien" f %alien-invoke
index 57517ba3192e282a10f794a0881e145e45c128d1..da4e7d5286d7a6f021843a248a4ce44d2449e5e9 100644 (file)
@@ -615,7 +615,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" %vm-invoke ;
+    "inline_gc" %vm-invoke ;
 
 M: x86 %alien-global ( dst symbol library -- )
     [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;    
index 41a1e8d5224435baea22962b9c16d1c4a08cde6e..da33c01df17587852e24b90c9e2d6b0bd697311b 100755 (executable)
@@ -108,7 +108,7 @@ void *alien_pointer()
        PRIMITIVE(set_alien_##name) \
        { \
                type *ptr = (type *)PRIMITIVE_GETVM()->alien_pointer(); \
-               type value = to(dpop()); \
+               type value = PRIMITIVE_GETVM()->to(dpop()); \
                *ptr = value; \
        }
 
@@ -124,7 +124,7 @@ DEFINE_ALIEN_ACCESSOR(signed_1,s8,box_signed_1,to_fixnum)
 DEFINE_ALIEN_ACCESSOR(unsigned_1,u8,box_unsigned_1,to_cell)
 DEFINE_ALIEN_ACCESSOR(float,float,box_float,to_float)
 DEFINE_ALIEN_ACCESSOR(double,double,box_double,to_double)
-DEFINE_ALIEN_ACCESSOR(cell,void *,box_alien,PRIMITIVE_GETVM()->pinned_alien_offset)
+DEFINE_ALIEN_ACCESSOR(cell,void *,box_alien,pinned_alien_offset)
 
 /* open a native library and push a handle */
 inline void factorvm::vmprim_dlopen()
index 28f2e2978e5be4260cab0912c69ed23190ca45da..f9895cefbd714a978255458348d3d472ef1e56b9 100644 (file)
@@ -9,4 +9,6 @@ register cell rs asm("edi");
 #define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
 #undef VM_PTR
 #define VM_PTR myvm
+#undef ASSERTVM
+#define ASSERTVM() assert(vm==myvm)
 }
index 0a46252d7fc1cc22d2e79fcbd37ac3c41d827e64..1bb8f0abe51decdd0d8190c6dcde2552a9735815 100755 (executable)
@@ -618,9 +618,9 @@ fixnum factorvm::to_fixnum(cell tagged)
        }
 }
 
-VM_C_API fixnum to_fixnum(cell tagged)
+VM_C_API fixnum to_fixnum(cell tagged,factorvm *myvm)
 {
-       return vm->to_fixnum(tagged);
+       return VM_PTR->to_fixnum(tagged);
 }
 
 cell factorvm::to_cell(cell tagged)
@@ -628,9 +628,9 @@ cell factorvm::to_cell(cell tagged)
        return (cell)to_fixnum(tagged);
 }
 
-VM_C_API cell to_cell(cell tagged)
+VM_C_API cell to_cell(cell tagged, factorvm *myvm)
 {
-       return vm->to_cell(tagged);
+       return VM_PTR->to_cell(tagged);
 }
 
 void factorvm::box_signed_1(s8 n)
@@ -740,9 +740,10 @@ s64 factorvm::to_signed_8(cell obj)
        }
 }
 
-VM_C_API s64 to_signed_8(cell obj)
+VM_C_API s64 to_signed_8(cell obj,factorvm *myvm)
 {
-       return vm->to_signed_8(obj);
+       ASSERTVM();
+       return VM_PTR->to_signed_8(obj);
 }
 
 void factorvm::box_unsigned_8(u64 n)
@@ -772,9 +773,10 @@ u64 factorvm::to_unsigned_8(cell obj)
        }
 }
 
-VM_C_API u64 to_unsigned_8(cell obj)
+VM_C_API u64 to_unsigned_8(cell obj,factorvm *myvm)
 {
-       return vm->to_unsigned_8(obj);
+       ASSERTVM();
+       return VM_PTR->to_unsigned_8(obj);
 }
 
 void factorvm::box_float(float flo)
@@ -792,9 +794,9 @@ float factorvm::to_float(cell value)
        return untag_float_check(value);
 }
 
-VM_C_API float to_float(cell value)
+VM_C_API float to_float(cell value,factorvm *myvm)
 {
-       return vm->to_float(value);
+       return VM_PTR->to_float(value);
 }
 
 void factorvm::box_double(double flo)
@@ -812,9 +814,9 @@ double factorvm::to_double(cell value)
        return untag_float_check(value);
 }
 
-VM_C_API double to_double(cell value)
+VM_C_API double to_double(cell value,factorvm *myvm)
 {
-       return vm->to_double(value);
+       return VM_PTR->to_double(value);
 }
 
 /* The fixnum+, fixnum- and fixnum* primitives are defined in cpu_*.S. On
index e8347fe0e2fba30fcaa59f11e80dd723486c152f..8affd8edd28dfd029085328b7b9bc2410e1b914d 100644 (file)
@@ -61,9 +61,9 @@ PRIMITIVE(double_bits);
 PRIMITIVE(bits_double);
 
 VM_C_API void box_float(float flo);
-VM_C_API float to_float(cell value);
+VM_C_API float to_float(cell value, factorvm *vm);
 VM_C_API void box_double(double flo);
-VM_C_API double to_double(cell value);
+VM_C_API double to_double(cell value, factorvm *vm);
 
 VM_C_API void box_signed_1(s8 n);
 VM_C_API void box_unsigned_1(u8 n);
@@ -76,11 +76,11 @@ VM_C_API void box_unsigned_cell(cell cell);
 VM_C_API void box_signed_8(s64 n);
 VM_C_API void box_unsigned_8(u64 n);
 
-VM_C_API s64 to_signed_8(cell obj);
-VM_C_API u64 to_unsigned_8(cell obj);
+VM_C_API s64 to_signed_8(cell obj, factorvm *vm);
+VM_C_API u64 to_unsigned_8(cell obj, factorvm *vm);
 
-VM_C_API fixnum to_fixnum(cell tagged);
-VM_C_API cell to_cell(cell tagged);
+VM_C_API fixnum to_fixnum(cell tagged, factorvm *vm);
+VM_C_API cell to_cell(cell tagged, factorvm *vm);
 
 VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y);
 VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y);
index c6d704ffc74e0cd99a4c867b3dd5f53c1f9c1fc9..212126f32244bf59fc665bb990575206607a7702 100644 (file)
@@ -12,4 +12,6 @@ namespace factor
 #endif
 
 extern const primitive_type primitives[];
+#define VM_PTR vm
+#define ASSERTVM() 
 }