nursery global variable moved into vm

db4
Phil Dawes 2009-08-20 20:20:35 +01:00
parent 0be499de8a
commit c010afc345
6 changed files with 28 additions and 21 deletions

View File

@ -29,6 +29,14 @@ enable-float-intrinsics
\ ##float>integer t frame-required? set-word-prop
>>
: %load-vm-addr ( reg -- )
0 swap LOAD32 rc-absolute-ppc-2/2 rt-vm rel-fixup ;
: %load-vm-field-addr ( reg symbol -- )
[ drop %load-vm-addr ]
[ [ dup ] dip vm-field-offset ADDI ] 2bi ;
M: ppc machine-registers
{
{ int-regs $[ 2 12 [a,b] 15 29 [a,b] append ] }
@ -418,7 +426,7 @@ M: ppc %set-alien-float swap 0 STFS ;
M: ppc %set-alien-double swap 0 STFD ;
: load-zone-ptr ( reg -- )
"nursery" f %alien-global ;
"nursery" %load-vm-field-addr ;
: load-allot-ptr ( nursery-ptr allot-ptr -- )
[ drop load-zone-ptr ] [ swap 4 LWZ ] 2bi ;
@ -678,13 +686,6 @@ M: ppc %box-large-struct ( n c-type -- )
! Call the function
"box_value_struct" f %alien-invoke ;
: %load-vm-addr ( reg -- )
0 swap LOAD32 rc-absolute-ppc-2/2 rt-vm rel-fixup ;
: %load-vm-field-addr ( reg symbol -- )
[ drop %load-vm-addr ]
[ [ dup ] dip vm-field-offset ADDI ] 2bi ;
M:: ppc %save-context ( temp1 temp2 callback-allowed? -- )
#! Save Factor stack pointers in case the C code calls a
#! callback which does a GC, which must reliably trace

View File

@ -566,7 +566,8 @@ M: x86 %sar [ SAR ] emit-shift ;
: load-zone-ptr ( reg -- )
#! Load pointer to start of zone array
0 MOV "nursery" f rc-absolute-cell rel-dlsym ;
[ 0 MOV rc-absolute-cell rt-vm rel-fixup ]
[ "nursery" vm-field-offset ADD ] bi ;
: load-allot-ptr ( nursery-ptr allot-ptr -- )
[ drop load-zone-ptr ] [ swap cell [+] MOV ] 2bi ;

View File

@ -3,6 +3,18 @@
USING: alien.structs alien.syntax ;
IN: vm
C-STRUCT: vm { "context*" "stack_chain" } ;
TYPEDEF: void* cell
C-STRUCT: zone
{ "cell" "start" }
{ "cell" "here" }
{ "cell" "size" }
{ "cell" "end" }
;
C-STRUCT: vm
{ "context*" "stack_chain" }
{ "zone" "nursery" }
;
: vm-field-offset ( field -- offset ) "vm" offset-of ;

View File

@ -1,13 +1,8 @@
#include "master.hpp"
factor::zone nursery;
namespace factor
{
/* new objects are allocated here */
VM_C_API zone nursery;
cell factorvm::init_zone(zone *z, cell size, cell start)
{
z->size = size;

View File

@ -66,6 +66,3 @@ PRIMITIVE(next_object);
PRIMITIVE(end_scan);
}
/* new objects are allocated here */
VM_C_API factor::zone nursery;

View File

@ -2,9 +2,10 @@ namespace factor
{
struct factorvm {
factor::context *stack_chain;
// if you change this struct, also change vm.factor
context *stack_chain;
/* new objects are allocated here */
zone nursery;
// segments
inline cell align_page(cell a);