Fix marking detached frames. This will let the image to be saved successfully finally.
(_syx_memory_gc_mark): be sure we mark all detached frames
:100644 100644 3208e02... 2856f76... M ChangeLog
:100644 100644 e1b9474... 342bf68... M syx/syx-interp.c
:100644 100644 ff409cf... a4e2da0... M syx/syx-memory.c
diff --git a/ChangeLog b/ChangeLog
index 3208e02..2856f76 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@
* syx/syx-memory.c (_syx_memory_gc_mark): easy mark stacks
(_syx_memory_gc_mark_frame): removed
+ (_syx_memory_gc_mark): be sure we mark all detached frames
2009-01-17 Luca Bruno <letha...@gmail.com>
diff --git a/syx/syx-interp.c b/syx/syx-interp.c
index e1b9474..342bf68 100644
--- a/syx/syx-interp.c
+++ b/syx/syx-interp.c
@@ -96,7 +96,7 @@ _syx_interp_state_remap (SyxInterpState *state, SyxObject *process)
{
state->process = process;
state->process_stack = SYX_STACK (SYX_PROCESS_STACK (process));
-
+
_syx_interp_state_update (state, SYX_INTERP_FRAME (state->process_stack->pointer));
}
diff --git a/syx/syx-memory.c b/syx/syx-memory.c
index ff409cf..a4e2da0 100644
--- a/syx/syx-memory.c
+++ b/syx/syx-memory.c
@@ -426,6 +426,16 @@ _syx_memory_gc_mark (void)
fields_size = SYX_ARRAYED_OBJECT_SIZE (oop);
break;
case SYX_OBJECT_TYPE_STACK:
+ if (SYX_IS_NIL (SYX_STACK_OUTER_STACK (oop)))
+ {
+ SyxInterpFrame *frame = SYX_INTERP_FRAME (SYX_STACK_POINTER (oop));
+ while (frame)
+ {
+ if (!SYX_IS_NIL (frame->detached_frame))
+ stack[sp++] = frame->detached_frame;
+ frame = frame->parent_frame;
+ }
+ }
fields = SYX_STACK_BOTTOM (oop);
fields_size = syx_stack_used_size (SYX_STACK (oop));
break;