else
{
array *literals = untag<array>(compiled->literals);
- return array_nth(literals,0);
+ cell executing = array_nth(literals,0);
+ check_data_pointer((object *)executing);
+ return executing;
}
}
return (stack_frame *)((cell)frame - frame->size);
}
+/* Allocates memory */
cell frame_scan(stack_frame *frame)
{
if(frame_type(frame) == QUOTATION_TYPE)
struct stack_frame_accumulator {
cell index;
- array *frames;
- stack_frame_accumulator(cell count) : index(0), frames(allot_array_internal<array>(count)) {}
+ gc_root<array> frames;
+ stack_frame_accumulator(cell count) : index(0), frames(allot_array(count,F)) {}
void operator()(stack_frame *frame)
{
- set_array_nth(frames,index++,frame_executing(frame));
- set_array_nth(frames,index++,frame_scan(frame));
+ set_array_nth(frames.untagged(),index++,frame_executing(frame));
+ set_array_nth(frames.untagged(),index++,frame_scan(frame));
}
};
stack_frame_accumulator accum(counter.count);
iterate_callstack_object(callstack.untagged(),accum);
- dpush(tag<array>(accum.frames));
+ dpush(accum.frames.value());
}
stack_frame *innermost_stack_frame(callstack *stack)
template <typename T>
struct gc_root : public tagged<T>
{
- void push() { gc_local_push((cell)this); }
+ void push() { check_tagged_pointer(tagged<T>::value()); gc_local_push((cell)this); }
explicit gc_root(cell value_) : tagged<T>(value_) { push(); }
explicit gc_root(T *value_) : tagged<T>(value_) { push(); }