Skip to content

Commit 9f0cf9e

Browse files
zherczegyichoi
authored andcommitted
Implement this binding for arrow functions.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 1cc7cb5 commit 9f0cf9e

File tree

12 files changed

+362
-146
lines changed

12 files changed

+362
-146
lines changed

jerry-core/ecma/base/ecma-alloc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,14 @@ ecma_alloc_extended_object (size_t size) /**< size of object */
131131
* Dealloc memory of an extended object
132132
*/
133133
inline void __attr_always_inline___
134-
ecma_dealloc_extended_object (ecma_extended_object_t *ext_object_p, /**< property pair to be freed */
134+
ecma_dealloc_extended_object (ecma_object_t *object_p, /**< extended object */
135135
size_t size) /**< size of object */
136136
{
137137
#ifdef JMEM_STATS
138138
jmem_stats_free_object_bytes (size);
139139
#endif /* JMEM_STATS */
140140

141-
jmem_heap_free_block (ext_object_p, size);
141+
jmem_heap_free_block (object_p, size);
142142
} /* ecma_dealloc_extended_object */
143143

144144
/**

jerry-core/ecma/base/ecma-alloc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ ecma_extended_object_t *ecma_alloc_extended_object (size_t size);
4747
/**
4848
* Dealloc memory of an extended object
4949
*/
50-
void ecma_dealloc_extended_object (ecma_extended_object_t *ext_object_p, size_t size);
50+
void ecma_dealloc_extended_object (ecma_object_t *object_p, size_t size);
5151

5252
/**
5353
* Allocate memory for ecma-number

jerry-core/ecma/base/ecma-gc.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -348,13 +348,26 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
348348
{
349349
ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) object_p;
350350

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;
353360

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));
355367
}
356368
break;
357369
}
370+
#endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
358371
default:
359372
{
360373
break;
@@ -554,7 +567,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
554567
{
555568
ecma_length_t arraybuffer_length = ext_object_p->u.class_prop.u.length;
556569
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);
558571
return;
559572
}
560573

@@ -565,7 +578,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
565578
ecma_free_value_if_not_object (ext_object_p->u.class_prop.u.value);
566579
ecma_free_values_collection (((ecma_promise_object_t *) object_p)->fulfill_reactions, false);
567580
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));
569582
return;
570583
}
571584
#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */
@@ -576,15 +589,15 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
576589
}
577590
}
578591

579-
ecma_dealloc_extended_object ((ecma_extended_object_t *) object_p, ext_object_size);
592+
ecma_dealloc_extended_object (object_p, ext_object_size);
580593
return;
581594
}
582595

583596
if (ecma_get_object_is_builtin (object_p)
584597
|| object_type == ECMA_OBJECT_TYPE_ARRAY
585598
|| object_type == ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION)
586599
{
587-
ecma_dealloc_extended_object ((ecma_extended_object_t *) object_p, ext_object_size);
600+
ecma_dealloc_extended_object (object_p, ext_object_size);
588601
return;
589602
}
590603

@@ -596,9 +609,24 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
596609
ecma_bytecode_deref (ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t,
597610
ext_func_p->u.function.bytecode_cp));
598611

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));
600627
return;
601628
}
629+
#endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
602630

603631
if (object_type == ECMA_OBJECT_TYPE_PSEUDO_ARRAY)
604632
{
@@ -621,20 +649,18 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
621649
}
622650

623651
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);
625653
return;
626654
}
627655
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
628656
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
629657
{
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));
632659
return;
633660
}
634661
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
635662
{
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));
638664
return;
639665
}
640666
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
@@ -657,7 +683,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
657683
if (!ecma_is_value_integer_number (args_len_or_this))
658684
{
659685
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));
661687
return;
662688
}
663689

@@ -670,7 +696,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
670696
}
671697

672698
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);
674700
return;
675701
}
676702
}

jerry-core/ecma/base/ecma-globals.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,18 +574,20 @@ typedef enum
574574
*/
575575
typedef enum
576576
{
577-
ECMA_OBJECT_TYPE_GENERAL = 0, /**< all objects that are not String (15.5),
578-
* Function (15.3), Arguments (10.6), Array (15.4) objects */
577+
ECMA_OBJECT_TYPE_GENERAL = 0, /**< all objects that are not belongs to the sub-types below. */
579578
ECMA_OBJECT_TYPE_CLASS = 1, /**< Objects with class property */
580579
ECMA_OBJECT_TYPE_FUNCTION = 2, /**< Function objects (15.3), created through 13.2 routine */
581580
ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION = 3, /**< External (host) function object */
582581
ECMA_OBJECT_TYPE_ARRAY = 4, /**< Array object (15.4) */
583582
ECMA_OBJECT_TYPE_BOUND_FUNCTION = 5, /**< Function objects (15.3), created through 15.3.4.5 routine */
584583
ECMA_OBJECT_TYPE_PSEUDO_ARRAY = 6, /**< Array-like object, such as Arguments object (10.6) */
584+
#ifndef CONFIG_DISABLE_ES2015_ARROW_FUNCTION
585+
ECMA_OBJECT_TYPE_ARROW_FUNCTION = 7, /**< arrow function objects */
586+
#endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
585587

586588
/* Types between 13-15 cannot have a built-in flag. See ecma_lexical_environment_type_t. */
587589

588-
ECMA_OBJECT_TYPE__MAX = ECMA_OBJECT_TYPE_PSEUDO_ARRAY /**< maximum value */
590+
ECMA_OBJECT_TYPE__MAX /**< maximum value */
589591
} ecma_object_type_t;
590592

591593
/**
@@ -777,6 +779,21 @@ typedef struct
777779
ecma_built_in_props_t built_in; /**< built-in object part */
778780
} ecma_extended_built_in_object_t;
779781

782+
#ifndef CONFIG_DISABLE_ES2015_ARROW_FUNCTION
783+
784+
/**
785+
* Description of arrow function objects.
786+
*/
787+
typedef struct
788+
{
789+
ecma_object_t object; /**< object header */
790+
ecma_value_t this_binding; /**< value of 'this' binding */
791+
jmem_cpointer_t scope_cp; /**< function scope */
792+
jmem_cpointer_t bytecode_cp; /**< function byte code */
793+
} ecma_arrow_function_t;
794+
795+
#endif /* !CONFIG_DISABLE_ES2015_ARROW_FUNCTION */
796+
780797
/**
781798
* Description of ECMA property descriptor
782799
*

jerry-core/ecma/base/ecma-helpers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ JERRY_STATIC_ASSERT (ECMA_PROPERTY_TYPE_MASK >= ECMA_PROPERTY_TYPE__MAX,
4545
/**
4646
* The ecma object types must be lower than the container mask.
4747
*/
48-
JERRY_STATIC_ASSERT (ECMA_OBJECT_TYPE_MASK >= ECMA_OBJECT_TYPE__MAX,
48+
JERRY_STATIC_ASSERT (ECMA_OBJECT_TYPE_MASK >= ECMA_OBJECT_TYPE__MAX - 1,
4949
ecma_object_types_must_be_lower_than_the_container_mask);
5050

5151
/**

0 commit comments

Comments
 (0)