?revision_form?Rev ?revision_input??revision_submit??revision_endform?
Rev 116 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#! /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)