Added %vm-invoke to pass vm ptr to vm functions (x86.32 only, otherwise uses singleton vm)
parent
57011aed51
commit
6a193bb0d5
|
@ -297,6 +297,8 @@ M: object %prepare-var-args ;
|
|||
|
||||
HOOK: %alien-invoke cpu ( function library -- )
|
||||
|
||||
HOOK: %vm-invoke cpu ( function library -- )
|
||||
|
||||
HOOK: %cleanup cpu ( params -- )
|
||||
|
||||
M: object %cleanup ( params -- ) drop ;
|
||||
|
|
|
@ -47,6 +47,12 @@ 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
|
||||
temp-reg PUSH
|
||||
%alien-invoke
|
||||
temp-reg POP ;
|
||||
|
||||
M: x86.32 return-struct-in-registers? ( c-type -- ? )
|
||||
c-type
|
||||
[ return-in-registers?>> ]
|
||||
|
|
|
@ -172,6 +172,8 @@ M: x86.64 %alien-invoke
|
|||
rc-absolute-cell rel-dlsym
|
||||
R11 CALL ;
|
||||
|
||||
M: x86.64 %vm-invoke %alien-invoke ;
|
||||
|
||||
M: x86.64 %prepare-alien-indirect ( -- )
|
||||
"unbox_alien" f %alien-invoke
|
||||
RBP RAX MOV ;
|
||||
|
|
|
@ -610,7 +610,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 %alien-invoke ;
|
||||
"inline_gc" f %vm-invoke ;
|
||||
|
||||
M: x86 %alien-global
|
||||
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;
|
||||
|
|
|
@ -7,4 +7,6 @@ register cell ds asm("esi");
|
|||
register cell rs asm("edi");
|
||||
|
||||
#define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
|
||||
#undef VM_PTR
|
||||
#define VM_PTR myvm
|
||||
}
|
||||
|
|
|
@ -694,7 +694,7 @@ PRIMITIVE(become)
|
|||
PRIMITIVE_GETVM()->vmprim_become();
|
||||
}
|
||||
|
||||
VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
|
||||
void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
|
||||
{
|
||||
for(cell i = 0; i < gc_roots_size; i++)
|
||||
gc_locals.push_back((cell)&gc_roots_base[i]);
|
||||
|
@ -705,9 +705,9 @@ VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
|
|||
gc_locals.pop_back();
|
||||
}
|
||||
|
||||
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size)
|
||||
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm)
|
||||
{
|
||||
return vm->inline_gc(gc_roots_base,gc_roots_size);
|
||||
return VM_PTR->inline_gc(gc_roots_base,gc_roots_size);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ PRIMITIVE(gc);
|
|||
PRIMITIVE(gc_stats);
|
||||
PRIMITIVE(clear_gc_stats);
|
||||
PRIMITIVE(become);
|
||||
|
||||
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size);
|
||||
struct factorvm;
|
||||
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm);
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue