summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-09-18 11:41:40 +0300
committerDmitry Stogov <dmitry@zend.com>2018-09-18 11:41:40 +0300
commit689c6fb188c9dfe5e428492b4b80f8d6f586a7e5 (patch)
tree8b6c9b130a77872b033c33c90cb67d5896e0e9b9 /Zend
parentb189c2432a4ba9bc111f2a4bb565ed9af09c8dc8 (diff)
downloadphp-git-689c6fb188c9dfe5e428492b4b80f8d6f586a7e5.tar.gz
Replace ZEND_ACC_ANON_BOUND, ZEND_ACC_UNRESOLVED_PARENT and ZEND_ACC_UNRESOLVED_INTERFACES with single ZEND_ACC_LINKED.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend.h3
-rw-r--r--Zend/zend_API.c2
-rw-r--r--Zend/zend_compile.c6
-rw-r--r--Zend/zend_compile.h18
-rw-r--r--Zend/zend_inheritance.c10
-rw-r--r--Zend/zend_interfaces.c4
-rw-r--r--Zend/zend_opcode.c4
-rw-r--r--Zend/zend_operators.c4
-rw-r--r--Zend/zend_vm_def.h6
-rw-r--r--Zend/zend_vm_execute.h6
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();
}