4 /* Assembly code makes assumptions about the layout of this struct */
6 /* C stack pointer on entry */
7 stack_frame *callstack_top;
8 stack_frame *callstack_bottom;
10 /* current datastack top pointer */
13 /* current retain stack top pointer */
16 /* callback-bottom stack frame, or NULL for top-level context.
17 When nest_stacks() is called, callstack layout with callbacks
21 [ callback stub in code heap ] <-- this is the magic frame
22 [ native frame: c_to_factor() ]
23 [ callback quotation frame ] <-- first call frame in call stack
25 magic frame is retained so that it's XT can be traced and forwarded. */
26 stack_frame *magic_frame;
28 /* memory region holding current datastack */
29 segment *datastack_region;
31 /* memory region holding current retain stack */
32 segment *retainstack_region;
34 /* saved special_objects slots on entry to callback */
36 cell current_callback_save;
40 context(cell ds_size, cell rs_size);
44 return *(cell *)datastack;
47 void replace(cell tagged)
49 *(cell *)datastack = tagged;
55 datastack -= sizeof(cell);
59 void push(cell tagged)
61 datastack += sizeof(cell);
65 void reset_datastack()
67 datastack = datastack_region->start - sizeof(cell);
70 void reset_retainstack()
72 retainstack = retainstack_region->start - sizeof(cell);
75 static const cell stack_reserved = (64 * sizeof(cell));
79 if(datastack + sizeof(cell) < datastack_region->start
80 || datastack + stack_reserved >= datastack_region->end)
83 if(retainstack + sizeof(cell) < retainstack_region->start
84 || retainstack + stack_reserved >= retainstack_region->end)
89 VM_C_API void nest_stacks(stack_frame *magic_frame, factor_vm *vm);
90 VM_C_API void unnest_stacks(factor_vm *vm);