added code to pass vm ptr to some unboxers

db4
Phil Dawes 2009-08-21 21:24:53 +01:00
parent c5119218c5
commit ff54a57eb3
9 changed files with 36 additions and 27 deletions

View 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 -- )

View File

@ -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

View 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

View 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" f %vm-invoke ;
"inline_gc" %vm-invoke ;
M: x86 %alien-global ( dst symbol library -- )
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;

View File

@ -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()

View 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)
}

View File

@ -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

View 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);

View File

@ -12,4 +12,6 @@ namespace factor
#endif
extern const primitive_type primitives[];
#define VM_PTR vm
#define ASSERTVM()
}