From 8f5160d6bf31b1a9a7bec0e7b618653c63883815 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 20 Oct 2014 15:39:09 +0400 Subject: [PATCH] Implementing ToObject for number arguments. --- .../ecma-builtin-number-object.c | 35 ++-------- src/libecmaoperations/ecma-conversion.c | 4 +- src/libecmaoperations/ecma-number-object.c | 67 +++++++++++++++++++ src/libecmaoperations/ecma-number-object.h | 35 ++++++++++ 4 files changed, 111 insertions(+), 30 deletions(-) create mode 100644 src/libecmaoperations/ecma-number-object.c create mode 100644 src/libecmaoperations/ecma-number-object.h diff --git a/src/libecmabuiltins/ecma-builtin-number-object.c b/src/libecmabuiltins/ecma-builtin-number-object.c index 133ced8f6..8634c3d6a 100644 --- a/src/libecmabuiltins/ecma-builtin-number-object.c +++ b/src/libecmabuiltins/ecma-builtin-number-object.c @@ -20,6 +20,7 @@ #include "ecma-gc.h" #include "ecma-globals.h" #include "ecma-helpers.h" +#include "ecma-number-object.h" #include "ecma-objects.h" #include "ecma-try-catch-macro.h" #include "globals.h" @@ -255,43 +256,21 @@ ecma_builtin_number_dispatch_construct (ecma_value_t *arguments_list_p, /**< arg { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); - ecma_number_t *prim_value_p; - if (arguments_list_len == 0) { ecma_number_t *zero_num_p = ecma_alloc_number (); *zero_num_p = ECMA_NUMBER_ZERO; - prim_value_p = zero_num_p; + ecma_completion_value_t completion = ecma_op_create_number_object (ecma_make_number_value (zero_num_p)); + + ecma_dealloc_number (zero_num_p); + + return completion; } else { - ecma_completion_value_t conv_to_num_completion = ecma_op_to_number (arguments_list_p [0]); - - if (!ecma_is_completion_value_normal (conv_to_num_completion)) - { - return conv_to_num_completion; - } - else - { - prim_value_p = ECMA_GET_POINTER (conv_to_num_completion.u.value.value); - } + return ecma_op_create_number_object (arguments_list_p[0]); } - - ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_NUMBER_PROTOTYPE); - ecma_object_t *obj_p = ecma_create_object (prototype_obj_p, - true, - ECMA_OBJECT_TYPE_GENERAL); - ecma_deref_object (prototype_obj_p); - - ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS); - class_prop_p->u.internal_property.value = ECMA_MAGIC_STRING_NUMBER_UL; - - ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, - ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE); - ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_p); - - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); } /* ecma_builtin_number_dispatch_construct */ /** diff --git a/src/libecmaoperations/ecma-conversion.c b/src/libecmaoperations/ecma-conversion.c index 48d24e146..abb6d7acb 100644 --- a/src/libecmaoperations/ecma-conversion.c +++ b/src/libecmaoperations/ecma-conversion.c @@ -25,6 +25,7 @@ #include "ecma-gc.h" #include "ecma-globals.h" #include "ecma-helpers.h" +#include "ecma-number-object.h" #include "ecma-objects.h" #include "ecma-objects-general.h" #include "ecma-string-object.h" @@ -477,8 +478,7 @@ ecma_op_to_object (ecma_value_t value) /**< ecma-value */ } case ECMA_TYPE_NUMBER: { - /* return Number object with [[PrimitiveValue]] set to the value */ - JERRY_UNIMPLEMENTED (); + return ecma_op_create_number_object (value); } case ECMA_TYPE_STRING: { diff --git a/src/libecmaoperations/ecma-number-object.c b/src/libecmaoperations/ecma-number-object.c new file mode 100644 index 000000000..cf1606304 --- /dev/null +++ b/src/libecmaoperations/ecma-number-object.c @@ -0,0 +1,67 @@ +/* Copyright 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ecma-alloc.h" +#include "ecma-builtins.h" +#include "ecma-exceptions.h" +#include "ecma-gc.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "ecma-number-object.h" +#include "ecma-objects.h" +#include "ecma-objects-general.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmanumberobject ECMA Number object related routines + * @{ + */ + +/** + * Number object creation operation. + * + * See also: ECMA-262 v5, 15.7.2.1 + * + * @return completion value + * Returned value must be freed with ecma_free_completion_value + */ +ecma_completion_value_t +ecma_op_create_number_object (ecma_value_t arg) /**< argument passed to the Number constructor */ +{ + ecma_completion_value_t conv_to_num_completion = ecma_op_to_number (arg); + + if (!ecma_is_completion_value_normal (conv_to_num_completion)) + { + return conv_to_num_completion; + } + + ecma_number_t *prim_value_p = ECMA_GET_POINTER (conv_to_num_completion.u.value.value); + + ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_NUMBER_PROTOTYPE); + ecma_object_t *obj_p = ecma_create_object (prototype_obj_p, + true, + ECMA_OBJECT_TYPE_GENERAL); + ecma_deref_object (prototype_obj_p); + + ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS); + class_prop_p->u.internal_property.value = ECMA_MAGIC_STRING_NUMBER_UL; + + ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, + ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE); + ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_p); + + return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); +} /* ecma_op_create_number_object */ diff --git a/src/libecmaoperations/ecma-number-object.h b/src/libecmaoperations/ecma-number-object.h new file mode 100644 index 000000000..95b715305 --- /dev/null +++ b/src/libecmaoperations/ecma-number-object.h @@ -0,0 +1,35 @@ +/* Copyright 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ECMA_NUMBER_OBJECT_H +#define ECMA_NUMBER_OBJECT_H + +#include "ecma-globals.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmanumberobject ECMA Number object related routines + * @{ + */ + +extern ecma_completion_value_t ecma_op_create_number_object (ecma_value_t arg); + +/** + * @} + * @} + */ + +#endif /* !ECMA_NUMBER_OBJECT_H */