]> granicus.if.org Git - php/commitdiff
Fixed file_cache broken by recent AST related changes.
authorDmitry Stogov <dmitry@zend.com>
Tue, 10 Oct 2017 16:37:46 +0000 (19:37 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 10 Oct 2017 16:37:46 +0000 (19:37 +0300)
ext/opcache/zend_file_cache.c

index 0b95212693f3dbece78d1b76e9dee70b1a2d33e2..2e5f3afdd2c74b733dd4a99181d0b7e5e0249af3 100644 (file)
@@ -266,36 +266,37 @@ static void zend_file_cache_serialize_hash(HashTable                *ht,
        }
 }
 
-static zend_ast *zend_file_cache_serialize_ast(zend_ast                 *ast,
-                                               zend_persistent_script   *script,
-                                               zend_file_cache_metainfo *info,
-                                               void                     *buf)
+static void zend_file_cache_serialize_ast(zend_ast                 *ast,
+                                          zend_persistent_script   *script,
+                                          zend_file_cache_metainfo *info,
+                                          void                     *buf)
 {
        uint32_t i;
-       zend_ast *ret;
-
-       SERIALIZE_PTR(ast);
-       ret = ast;
-       UNSERIALIZE_PTR(ast);
+       zend_ast *tmp;
 
        if (ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT) {
                zend_file_cache_serialize_zval(&((zend_ast_zval*)ast)->val, script, info, buf);
        } else if (zend_ast_is_list(ast)) {
                zend_ast_list *list = zend_ast_get_list(ast);
                for (i = 0; i < list->children; i++) {
-                       if (list->child[i]) {
-                               list->child[i] = zend_file_cache_serialize_ast(list->child[i], script, info, buf);
+                       if (list->child[i] && !IS_SERIALIZED(list->child[i])) {
+                               SERIALIZE_PTR(list->child[i]);
+                               tmp = list->child[i];
+                               UNSERIALIZE_PTR(tmp);
+                               zend_file_cache_serialize_ast(tmp, script, info, buf);
                        }
                }
        } else {
                uint32_t children = zend_ast_get_num_children(ast);
                for (i = 0; i < children; i++) {
-                       if (ast->child[i]) {
-                               ast->child[i] = zend_file_cache_serialize_ast(ast->child[i], script, info, buf);
+                       if (ast->child[i] && !IS_SERIALIZED(ast->child[i])) {
+                               SERIALIZE_PTR(ast->child[i]);
+                               tmp = ast->child[i];
+                               UNSERIALIZE_PTR(tmp);
+                               zend_file_cache_serialize_ast(tmp, script, info, buf);
                        }
                }
        }
-       return ret;
 }
 
 static void zend_file_cache_serialize_zval(zval                     *zv,
@@ -336,7 +337,7 @@ static void zend_file_cache_serialize_zval(zval                     *zv,
                                SERIALIZE_PTR(Z_AST_P(zv));
                                ast = Z_AST_P(zv);
                                UNSERIALIZE_PTR(ast);
-                               zend_file_cache_serialize_ast(Z_ASTVAL_P(zv), script, info, buf);
+                               zend_file_cache_serialize_ast(GC_AST(ast), script, info, buf);
                        }
                        break;
        }
@@ -884,32 +885,31 @@ static void zend_file_cache_unserialize_hash(HashTable               *ht,
        }
 }
 
-static zend_ast *zend_file_cache_unserialize_ast(zend_ast                *ast,
-                                                 zend_persistent_script  *script,
-                                                 void                    *buf)
+static void zend_file_cache_unserialize_ast(zend_ast                *ast,
+                                            zend_persistent_script  *script,
+                                            void                    *buf)
 {
        uint32_t i;
 
-       UNSERIALIZE_PTR(ast);
-
        if (ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_CONSTANT) {
                zend_file_cache_unserialize_zval(&((zend_ast_zval*)ast)->val, script, buf);
        } else if (zend_ast_is_list(ast)) {
                zend_ast_list *list = zend_ast_get_list(ast);
                for (i = 0; i < list->children; i++) {
-                       if (list->child[i]) {
-                               list->child[i] = zend_file_cache_unserialize_ast(list->child[i], script, buf);
+                       if (list->child[i] && !IS_UNSERIALIZED(list->child[i])) {
+                               UNSERIALIZE_PTR(list->child[i]);
+                               zend_file_cache_unserialize_ast(list->child[i], script, buf);
                        }
                }
        } else {
                uint32_t children = zend_ast_get_num_children(ast);
                for (i = 0; i < children; i++) {
-                       if (ast->child[i]) {
-                               ast->child[i] = zend_file_cache_unserialize_ast(ast->child[i], script, buf);
+                       if (ast->child[i] && !IS_UNSERIALIZED(ast->child[i])) {
+                               UNSERIALIZE_PTR(ast->child[i]);
+                               zend_file_cache_unserialize_ast(ast->child[i], script, buf);
                        }
                }
        }
-       return ast;
 }
 
 static void zend_file_cache_unserialize_zval(zval                    *zv,