HOOK: %alien-invoke cpu ( function library -- )
-HOOK: %vm-invoke cpu ( function library -- )
+HOOK: %vm-invoke cpu ( function -- )
HOOK: %cleanup cpu ( params -- )
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 -- ? )
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
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
! 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 ;
PRIMITIVE(set_alien_##name) \
{ \
type *ptr = (type *)PRIMITIVE_GETVM()->alien_pointer(); \
- type value = to(dpop()); \
+ type value = PRIMITIVE_GETVM()->to(dpop()); \
*ptr = value; \
}
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()
#define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
#undef VM_PTR
#define VM_PTR myvm
+#undef ASSERTVM
+#define ASSERTVM() assert(vm==myvm)
}
}
}
-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)
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)
}
}
-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)
}
}
-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)
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)
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
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);
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);
#endif
extern const primitive_type primitives[];
+#define VM_PTR vm
+#define ASSERTVM()
}