0,0 → 1,138 |
#! /bin/sh /usr/share/dpatch/dpatch-run |
## dumping_problems.dpatch by Martin Stjernholm <mast@roxen.com> |
## |
## DP: Encode references to all ex-masters as if they are to the current |
## DP: master. |
## DP: |
## DP: That since we cannot hope to eradicate all references to the old |
## DP: master when replacing it, and in any case the decoder cannot hope to |
## DP: find the same ex-master again. |
## DP: |
## DP: If this creates a problem for someone using replace_master then it's |
## DP: always possible to clear the is_pike_master variable in the old |
## DP: master. |
|
@DPATCH@ |
|
--- trunk/lib/master.pike.in 28 Jul 2010 10:29:59 -0000 1.474 |
+++ cvs/lib/master.pike.in 28 Jul 2010 22:58:01 -0000 1.476 |
@@ -85,6 +85,13 @@ |
//! |
int show_if_constant_errors = 0; |
|
+int is_pike_master = 0; |
+// This integer variable should exist in any object that aspires to be |
+// the master. It gets set to 1 when the master is installed, and is |
+// therefore set in any object that is or has been the master. That |
+// makes the Encoder class encode references to the master and all |
+// ex-masters as references to the current master object. |
+ |
// --- Functions begin here. |
|
// Have to access some stuff without going through the resolver. |
@@ -5092,6 +5099,11 @@ |
} |
} |
|
+ else if (what->is_pike_master) { |
+ ENC_MSG (" is a master object\n"); |
+ ENC_RETURN ("o/master"); |
+ } |
+ |
program prog; |
if ((prog = objects_reverse_lookup (what))) |
ENC_MSG (" found program in objects: %O\n", prog); |
--- trunk/src/builtin_functions.c 27 Jul 2010 16:46:01 -0000 1.704 |
+++ cvs/src/builtin_functions.c 28 Jul 2010 22:51:00 -0000 1.705 |
@@ -7364,22 +7364,28 @@ |
*/ |
PMOD_EXPORT void f_replace_master(INT32 args) |
{ |
+ struct object *new_master; |
ASSERT_SECURITY_ROOT("replace_master"); |
|
if(!args) |
SIMPLE_TOO_FEW_ARGS_ERROR("replace_master", 1); |
if(Pike_sp[-args].type != T_OBJECT) |
SIMPLE_BAD_ARG_ERROR("replace_master", 1, "object"); |
- if(!Pike_sp[-args].u.object->prog) |
+ new_master = Pike_sp[-args].u.object; |
+ if(!new_master->prog) |
bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args, |
"Called with destructed object.\n"); |
|
if (Pike_sp[-args].subtype) |
bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args, |
"Subtyped master objects are not supported yet.\n"); |
- |
+ |
+ push_constant_text ("is_pike_master"); |
+ args++; |
+ object_set_index (new_master, 0, Pike_sp - 1, &svalue_int_one); |
+ |
free_object(master_object); |
- master_object=Pike_sp[-args].u.object; |
+ master_object=new_master; |
add_ref(master_object); |
|
free_program(master_program); |
--- trunk/src/object.c 11 Jul 2010 10:08:02 -0000 1.310 |
+++ cvs/src/object.c 28 Jul 2010 22:50:59 -0000 1.311 |
@@ -658,6 +658,7 @@ |
} |
|
{ |
+ int f; |
ONERROR uwp; |
|
/* fprintf(stderr, "Cloning master...\n"); */ |
@@ -673,7 +674,11 @@ |
|
call_c_initializers(master_object); |
call_pike_initializers(master_object,0); |
- |
+ |
+ f = find_identifier ("is_pike_master", master_program); |
+ if (f >= 0) |
+ object_low_set_index (master_object, f, &svalue_int_one); |
+ |
/* fprintf(stderr, "Master loaded.\n"); */ |
|
UNSET_ONERROR (uwp); |
--- trunk/src/svalue.c 11 Jul 2010 12:39:10 -0000 1.261 |
+++ cvs/src/svalue.c 28 Jul 2010 22:46:39 -0000 1.262 |
@@ -30,14 +30,10 @@ |
|
#define sp Pike_sp |
|
-PMOD_EXPORT const struct svalue svalue_undefined = |
+PMOD_EXPORT struct svalue svalue_undefined = |
SVALUE_INIT (T_INT, NUMBER_UNDEFINED, 0); |
-PMOD_EXPORT const struct svalue svalue_int_zero = SVALUE_INIT_INT (0); |
-#ifdef HAVE_UNION_INIT |
-PMOD_EXPORT const struct svalue svalue_int_one = SVALUE_INIT_INT (1); |
-#else |
+PMOD_EXPORT struct svalue svalue_int_zero = SVALUE_INIT_INT (0); |
PMOD_EXPORT struct svalue svalue_int_one = SVALUE_INIT_INT (1); |
-#endif |
|
#ifdef PIKE_DEBUG |
PMOD_EXPORT const char msg_type_error[] = |
--- trunk/src/svalue.h 18 Feb 2010 08:52:55 -0000 1.172 |
+++ cvs/src/svalue.h 28 Jul 2010 22:46:40 -0000 1.173 |
@@ -323,13 +323,8 @@ |
|
#define FUNCTION_BUILTIN USHRT_MAX |
|
-extern PMOD_EXPORT const struct svalue svalue_undefined, svalue_int_zero; |
-#ifdef HAVE_UNION_INIT |
-extern PMOD_EXPORT const struct svalue svalue_int_one; |
-#else |
-/* The value 1 is initialized first thing in init_pike. */ |
-extern PMOD_EXPORT struct svalue svalue_int_one; |
-#endif |
+extern PMOD_EXPORT struct svalue svalue_undefined, |
+ svalue_int_zero, svalue_int_one; |
|
#define is_gt(a,b) is_lt(b,a) |
#define is_ge(a,b) is_le(b,a) |