From d8e7d886c48241ca6c59c0b2e676d8a092d9f863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Sat, 5 Oct 2013 13:49:45 +0200 Subject: [PATCH] Objects: Exit event handlers may need the parent. Make sure that parent_storage() also works from exit event handlers. Fixes fatal "Shouldn't get an exception in destruct()." Also propagates the PROGRAM_HAS_C_METHODS flag on inherit. --- src/object.c | 7 +++++++ src/program.c | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/object.c b/src/object.c index 089bb895a5..3495a012a0 100644 --- a/src/object.c +++ b/src/object.c @@ -839,6 +839,13 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason return; } get_destroy_called_mark(o)->p=p; + } else if ((p->flags & (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) == + (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) { + /* We might have event handlers that need + * the program to reach the parent. + */ + get_destroy_called_mark(o)->p=p; + destroy_called = 1; } debug_malloc_touch(o); debug_malloc_touch(o->storage); diff --git a/src/program.c b/src/program.c index 45a343aa40..29b0c320ee 100644 --- a/src/program.c +++ b/src/program.c @@ -4642,6 +4642,10 @@ void lower_inherit(struct program *p, return; } + if (p->flags & PROGRAM_HAS_C_METHODS) { + Pike_compiler->new_program->flags |= PROGRAM_HAS_C_METHODS; + } + /* parent offset was increased by 42 for above test.. */ if(parent_offset) parent_offset-=42; -- GitLab