]> gitweb.factorcode.org Git - factor.git/blob - vm/contexts.hpp
GC maps for more compact inline GC checks
[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         OBJ_CONTEXT,
10 };
11
12 static const cell stack_reserved = 1024;
13
14 struct context {
15
16         // First 4 fields accessed directly by compiler. See basis/vm/vm.factor
17
18         /* Factor callstack pointers */
19         stack_frame *callstack_top;
20         stack_frame *callstack_bottom;
21
22         /* current datastack top pointer */
23         cell datastack;
24
25         /* current retain stack top pointer */
26         cell retainstack;
27
28         /* C callstack pointer */
29         cell callstack_save;
30
31         segment *datastack_seg;
32         segment *retainstack_seg;
33         segment *callstack_seg;
34
35         /* context-specific special objects, accessed by context-object and
36         set-context-object primitives */
37         cell context_objects[context_object_count];
38
39         context(cell datastack_size, cell retainstack_size, cell callstack_size);
40         ~context();
41
42         void reset_datastack();
43         void reset_retainstack();
44         void reset_callstack();
45         void reset_context_objects();
46         void reset();
47         void fix_stacks();
48         void scrub_stacks(gc_info *info, cell index);
49
50         cell peek()
51         {
52                 return *(cell *)datastack;
53         }
54
55         void replace(cell tagged)
56         {
57                 *(cell *)datastack = tagged;
58         }
59
60         cell pop()
61         {
62                 cell value = peek();
63                 datastack -= sizeof(cell);
64                 return value;
65         }
66
67         void push(cell tagged)
68         {
69                 datastack += sizeof(cell);
70                 replace(tagged);
71         }
72 };
73
74 VM_C_API context *new_context(factor_vm *parent);
75 VM_C_API void delete_context(factor_vm *parent, context *old_context);
76 VM_C_API cell begin_callback(factor_vm *parent, cell quot);
77 VM_C_API void end_callback(factor_vm *parent);
78
79 }