From 1b74687989d2354450a5e2a41dbf82cff4035ebc Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 20 Oct 2014 15:26:24 +0400 Subject: [PATCH] Implementing ToObject for boolean arguments. --- .../ecma-builtin-boolean-object.c | 33 +-------- src/libecmaoperations/ecma-boolean-object.c | 69 +++++++++++++++++++ src/libecmaoperations/ecma-boolean-object.h | 35 ++++++++++ src/libecmaoperations/ecma-conversion.c | 4 +- 4 files changed, 109 insertions(+), 32 deletions(-) create mode 100644 src/libecmaoperations/ecma-boolean-object.c create mode 100644 src/libecmaoperations/ecma-boolean-object.h diff --git a/src/libecmabuiltins/ecma-builtin-boolean-object.c b/src/libecmabuiltins/ecma-builtin-boolean-object.c index 26748b3ef..455031412 100644 --- a/src/libecmabuiltins/ecma-builtin-boolean-object.c +++ b/src/libecmabuiltins/ecma-builtin-boolean-object.c @@ -14,6 +14,7 @@ */ #include "ecma-alloc.h" +#include "ecma-boolean-object.h" #include "ecma-builtins.h" #include "ecma-conversion.h" #include "ecma-exceptions.h" @@ -247,42 +248,14 @@ ecma_builtin_boolean_dispatch_construct (ecma_value_t *arguments_list_p, /**< ar { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); - ecma_simple_value_t bool_value; - if (arguments_list_len == 0) { - bool_value = ECMA_SIMPLE_VALUE_FALSE; + return ecma_op_create_boolean_object (ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE)); } else { - ecma_completion_value_t conv_to_boolean_completion = ecma_op_to_boolean (arguments_list_p [0]); - - if (!ecma_is_completion_value_normal (conv_to_boolean_completion)) - { - return conv_to_boolean_completion; - } - else - { - bool_value = conv_to_boolean_completion.u.value.value; - } + return ecma_op_create_boolean_object (arguments_list_p[0]); } - - JERRY_ASSERT (bool_value == ECMA_SIMPLE_VALUE_TRUE || bool_value == ECMA_SIMPLE_VALUE_FALSE); - - ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_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_BOOLEAN_UL; - - ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, - ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE); - prim_value_prop_p->u.internal_property.value = bool_value; - - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); } /* ecma_builtin_boolean_dispatch_construct */ /** diff --git a/src/libecmaoperations/ecma-boolean-object.c b/src/libecmaoperations/ecma-boolean-object.c new file mode 100644 index 000000000..a10757780 --- /dev/null +++ b/src/libecmaoperations/ecma-boolean-object.c @@ -0,0 +1,69 @@ +/* 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-boolean-object.h" +#include "ecma-builtins.h" +#include "ecma-exceptions.h" +#include "ecma-gc.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "ecma-objects.h" +#include "ecma-objects-general.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmabooleanobject ECMA Boolean object related routines + * @{ + */ + +/** + * Boolean object creation operation. + * + * See also: ECMA-262 v5, 15.6.2.1 + * + * @return completion value + * Returned value must be freed with ecma_free_completion_value + */ +ecma_completion_value_t +ecma_op_create_boolean_object (ecma_value_t arg) /**< argument passed to the Boolean constructor */ +{ + ecma_completion_value_t conv_to_boolean_completion = ecma_op_to_boolean (arg); + + if (!ecma_is_completion_value_normal (conv_to_boolean_completion)) + { + return conv_to_boolean_completion; + } + + ecma_simple_value_t bool_value = conv_to_boolean_completion.u.value.value; + + JERRY_ASSERT (bool_value == ECMA_SIMPLE_VALUE_TRUE || bool_value == ECMA_SIMPLE_VALUE_FALSE); + + ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_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_BOOLEAN_UL; + + ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, + ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE); + prim_value_prop_p->u.internal_property.value = bool_value; + + return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); +} /* ecma_op_create_boolean_object */ diff --git a/src/libecmaoperations/ecma-boolean-object.h b/src/libecmaoperations/ecma-boolean-object.h new file mode 100644 index 000000000..f2721f1b7 --- /dev/null +++ b/src/libecmaoperations/ecma-boolean-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_BOOLEAN_OBJECT_H +#define ECMA_BOOLEAN_OBJECT_H + +#include "ecma-globals.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmabooleanobject ECMA Boolean object related routines + * @{ + */ + +extern ecma_completion_value_t ecma_op_create_boolean_object (ecma_value_t arg); + +/** + * @} + * @} + */ + +#endif /* !ECMA_BOOLEAN_OBJECT_H */ diff --git a/src/libecmaoperations/ecma-conversion.c b/src/libecmaoperations/ecma-conversion.c index 8e29c16b2..48d24e146 100644 --- a/src/libecmaoperations/ecma-conversion.c +++ b/src/libecmaoperations/ecma-conversion.c @@ -18,6 +18,7 @@ */ #include "ecma-alloc.h" +#include "ecma-boolean-object.h" #include "ecma-conversion.h" #include "ecma-exceptions.h" #include "ecma-function-object.h" @@ -462,8 +463,7 @@ ecma_op_to_object (ecma_value_t value) /**< ecma-value */ case ECMA_SIMPLE_VALUE_FALSE: case ECMA_SIMPLE_VALUE_TRUE: { - /* return Boolean object with [[PrimitiveValue]] set to the value */ - JERRY_UNIMPLEMENTED (); + return ecma_op_create_boolean_object (value); } case ECMA_SIMPLE_VALUE_EMPTY: case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT: