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