@@ -149,6 +149,33 @@ ecma_deref_object (ecma_object_t *object_p) /**< object */
149149 object_p -> type_flags_refs = (uint16_t ) (object_p -> type_flags_refs - ECMA_OBJECT_REF_ONE );
150150} /* ecma_deref_object */
151151
152+ /**
153+ * Mark objects referenced by global object
154+ */
155+ static void
156+ ecma_gc_mark_global_object (ecma_global_object_t * global_object_p ) /**< global object */
157+ {
158+ JERRY_ASSERT (global_object_p -> extended_object .u .built_in .routine_id == 0 );
159+
160+ ecma_gc_set_object_visited (ECMA_GET_NON_NULL_POINTER (ecma_object_t , global_object_p -> global_env_cp ));
161+
162+ #if ENABLED (JERRY_ESNEXT )
163+ if (global_object_p -> global_scope_cp != global_object_p -> global_env_cp )
164+ {
165+ ecma_gc_set_object_visited (ECMA_GET_NON_NULL_POINTER (ecma_object_t , global_object_p -> global_scope_cp ));
166+ }
167+ #endif /* ENABLED (JERRY_ESNEXT) */
168+
169+ jmem_cpointer_t * builtin_objects_p = global_object_p -> builtin_objects ;
170+ for (int i = 0 ; i < ECMA_BUILTIN_OBJECTS_COUNT ; i ++ )
171+ {
172+ if (builtin_objects_p [i ] != JMEM_CP_NULL )
173+ {
174+ ecma_gc_set_object_visited (ECMA_GET_NON_NULL_POINTER (ecma_object_t , builtin_objects_p [i ]));
175+ }
176+ }
177+ } /* ecma_gc_mark_global_object */
178+
152179/**
153180 * Mark objects referenced by arguments object
154181 */
@@ -620,14 +647,52 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
620647 {
621648 ecma_object_t * binding_object_p = ecma_get_lex_env_binding_object (object_p );
622649 ecma_gc_set_object_visited (binding_object_p );
623-
624650 return ;
625651 }
626652 }
627653 else
628654 {
629- switch (ecma_get_object_type (object_p ))
655+ ecma_object_type_t object_type = ecma_get_object_type (object_p );
656+
657+ #if ENABLED (JERRY_BUILTIN_REALMS )
658+ if (JERRY_UNLIKELY (ecma_get_object_is_builtin (object_p )))
659+ {
660+ ecma_value_t realm_value ;
661+
662+ if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN (object_type ))
663+ {
664+ realm_value = ((ecma_extended_built_in_object_t * ) object_p )-> built_in .realm_value ;
665+ }
666+ else
667+ {
668+ ecma_extended_object_t * extended_object_p = (ecma_extended_object_t * ) object_p ;
669+
670+ if (object_type == ECMA_OBJECT_TYPE_GENERAL
671+ && extended_object_p -> u .built_in .id == ECMA_BUILTIN_ID_GLOBAL )
672+ {
673+ ecma_gc_mark_global_object ((ecma_global_object_t * ) object_p );
674+ }
675+
676+ realm_value = extended_object_p -> u .built_in .realm_value ;
677+ }
678+
679+ ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t , realm_value ));
680+ }
681+ #endif /* ENABLED (JERRY_BUILTIN_REALMS) */
682+
683+ switch (object_type )
630684 {
685+ #if !ENABLED (JERRY_BUILTIN_REALMS )
686+ case ECMA_OBJECT_TYPE_GENERAL :
687+ {
688+ if (JERRY_UNLIKELY (ecma_get_object_is_builtin (object_p ))
689+ && ((ecma_extended_object_t * ) object_p )-> u .built_in .id == ECMA_BUILTIN_ID_GLOBAL )
690+ {
691+ ecma_gc_mark_global_object ((ecma_global_object_t * ) object_p );
692+ }
693+ break ;
694+ }
695+ #endif /* !ENABLED (JERRY_BUILTIN_REALMS) */
631696 case ECMA_OBJECT_TYPE_CLASS :
632697 {
633698 ecma_extended_object_t * ext_object_p = (ecma_extended_object_t * ) object_p ;
@@ -1305,23 +1370,24 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
13051370 {
13061371 uint8_t length_and_bitset_size ;
13071372
1308- if (object_type == ECMA_OBJECT_TYPE_CLASS || object_type == ECMA_OBJECT_TYPE_ARRAY )
1373+ if (ECMA_BUILTIN_IS_EXTENDED_BUILT_IN ( object_type ) )
13091374 {
13101375 ext_object_size = sizeof (ecma_extended_built_in_object_t );
13111376 length_and_bitset_size = ((ecma_extended_built_in_object_t * ) object_p )-> built_in .u .length_and_bitset_size ;
13121377 ext_object_size += sizeof (uint64_t ) * (length_and_bitset_size >> ECMA_BUILT_IN_BITSET_SHIFT );
13131378 }
13141379 else
13151380 {
1316- if (object_type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION
1317- && ecma_builtin_function_is_routine (object_p ))
1381+ ecma_extended_object_t * extended_object_p = (ecma_extended_object_t * ) object_p ;
1382+
1383+ if (extended_object_p -> u .built_in .routine_id > 0 )
13181384 {
1319- #if ENABLED (JERRY_ESNEXT )
1320- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
1385+ JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_NATIVE_FUNCTION );
13211386
1322- if (ext_obj_p -> u .built_in .id == ECMA_BUILTIN_ID_HANDLER )
1387+ #if ENABLED (JERRY_ESNEXT )
1388+ if (extended_object_p -> u .built_in .id == ECMA_BUILTIN_ID_HANDLER )
13231389 {
1324- switch (ext_obj_p -> u .built_in .routine_id )
1390+ switch (extended_object_p -> u .built_in .routine_id )
13251391 {
13261392 case ECMA_NATIVE_HANDLER_PROMISE_RESOLVE :
13271393 case ECMA_NATIVE_HANDLER_PROMISE_REJECT :
@@ -1367,6 +1433,11 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
13671433 }
13681434#endif /* ENABLED (JERRY_ESNEXT) */
13691435 }
1436+ else if (extended_object_p -> u .built_in .id == ECMA_BUILTIN_ID_GLOBAL )
1437+ {
1438+ JERRY_ASSERT (object_type == ECMA_OBJECT_TYPE_GENERAL );
1439+ ext_object_size = sizeof (ecma_global_object_t );
1440+ }
13701441 else
13711442 {
13721443 length_and_bitset_size = ((ecma_extended_object_t * ) object_p )-> u .built_in .u .length_and_bitset_size ;
0 commit comments