mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Immutable clases and op_arrays.
Squashed commit of the following: commitcd0c36c3f9
Merge:4740dabb84
ad6738e886
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 14:43:38 2018 +0300 Merge branch 'master' into immutable * master: Remove the "auto" encoding Fixed bug #77025 Add vtbls for EUC-TW encoding commit4740dabb84
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 14:12:28 2018 +0300 Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes. commitad7a78b253
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:46:30 2018 +0300 Added comment commit0276ea5187
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:42:43 2018 +0300 Added type cast commitc63fc5d5f1
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:36:51 2018 +0300 Moved static class members initialization into the proper place. commitb945548e93
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:21:03 2018 +0300 Removed redundand assertion commitd5a4108840
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:19:13 2018 +0300 Removed duplicate code commit8dadca8864
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 11:05:43 2018 +0300 Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros. commit9ef07c88bd
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 10:48:29 2018 +0300 typo commita06f0f3d3a
Merge:94099586ec
3412345ffe
Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Oct 17 10:47:07 2018 +0300 Merge branch 'master' into immutable * master: Remove unused variable makefile_am_files Classify object handlers are required/optional Add support for getting SKIP_TAGSTART and SKIP_WHITE options Remove some obsolete config_vars.mk occurrences Remove bsd_converted from .gitignore Remove configuration parser and scanners ignores Remove obsolete buildconf.stamp from .gitignore [ci skip] Add magicdata.patch exception to .gitignore Remove outdated ext/spl/examples items from .gitignore Remove unused test.inc in ext/iconv/tests commit94099586ec
Author: Dmitry Stogov <dmitry@zend.com> Date: Mon Oct 15 23:34:01 2018 +0300 Immutable clases and op_arrays
This commit is contained in:
parent
ad6738e886
commit
d57cd36e47
31 changed files with 838 additions and 348 deletions
|
@ -64,11 +64,16 @@ static zend_function *zend_duplicate_function(zend_function *func, zend_class_en
|
|||
/* reuse the same op_array structure */
|
||||
return func;
|
||||
}
|
||||
if (!(GC_FLAGS(func->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) {
|
||||
GC_ADDREF(func->op_array.static_variables);
|
||||
}
|
||||
new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
|
||||
memcpy(new_function, func, sizeof(zend_op_array));
|
||||
if (ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr)) {
|
||||
/* See: Zend/tests/method_static_var.phpt */
|
||||
new_function->op_array.static_variables = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr);
|
||||
}
|
||||
if (!(GC_FLAGS(new_function->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) {
|
||||
GC_ADDREF(new_function->op_array.static_variables);
|
||||
}
|
||||
ZEND_MAP_PTR_INIT(new_function->op_array.static_variables_ptr, &new_function->op_array.static_variables);
|
||||
}
|
||||
return new_function;
|
||||
}
|
||||
|
@ -87,23 +92,9 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
|
|||
if (EXPECTED(!ce->get_iterator)) {
|
||||
ce->get_iterator = parent->get_iterator;
|
||||
}
|
||||
if (EXPECTED(!ce->iterator_funcs_ptr) && UNEXPECTED(parent->iterator_funcs_ptr)) {
|
||||
if (ce->type == ZEND_INTERNAL_CLASS) {
|
||||
ce->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
|
||||
if (parent->iterator_funcs_ptr->zf_new_iterator) {
|
||||
ce->iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&ce->function_table, "getiterator", sizeof("getiterator") - 1);
|
||||
}
|
||||
if (parent->iterator_funcs_ptr->zf_current) {
|
||||
ce->iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&ce->function_table, "rewind", sizeof("rewind") - 1);
|
||||
ce->iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&ce->function_table, "valid", sizeof("valid") - 1);
|
||||
ce->iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&ce->function_table, "key", sizeof("key") - 1);
|
||||
ce->iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&ce->function_table, "current", sizeof("current") - 1);
|
||||
ce->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&ce->function_table, "next", sizeof("next") - 1);
|
||||
}
|
||||
} else {
|
||||
ce->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
|
||||
memset(ce->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
|
||||
}
|
||||
if (parent->iterator_funcs_ptr) {
|
||||
/* Must be initialized through iface->interface_gets_implemented() */
|
||||
ZEND_ASSERT(ce->iterator_funcs_ptr);
|
||||
}
|
||||
if (EXPECTED(!ce->__get)) {
|
||||
ce->__get = parent->__get;
|
||||
|
@ -894,6 +885,10 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
|
|||
dst = end + parent_ce->default_static_members_count;
|
||||
ce->default_static_members_table = end;
|
||||
}
|
||||
if (CE_STATIC_MEMBERS(parent_ce) == NULL) {
|
||||
ZEND_ASSERT(parent_ce->type == ZEND_INTERNAL_CLASS || (parent_ce->ce_flags & ZEND_ACC_IMMUTABLE));
|
||||
zend_class_init_statics(parent_ce);
|
||||
}
|
||||
if (UNEXPECTED(parent_ce->type != ce->type)) {
|
||||
/* User class extends internal */
|
||||
if (UNEXPECTED(zend_update_class_constants(parent_ce) != SUCCESS)) {
|
||||
|
@ -910,7 +905,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
|
|||
}
|
||||
} while (dst != end);
|
||||
} else if (ce->type == ZEND_USER_CLASS) {
|
||||
src = parent_ce->default_static_members_table + parent_ce->default_static_members_count;
|
||||
src = CE_STATIC_MEMBERS(parent_ce) + parent_ce->default_static_members_count;
|
||||
do {
|
||||
dst--;
|
||||
src--;
|
||||
|
@ -936,18 +931,14 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
|
|||
} while (dst != end);
|
||||
}
|
||||
ce->default_static_members_count += parent_ce->default_static_members_count;
|
||||
if (ce->type == ZEND_USER_CLASS) {
|
||||
ce->static_members_table = ce->default_static_members_table;
|
||||
#ifdef ZTS
|
||||
} else if (!ce->static_members_table_idx) {
|
||||
CG(last_static_member)++;
|
||||
ce->static_members_table_idx = CG(last_static_member);
|
||||
if (CG(static_members_table)) {
|
||||
/* Support for run-time declaration: dl() */
|
||||
CG(static_members_table) = realloc(CG(static_members_table), (CG(last_static_member) + 1) * sizeof(zval*));
|
||||
CG(static_members_table)[ce->static_members_table_idx] = NULL;
|
||||
if (!ZEND_MAP_PTR(ce->static_members_table)) {
|
||||
ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS);
|
||||
if (!EG(current_execute_data)) {
|
||||
ZEND_MAP_PTR_NEW(ce->static_members_table);
|
||||
} else {
|
||||
/* internal class loaded by dl() */
|
||||
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1315,6 +1306,10 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
|
|||
} else {
|
||||
new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
|
||||
memcpy(new_fn, fn, sizeof(zend_op_array));
|
||||
new_fn->op_array.fn_flags &= ~ZEND_ACC_IMMUTABLE;
|
||||
ZEND_MAP_PTR_INIT(new_fn->op_array.run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
|
||||
ZEND_MAP_PTR_SET(new_fn->op_array.run_time_cache, NULL);
|
||||
ZEND_MAP_PTR_INIT(new_fn->op_array.static_variables_ptr, &new_fn->op_array.static_variables);
|
||||
}
|
||||
fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
|
||||
zend_add_magic_methods(ce, key, fn);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue