added code to pass vm ptr to some unboxers
parent
c5119218c5
commit
ff54a57eb3
|
@ -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 -- )
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
26
vm/math.cpp
26
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
|
||||
|
|
12
vm/math.hpp
12
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);
|
||||
|
|
|
@ -12,4 +12,6 @@ namespace factor
|
|||
#endif
|
||||
|
||||
extern const primitive_type primitives[];
|
||||
#define VM_PTR vm
|
||||
#define ASSERTVM()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue