]> gitweb.factorcode.org Git - factor.git/blob - vm/contexts.hpp
vm: actually use context callstacks when running code
[factor.git] / vm / contexts.hpp
1 namespace factor
2 {
3
4 static const cell context_object_count = 10;
5
6 enum context_object {
7         OBJ_NAMESTACK,
8         OBJ_CATCHSTACK,
9 };
10
11 struct context {
12
13         // First 4 fields accessed directly by compiler. See basis/vm/vm.factor
14
15         /* Factor callstack pointers */
16         stack_frame *callstack_top;
17         stack_frame *callstack_bottom;
18
19         /* current datastack top pointer */
20         cell datastack;
21
22         /* current retain stack top pointer */
23         cell retainstack;
24
25         /* C callstack pointer */
26         cell callstack_save;
27
28         /* context-specific special objects, accessed by context-object and
29         set-context-object primitives */
30         cell context_objects[context_object_count];
31
32         segment *datastack_seg;
33         segment *retainstack_seg;
34         segment *callstack_seg;
35
36         context(cell datastack_size, cell retainstack_size, cell callstack_size);
37         ~context();
38
39         void reset_datastack();
40         void reset_retainstack();
41         void reset_callstack();
42         void reset_context_objects();
43         void reset();
44
45         cell peek()
46         {
47                 return *(cell *)datastack;
48         }
49
50         void replace(cell tagged)
51         {
52                 *(cell *)datastack = tagged;
53         }
54
55         cell pop()
56         {
57                 cell value = peek();
58                 datastack -= sizeof(cell);
59                 return value;
60         }
61
62         void push(cell tagged)
63         {
64                 datastack += sizeof(cell);
65                 replace(tagged);
66         }
67
68         static const cell stack_reserved = (64 * sizeof(cell));
69
70         void fix_stacks()
71         {
72                 if(datastack + sizeof(cell) < datastack_seg->start
73                         || datastack + stack_reserved >= datastack_seg->end)
74                         reset_datastack();
75
76                 if(retainstack + sizeof(cell) < retainstack_seg->start
77                         || retainstack + stack_reserved >= retainstack_seg->end)
78                         reset_retainstack();
79         }
80 };
81
82 VM_C_API void begin_callback(factor_vm *vm);
83 VM_C_API void end_callback(factor_vm *vm);
84
85 }