int main(int argc, char **argv) { dirty_stack(VARCTRL); test(); return 0; }
void caml_realloc_stack () { CAMLparam0(); CAMLlocal2(old_stack, new_stack); /* All sizes are in bytes */ asize_t size; uintnat stack_used; old_stack = caml_current_stack; stack_used = Stack_sp(old_stack); size = Wosize_val(old_stack); size *= 2; caml_gc_log ("Growing old_stack=0x%lx to %lu words\n", old_stack, size); new_stack = caml_alloc(size, Stack_tag); caml_gc_log ("New_stack=0x%lx\n", new_stack); memcpy(Stack_high(new_stack) - stack_used, Stack_high(old_stack) - stack_used, stack_used); Stack_sp(new_stack) = Stack_sp(old_stack); Stack_handle_value(new_stack) = Stack_handle_value(old_stack); Stack_handle_exception(new_stack) = Stack_handle_exception(old_stack); Stack_handle_effect(new_stack) = Stack_handle_effect(old_stack); Stack_parent(new_stack) = Stack_parent(old_stack); Stack_dirty(new_stack) = Val_long(0); if (Stack_dirty(old_stack) == Val_long(1)) { dirty_stack(new_stack); } load_stack(new_stack); /* Reset old stack */ Stack_sp(old_stack) = 0; Stack_dirty(old_stack) = Val_long(0); Stack_handle_value(old_stack) = Val_long(0); Stack_handle_exception(old_stack) = Val_long(0); Stack_handle_effect(old_stack) = Val_long(0); Stack_parent(old_stack) = Val_unit; CAMLreturn0; }
static void save_stack_dirty (int mark_dirty) { if (mark_dirty) dirty_stack(caml_current_stack); }