]> gitweb.factorcode.org Git - factor.git/blob - vm/contexts.hpp
Merge branch 'master' of git://factorcode.org/git/factor
[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         /* temporary area used by FFI code generation */
40         s64 long_long_return;
41
42         context(cell datastack_size, cell retainstack_size, cell callstack_size);
43         ~context();
44
45         void reset_datastack();
46         void reset_retainstack();
47         void reset_callstack();
48         void reset_context_objects();
49         void reset();
50         void fix_stacks();
51
52         cell peek()
53         {
54                 return *(cell *)datastack;
55         }
56
57         void replace(cell tagged)
58         {
59                 *(cell *)datastack = tagged;
60         }
61
62         cell pop()
63         {
64                 cell value = peek();
65                 datastack -= sizeof(cell);
66                 return value;
67         }
68
69         void push(cell tagged)
70         {
71                 datastack += sizeof(cell);
72                 replace(tagged);
73         }
74 };
75
76 VM_C_API context *new_context(factor_vm *parent);
77 VM_C_API void delete_context(factor_vm *parent, context *old_context);
78 VM_C_API cell begin_callback(factor_vm *parent, cell quot);
79 VM_C_API void end_callback(factor_vm *parent);
80
81 }