@@ -87,6 +87,22 @@ ecma_builtin_get (ecma_builtin_id_t builtin_id) /**< id of built-in to check on
8787 return ecma_builtin_objects [builtin_id ];
8888} /* ecma_builtin_get */
8989
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+
90106/**
91107 * Initialize specified built-in object.
92108 *
@@ -113,6 +129,7 @@ ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
113129
114130 ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) obj_p ;
115131 ext_obj_p -> u .built_in .id = obj_builtin_id ;
132+ ext_obj_p -> u .built_in .routine_id = obj_builtin_id ;
116133 ext_obj_p -> u .built_in .instantiated_bitset = 0 ;
117134
118135 /** 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, /**
285302{
286303 ecma_object_t * prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE );
287304
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 );
289306
290307 ecma_deref_object (prototype_obj_p );
291308
292309 ecma_set_object_is_builtin (func_obj_p );
293310
311+ JERRY_ASSERT (routine_id >= ECMA_BUILTIN_ID__COUNT );
312+
294313 ecma_extended_object_t * ext_func_obj_p = (ecma_extended_object_t * ) func_obj_p ;
295314 ext_func_obj_p -> u .built_in .id = builtin_id ;
296315 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 *
328347{
329348 JERRY_ASSERT (ecma_get_object_is_builtin (object_p ));
330349
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 ;
332351
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 ))
334354 {
335355 ecma_string_t * magic_string_length_p = ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH );
336356
@@ -348,8 +368,6 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
348368 * as it is non-configurable and so can't be deleted
349369 */
350370
351- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
352-
353371 ecma_property_t * len_prop_p = ecma_create_named_data_property (object_p ,
354372 string_p ,
355373 ECMA_PROPERTY_FIXED );
@@ -371,8 +389,6 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
371389 return NULL ;
372390 }
373391
374- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
375-
376392 ecma_builtin_id_t builtin_id = (ecma_builtin_id_t ) ext_obj_p -> u .built_in .id ;
377393
378394 JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT );
@@ -513,9 +529,10 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
513529 }
514530 case ECMA_BUILTIN_PROPERTY_ROUTINE :
515531 {
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 *
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 ));
519536 value = ecma_make_object_value (func_obj_p );
520537 break ;
521538 }
@@ -559,9 +576,12 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in
559576 ecma_collection_header_t * non_enum_collection_p ) /**< skipped 'non-enumerable'
560577 * collection */
561578{
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 ;
563582
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 ))
565585 {
566586 ecma_collection_header_t * for_enumerable_p = main_collection_p ;
567587 (void ) for_enumerable_p ;
@@ -575,8 +595,6 @@ ecma_builtin_list_lazy_property_names (ecma_object_t *object_p, /**< a built-in
575595 }
576596 else
577597 {
578- ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) object_p ;
579-
580598 ecma_builtin_id_t builtin_id = (ecma_builtin_id_t ) ext_obj_p -> u .built_in .id ;
581599
582600 JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT );
@@ -659,7 +677,7 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
659677 ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY );
660678 ecma_extended_object_t * ext_obj_p = (ecma_extended_object_t * ) obj_p ;
661679
662- if (ecma_get_object_type (obj_p ) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION )
680+ if (ecma_builtin_function_is_routine (obj_p ))
663681 {
664682 ret_value = ecma_builtin_dispatch_routine (ext_obj_p -> u .built_in .id ,
665683 ext_obj_p -> u .built_in .routine_id ,
0 commit comments