From ff54a57eb314e8f672c1056244333736ceb5498e Mon Sep 17 00:00:00 2001 From: Phil Dawes Date: Fri, 21 Aug 2009 21:24:53 +0100 Subject: [PATCH] added code to pass vm ptr to some unboxers --- basis/cpu/architecture/architecture.factor | 2 +- basis/cpu/x86/32/32.factor | 11 +++++---- basis/cpu/x86/64/64.factor | 2 +- basis/cpu/x86/x86.factor | 2 +- vm/alien.cpp | 4 ++-- vm/cpu-x86.32.hpp | 2 ++ vm/math.cpp | 26 ++++++++++++---------- vm/math.hpp | 12 +++++----- vm/primitives.hpp | 2 ++ 9 files changed, 36 insertions(+), 27 deletions(-) diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index b9d07f578e..6d88944881 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -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 -- ) diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index a48528d3fd..306771a4b5 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -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 + f %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 diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index 4d041d2334..06592078d8 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -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 diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 57517ba319..da4e7d5286 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -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" f %vm-invoke ; + "inline_gc" %vm-invoke ; M: x86 %alien-global ( dst symbol library -- ) [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ; diff --git a/vm/alien.cpp b/vm/alien.cpp index 41a1e8d522..da33c01df1 100755 --- a/vm/alien.cpp +++ b/vm/alien.cpp @@ -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() diff --git a/vm/cpu-x86.32.hpp b/vm/cpu-x86.32.hpp index 28f2e2978e..f9895cefbd 100644 --- a/vm/cpu-x86.32.hpp +++ b/vm/cpu-x86.32.hpp @@ -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) } diff --git a/vm/math.cpp b/vm/math.cpp index 0a46252d7f..1bb8f0abe5 100755 --- a/vm/math.cpp +++ b/vm/math.cpp @@ -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 diff --git a/vm/math.hpp b/vm/math.hpp index e8347fe0e2..8affd8edd2 100644 --- a/vm/math.hpp +++ b/vm/math.hpp @@ -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); diff --git a/vm/primitives.hpp b/vm/primitives.hpp index c6d704ffc7..212126f322 100644 --- a/vm/primitives.hpp +++ b/vm/primitives.hpp @@ -12,4 +12,6 @@ namespace factor #endif extern const primitive_type primitives[]; +#define VM_PTR vm +#define ASSERTVM() } -- 2.34.1