Don't issue FETCH_CLASS for anon classes

This commit is contained in:
Nikita Popov 2015-04-26 15:36:40 +02:00
parent 929fdc1c1a
commit 03d7042d5c
3 changed files with 8 additions and 21 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);