From 03d7042d5cd8b080eb945860626f6ab47b0658f8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 26 Apr 2015 15:36:40 +0200 Subject: [PATCH] Don't issue FETCH_CLASS for anon classes --- Zend/zend_compile.c | 21 ++++----------------- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 4 ++-- 3 files changed, 8 insertions(+), 21 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e596f5b5f6..f4f8e77f48 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3257,22 +3257,9 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */ class_node.op_type = IS_CONST; ZVAL_STR(&class_node.u.constant, zend_resolve_class_name_ast(class_ast)); } else if (class_ast->kind == ZEND_AST_CLASS) { - zend_class_entry *ce = - zend_compile_class_decl(class_ast TSRMLS_CC); - zend_string *name = ce->name; - uint32_t fetch_type = zend_get_class_fetch_type(name); - - opline = zend_emit_op(&class_node, - ZEND_FETCH_CLASS, NULL, NULL TSRMLS_CC); - opline->extended_value = fetch_type; - - if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { - opline->op2_type = IS_CONST; - opline->op2.constant = zend_add_class_name_literal(CG(active_op_array), - zend_resolve_class_name(name, ZEND_NAME_FQ TSRMLS_CC) TSRMLS_CC); - } - - zend_string_release(name); + zend_class_entry *ce = zend_compile_class_decl(class_ast TSRMLS_CC); + class_node.op_type = IS_CONST; + ZVAL_STR_COPY(&class_node.u.constant, ce->name); } else { zend_compile_class_ref(&class_node, class_ast, 1); } @@ -4938,7 +4925,7 @@ zend_class_entry *zend_compile_class_decl(zend_ast *ast) /* {{{ */ zend_class_entry *active = CG(active_class_entry); if (decl->flags & ZEND_ACC_ANON_CLASS) { - name = zend_generate_anon_class_name(); + decl->name = name = zend_generate_anon_class_name(); /* Serialization is not supported for anonymous classes */ ce->serialize = zend_class_serialize_deny; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4c8f9880c0..68359062bc 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6725,7 +6725,7 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY) Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_FETCH_CLASS) { + while (opline->opcode != ZEND_NEW) { opline++; } ZEND_VM_JMP(opline); @@ -6743,7 +6743,7 @@ ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY) Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_FETCH_CLASS) { + while (opline->opcode != ZEND_NEW) { opline++; } ZEND_VM_JMP(opline); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0dfe42a275..6a0c4bb49b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1307,7 +1307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEN Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_FETCH_CLASS) { + while (opline->opcode != ZEND_NEW) { opline++; } ZEND_VM_JMP(opline); @@ -1325,7 +1325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_H Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_FETCH_CLASS) { + while (opline->opcode != ZEND_NEW) { opline++; } ZEND_VM_JMP(opline); -- 2.40.0