diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2018-07-11 18:56:10 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2018-07-11 18:56:10 +0300 |
| commit | 85ee47eda00d68219f9ff34965bdede1e45f1f63 (patch) | |
| tree | d8e04f2480b746e1241c57d39dbe6a54f1eec130 /ext | |
| parent | 2367e649bc98f77202351af9079d6577d072228b (diff) | |
| download | php-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.c | 26 | ||||
| -rw-r--r-- | ext/opcache/zend_file_cache.c | 97 | ||||
| -rw-r--r-- | ext/opcache/zend_persist.c | 38 | ||||
| -rw-r--r-- | ext/opcache/zend_persist_calc.c | 33 | ||||
| -rw-r--r-- | ext/reflection/php_reflection.c | 6 |
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++; |
