static zend_ast *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) { 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); } } } 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); } } } return ast; }
static zend_ast *zend_persist_ast(zend_ast *ast) { uint32_t i; zend_ast *node; if (ast->kind == ZEND_AST_ZVAL) { zend_ast_zval *copy = zend_accel_memdup(ast, sizeof(zend_ast_zval)); zend_persist_zval(©->val); node = (zend_ast *) copy; } else if (zend_ast_is_list(ast)) { zend_ast_list *list = zend_ast_get_list(ast); zend_ast_list *copy = zend_accel_memdup(ast, sizeof(zend_ast_list) - sizeof(zend_ast *) + sizeof(zend_ast *) * list->children); for (i = 0; i < list->children; i++) { if (copy->child[i]) { copy->child[i] = zend_persist_ast(copy->child[i]); } } node = (zend_ast *) copy; } else { uint32_t children = zend_ast_get_num_children(ast); node = zend_accel_memdup(ast, sizeof(zend_ast) - sizeof(zend_ast *) + sizeof(zend_ast *) * children); for (i = 0; i < children; i++) { if (node->child[i]) { node->child[i] = zend_persist_ast(node->child[i]); } } } efree(ast); return node; }
static void zend_persist_ast_calc(zend_ast *ast) { uint32_t i; if (ast->kind == ZEND_AST_ZVAL) { ADD_SIZE(sizeof(zend_ast_zval)); zend_persist_zval_calc(zend_ast_get_zval(ast)); } else if (zend_ast_is_list(ast)) { zend_ast_list *list = zend_ast_get_list(ast); ADD_SIZE(sizeof(zend_ast_list) - sizeof(zend_ast *) + sizeof(zend_ast *) * list->children); for (i = 0; i < list->children; i++) { if (list->child[i]) { zend_persist_ast_calc(list->child[i]); } } } else { uint32_t children = zend_ast_get_num_children(ast); ADD_SIZE(sizeof(zend_ast) - sizeof(zend_ast *) + sizeof(zend_ast *) * children); for (i = 0; i < children; i++) { if (ast->child[i]) { zend_persist_ast_calc(ast->child[i]); } } } }
static zend_ast *zend_ast_clone(zend_ast *ast) { uint32_t i; if (ast->kind == ZEND_AST_ZVAL) { zend_ast_zval *copy = emalloc(sizeof(zend_ast_zval)); copy->kind = ZEND_AST_ZVAL; copy->attr = ast->attr; ZVAL_COPY_VALUE(©->val, zend_ast_get_zval(ast)); zend_clone_zval(©->val, 0); return (zend_ast *) copy; } else if (zend_ast_is_list(ast)) { zend_ast_list *list = zend_ast_get_list(ast); zend_ast_list *copy = emalloc( sizeof(zend_ast_list) - sizeof(zend_ast *) + sizeof(zend_ast *) * list->children); copy->kind = list->kind; copy->attr = list->attr; copy->children = list->children; for (i = 0; i < list->children; i++) { if (list->child[i]) { copy->child[i] = zend_ast_clone(list->child[i]); } else { copy->child[i] = NULL; } } return (zend_ast *) copy; } else { uint32_t children = zend_ast_get_num_children(ast); zend_ast *copy = emalloc(sizeof(zend_ast) - sizeof(zend_ast *) + sizeof(zend_ast *) * children); copy->kind = ast->kind; copy->attr = ast->attr; for (i = 0; i < children; i++) { if (ast->child[i]) { copy->child[i] = zend_ast_clone(ast->child[i]); } else { copy->child[i] = NULL; } } return copy; } }