]> granicus.if.org Git - php/commitdiff
AST don't have to be COPYABLE anymore.
authorDmitry Stogov <dmitry@zend.com>
Tue, 10 Oct 2017 12:45:03 +0000 (15:45 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 10 Oct 2017 12:45:03 +0000 (15:45 +0300)
Zend/zend_types.h
Zend/zend_variables.c
ext/opcache/zend_persist.c

index ce7ebaca699275df60aacc20c36ba025e42d329f..4f073d47194122fba428e45dcecf392f1d84a7bd 100644 (file)
@@ -475,7 +475,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
 #define IS_RESOURCE_EX                         (IS_RESOURCE       | ((IS_TYPE_REFCOUNTED                   ) << Z_TYPE_FLAGS_SHIFT))
 #define IS_REFERENCE_EX                                (IS_REFERENCE      | ((IS_TYPE_REFCOUNTED                   ) << Z_TYPE_FLAGS_SHIFT))
 
-#define IS_CONSTANT_AST_EX                     (IS_CONSTANT_AST   | ((IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE) << Z_TYPE_FLAGS_SHIFT))
+#define IS_CONSTANT_AST_EX                     (IS_CONSTANT_AST   | ((IS_TYPE_REFCOUNTED                   ) << Z_TYPE_FLAGS_SHIFT))
 
 #define IS_CONSTANT_VISITED(p)         (Z_TYPE_FLAGS_P(p) & IS_CONSTANT_VISITED_MARK)
 #define MARK_CONSTANT_VISITED(p)       Z_TYPE_FLAGS_P(p) |= IS_CONSTANT_VISITED_MARK
index d7fd5239d7796bbd6bd5c3f6b524172b738102f5..97a2ea474c66bb689d331b47693e780c5d90587e 100644 (file)
@@ -167,8 +167,6 @@ ZEND_API void ZEND_FASTCALL _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
        } else if (EXPECTED(Z_TYPE_P(zvalue) == IS_STRING)) {
                CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue));
                ZVAL_NEW_STR(zvalue, zend_string_dup(Z_STR_P(zvalue), 0));
-       } else if (EXPECTED(Z_TYPE_P(zvalue) == IS_CONSTANT_AST)) {
-               ZVAL_AST(zvalue, zend_ast_copy(Z_ASTVAL_P(zvalue)));
        }
 }
 
index 8fb7f41e3e76cf8eab4b7f6980daf5856c216120..dd68305dbd37d3a128c1f57476a2715633937d48 100644 (file)
@@ -319,12 +319,12 @@ static void zend_persist_zval(zval *z)
                        new_ptr = zend_shared_alloc_get_xlat_entry(Z_AST_P(z));
                        if (new_ptr) {
                                Z_AST_P(z) = new_ptr;
-                               Z_TYPE_FLAGS_P(z) = IS_TYPE_COPYABLE;
+                               Z_TYPE_FLAGS_P(z) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE);
                        } else {
                                zend_ast_ref *old_ref = Z_AST_P(z);
                                Z_ARR_P(z) = zend_accel_memdup(Z_AST_P(z), sizeof(zend_ast_ref));
                                zend_persist_ast(GC_AST(old_ref));
-                               Z_TYPE_FLAGS_P(z) = IS_TYPE_COPYABLE;
+                               Z_TYPE_FLAGS_P(z) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE);
                                GC_REFCOUNT(Z_COUNTED_P(z)) = 2;
                                efree(old_ref);
                        }