diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index a6d70f88e8..37a5369259 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -449,10 +449,10 @@ M:: ppc %allot ( dst size class nursery-ptr -- ) dst class store-tagged ; : load-cards-offset ( dst -- ) - [ "cards_offset" f %alien-global ] [ dup 0 LWZ ] bi ; + [ "cards_offset" %load-vm-field-addr ] [ dup 0 LWZ ] bi ; : load-decks-offset ( dst -- ) - [ "decks_offset" f %alien-global ] [ dup 0 LWZ ] bi ; + [ "decks_offset" %load-vm-field-addr ] [ dup 0 LWZ ] bi ; M:: ppc %write-barrier ( src card# table -- ) card-mark scratch-reg LI diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 4f79f50f96..7e73275dde 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -587,18 +587,22 @@ M:: x86 %allot ( dst size class nursery-ptr -- ) dst class store-tagged nursery-ptr size inc-allot-ptr ; +: %vm-field-ptr ( reg field -- ) + [ drop 0 MOV rc-absolute-cell rt-vm rel-fixup ] + [ vm-field-offset ADD ] 2bi ; + M:: x86 %write-barrier ( src card# table -- ) #! Mark the card pointed to by vreg. ! Mark the card card# src MOV card# card-bits SHR - table "cards_offset" f %alien-global + table "cards_offset" %vm-field-ptr table table [] MOV table card# [+] card-mark MOV ! Mark the card deck card# deck-bits card-bits - SHR - table "decks_offset" f %alien-global + table "decks_offset" %vm-field-ptr table table [] MOV table card# [+] card-mark MOV ; diff --git a/basis/vm/vm.factor b/basis/vm/vm.factor index 19d009f121..655250d755 100644 --- a/basis/vm/vm.factor +++ b/basis/vm/vm.factor @@ -15,6 +15,8 @@ C-STRUCT: zone C-STRUCT: vm { "context*" "stack_chain" } { "zone" "nursery" } + { "cell" "cards_offset" } + { "cell" "decks_offset" } ; : vm-field-offset ( field -- offset ) "vm" offset-of ; \ No newline at end of file diff --git a/vm/vm.hpp b/vm/vm.hpp index 7508abf5ea..00a24e4502 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -4,9 +4,9 @@ namespace factor struct factorvm { // if you change this struct, also change vm.factor context *stack_chain; - /* new objects are allocated here */ - zone nursery; - + zone nursery; /* new objects are allocated here */ + cell cards_offset; + cell decks_offset; // segments inline cell align_page(cell a); diff --git a/vm/write_barrier.cpp b/vm/write_barrier.cpp index 7ce764722e..72879aab4b 100644 --- a/vm/write_barrier.cpp +++ b/vm/write_barrier.cpp @@ -2,6 +2,4 @@ using namespace factor; -cell cards_offset; -cell decks_offset; diff --git a/vm/write_barrier.hpp b/vm/write_barrier.hpp index b2b370d274..7c0241a31a 100755 --- a/vm/write_barrier.hpp +++ b/vm/write_barrier.hpp @@ -6,9 +6,6 @@ card has a slot written to. the offset of the first object is set by the allocator. */ -VM_C_API factor::cell cards_offset; -VM_C_API factor::cell decks_offset; - namespace factor {