@@ -348,13 +348,26 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
348
348
{
349
349
ecma_extended_object_t * ext_func_p = (ecma_extended_object_t * ) object_p ;
350
350
351
- ecma_object_t * scope_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t ,
352
- ext_func_p -> u .function .scope_cp );
351
+ ecma_gc_set_object_visited (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t ,
352
+ ext_func_p -> u .function .scope_cp ));
353
+ }
354
+ break ;
355
+ }
356
+ #ifndef CONFIG_DISABLE_ES2015_ARROW_FUNCTION
357
+ case ECMA_OBJECT_TYPE_ARROW_FUNCTION :
358
+ {
359
+ ecma_arrow_function_t * arrow_func_p = (ecma_arrow_function_t * ) object_p ;
353
360
354
- ecma_gc_set_object_visited (scope_p );
361
+ ecma_gc_set_object_visited (ECMA_GET_NON_NULL_POINTER (ecma_object_t ,
362
+ arrow_func_p -> scope_cp ));
363
+
364
+ if (ecma_is_value_object (arrow_func_p -> this_binding ))
365
+ {
366
+ ecma_gc_set_object_visited (ecma_get_object_from_value (arrow_func_p -> this_binding ));
355
367
}
356
368
break ;
357
369
}
370
+ #endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
358
371
default :
359
372
{
360
373
break ;
@@ -554,7 +567,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
554
567
{
555
568
ecma_length_t arraybuffer_length = ext_object_p -> u .class_prop .u .length ;
556
569
size_t size = sizeof (ecma_extended_object_t ) + arraybuffer_length ;
557
- ecma_dealloc_extended_object (( ecma_extended_object_t * ) object_p , size );
570
+ ecma_dealloc_extended_object (object_p , size );
558
571
return ;
559
572
}
560
573
@@ -565,7 +578,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
565
578
ecma_free_value_if_not_object (ext_object_p -> u .class_prop .u .value );
566
579
ecma_free_values_collection (((ecma_promise_object_t * ) object_p )-> fulfill_reactions , false);
567
580
ecma_free_values_collection (((ecma_promise_object_t * ) object_p )-> reject_reactions , false);
568
- ecma_dealloc_extended_object (( ecma_extended_object_t * ) object_p , sizeof (ecma_promise_object_t ));
581
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_promise_object_t ));
569
582
return ;
570
583
}
571
584
#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */
@@ -576,15 +589,15 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
576
589
}
577
590
}
578
591
579
- ecma_dealloc_extended_object (( ecma_extended_object_t * ) object_p , ext_object_size );
592
+ ecma_dealloc_extended_object (object_p , ext_object_size );
580
593
return ;
581
594
}
582
595
583
596
if (ecma_get_object_is_builtin (object_p )
584
597
|| object_type == ECMA_OBJECT_TYPE_ARRAY
585
598
|| object_type == ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION )
586
599
{
587
- ecma_dealloc_extended_object (( ecma_extended_object_t * ) object_p , ext_object_size );
600
+ ecma_dealloc_extended_object (object_p , ext_object_size );
588
601
return ;
589
602
}
590
603
@@ -596,9 +609,24 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
596
609
ecma_bytecode_deref (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t ,
597
610
ext_func_p -> u .function .bytecode_cp ));
598
611
599
- ecma_dealloc_extended_object (ext_func_p , sizeof (ecma_extended_object_t ));
612
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_object_t ));
613
+ return ;
614
+ }
615
+
616
+ #ifndef CONFIG_DISABLE_ES2015_ARROW_FUNCTION
617
+ if (object_type == ECMA_OBJECT_TYPE_ARROW_FUNCTION )
618
+ {
619
+ ecma_arrow_function_t * arrow_func_p = (ecma_arrow_function_t * ) object_p ;
620
+
621
+ ecma_bytecode_deref (ECMA_GET_NON_NULL_POINTER (ecma_compiled_code_t ,
622
+ arrow_func_p -> bytecode_cp ));
623
+
624
+ ecma_free_value_if_not_object (arrow_func_p -> this_binding );
625
+
626
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_arrow_function_t ));
600
627
return ;
601
628
}
629
+ #endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
602
630
603
631
if (object_type == ECMA_OBJECT_TYPE_PSEUDO_ARRAY )
604
632
{
@@ -621,20 +649,18 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
621
649
}
622
650
623
651
size_t formal_params_size = formal_params_number * sizeof (jmem_cpointer_t );
624
- ecma_dealloc_extended_object (ext_object_p , sizeof (ecma_extended_object_t ) + formal_params_size );
652
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_object_t ) + formal_params_size );
625
653
return ;
626
654
}
627
655
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
628
656
case ECMA_PSEUDO_ARRAY_TYPEDARRAY :
629
657
{
630
- ecma_dealloc_extended_object ((ecma_extended_object_t * ) object_p ,
631
- sizeof (ecma_extended_object_t ));
658
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_object_t ));
632
659
return ;
633
660
}
634
661
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO :
635
662
{
636
- ecma_dealloc_extended_object ((ecma_extended_object_t * ) object_p ,
637
- sizeof (ecma_extended_typedarray_object_t ));
663
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_typedarray_object_t ));
638
664
return ;
639
665
}
640
666
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
@@ -657,7 +683,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
657
683
if (!ecma_is_value_integer_number (args_len_or_this ))
658
684
{
659
685
ecma_free_value_if_not_object (args_len_or_this );
660
- ecma_dealloc_extended_object (ext_function_p , sizeof (ecma_extended_object_t ));
686
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_object_t ));
661
687
return ;
662
688
}
663
689
@@ -670,7 +696,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
670
696
}
671
697
672
698
size_t args_size = ((size_t ) args_length ) * sizeof (ecma_value_t );
673
- ecma_dealloc_extended_object (ext_function_p , sizeof (ecma_extended_object_t ) + args_size );
699
+ ecma_dealloc_extended_object (object_p , sizeof (ecma_extended_object_t ) + args_size );
674
700
return ;
675
701
}
676
702
}
0 commit comments