Rev 116 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 116 | holmgren | 1 | From: Martin Stjernholm <mast@roxen.com> |
| 2 | Subject: Encode references to all ex-masters as if they are to the current master. |
||
| 108 | holmgren | 3 | |
| 116 | holmgren | 4 | That since we cannot hope to eradicate all references to the old |
| 5 | master when replacing it, and in any case the decoder cannot hope to |
||
| 6 | find the same ex-master again. |
||
| 108 | holmgren | 7 | |
| 116 | holmgren | 8 | If this creates a problem for someone using replace_master then it's |
| 9 | always possible to clear the is_pike_master variable in the old |
||
| 10 | master. |
||
| 11 | |||
| 108 | holmgren | 12 | --- trunk/lib/master.pike.in 28 Jul 2010 10:29:59 -0000 1.474 |
| 13 | +++ cvs/lib/master.pike.in 28 Jul 2010 22:58:01 -0000 1.476 |
||
| 14 | @@ -85,6 +85,13 @@ |
||
| 15 | //! |
||
| 16 | int show_if_constant_errors = 0; |
||
| 17 | |||
| 18 | +int is_pike_master = 0; |
||
| 19 | +// This integer variable should exist in any object that aspires to be |
||
| 20 | +// the master. It gets set to 1 when the master is installed, and is |
||
| 21 | +// therefore set in any object that is or has been the master. That |
||
| 22 | +// makes the Encoder class encode references to the master and all |
||
| 23 | +// ex-masters as references to the current master object. |
||
| 24 | + |
||
| 25 | // --- Functions begin here. |
||
| 26 | |||
| 27 | // Have to access some stuff without going through the resolver. |
||
| 28 | @@ -5092,6 +5099,11 @@ |
||
| 29 | } |
||
| 30 | } |
||
| 31 | |||
| 32 | + else if (what->is_pike_master) { |
||
| 33 | + ENC_MSG (" is a master object\n"); |
||
| 34 | + ENC_RETURN ("o/master"); |
||
| 35 | + } |
||
| 36 | + |
||
| 37 | program prog; |
||
| 38 | if ((prog = objects_reverse_lookup (what))) |
||
| 39 | ENC_MSG (" found program in objects: %O\n", prog); |
||
| 40 | --- trunk/src/builtin_functions.c 27 Jul 2010 16:46:01 -0000 1.704 |
||
| 41 | +++ cvs/src/builtin_functions.c 28 Jul 2010 22:51:00 -0000 1.705 |
||
| 42 | @@ -7364,22 +7364,28 @@ |
||
| 43 | */ |
||
| 44 | PMOD_EXPORT void f_replace_master(INT32 args) |
||
| 45 | { |
||
| 46 | + struct object *new_master; |
||
| 47 | ASSERT_SECURITY_ROOT("replace_master"); |
||
| 48 | |||
| 49 | if(!args) |
||
| 50 | SIMPLE_TOO_FEW_ARGS_ERROR("replace_master", 1); |
||
| 51 | if(Pike_sp[-args].type != T_OBJECT) |
||
| 52 | SIMPLE_BAD_ARG_ERROR("replace_master", 1, "object"); |
||
| 53 | - if(!Pike_sp[-args].u.object->prog) |
||
| 54 | + new_master = Pike_sp[-args].u.object; |
||
| 55 | + if(!new_master->prog) |
||
| 56 | bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args, |
||
| 57 | "Called with destructed object.\n"); |
||
| 58 | |||
| 59 | if (Pike_sp[-args].subtype) |
||
| 60 | bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args, |
||
| 61 | "Subtyped master objects are not supported yet.\n"); |
||
| 62 | - |
||
| 63 | + |
||
| 64 | + push_constant_text ("is_pike_master"); |
||
| 65 | + args++; |
||
| 66 | + object_set_index (new_master, 0, Pike_sp - 1, &svalue_int_one); |
||
| 67 | + |
||
| 68 | free_object(master_object); |
||
| 69 | - master_object=Pike_sp[-args].u.object; |
||
| 70 | + master_object=new_master; |
||
| 71 | add_ref(master_object); |
||
| 72 | |||
| 73 | free_program(master_program); |
||
| 74 | --- trunk/src/object.c 11 Jul 2010 10:08:02 -0000 1.310 |
||
| 75 | +++ cvs/src/object.c 28 Jul 2010 22:50:59 -0000 1.311 |
||
| 76 | @@ -658,6 +658,7 @@ |
||
| 77 | } |
||
| 78 | |||
| 79 | { |
||
| 80 | + int f; |
||
| 81 | ONERROR uwp; |
||
| 82 | |||
| 83 | /* fprintf(stderr, "Cloning master...\n"); */ |
||
| 84 | @@ -673,7 +674,11 @@ |
||
| 85 | |||
| 86 | call_c_initializers(master_object); |
||
| 87 | call_pike_initializers(master_object,0); |
||
| 88 | - |
||
| 89 | + |
||
| 90 | + f = find_identifier ("is_pike_master", master_program); |
||
| 91 | + if (f >= 0) |
||
| 92 | + object_low_set_index (master_object, f, &svalue_int_one); |
||
| 93 | + |
||
| 94 | /* fprintf(stderr, "Master loaded.\n"); */ |
||
| 95 | |||
| 96 | UNSET_ONERROR (uwp); |
||
| 97 | --- trunk/src/svalue.c 11 Jul 2010 12:39:10 -0000 1.261 |
||
| 98 | +++ cvs/src/svalue.c 28 Jul 2010 22:46:39 -0000 1.262 |
||
| 99 | @@ -30,14 +30,10 @@ |
||
| 100 | |||
| 101 | #define sp Pike_sp |
||
| 102 | |||
| 103 | -PMOD_EXPORT const struct svalue svalue_undefined = |
||
| 104 | +PMOD_EXPORT struct svalue svalue_undefined = |
||
| 105 | SVALUE_INIT (T_INT, NUMBER_UNDEFINED, 0); |
||
| 106 | -PMOD_EXPORT const struct svalue svalue_int_zero = SVALUE_INIT_INT (0); |
||
| 107 | -#ifdef HAVE_UNION_INIT |
||
| 108 | -PMOD_EXPORT const struct svalue svalue_int_one = SVALUE_INIT_INT (1); |
||
| 109 | -#else |
||
| 110 | +PMOD_EXPORT struct svalue svalue_int_zero = SVALUE_INIT_INT (0); |
||
| 111 | PMOD_EXPORT struct svalue svalue_int_one = SVALUE_INIT_INT (1); |
||
| 112 | -#endif |
||
| 113 | |||
| 114 | #ifdef PIKE_DEBUG |
||
| 115 | PMOD_EXPORT const char msg_type_error[] = |
||
| 116 | --- trunk/src/svalue.h 18 Feb 2010 08:52:55 -0000 1.172 |
||
| 117 | +++ cvs/src/svalue.h 28 Jul 2010 22:46:40 -0000 1.173 |
||
| 118 | @@ -323,13 +323,8 @@ |
||
| 119 | |||
| 120 | #define FUNCTION_BUILTIN USHRT_MAX |
||
| 121 | |||
| 122 | -extern PMOD_EXPORT const struct svalue svalue_undefined, svalue_int_zero; |
||
| 123 | -#ifdef HAVE_UNION_INIT |
||
| 124 | -extern PMOD_EXPORT const struct svalue svalue_int_one; |
||
| 125 | -#else |
||
| 126 | -/* The value 1 is initialized first thing in init_pike. */ |
||
| 127 | -extern PMOD_EXPORT struct svalue svalue_int_one; |
||
| 128 | -#endif |
||
| 129 | +extern PMOD_EXPORT struct svalue svalue_undefined, |
||
| 130 | + svalue_int_zero, svalue_int_one; |
||
| 131 | |||
| 132 | #define is_gt(a,b) is_lt(b,a) |
||
| 133 | #define is_ge(a,b) is_le(b,a) |