Index: src/ops/object.ops =================================================================== --- src/ops/object.ops (revision 43420) +++ src/ops/object.ops (working copy) @@ -140,6 +140,9 @@ PObj_get_FLAGS(interp->current_cont) |= SUB_FLAG_TAILCALL; /* Detach continuation from current CallContext to avoid marking dead object. */ /* RetContinuation will kill itself after invoke */ +fprintf(stderr, "tailcallmethod PMC STR %d %d\n", + (interp->current_cont->vtable->base_type == enum_class_RetContinuation), + Parrot_pcc_do_run_ops(interp, method_pmc)); if (interp->current_cont->vtable->base_type == enum_class_RetContinuation && Parrot_pcc_do_run_ops(interp, method_pmc)) { PMC * const ctx = CURRENT_CONTEXT(interp); @@ -148,6 +151,8 @@ Parrot_pcc_set_continuation(interp, ctx, PMCNULL); } interp->current_object = object; +fprintf(stderr, "tailcallmethod PMC STR invoking with continuation %p\n", + (void*)interp->current_cont); dest = (opcode_t *)VTABLE_invoke(interp, method_pmc, next); } goto ADDRESS(dest); Index: src/pmc/retcontinuation.pmc =================================================================== --- src/pmc/retcontinuation.pmc (revision 43420) +++ src/pmc/retcontinuation.pmc (working copy) @@ -84,8 +84,15 @@ /* recycle this PMC and make sure it doesn't get marked */ if (!PMC_IS_NULL(from_ctx)) + { + fprintf(stderr,"%s:%d: resetting continuation (SELF=%p) in context %p\n", + __FILE__, __LINE__, (void*)SELF, (void*)from_ctx); Parrot_pcc_set_continuation(interp, from_ctx, NULL); + } + fprintf(stderr,"%s:%d: freeing myself (SELF=%p)\n", + __FILE__, __LINE__, (void*)SELF); Parrot_gc_free_pmc_header(interp, SELF); + Parrot_gc_mark_and_sweep(interp, 0); if (INTERP->code != seg) Parrot_switch_to_cs(INTERP, seg, 1); Index: src/pmc/sub.pmc =================================================================== --- src/pmc/sub.pmc (revision 43420) +++ src/pmc/sub.pmc (working copy) @@ -21,6 +21,8 @@ #include "parrot/oplib/ops.h" #include "sub.str" +static unsigned debug_counter = 0; + static void print_sub_name(PARROT_INTERP, ARGIN_NULLOK(PMC *sub)) { @@ -395,6 +397,12 @@ Parrot_pcc_init_context(INTERP, context, caller_ctx); Parrot_pcc_set_sub(interp, context, SELF); + fprintf(stderr, "%d: %s:%d: setting continuation %p in context %p\n", + debug_counter++, __FILE__, __LINE__, (void*)ccont, (void*)context); +#if 0 + if (debug_counter-1 == 2515) + abort(); +#endif Parrot_pcc_set_continuation(interp, context, ccont); Parrot_pcc_set_constants(interp, context, sub->seg->const_table->constants); Index: src/gc/api.c =================================================================== --- src/gc/api.c (revision 43420) +++ src/gc/api.c (working copy) @@ -242,6 +242,8 @@ { ASSERT_ARGS(Parrot_gc_mark_PMC_alive_fun) if (!PMC_IS_NULL(obj)) { + if (!PObj_is_PMC_TEST(obj)) + fprintf(stderr, "object at %p is not a PMC\n", (void*)obj); PARROT_ASSERT(PObj_is_PMC_TEST(obj)); if (PObj_is_live_or_free_TESTALL(obj)) Index: src/sub.c =================================================================== --- src/sub.c (revision 43420) +++ src/sub.c (working copy) @@ -66,6 +66,7 @@ ASSERT_ARGS(new_ret_continuation_pmc) PMC* const continuation = pmc_new(interp, enum_class_RetContinuation); VTABLE_set_pointer(interp, continuation, address); + fprintf(stderr, "new ret continuation %p\n", (void*)continuation); return continuation; } Index: src/call/context_accessors.c =================================================================== --- src/call/context_accessors.c (revision 43420) +++ src/call/context_accessors.c (working copy) @@ -16,6 +16,8 @@ #include "parrot/parrot.h" +static unsigned debug_counter = 0; + /* HEADERIZER HFILE: include/parrot/context.h */ /* HEADERIZER BEGIN: static */ @@ -371,6 +373,11 @@ Parrot_pcc_set_continuation_func(PARROT_INTERP, ARGIN(PMC *ctx), ARGIN_NULLOK(PMC *_continuation)) { ASSERT_ARGS(Parrot_pcc_set_continuation_func) + if (_continuation && _continuation->vtable->base_type == enum_class_RetContinuation) + { + fprintf(stderr, "%d: setting continuation %p in context %p\n", + debug_counter++, (void*)_continuation, (void*)ctx); + } Parrot_Context *c = get_context_struct_fast(interp, ctx); c->current_cont = _continuation; }