]> gitweb.factorcode.org Git - factor.git/blob - vm/callstack.hpp
Merge remote-tracking branch 'malu/semantic-versioning'
[factor.git] / vm / callstack.hpp
1 namespace factor
2 {
3
4 inline static cell callstack_object_size(cell size)
5 {
6         return sizeof(callstack) + size;
7 }
8
9 /* This is a little tricky. The iterator may allocate memory, so we
10 keep the callstack in a GC root and use relative offsets */
11 template<typename Iterator> void factor_vm::iterate_callstack_object(callstack *stack_, Iterator &iterator)
12 {
13         data_root<callstack> stack(stack_,this);
14         fixnum frame_offset = factor::untag_fixnum(stack->length) - sizeof(stack_frame);
15
16         while(frame_offset >= 0)
17         {
18                 stack_frame *frame = stack->frame_at(frame_offset);
19                 frame_offset -= frame->size;
20                 iterator(frame);
21         }
22 }
23
24 template<typename Iterator> void factor_vm::iterate_callstack(context *ctx, Iterator &iterator)
25 {
26         stack_frame *frame = ctx->callstack_bottom - 1;
27
28         while(frame >= ctx->callstack_top)
29         {
30                 iterator(frame);
31                 frame = frame_successor(frame);
32         }
33 }
34
35 }