@@ -87,6 +87,22 @@ ecma_builtin_get (ecma_builtin_id_t builtin_id) /**< id of built-in to check on
87
87
return ecma_builtin_objects [builtin_id ];
88
88
} /* ecma_builtin_get */
89
89
90
+ /**
91
+ * Checks whether the given function is a built-in routine
92
+ *
93
+ * @return true if the function object is a built-in routine
94
+ * false otherwise
95
+ */
96
+ inline bool __attr_always_inline___
97
+ ecma_builtin_function_is_routine (ecma_object_t * func_obj_p ) /**< function object */
98
+ {
99
+ JERRY_ASSERT (ecma_get_object_type (func_obj_p ) == ECMA_OBJECT_TYPE_FUNCTION );
100
+ JERRY_ASSERT (ecma_get_object_is_builtin (func_obj_p ));
101
+
102
+ ecma_extended_object_t * ext_func_obj_p = (ecma_extended_object_t * ) func_obj_p ;
103
+ return (ext_func_obj_p -> u .built_in .routine_id >= ECMA_BUILTIN_ID__COUNT );
104
+ } /* ecma_builtin_function_is_routine */
105
+
90
106
/**
91
107
* Initialize specified built-in object.
92
108
*
@@ -113,6 +129,7 @@ ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
113
129
114
130
ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) obj_p ;
115
131
ext_obj_p -> u .built_in .id = obj_builtin_id ;
132
+ ext_obj_p -> u .built_in .routine_id = obj_builtin_id ;
116
133
ext_obj_p -> u .built_in .instantiated_bitset = 0 ;
117
134
118
135
/** Initializing [[PrimitiveValue]] properties of built-in prototype objects */
@@ -285,12 +302,14 @@ ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /**
285
302
{
286
303
ecma_object_t * prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE );
287
304
288
- ecma_object_t * func_obj_p = ecma_create_object (prototype_obj_p , true, true, ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION );
305
+ ecma_object_t * func_obj_p = ecma_create_object (prototype_obj_p , true, true, ECMA_OBJECT_TYPE_FUNCTION );
289
306
290
307
ecma_deref_object (prototype_obj_p );
291
308
292
309
ecma_set_object_is_builtin (func_obj_p );
293
310
311
+ JERRY_ASSERT (routine_id >= ECMA_BUILTIN_ID__COUNT );
312
+
294
313
ecma_extended_object_t * ext_func_obj_p = (ecma_extended_object_t * ) func_obj_p ;
295
314
ext_func_obj_p -> u .built_in .id = builtin_id ;
296
315
ext_func_obj_p -> u .built_in .length = length_prop_value ;
@@ -328,9 +347,10 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
328
347
{
329
348
JERRY_ASSERT (ecma_get_object_is_builtin (object_p ));
330
349
331
- const ecma_object_type_t type = ecma_get_object_type ( object_p ) ;
350
+ ecma_extended_object_t * ext_obj_p = ( ecma_extended_object_t * ) object_p ;
332
351
333
- if (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION )
352
+ if (ecma_get_object_type (object_p ) == ECMA_OBJECT_TYPE_FUNCTION
353
+ && ecma_builtin_function_is_routine (object_p ))
334
354
{
335
355
ecma_string_t * magic_string_length_p = ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH );
336
356
@@ -348,8 +368,6 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
348
368
* as it is non-configurable and so can't be deleted
349
369
*/
350
370
351
- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
352
-
353
371
ecma_property_t * len_prop_p = ecma_create_named_data_property (object_p ,
354
372
string_p ,
355
373
ECMA_PROPERTY_FIXED );
@@ -371,8 +389,6 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
371
389
return NULL ;
372
390
}
373
391
374
- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
375
-
376
392
ecma_builtin_id_t builtin_id = (ecma_builtin_id_t ) ext_obj_p -> u .built_in .id ;
377
393
378
394
JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT );
@@ -513,9 +529,10 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
513
529
}
514
530
case ECMA_BUILTIN_PROPERTY_ROUTINE :
515
531
{
516
- ecma_object_t * func_obj_p = ecma_builtin_make_function_object_for_routine (builtin_id ,
517
- magic_string_id ,
518
- (uint8_t ) curr_property_p -> value );
532
+ ecma_object_t * func_obj_p ;
533
+ func_obj_p = ecma_builtin_make_function_object_for_routine (builtin_id ,
534
+ ECMA_GET_ROUTINE_ID (curr_property_p -> value ),
535
+ ECMA_GET_ROUTINE_LENGTH (curr_property_p -> value ));
519
536
value = ecma_make_object_value (func_obj_p );
520
537
break ;
521
538
}
@@ -559,9 +576,12 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in
559
576
ecma_collection_header_t * non_enum_collection_p ) /**< skipped 'non-enumerable'
560
577
* collection */
561
578
{
562
- const ecma_object_type_t type = ecma_get_object_type (object_p );
579
+ JERRY_ASSERT (ecma_get_object_is_builtin (object_p ));
580
+
581
+ ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
563
582
564
- if (type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION )
583
+ if (ecma_get_object_type (object_p ) == ECMA_OBJECT_TYPE_FUNCTION
584
+ && ecma_builtin_function_is_routine (object_p ))
565
585
{
566
586
ecma_collection_header_t * for_enumerable_p = main_collection_p ;
567
587
(void ) for_enumerable_p ;
@@ -575,8 +595,6 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in
575
595
}
576
596
else
577
597
{
578
- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
579
-
580
598
ecma_builtin_id_t builtin_id = (ecma_builtin_id_t ) ext_obj_p -> u .built_in .id ;
581
599
582
600
JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT );
@@ -659,7 +677,7 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
659
677
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY );
660
678
ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) obj_p ;
661
679
662
- if (ecma_get_object_type (obj_p ) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION )
680
+ if (ecma_builtin_function_is_routine (obj_p ))
663
681
{
664
682
ret_value = ecma_builtin_dispatch_routine (ext_obj_p -> u .built_in .id ,
665
683
ext_obj_p -> u .built_in .routine_id ,
0 commit comments