From 1f91c0c74a11da82c2d9adece96a4ae4fdb782c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Fri, 2 May 2008 12:56:06 +0200
Subject: [PATCH] Added handle_inherit() to CompilerEnvironment and
 PikeCompiler.

Rev: src/pike_compiler.h:1.10
Rev: src/program.c:1.682
---
 src/pike_compiler.h |  4 ++-
 src/program.c       | 65 +++++++++++++++++++++++++++++++++++++--------
 2 files changed, 57 insertions(+), 12 deletions(-)

diff --git a/src/pike_compiler.h b/src/pike_compiler.h
index d7971f4398..b661db1d89 100644
--- a/src/pike_compiler.h
+++ b/src/pike_compiler.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: pike_compiler.h,v 1.9 2008/04/26 19:04:26 grubba Exp $
+|| $Id: pike_compiler.h,v 1.10 2008/05/02 10:56:06 grubba Exp $
 */
 
 #ifndef PIKE_COMPILER_H
@@ -69,6 +69,7 @@ struct compilation
 #define CE_PIKE_COMPILER_FUN_NUM			3
 #define CE_GET_COMPILATION_HANDLER_FUN_NUM		4
 #define CE_GET_DEFAULT_MODULE_FUN_NUM			5
+#define CE_HANDLE_INHERIT_FUN_NUM			6
 
 /* PikeCompiler function numbers. */
 #define PC_REPORT_FUN_NUM				0
@@ -78,5 +79,6 @@ struct compilation
 #define PC_GET_COMPILATION_HANDLER_FUN_NUM		4
 #define PC_GET_DEFAULT_MODULE_FUN_NUM			5
 #define PC_CHANGE_COMPILER_COMPATIBILITY_FUN_NUM	6
+#define PC_HANDLE_INHERIT_FUN_NUM			7
 
 #endif	/* !PIKE_COMPILER_H */
diff --git a/src/program.c b/src/program.c
index 4ab4b781c0..0a24fa2a86 100644
--- a/src/program.c
+++ b/src/program.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: program.c,v 1.681 2008/05/02 04:15:14 mast Exp $
+|| $Id: program.c,v 1.682 2008/05/02 10:56:06 grubba Exp $
 */
 
 #include "global.h"
@@ -4507,23 +4507,15 @@ int call_handle_inherit(struct pike_string *s)
 
   CHECK_COMPILER();
 
-  reference_shared_string(s);
-  push_string(s);
+  ref_push_string(s);
   if (!TEST_COMPAT(7,6)) {
     /* In Pike 7.7 and later filenames belonging to Pike are assumed
      * to be encoded according to UTF-8.
      */
     f_string_to_utf8(1);
   }
-  ref_push_string(c->lex.current_file);
-  if (c->handler && c->handler->prog) {
-    ref_push_object(c->handler);
-    args = 3;
-  }
-  else args = 2;
 
-  if (safe_apply_handler("handle_inherit", c->handler, c->compat_handler,
-			 args, BIT_PROGRAM|BIT_FUNCTION|BIT_ZERO))
+  if (safe_apply_current2(PC_HANDLE_INHERIT_FUN_NUM, 1, NULL))
     if (Pike_sp[-1].type != T_INT)
       return 1;
     else {
@@ -7368,6 +7360,22 @@ static void f_compilation_env_get_default_module(INT32 args)
   }
 }
 
+/*! @decl program handle_inherit(string inh, string current_file, @
+ *!                              object|void handler)
+ *!
+ *!   Look up an inherit @[inh].
+ */
+static void f_compilation_env_handle_inherit(INT32 args)
+{
+  if(get_master())
+  {
+    APPLY_MASTER("handle_inherit", args);
+  } else {
+    pop_n_elems(args);
+    push_undefined();
+  }
+}
+
 /*! @class PikeCompiler
  *!
  *!   The Pike compiler.
@@ -8310,6 +8318,35 @@ static void f_compilation_change_compiler_compatibility(INT32 args)
   push_int(0);
 }
 
+/*! @decl program handle_inherit(string inh)
+ *!
+ *!   Look up an inherit @[inh] in the current program.
+ */
+static void f_compilation_handle_inherit(INT32 args)
+{
+  struct compilation *c = THIS_COMPILATION;
+  struct object *handler;
+  int fun = -1;
+
+  if (args > 1) pop_n_elems(args-1);
+
+  ref_push_string(c->lex.current_file);
+  if (c->handler && c->handler->prog) {
+    ref_push_object(c->handler);
+    args = 3;
+  }
+  else args = 2;
+
+  if (((handler = c->handler) && handler->prog &&
+       ((fun = find_identifier("handle_inherit", handler->prog)) != -1)) ||
+      ((handler = c->compat_handler) && handler->prog &&
+       ((fun = find_identifier("handle_inherit", handler->prog)) != -1))) {
+    apply_low(handler, fun, args);
+  } else {
+    apply_external(1, CE_HANDLE_INHERIT_FUN_NUM, args);
+  }
+}
+
 static void f_compilation__sprintf(INT32 args)
 {
   struct compilation *c = THIS_COMPILATION;
@@ -8578,6 +8615,9 @@ static void compile_compiler(void)
 	       f_compilation_change_compiler_compatibility,
 	       tFunc(tInt tInt, tVoid), 0);
 
+  ADD_FUNCTION("handle_inherit", f_compilation_handle_inherit,
+	       tFunc(tStr, tPrg(tObj)), 0);
+
   ADD_FUNCTION("_sprintf", f_compilation__sprintf,
 	       tFunc(tInt tOr(tMap(tStr, tMix), tVoid), tStr), ID_STATIC);
 
@@ -8630,6 +8670,9 @@ static void compile_compiler(void)
 	       f_compilation_env_get_default_module,
 	       tFunc(tNone, tOr(tMap(tStr, tMix), tObj)), 0);
 
+  ADD_FUNCTION("handle_inherit", f_compilation_env_handle_inherit,
+	       tFunc(tStr tStr tOr(tObj, tVoid), tPrg(tObj)), 0);
+
   {
     struct pike_string *type_name;
     struct svalue type_value;
-- 
GitLab