diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index 8491a933db..a6d70f88e8 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -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 diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 9222e63b7f..4f79f50f96 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -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 ; diff --git a/basis/vm/vm.factor b/basis/vm/vm.factor index 5ae82c1c7a..19d009f121 100644 --- a/basis/vm/vm.factor +++ b/basis/vm/vm.factor @@ -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 ; \ No newline at end of file diff --git a/vm/data_heap.cpp b/vm/data_heap.cpp index e790c63122..de3d8d87be 100755 --- a/vm/data_heap.cpp +++ b/vm/data_heap.cpp @@ -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; diff --git a/vm/data_heap.hpp b/vm/data_heap.hpp index 88316ffd8d..7e6ff81e70 100755 --- a/vm/data_heap.hpp +++ b/vm/data_heap.hpp @@ -66,6 +66,3 @@ PRIMITIVE(next_object); PRIMITIVE(end_scan); } - -/* new objects are allocated here */ -VM_C_API factor::zone nursery; diff --git a/vm/vm.hpp b/vm/vm.hpp index 40be36b249..12f767404f 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -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);