]> granicus.if.org Git - php/commitdiff
Set PROPERTY_TYPES_RESOLVED flag for internal classes
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 4 Jul 2019 08:28:12 +0000 (10:28 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 4 Jul 2019 08:32:36 +0000 (10:32 +0200)
Also make sure that the resolution happens before preloading runs.

Zend/zend.c

index c3a99d2df87842f9b604063b5c34d295cc74804a..af4ac2981cd320a6e66f4e8d1e6a00baffdd89bb 100644 (file)
@@ -956,7 +956,11 @@ static void zend_resolve_property_types(void) /* {{{ */
        zend_property_info *prop_info;
 
        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) {
                                if (ZEND_TYPE_IS_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();
                }
+               ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
        } ZEND_HASH_FOREACH_END();
 }
 /* }}} */
@@ -986,6 +991,8 @@ int zend_post_startup(void) /* {{{ */
        zend_executor_globals *executor_globals = ts_resource(executor_globals_id);
 #endif
 
+       zend_resolve_property_types();
+
        if (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
        *GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table;
        *GLOBAL_CLASS_TABLE = *compiler_globals->class_table;