\ ##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 ] }
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 ;
! 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
: 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 ;
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
{
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);