From 2a52ffd93c4b8149ad551a035cf38f251c8252c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Sun, 1 Oct 2000 01:51:54 -0700
Subject: [PATCH] allow parent access from prog->exit()

Rev: src/interpret.c:1.172
Rev: src/object.c:1.150
Rev: src/object.h:1.55
Rev: src/program.c:1.274
---
 src/interpret.c |  6 +++---
 src/object.c    | 16 ++++++++++++++--
 src/object.h    |  3 ++-
 src/program.c   | 18 ++++++++++++++----
 4 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/interpret.c b/src/interpret.c
index a64f784561..a57c78bd83 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.171 2000/09/25 23:41:33 hubbe Exp $");
+RCSID("$Id: interpret.c,v 1.172 2000/10/01 08:51:52 hubbe Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -441,7 +441,7 @@ PMOD_EXPORT void find_external_context(struct external_variable_context *loc,
   struct program *p;
   INT32 e,off;
   TRACE((4, "-find_external_context(%d, inherit=%ld)\n", arg2,
-	 DO_NOT_WARN((long)(loc->inherit - loc->o->prog->inherits))));
+	 DO_NOT_WARN((long)(loc->o->prog ? loc->inherit - loc->o->prog->inherits : 0))));
 
   if(!loc->o)
     error("Current object is destructed\n");
@@ -449,7 +449,7 @@ PMOD_EXPORT void find_external_context(struct external_variable_context *loc,
   while(--arg2>=0)
   {
 #ifdef PIKE_DEBUG  
-    if(t_flag>8)
+    if(t_flag>8 && loc->o->prog)
       my_describe_inherit_structure(loc->o->prog);
 #endif
 
diff --git a/src/object.c b/src/object.c
index 262c9876d8..8ebe234458 100644
--- a/src/object.c
+++ b/src/object.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: object.c,v 1.149 2000/09/29 15:48:04 mast Exp $");
+RCSID("$Id: object.c,v 1.150 2000/10/01 08:51:53 hubbe Exp $");
 #include "object.h"
 #include "dynamic_buffer.h"
 #include "interpret.h"
@@ -468,10 +468,19 @@ struct destroy_called_mark
 {
   struct destroy_called_mark *next;
   void *data;
+  struct program *p; /* for magic */
 };
 
 PTR_HASH_ALLOC(destroy_called_mark,128)
 
+PMOD_EXPORT struct program *get_program_for_object_being_destructed(struct object * o)
+{
+  struct destroy_called_mark * tmp;
+  if(( tmp = find_destroy_called_mark(o)))
+    return tmp->p;
+  return 0;
+}
+
 static void call_destroy(struct object *o, int foo)
 {
   int e;
@@ -520,6 +529,7 @@ static void call_destroy(struct object *o, int foo)
 #endif
 }
 
+
 void low_destruct(struct object *o,int do_free)
 {
   int e;
@@ -537,7 +547,6 @@ void low_destruct(struct object *o,int do_free)
   add_ref(o);
 
   call_destroy(o,0);
-  remove_destroy_called_mark(o);
 
   /* destructed in destroy() */
   if(!(p=o->prog))
@@ -545,6 +554,7 @@ void low_destruct(struct object *o,int do_free)
     free_object(o);
     return;
   }
+  get_destroy_called_mark(o)->p=p;
 
   debug_malloc_touch(o);
   debug_malloc_touch(o->storage);
@@ -610,6 +620,8 @@ void low_destruct(struct object *o,int do_free)
   POP_FRAME();
 
   free_program(p);
+
+  remove_destroy_called_mark(o);
 }
 
 PMOD_EXPORT void destruct(struct object *o)
diff --git a/src/object.h b/src/object.h
index a520c40058..cc9ca2bb2b 100644
--- a/src/object.h
+++ b/src/object.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: object.h,v 1.54 2000/08/10 14:58:05 grubba Exp $
+ * $Id: object.h,v 1.55 2000/10/01 08:51:54 hubbe Exp $
  */
 #ifndef OBJECT_H
 #define OBJECT_H
@@ -54,6 +54,7 @@ extern struct program *magic_set_index_program;
 #include "block_alloc_h.h"
 /* Prototypes begin here */
 BLOCK_ALLOC(object, 511)
+PMOD_EXPORT struct program *get_program_for_object_being_destructed(struct object * o);
 struct object *low_clone(struct program *p);
 void call_c_initializers(struct object *o);
 PMOD_EXPORT void do_free_object(struct object *o);
diff --git a/src/program.c b/src/program.c
index ef94f2c0b4..bf13a1fe2a 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: program.c,v 1.273 2000/09/26 00:17:47 hubbe Exp $");
+RCSID("$Id: program.c,v 1.274 2000/10/01 08:51:54 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -4407,13 +4407,23 @@ int yyexplain_not_implements(struct program *a, struct program *b, int flags)
 PMOD_EXPORT void *parent_storage(int depth)
 {
   struct external_variable_context loc;
+  struct program *p;
+
 
   loc.o=Pike_fp->current_object;
-  if(!loc.o->prog)
-    error("Cannot access parent of destructed object.\n");
+  p=loc.o->prog;
+  if(!p)
+  {
+    /* magic fallback */
+    p=get_program_for_object_being_destructed(loc.o);
+    if(!p)
+    {
+      error("Cannot access parent of destructed object.\n");
+    }
+  }
 
   loc.parent_identifier=Pike_fp->fun;
-  loc.inherit=INHERIT_FROM_INT(loc.o->prog, Pike_fp->fun);
+  loc.inherit=INHERIT_FROM_INT(p, Pike_fp->fun);
   
   find_external_context(&loc, depth);
 
-- 
GitLab