]> granicus.if.org Git - php/commitdiff
Use better data structures (incomplete)
authorDmitry Stogov <dmitry@zend.com>
Tue, 18 Feb 2014 07:44:58 +0000 (11:44 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 18 Feb 2014 07:44:58 +0000 (11:44 +0400)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
main/main.c

index 68b6bef360b981c5661c2833bb37da5a7fddbf14..a3f99a2f1afd5b12a7d22105494e169aa464b0f8 100644 (file)
@@ -760,63 +760,60 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu
 
 static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
 {
-       if (Z_ISREF_P(variable_ptr)) {
+       zval garbage;
+
+       if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+               ZVAL_COPY(variable_ptr, value);
+               return variable_ptr;
+       } else if (Z_ISREF_P(variable_ptr)) {
                variable_ptr = Z_REFVAL_P(variable_ptr);
        }
 
-       if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
+       if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+               ZVAL_COPY(variable_ptr, value);
+       } else if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
            UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
                Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
-               return variable_ptr;
-       }
-
-//???
-#if 0
-       if (EXPECTED(!PZVAL_IS_REF(variable_ptr))) {
+       } else if (EXPECTED(variable_ptr != value)) {
                if (Z_REFCOUNT_P(variable_ptr)==1) {
-                       if (UNEXPECTED(variable_ptr == value)) {
-                               return variable_ptr;
-                       } else if (EXPECTED(!PZVAL_IS_REF(value))) {
-                               Z_ADDREF_P(value);
-                               *variable_ptr_ptr = value;
-                               ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval));
-                               GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
-                               zval_dtor(variable_ptr);
-                               efree(variable_ptr);
-                               return value;
-                       } else {
-                               goto copy_value;
-                       }
+//???                  if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(value)))) {
+//???                          _zval_dtor_func(variable_ptr ZEND_FILE_LINE_CC);
+//???                          ZVAL_COPY(variable_ptr, value);
+//???                  } else if (EXPECTED(!Z_ISREF_P(value))) {
+//???                          Z_ADDREF_P(value);
+//???                          *variable_ptr_ptr = value;
+//???                          ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval));
+//???                          GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
+//???                          zval_dtor(variable_ptr);
+//???                          ZVAL_COPY(variable_ptr, value);
+//???                  } else {
+                               ZVAL_COPY_VALUE(&garbage, variable_ptr);
+                               ZVAL_DUP(variable_ptr, value);
+                               _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+//???                  }
                } else { /* we need to split */
                        Z_DELREF_P(variable_ptr);
                        GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
-                       if (PZVAL_IS_REF(value)) {
-                               ALLOC_ZVAL(variable_ptr);
-                               *variable_ptr_ptr = variable_ptr;
-                               INIT_PZVAL_COPY(variable_ptr, value);
-                               zval_copy_ctor(variable_ptr);
-                               return variable_ptr;
+                       if (Z_ISREF_P(value)) {
+                               ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
                        } else {
-                               *variable_ptr_ptr = value;
-                               Z_ADDREF_P(value);
-                               return value;
-                       }
-               }
-       } else {
-               if (EXPECTED(variable_ptr != value)) {
-copy_value:
-                       if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) {
-                               /* nothing to destroy */
-                               ZVAL_DUP(variable_ptr, value);
-                       } else {
-                               ZVAL_COPY_VALUE(&garbage, variable_ptr);
-                               ZVAL_DUP(variable_ptr, value);
-                               _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+                               ZVAL_COPY(variable_ptr, value);
                        }
                }
+//???  } else {
+//???          if (EXPECTED(variable_ptr != value)) {
+//???copy_value:
+//???                  if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) {
+//???                          /* nothing to destroy */
+//???                          ZVAL_DUP(variable_ptr, value);
+//???                  } else {
+//???                          ZVAL_COPY_VALUE(&garbage, variable_ptr);
+//???                          ZVAL_DUP(variable_ptr, value);
+//???                          _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+//???                  }
+//???          }
                return variable_ptr;
        }
-#endif
        return variable_ptr;
 }
 
index 647efe423147e4974030df28c05ebd712b2ab83f..9dc9f91d16096a890f1e0e4a422d54534b7d105e 100644 (file)
@@ -495,6 +495,9 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -1729,8 +1732,8 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
                ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
        }
 
-       FREE_OP1_VAR_PTR();
-       FREE_OP2_VAR_PTR();
+//???  FREE_OP1_VAR_PTR();
+//???  FREE_OP2_VAR_PTR();
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
index 6f6746c3bcedcd9eae0a2daafe57a09d0c258fe8..5420c8e418bb3f0e6334980ab5a426096241bba0 100644 (file)
@@ -13759,6 +13759,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -16118,6 +16121,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -18079,6 +18085,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -19089,8 +19098,8 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
                ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
        }
 
-       if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-       if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
+//???  if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//???  if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -20128,6 +20137,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -21470,6 +21482,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -22327,7 +22342,8 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
                ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
        }
 
-       if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//???  if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//???  ;
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -23283,6 +23299,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -24611,6 +24630,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -25851,6 +25873,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -27092,6 +27117,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -27487,6 +27515,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -30163,6 +30194,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -32303,6 +32337,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -34138,6 +34175,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -35141,7 +35181,8 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
        }
 
-       if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
+//???  ;
+//???  if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
@@ -36060,6 +36101,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -37270,6 +37314,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
                zval_ptr_dtor(objval);
        } else {
+               if (Z_ISREF_P(var_ptr)) {
+                       var_ptr = Z_REFVAL_P(var_ptr);
+               }
                binary_op(var_ptr, var_ptr, value TSRMLS_CC);
        }
 
@@ -38120,6 +38167,8 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
                ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
        }
 
+//???  ;
+//???  ;
 
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
index b3dbfa0f8bdb9e04846f7a4bfa19fa7da8d3812d..b2068cd137d13fe013c05a1f9e8a421378ee0403 100644 (file)
@@ -1090,7 +1090,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
                                if (PG(html_errors)) {
                                        if (type == E_ERROR || type == E_PARSE) {
                                                zend_string *buf = php_escape_html_entities(buffer, buffer_len, 0, ENT_COMPAT, NULL TSRMLS_CC);
-                                               php_printf("%s<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf, error_filename, error_lineno, STR_PRINT(append_string));
+                                               php_printf("%s<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf->val, error_filename, error_lineno, STR_PRINT(append_string));
                                                STR_FREE(buf);
                                        } else {
                                                php_printf("%s<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string));