]> granicus.if.org Git - php/commitdiff
- Commit experimental patch to fix the problem when doing $a = new foo()
authorAndi Gutmans <andi@php.net>
Thu, 9 Nov 2000 22:11:14 +0000 (22:11 +0000)
committerAndi Gutmans <andi@php.net>
Thu, 9 Nov 2000 22:11:14 +0000 (22:11 +0000)
  and the constructor assigns $this by reference to other symbol table
  elements. Thanks to Daniel J. Rodriguez on this one.

Zend/zend_compile.c
Zend/zend_compile.h

index 33616a0d5af312399238ae84bcc22b8e8c799f50..3c51e21a113a57bc3adfb6c26941b756666e2c74 100644 (file)
@@ -303,7 +303,15 @@ void zend_do_echo(znode *arg CLS_DC)
 
 void zend_do_assign(znode *result, znode *variable, znode *value CLS_DC)
 {
-       zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
+       zend_op *opline;
+
+       if (value->u.EA.type & EXT_TYPE_NEW_OP) {
+               value->u.EA.type &= ~EXT_TYPE_NEW_OP;
+               zend_do_assign_ref(result, variable, value CLS_CC);
+               return;
+       }
+
+       opline = get_next_op(CG(active_op_array) CLS_CC);
 
        opline->opcode = ZEND_ASSIGN;
        opline->result.op_type = IS_VAR;
@@ -1649,6 +1657,7 @@ void zend_do_begin_new_object(znode *new_token, znode *class_name CLS_DC)
        opline->opcode = ZEND_NEW;
        opline->result.op_type = IS_VAR;
        opline->result.u.var = get_temporary_variable(CG(active_op_array));
+       opline->result.u.EA.type |= EXT_TYPE_NEW_OP;
        opline->op1 = *class_name;
        SET_UNUSED(opline->op2);
 
index bc771935e6ace7d72b3b295fbed070ee47976723..445d9cb0b3196ce818c62440d28c58ebab31ca8b 100644 (file)
@@ -204,6 +204,7 @@ typedef struct _zend_file_handle {
 
 
 #define EXT_TYPE_UNUSED                (1<<0)
+#define EXT_TYPE_NEW_OP                (1<<1)
 
 #include "zend_globals.h"