mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Don't issue FETCH_CLASS for anon classes
This commit is contained in:
parent
929fdc1c1a
commit
03d7042d5c
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user