4 /* Assembly code makes assumptions about the layout of this struct:
5 - callstack_top field is 0
6 - callstack_bottom field is 1
8 - retainstack field is 3 */
10 /* C stack pointer on entry */
11 stack_frame *callstack_top;
12 stack_frame *callstack_bottom;
14 /* current datastack top pointer */
17 /* current retain stack top pointer */
20 /* saved contents of ds register on entry to callback */
23 /* saved contents of rs register on entry to callback */
24 cell retainstack_save;
26 /* callback-bottom stack frame, or NULL for top-level context.
27 When nest_stacks() is called, callstack layout with callbacks
31 [ callback stub in code heap ] <-- this is the magic frame
32 [ native frame: c_to_factor() ]
33 [ callback quotation frame ] <-- first call frame in call stack
35 magic frame is retained so that it's XT can be traced and forwarded. */
36 stack_frame *magic_frame;
38 /* memory region holding current datastack */
39 segment *datastack_region;
41 /* memory region holding current retain stack */
42 segment *retainstack_region;
44 /* saved special_objects slots on entry to callback */
46 cell current_callback_save;
51 #define ds_bot (ctx->datastack_region->start)
52 #define ds_top (ctx->datastack_region->end)
53 #define rs_bot (ctx->retainstack_region->start)
54 #define rs_top (ctx->retainstack_region->end)
59 VM_C_API void nest_stacks(stack_frame *magic_frame, factor_vm *vm);
60 VM_C_API void unnest_stacks(factor_vm *vm);