Set PROPERTY_TYPES_RESOLVED flag for internal classes

Also make sure that the resolution happens before preloading runs.
This commit is contained in:
Nikita Popov 2019-07-04 10:28:12 +02:00
parent 09041151de
commit 1fea887cc0

View file

@ -956,7 +956,11 @@ static void zend_resolve_property_types(void) /* {{{ */
zend_property_info *prop_info; zend_property_info *prop_info;
ZEND_HASH_FOREACH_PTR(CG(class_table), ce) { ZEND_HASH_FOREACH_PTR(CG(class_table), ce) {
if (UNEXPECTED(ce->type == ZEND_INTERNAL_CLASS && ZEND_CLASS_HAS_TYPE_HINTS(ce))) { if (ce->type != ZEND_INTERNAL_CLASS) {
continue;
}
if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) {
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
if (ZEND_TYPE_IS_NAME(prop_info->type)) { if (ZEND_TYPE_IS_NAME(prop_info->type)) {
zend_string *type_name = ZEND_TYPE_NAME(prop_info->type); zend_string *type_name = ZEND_TYPE_NAME(prop_info->type);
@ -970,6 +974,7 @@ static void zend_resolve_property_types(void) /* {{{ */
} }
} ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END();
} }
ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
} ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END();
} }
/* }}} */ /* }}} */
@ -986,6 +991,8 @@ int zend_post_startup(void) /* {{{ */
zend_executor_globals *executor_globals = ts_resource(executor_globals_id); zend_executor_globals *executor_globals = ts_resource(executor_globals_id);
#endif #endif
zend_resolve_property_types();
if (zend_post_startup_cb) { if (zend_post_startup_cb) {
int (*cb)(void) = zend_post_startup_cb; int (*cb)(void) = zend_post_startup_cb;
@ -995,8 +1002,6 @@ int zend_post_startup(void) /* {{{ */
} }
} }
zend_resolve_property_types();
#ifdef ZTS #ifdef ZTS
*GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table; *GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table;
*GLOBAL_CLASS_TABLE = *compiler_globals->class_table; *GLOBAL_CLASS_TABLE = *compiler_globals->class_table;