diff options
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend.h | 3 | ||||
-rw-r--r-- | Zend/zend_API.c | 2 | ||||
-rw-r--r-- | Zend/zend_compile.c | 6 | ||||
-rw-r--r-- | Zend/zend_compile.h | 18 | ||||
-rw-r--r-- | Zend/zend_inheritance.c | 10 | ||||
-rw-r--r-- | Zend/zend_interfaces.c | 4 | ||||
-rw-r--r-- | Zend/zend_opcode.c | 4 | ||||
-rw-r--r-- | Zend/zend_operators.c | 4 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 6 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 6 |
10 files changed, 26 insertions, 37 deletions
diff --git a/Zend/zend.h b/Zend/zend.h index ba577274d9..5ab9fdb532 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -115,6 +115,7 @@ typedef struct _zend_trait_alias { struct _zend_class_entry { char type; zend_string *name; + /* class_entry or string depending on ZEND_ACC_LINKED */ union { zend_class_entry *parent; zend_string *parent_name; @@ -163,7 +164,7 @@ struct _zend_class_entry { uint32_t num_interfaces; uint32_t num_traits; - /* class_entry or string(s) depending on ZEND_ACC_UNRESOLVED_INTERFACES */ + /* class_entry or string(s) depending on ZEND_ACC_LINKED */ union { zend_class_entry **interfaces; zend_class_name *interface_names; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 827ae6b4ab..199735ec4a 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2716,7 +2716,7 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class class_entry->type = ZEND_INTERNAL_CLASS; zend_initialize_class_data(class_entry, 0); - class_entry->ce_flags = ce_flags | ZEND_ACC_CONSTANTS_UPDATED; + class_entry->ce_flags = ce_flags | ZEND_ACC_CONSTANTS_UPDATED | ZEND_ACC_LINKED; class_entry->info.internal.module = EG(current_module); if (class_entry->info.internal.builtin_functions) { diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 4764329b57..69f09fa078 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6183,7 +6183,7 @@ void zend_compile_implements(zend_ast *ast) /* {{{ */ interface_names[i].lc_name = zend_string_tolower(interface_names[i].name); } - ce->ce_flags |= ZEND_ACC_IMPLEMENT_INTERFACES | ZEND_ACC_UNRESOLVED_INTERFACES; + ce->ce_flags |= ZEND_ACC_IMPLEMENT_INTERFACES; ce->num_interfaces = list->children; ce->interface_names = interface_names; } @@ -6280,7 +6280,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ ce->parent_name = zend_resolve_class_name(extends_name, extends_ast->kind == ZEND_AST_ZVAL ? extends_ast->attr : ZEND_NAME_FQ); zend_string_release_ex(extends_name, 0); - ce->ce_flags |= ZEND_ACC_INHERITED | ZEND_ACC_UNRESOLVED_PARENT; + ce->ce_flags |= ZEND_ACC_INHERITED; } CG(active_class_entry) = ce; @@ -6355,12 +6355,14 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ } CG(zend_lineno) = ast->lineno; zend_string_release(lcname); + ce->ce_flags |= ZEND_ACC_LINKED; return; } } } else { if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) { zend_string_release(lcname); + ce->ce_flags |= ZEND_ACC_LINKED; return; } } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 4534b0fee5..0dc63467a9 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -217,7 +217,7 @@ typedef struct _zend_oparray_context { #define ZEND_ACC_ABSTRACT (1 << 6) /* X | X | | */ #define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS (1 << 6) /* X | | | */ /* | | | */ -/* Class Flags (unused: 15...) | | | */ +/* Class Flags (unused: 13...) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -225,8 +225,8 @@ typedef struct _zend_oparray_context { #define ZEND_ACC_TRAIT (1 << 1) /* X | | | */ #define ZEND_ACC_ANON_CLASS (1 << 2) /* X | | | */ /* | | | */ -/* Bound anonymous class | | | */ -#define ZEND_ACC_ANON_BOUND (1 << 3) /* X | | | */ +/* Class linked with parent, interfacs and traits | | | */ +#define ZEND_ACC_LINKED (1 << 3) /* X | | | */ /* | | | */ /* class is abstarct, since it is set by any | | | */ /* abstract method | | | */ @@ -242,20 +242,14 @@ typedef struct _zend_oparray_context { /* Class extends another class | | | */ #define ZEND_ACC_INHERITED (1 << 9) /* X | | | */ /* | | | */ -/* Class extends another class | | | */ -#define ZEND_ACC_UNRESOLVED_PARENT (1 << 10) /* X | | | */ -/* | | | */ -/* Class implements interface(s) | | | */ -#define ZEND_ACC_IMPLEMENT_INTERFACES (1 << 11) /* X | | | */ -/* | | | */ /* Class implements interface(s) | | | */ -#define ZEND_ACC_UNRESOLVED_INTERFACES (1 << 12) /* X | | | */ +#define ZEND_ACC_IMPLEMENT_INTERFACES (1 << 10) /* X | | | */ /* | | | */ /* Class uses trait(s) | | | */ -#define ZEND_ACC_IMPLEMENT_TRAITS (1 << 13) /* X | | | */ +#define ZEND_ACC_IMPLEMENT_TRAITS (1 << 11) /* X | | | */ /* | | | */ /* User class has methods with static variables | | | */ -#define ZEND_HAS_STATIC_IN_METHODS (1 << 14) /* X | | | */ +#define ZEND_HAS_STATIC_IN_METHODS (1 << 12) /* X | | | */ /* | | | */ /* Function Flags (unused: 25...30) | | | */ /* ============== | | | */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 7220c2034f..7bf4cbcf12 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -719,7 +719,6 @@ static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_en uint32_t i, ce_num, if_num = iface->num_interfaces; zend_class_entry *entry; - ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); ce_num = ce->num_interfaces; if (ce->type == ZEND_INTERNAL_CLASS) { @@ -798,9 +797,8 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent } } - if (ce->ce_flags & ZEND_ACC_UNRESOLVED_PARENT) { + if (ce->parent_name) { zend_string_release_ex(ce->parent_name, 0); - ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_PARENT; } ce->parent = parent_ce; @@ -1032,7 +1030,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry zend_string *key; zend_class_constant *c; - ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED); for (i = 0; i < ce->num_interfaces; i++) { if (ce->interfaces[i] == NULL) { @@ -1090,8 +1088,6 @@ static void zend_do_implement_interfaces(zend_class_entry *ce) /* {{{ */ zend_class_constant *c; uint32_t i, j; - ZEND_ASSERT(ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES); - if (ce->parent && ce->parent->num_interfaces) { interfaces = emalloc(sizeof(zend_class_entry*) * (ce->parent->num_interfaces + ce->num_interfaces)); memcpy(interfaces, ce->parent->interfaces, sizeof(zend_class_entry*) * ce->parent->num_interfaces); @@ -1141,7 +1137,6 @@ static void zend_do_implement_interfaces(zend_class_entry *ce) /* {{{ */ ce->num_interfaces = num_interfaces; ce->interfaces = interfaces; - ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_INTERFACES; i = ce->parent ? ce->parent->num_interfaces : 0; for (; i < ce->num_interfaces; i++) { @@ -1912,6 +1907,7 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent) /* {{{ */ { + ce->ce_flags |= ZEND_ACC_LINKED; if (parent) { zend_do_inheritance(ce, parent); } diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 64d46c75e2..2e7f70c795 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -291,7 +291,7 @@ static int zend_implement_traversable(zend_class_entry *interface, zend_class_en return SUCCESS; } if (class_type->num_interfaces) { - ZEND_ASSERT(!(class_type->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_LINKED); for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) { return SUCCESS; @@ -320,7 +320,7 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { /* c-level get_iterator cannot be changed (exception being only Traversable is implemented) */ if (class_type->num_interfaces) { - ZEND_ASSERT(!(class_type->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_LINKED); for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { zend_error_noreturn(E_ERROR, "Class %s cannot implement both %s and %s at the same time", diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 60fb5dd367..64a49b57f1 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -218,7 +218,7 @@ ZEND_API void destroy_zend_class(zval *zv) } switch (ce->type) { case ZEND_USER_CLASS: - if (ce->ce_flags & ZEND_ACC_UNRESOLVED_PARENT) { + if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_LINKED)) { zend_string_release_ex(ce->parent_name, 0); } if (ce->default_properties_table) { @@ -266,7 +266,7 @@ ZEND_API void destroy_zend_class(zval *zv) } zend_hash_destroy(&ce->constants_table); if (ce->num_interfaces > 0) { - if (ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES) { + if (!(ce->ce_flags & ZEND_ACC_LINKED)) { uint32_t i; for (i = 0; i < ce->num_interfaces; i++) { diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 745ee86be8..2081338a01 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2279,7 +2279,7 @@ static zend_bool ZEND_FASTCALL instanceof_interface_only(const zend_class_entry uint32_t i; if (instance_ce->num_interfaces) { - ZEND_ASSERT(!(instance_ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + ZEND_ASSERT(instance_ce->ce_flags & ZEND_ACC_LINKED); for (i = 0; i < instance_ce->num_interfaces; i++) { if (instanceof_interface_only(instance_ce->interfaces[i], ce)) { return 1; @@ -2307,7 +2307,7 @@ static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *inst uint32_t i; if (instance_ce->num_interfaces) { - ZEND_ASSERT(!(instance_ce->ce_flags & ZEND_ACC_UNRESOLVED_INTERFACES)); + ZEND_ASSERT(instance_ce->ce_flags & ZEND_ACC_LINKED); for (i = 0; i < instance_ce->num_interfaces; i++) { if (instanceof_interface(instance_ce->interfaces[i], ce)) { return 1; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0b7ebf8f89..98a016cca2 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6692,12 +6692,11 @@ ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR) ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + if (ce->ce_flags & ZEND_ACC_LINKED) { ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } zend_do_link_class(ce, NULL); - ce->ce_flags |= ZEND_ACC_ANON_BOUND; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -6713,7 +6712,7 @@ ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, CONST, CONST, JMP_ADDR) ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + if (ce->ce_flags & ZEND_ACC_LINKED) { ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } @@ -6727,7 +6726,6 @@ ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, CONST, CONST, JMP_ADDR) } zend_do_link_class(ce, parent); - ce->ce_flags |= ZEND_ACC_ANON_BOUND; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ecde1bcddc..a82590574d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1596,12 +1596,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + if (ce->ce_flags & ZEND_ACC_LINKED) { ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } zend_do_link_class(ce, NULL); - ce->ce_flags |= ZEND_ACC_ANON_BOUND; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -5801,7 +5800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_S ce = Z_CE_P(zv); Z_CE_P(EX_VAR(opline->result.var)) = ce; - if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + if (ce->ce_flags & ZEND_ACC_LINKED) { ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } @@ -5815,7 +5814,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_S } zend_do_link_class(ce, parent); - ce->ce_flags |= ZEND_ACC_ANON_BOUND; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } |