]> gitweb.factorcode.org Git - factor.git/blob - vm/contexts.hpp
Merge branch 's3' of git://github.com/littledan/Factor into s3
[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_ID,
10 };
11
12 /* Assembly code makes assumptions about the layout of this struct */
13 struct context {
14         /* C stack pointer on entry */
15         stack_frame *callstack_top;
16         stack_frame *callstack_bottom;
17
18         /* current datastack top pointer */
19         cell datastack;
20
21         /* current retain stack top pointer */
22         cell retainstack;
23
24         /* memory region holding current datastack */
25         segment *datastack_region;
26
27         /* memory region holding current retain stack */
28         segment *retainstack_region;
29
30         /* context-specific special objects, accessed by context-object and
31         set-context-object primitives */
32         cell context_objects[context_object_count];
33
34         context *next;
35
36         context(cell ds_size, cell rs_size);
37         void reset_datastack();
38         void reset_retainstack();
39         void reset_context_objects();
40
41         cell peek()
42         {
43                 return *(cell *)datastack;
44         }
45
46         void replace(cell tagged)
47         {
48                 *(cell *)datastack = tagged;
49         }
50
51         cell pop()
52         {
53                 cell value = peek();
54                 datastack -= sizeof(cell);
55                 return value;
56         }
57
58         void push(cell tagged)
59         {
60                 datastack += sizeof(cell);
61                 replace(tagged);
62         }
63
64         static const cell stack_reserved = (64 * sizeof(cell));
65
66         void fix_stacks()
67         {
68                 if(datastack + sizeof(cell) < datastack_region->start
69                         || datastack + stack_reserved >= datastack_region->end)
70                         reset_datastack();
71
72                 if(retainstack + sizeof(cell) < retainstack_region->start
73                         || retainstack + stack_reserved >= retainstack_region->end)
74                         reset_retainstack();
75         }
76 };
77
78 VM_C_API void nest_stacks(factor_vm *vm);
79 VM_C_API void unnest_stacks(factor_vm *vm);
80
81 }