]> granicus.if.org Git - php/commitdiff
Use better data structures (incomplete)
authorDmitry Stogov <dmitry@zend.com>
Wed, 19 Feb 2014 12:50:09 +0000 (16:50 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 19 Feb 2014 12:50:09 +0000 (16:50 +0400)
Zend/zend_closures.c
Zend/zend_execute.h
Zend/zend_variables.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index d0c0ebb4b308842cd84cfad28e0a60409a793fa4..a654736244f66051985d73a3d16c15aaf16c1e2c 100644 (file)
@@ -428,7 +428,7 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
        closure->func = *func;
        closure->func.common.prototype = NULL;
 
-       if ((scope == NULL) && (this_ptr != NULL)) {
+       if ((scope == NULL) && (Z_TYPE_P(this_ptr) != IS_UNDEF)) {
                /* use dummy scope if we're binding an object without specifying a scope */
                /* maybe it would be better to create one for this purpose */
                scope = zend_ce_closure;
index 169831c41fffa3ddca52b1a7db3cd9b2e4799918..da5029d52b1669a51d2c629b9228ac670297f593 100644 (file)
@@ -72,7 +72,8 @@ ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend
 
 static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC)
 {
-       if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) {
+//??? IS_CONSTANT_TYPE_MASK used only for some rare cases
+       if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr) & IS_CONSTANT_TYPE_MASK)) {
                if (!Z_DELREF_P(zval_ptr)) {
                        ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
                        GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
index 2427871a22ccb792d072639e93cdd8bf7610b366..a3d768d6d395626067243f694aec832ae25791d0 100644 (file)
@@ -299,6 +299,7 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
                } else {
                        if (is_ref) {
                                SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
+/*
                                if (!Z_ISREF_P(p)) {
                                        if (IS_REFCOUNTED(Z_TYPE_P(p)) && Z_REFCOUNT_P(p) > 1) {
                                                Z_DELREF_P(p);
@@ -309,6 +310,7 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
                                                ZVAL_NEW_REF(p, p);
                                        }
                                }
+*/
                        } else if (Z_ISREF_P(p)) {
                                ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(p));
                                if (Z_REFCOUNTED(tmp) && Z_REFCOUNT(tmp) > 1) {
index 6a5bad7201409d8fbb5b88ce8a1a4574bdf3a04e..dfb53daa84c7702fc546087b83da414c1046c99c 100644 (file)
@@ -2258,10 +2258,15 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
index 7f4540fdaf44e5338fafa86400f5cd3fa3c4ac70..435bba4e0c4a9aa4b8de4cf98fdc779ccc31e2eb 100644 (file)
@@ -9519,10 +9519,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
@@ -10319,10 +10324,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
@@ -11664,10 +11674,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
@@ -25226,10 +25241,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
@@ -26474,10 +26494,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);
@@ -28121,10 +28146,15 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE
        }
 
        if (Z_TYPE_P(var) != IS_STRING) {
-               zend_make_printable_zval(var, &var_copy, &use_copy);
+               if (Z_TYPE_P(var) == IS_REFERENCE) {
+                       var = Z_REFVAL_P(var);
+               }
+               if (Z_TYPE_P(var) != IS_STRING) {
+                       zend_make_printable_zval(var, &var_copy, &use_copy);
 
-               if (use_copy) {
-                       var = &var_copy;
+                       if (use_copy) {
+                               var = &var_copy;
+                       }
                }
        }
        add_string_to_string(str, str, var);