summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-07-11 18:56:10 +0300
committerDmitry Stogov <dmitry@zend.com>2018-07-11 18:56:10 +0300
commit85ee47eda00d68219f9ff34965bdede1e45f1f63 (patch)
treed8e04f2480b746e1241c57d39dbe6a54f1eec130 /ext
parent2367e649bc98f77202351af9079d6577d072228b (diff)
downloadphp-git-85ee47eda00d68219f9ff34965bdede1e45f1f63.tar.gz
Changed structure of zend_class_entry.trait_aliases and zend_class_entry.trait_precedences to avoid keeping "intermediate" trait references, that are used only during inheritance.
Diffstat (limited to 'ext')
-rw-r--r--ext/opcache/zend_accelerator_util_funcs.c26
-rw-r--r--ext/opcache/zend_file_cache.c97
-rw-r--r--ext/opcache/zend_persist.c38
-rw-r--r--ext/opcache/zend_persist_calc.c33
-rw-r--r--ext/reflection/php_reflection.c6
5 files changed, 55 insertions, 145 deletions
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c
index d1e9b5571c..707c49533f 100644
--- a/ext/opcache/zend_accelerator_util_funcs.c
+++ b/ext/opcache/zend_accelerator_util_funcs.c
@@ -437,8 +437,6 @@ static void zend_class_copy_ctor(zend_class_entry **pce)
while (ce->trait_aliases[i]) {
trait_aliases[i] = emalloc(sizeof(zend_trait_alias));
memcpy(trait_aliases[i], ce->trait_aliases[i], sizeof(zend_trait_alias));
- trait_aliases[i]->trait_method = emalloc(sizeof(zend_trait_method_reference));
- memcpy(trait_aliases[i]->trait_method, ce->trait_aliases[i]->trait_method, sizeof(zend_trait_method_reference));
i++;
}
trait_aliases[i] = NULL;
@@ -455,28 +453,8 @@ static void zend_class_copy_ctor(zend_class_entry **pce)
trait_precedences = emalloc(sizeof(zend_trait_precedence*) * (i + 1));
i = 0;
while (ce->trait_precedences[i]) {
- trait_precedences[i] = emalloc(sizeof(zend_trait_precedence));
- memcpy(trait_precedences[i], ce->trait_precedences[i], sizeof(zend_trait_precedence));
- trait_precedences[i]->trait_method = emalloc(sizeof(zend_trait_method_reference));
- memcpy(trait_precedences[i]->trait_method, ce->trait_precedences[i]->trait_method, sizeof(zend_trait_method_reference));
-
- if (trait_precedences[i]->exclude_from_classes) {
- zend_string **exclude_from_classes;
- int j = 0;
-
- while (trait_precedences[i]->exclude_from_classes[j].class_name) {
- j++;
- }
- exclude_from_classes = emalloc(sizeof(zend_string*) * (j + 1));
- j = 0;
- while (trait_precedences[i]->exclude_from_classes[j].class_name) {
- exclude_from_classes[j] =
- trait_precedences[i]->exclude_from_classes[j].class_name;
- j++;
- }
- exclude_from_classes[j] = NULL;
- trait_precedences[i]->exclude_from_classes = (void*)exclude_from_classes;
- }
+ trait_precedences[i] = emalloc(sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
+ memcpy(trait_precedences[i], ce->trait_precedences[i], sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
i++;
}
trait_precedences[i] = NULL;
diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c
index 3f405c6118..6190760049 100644
--- a/ext/opcache/zend_file_cache.c
+++ b/ext/opcache/zend_file_cache.c
@@ -648,19 +648,11 @@ static void zend_file_cache_serialize_class(zval *zv,
q = *p;
UNSERIALIZE_PTR(q);
- if (q->trait_method) {
- zend_trait_method_reference *m;
-
- SERIALIZE_PTR(q->trait_method);
- m = q->trait_method;
- UNSERIALIZE_PTR(m);
-
- if (m->method_name) {
- SERIALIZE_STR(m->method_name);
- }
- if (m->class_name) {
- SERIALIZE_STR(m->class_name);
- }
+ if (q->trait_method.method_name) {
+ SERIALIZE_STR(q->trait_method.method_name);
+ }
+ if (q->trait_method.class_name) {
+ SERIALIZE_STR(q->trait_method.class_name);
}
if (q->alias) {
@@ -672,6 +664,7 @@ static void zend_file_cache_serialize_class(zval *zv,
if (ce->trait_precedences) {
zend_trait_precedence **p, *q;
+ int j;
SERIALIZE_PTR(ce->trait_precedences);
p = ce->trait_precedences;
@@ -682,32 +675,15 @@ static void zend_file_cache_serialize_class(zval *zv,
q = *p;
UNSERIALIZE_PTR(q);
- if (q->trait_method) {
- zend_trait_method_reference *m;
-
- SERIALIZE_PTR(q->trait_method);
- m = q->trait_method;
- UNSERIALIZE_PTR(m);
-
- if (m->method_name) {
- SERIALIZE_STR(m->method_name);
- }
- if (m->class_name) {
- SERIALIZE_STR(m->class_name);
- }
+ if (q->trait_method.method_name) {
+ SERIALIZE_STR(q->trait_method.method_name);
+ }
+ if (q->trait_method.class_name) {
+ SERIALIZE_STR(q->trait_method.class_name);
}
- if (q->exclude_from_classes) {
- zend_string **s;
-
- SERIALIZE_PTR(q->exclude_from_classes);
- s = (zend_string**)q->exclude_from_classes;
- UNSERIALIZE_PTR(s);
-
- while (*s) {
- SERIALIZE_STR(*s);
- s++;
- }
+ for (j = 0; j < q->num_excludes; j++) {
+ SERIALIZE_STR(q->exclude_class_names[j]);
}
p++;
}
@@ -1278,18 +1254,11 @@ static void zend_file_cache_unserialize_class(zval *zv,
UNSERIALIZE_PTR(*p);
q = *p;
- if (q->trait_method) {
- zend_trait_method_reference *m;
-
- UNSERIALIZE_PTR(q->trait_method);
- m = q->trait_method;
-
- if (m->method_name) {
- UNSERIALIZE_STR(m->method_name);
- }
- if (m->class_name) {
- UNSERIALIZE_STR(m->class_name);
- }
+ if (q->trait_method.method_name) {
+ UNSERIALIZE_STR(q->trait_method.method_name);
+ }
+ if (q->trait_method.class_name) {
+ UNSERIALIZE_STR(q->trait_method.class_name);
}
if (q->alias) {
@@ -1301,6 +1270,7 @@ static void zend_file_cache_unserialize_class(zval *zv,
if (ce->trait_precedences) {
zend_trait_precedence **p, *q;
+ int j;
UNSERIALIZE_PTR(ce->trait_precedences);
p = ce->trait_precedences;
@@ -1309,30 +1279,15 @@ static void zend_file_cache_unserialize_class(zval *zv,
UNSERIALIZE_PTR(*p);
q = *p;
- if (q->trait_method) {
- zend_trait_method_reference *m;
-
- UNSERIALIZE_PTR(q->trait_method);
- m = q->trait_method;
-
- if (m->method_name) {
- UNSERIALIZE_STR(m->method_name);
- }
- if (m->class_name) {
- UNSERIALIZE_STR(m->class_name);
- }
+ if (q->trait_method.method_name) {
+ UNSERIALIZE_STR(q->trait_method.method_name);
+ }
+ if (q->trait_method.class_name) {
+ UNSERIALIZE_STR(q->trait_method.class_name);
}
- if (q->exclude_from_classes) {
- zend_string **s;
-
- UNSERIALIZE_PTR(q->exclude_from_classes);
- s = (zend_string**)q->exclude_from_classes;
-
- while (*s) {
- UNSERIALIZE_STR(*s);
- s++;
- }
+ for (j = 0; j < q->num_excludes; j++) {
+ UNSERIALIZE_STR(q->exclude_class_names[j]);
}
p++;
}
diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c
index ecd0da5163..f7310232e5 100644
--- a/ext/opcache/zend_persist.c
+++ b/ext/opcache/zend_persist.c
@@ -775,16 +775,11 @@ static void zend_persist_class_entry(zval *zv)
if (ce->trait_aliases) {
int i = 0;
while (ce->trait_aliases[i]) {
- if (ce->trait_aliases[i]->trait_method) {
- if (ce->trait_aliases[i]->trait_method->method_name) {
- zend_accel_store_interned_string(ce->trait_aliases[i]->trait_method->method_name);
- }
- if (ce->trait_aliases[i]->trait_method->class_name) {
- zend_accel_store_interned_string(ce->trait_aliases[i]->trait_method->class_name);
- }
- ce->trait_aliases[i]->trait_method->ce = NULL;
- zend_accel_store(ce->trait_aliases[i]->trait_method,
- sizeof(zend_trait_method_reference));
+ if (ce->trait_aliases[i]->trait_method.method_name) {
+ zend_accel_store_interned_string(ce->trait_aliases[i]->trait_method.method_name);
+ }
+ if (ce->trait_aliases[i]->trait_method.class_name) {
+ zend_accel_store_interned_string(ce->trait_aliases[i]->trait_method.class_name);
}
if (ce->trait_aliases[i]->alias) {
@@ -800,26 +795,17 @@ static void zend_persist_class_entry(zval *zv)
if (ce->trait_precedences) {
int i = 0;
+ int j;
while (ce->trait_precedences[i]) {
- zend_accel_store_interned_string(ce->trait_precedences[i]->trait_method->method_name);
- zend_accel_store_interned_string(ce->trait_precedences[i]->trait_method->class_name);
- ce->trait_precedences[i]->trait_method->ce = NULL;
- zend_accel_store(ce->trait_precedences[i]->trait_method,
- sizeof(zend_trait_method_reference));
-
- if (ce->trait_precedences[i]->exclude_from_classes) {
- int j = 0;
-
- while (ce->trait_precedences[i]->exclude_from_classes[j].class_name) {
- zend_accel_store_interned_string(ce->trait_precedences[i]->exclude_from_classes[j].class_name);
- j++;
- }
- zend_accel_store(ce->trait_precedences[i]->exclude_from_classes,
- sizeof(zend_class_entry*) * (j + 1));
+ zend_accel_store_interned_string(ce->trait_precedences[i]->trait_method.method_name);
+ zend_accel_store_interned_string(ce->trait_precedences[i]->trait_method.class_name);
+
+ for (j = 0; j < ce->trait_precedences[i]->num_excludes; j++) {
+ zend_accel_store_interned_string(ce->trait_precedences[i]->exclude_class_names[j]);
}
- zend_accel_store(ce->trait_precedences[i], sizeof(zend_trait_precedence));
+ zend_accel_store(ce->trait_precedences[i], sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
i++;
}
zend_accel_store(
diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c
index 0291464c4e..4e08d754c7 100644
--- a/ext/opcache/zend_persist_calc.c
+++ b/ext/opcache/zend_persist_calc.c
@@ -345,14 +345,11 @@ static void zend_persist_class_entry_calc(zval *zv)
if (ce->trait_aliases) {
int i = 0;
while (ce->trait_aliases[i]) {
- if (ce->trait_aliases[i]->trait_method) {
- if (ce->trait_aliases[i]->trait_method->method_name) {
- ADD_INTERNED_STRING(ce->trait_aliases[i]->trait_method->method_name, 0);
- }
- if (ce->trait_aliases[i]->trait_method->class_name) {
- ADD_INTERNED_STRING(ce->trait_aliases[i]->trait_method->class_name, 0);
- }
- ADD_SIZE(sizeof(zend_trait_method_reference));
+ if (ce->trait_aliases[i]->trait_method.method_name) {
+ ADD_INTERNED_STRING(ce->trait_aliases[i]->trait_method.method_name, 0);
+ }
+ if (ce->trait_aliases[i]->trait_method.class_name) {
+ ADD_INTERNED_STRING(ce->trait_aliases[i]->trait_method.class_name, 0);
}
if (ce->trait_aliases[i]->alias) {
@@ -366,22 +363,16 @@ static void zend_persist_class_entry_calc(zval *zv)
if (ce->trait_precedences) {
int i = 0;
+ int j;
while (ce->trait_precedences[i]) {
- ADD_INTERNED_STRING(ce->trait_precedences[i]->trait_method->method_name, 0);
- ADD_INTERNED_STRING(ce->trait_precedences[i]->trait_method->class_name, 0);
- ADD_SIZE(sizeof(zend_trait_method_reference));
-
- if (ce->trait_precedences[i]->exclude_from_classes) {
- int j = 0;
-
- while (ce->trait_precedences[i]->exclude_from_classes[j].class_name) {
- ADD_INTERNED_STRING(ce->trait_precedences[i]->exclude_from_classes[j].class_name, 0);
- j++;
- }
- ADD_SIZE(sizeof(zend_class_entry*) * (j + 1));
+ ADD_INTERNED_STRING(ce->trait_precedences[i]->trait_method.method_name, 0);
+ ADD_INTERNED_STRING(ce->trait_precedences[i]->trait_method.class_name, 0);
+
+ for (j = 0; j < ce->trait_precedences[i]->num_excludes; j++) {
+ ADD_INTERNED_STRING(ce->trait_precedences[i]->exclude_class_names[j], 0);
}
- ADD_SIZE(sizeof(zend_trait_precedence));
+ ADD_SIZE(sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
i++;
}
ADD_SIZE(sizeof(zend_trait_precedence*) * (i + 1));
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index cba4f1d54a..87220dd7d3 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -4939,12 +4939,12 @@ ZEND_METHOD(reflection_class, getTraitAliases)
array_init(return_value);
while (ce->trait_aliases[i]) {
zend_string *mname;
- zend_trait_method_reference *cur_ref = ce->trait_aliases[i]->trait_method;
+ zend_trait_method_reference *cur_ref = &ce->trait_aliases[i]->trait_method;
if (ce->trait_aliases[i]->alias) {
- mname = zend_string_alloc(ZSTR_LEN(cur_ref->ce->name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
- snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->ce->name), ZSTR_VAL(cur_ref->method_name));
+ mname = zend_string_alloc(ZSTR_LEN(cur_ref->class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
+ snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->class_name), ZSTR_VAL(cur_ref->method_name));
add_assoc_str_ex(return_value, ZSTR_VAL(ce->trait_aliases[i]->alias), ZSTR_LEN(ce->trait_aliases[i]->alias), mname);
}
i++;