@@ -148,6 +148,36 @@ ecma_deref_object (ecma_object_t *object_p) /**< object */
148148 object_p -> type_flags_refs = (uint16_t ) (object_p -> type_flags_refs - ECMA_OBJECT_REF_ONE );
149149} /* ecma_deref_object */
150150
151+ /**
152+ * Mark objects referenced by arguments object
153+ */
154+ static void
155+ ecma_gc_mark_arguments_object (ecma_extended_object_t * ext_object_p ) /**< arguments object */
156+ {
157+ JERRY_ASSERT (ecma_get_object_type ((ecma_object_t * ) ext_object_p ) == ECMA_OBJECT_TYPE_PSEUDO_ARRAY );
158+
159+ ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) ext_object_p ;
160+ ecma_value_t * argv_p = (ecma_value_t * ) (arguments_p + 1 );
161+
162+ if (ext_object_p -> u .pseudo_array .extra_info & ECMA_ARGUMENTS_OBJECT_MAPPED )
163+ {
164+ ecma_mapped_arguments_t * mapped_arguments_p = (ecma_mapped_arguments_t * ) ext_object_p ;
165+ argv_p = (ecma_value_t * ) (mapped_arguments_p + 1 );
166+
167+ ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t , mapped_arguments_p -> lex_env ));
168+ }
169+
170+ uint32_t arguments_number = arguments_p -> header .u .pseudo_array .u2 .arguments_number ;
171+
172+ for (uint32_t i = 0 ; i < arguments_number ; i ++ )
173+ {
174+ if (ecma_is_value_object (argv_p [i ]))
175+ {
176+ ecma_gc_set_object_visited (ecma_get_object_from_value (argv_p [i ]));
177+ }
178+ }
179+ } /* ecma_gc_mark_arguments_object */
180+
151181/**
152182 * Mark referenced object from property
153183 */
@@ -695,10 +725,7 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
695725 {
696726 JERRY_ASSERT (ext_object_p -> u .pseudo_array .type == ECMA_PSEUDO_ARRAY_ARGUMENTS );
697727
698- ecma_object_t * lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t ,
699- ext_object_p -> u .pseudo_array .u2 .lex_env_cp );
700-
701- ecma_gc_set_object_visited (lex_env_p );
728+ ecma_gc_mark_arguments_object (ext_object_p );
702729 break ;
703730 }
704731 }
@@ -880,6 +907,39 @@ ecma_gc_free_native_pointer (ecma_property_t *property_p) /**< property */
880907 }
881908} /* ecma_gc_free_native_pointer */
882909
910+ /**
911+ * Free specified arguments object.
912+ */
913+ static size_t
914+ ecma_free_arguments_object (ecma_extended_object_t * ext_object_p ) /**< arguments object */
915+ {
916+ JERRY_ASSERT (ecma_get_object_type ((ecma_object_t * ) ext_object_p ) == ECMA_OBJECT_TYPE_PSEUDO_ARRAY );
917+
918+ size_t object_size = sizeof (ecma_unmapped_arguments_t );
919+
920+ if (ext_object_p -> u .pseudo_array .extra_info & ECMA_ARGUMENTS_OBJECT_MAPPED )
921+ {
922+ ecma_mapped_arguments_t * mapped_arguments_p = (ecma_mapped_arguments_t * ) ext_object_p ;
923+ object_size = sizeof (ecma_mapped_arguments_t );
924+
925+ ecma_compiled_code_t * byte_code_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t ,
926+ mapped_arguments_p -> byte_code );
927+
928+ ecma_bytecode_deref (byte_code_p );
929+ }
930+
931+ ecma_value_t * argv_p = (ecma_value_t * ) (((uint8_t * ) ext_object_p ) + object_size );
932+ ecma_unmapped_arguments_t * arguments_p = (ecma_unmapped_arguments_t * ) ext_object_p ;
933+ uint32_t arguments_number = arguments_p -> header .u .pseudo_array .u2 .arguments_number ;
934+
935+ for (uint32_t i = 0 ; i < arguments_number ; i ++ )
936+ {
937+ ecma_free_value_if_not_object (argv_p [i ]);
938+ }
939+
940+ return object_size + (arguments_number * sizeof (ecma_value_t ));
941+ } /* ecma_free_arguments_object */
942+
883943/**
884944 * Free specified fast access mode array object.
885945 */
@@ -1372,22 +1432,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
13721432 {
13731433 case ECMA_PSEUDO_ARRAY_ARGUMENTS :
13741434 {
1375- JERRY_ASSERT (ext_object_p -> u .pseudo_array .type == ECMA_PSEUDO_ARRAY_ARGUMENTS );
1376-
1377- uint32_t formal_params_number = ext_object_p -> u .pseudo_array .u1 .length ;
1378- ecma_value_t * arg_literal_p = (ecma_value_t * ) (ext_object_p + 1 );
1379-
1380- for (uint32_t i = 0 ; i < formal_params_number ; i ++ )
1381- {
1382- if (arg_literal_p [i ] != ECMA_VALUE_EMPTY )
1383- {
1384- ecma_string_t * name_p = ecma_get_string_from_value (arg_literal_p [i ]);
1385- ecma_deref_ecma_string (name_p );
1386- }
1387- }
1388-
1389- size_t formal_params_size = formal_params_number * sizeof (ecma_value_t );
1390- ext_object_size += formal_params_size ;
1435+ ext_object_size = ecma_free_arguments_object (ext_object_p );
13911436 break ;
13921437 }
13931438#if ENABLED (JERRY_BUILTIN_TYPEDARRAY )
0 commit comments