Pass function arguments through ecma-collections.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan
2015-08-04 19:27:18 +03:00
parent 7daabb1974
commit 1cafff32b5
19 changed files with 245 additions and 247 deletions
@@ -392,11 +392,25 @@ ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /**
ecma_completion_value_t
ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
ecma_value_t this_arg_value, /**< 'this' argument value */
const ecma_value_t *arguments_list_p, /**< arguments list */
ecma_length_t arguments_list_len) /**< length of the arguments list */
ecma_collection_header_t* arg_collection_p) /**< arguments collection */
{
JERRY_ASSERT (ecma_get_object_is_builtin (obj_p));
JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
const ecma_length_t arguments_list_len = arg_collection_p != NULL ? arg_collection_p->unit_number : 0;
MEM_DEFINE_LOCAL_ARRAY (arguments_list_p, arguments_list_len, ecma_value_t);
ecma_collection_iterator_t arg_collection_iter;
ecma_collection_iterator_init (&arg_collection_iter,
arg_collection_p);
for (ecma_length_t arg_index = 0;
ecma_collection_iterator_next (&arg_collection_iter);
arg_index++)
{
arguments_list_p[arg_index] = *arg_collection_iter.current_value_p;
}
if (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
{
@@ -417,11 +431,11 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
ecma_builtin_id_t built_in_id = (ecma_builtin_id_t) built_in_id_field;
uint16_t routine_id = (uint16_t) routine_id_field;
return ecma_builtin_dispatch_routine (built_in_id,
routine_id,
this_arg_value,
arguments_list_p,
arguments_list_len);
ret_value = ecma_builtin_dispatch_routine (built_in_id,
routine_id,
this_arg_value,
arguments_list_p,
arguments_list_len);
}
else
{
@@ -445,13 +459,10 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
{ \
if (object_type == ECMA_OBJECT_TYPE_FUNCTION) \
{ \
return ecma_builtin_ ## lowercase_name ## _dispatch_call (arguments_list_p, \
arguments_list_len); \
} \
else \
{ \
JERRY_UNREACHABLE (); \
ret_value = ecma_builtin_ ## lowercase_name ## _dispatch_call (arguments_list_p, \
arguments_list_len); \
} \
break; \
}
#include "ecma-builtins.inc.h"
@@ -471,7 +482,11 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
}
}
JERRY_UNREACHABLE ();
MEM_FINALIZE_LOCAL_ARRAY (arguments_list_p);
JERRY_ASSERT (!ecma_is_completion_value_empty (ret_value));
return ret_value;
} /* ecma_builtin_dispatch_call */
/**
@@ -481,13 +496,26 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
*/
ecma_completion_value_t
ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
const ecma_value_t *arguments_list_p, /**< arguments list */
ecma_length_t arguments_list_len) /**< length of the arguments list */
ecma_collection_header_t* arg_collection_p) /**< arguments collection */
{
JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION);
JERRY_ASSERT (ecma_get_object_is_builtin (obj_p));
JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
const ecma_length_t arguments_list_len = arg_collection_p != NULL ? arg_collection_p->unit_number : 0;
MEM_DEFINE_LOCAL_ARRAY (arguments_list_p, arguments_list_len, ecma_value_t);
ecma_collection_iterator_t arg_collection_iter;
ecma_collection_iterator_init (&arg_collection_iter,
arg_collection_p);
for (ecma_length_t arg_index = 0;
ecma_collection_iterator_next (&arg_collection_iter);
arg_index++)
{
arguments_list_p[arg_index] = *arg_collection_iter.current_value_p;
}
ecma_property_t *built_in_id_prop_p = ecma_get_internal_property (obj_p,
ECMA_INTERNAL_PROPERTY_BUILT_IN_ID);
@@ -495,6 +523,7 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
JERRY_ASSERT (ecma_builtin_is (obj_p, builtin_id));
JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION);
switch (builtin_id)
{
#define BUILTIN(builtin_id, \
@@ -507,13 +536,10 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
{ \
if (object_type == ECMA_OBJECT_TYPE_FUNCTION) \
{ \
return ecma_builtin_ ## lowercase_name ## _dispatch_construct (arguments_list_p, \
arguments_list_len); \
} \
else \
{ \
JERRY_UNREACHABLE (); \
ret_value = ecma_builtin_ ## lowercase_name ## _dispatch_construct (arguments_list_p, \
arguments_list_len); \
} \
break; \
}
#include "ecma-builtins.inc.h"
@@ -532,7 +558,11 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
}
}
JERRY_UNREACHABLE ();
MEM_FINALIZE_LOCAL_ARRAY (arguments_list_p);
JERRY_ASSERT (!ecma_is_completion_value_empty (ret_value));
return ret_value;
} /* ecma_builtin_dispatch_construct */
/**