diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index d682786e7..5961db133 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -204,7 +204,7 @@ opfunc_jmp (OPCODE opdata, struct __int_data *int_data) * See also: ECMA-262 v5, 11.13.1 * * @return completion value - * Returned value must be freed with ecma_FreeCompletionValue + * Returned value must be freed with ecma_free_completion_value */ ecma_CompletionValue_t opfunc_assignment (OPCODE opdata, /**< operation data */ diff --git a/src/libecmaobjects/ecma-helpers-value.c b/src/libecmaobjects/ecma-helpers-value.c index 98f0bae7c..455340df1 100644 --- a/src/libecmaobjects/ecma-helpers-value.c +++ b/src/libecmaobjects/ecma-helpers-value.c @@ -276,6 +276,18 @@ ecma_free_completion_value( ecma_CompletionValue_t completion_value) /**< comple } } /* ecma_free_completion_value */ +/** + * Check if the completion value is normal value. + * + * @return true - if the completion type is normal, + * false - otherwise. + */ +bool +ecma_is_completion_value_normal( ecma_CompletionValue_t value) +{ + return ( value.type == ECMA_COMPLETION_TYPE_NORMAL ); +} /* ecma_is_completion_value_normal */ + /** * Check if the completion value is specified normal simple value. * diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index 9561b478f..dbe890bd1 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -56,6 +56,7 @@ extern ecma_CompletionValue_t ecma_MakeCompletionValue( ecma_CompletionType_t ty extern ecma_CompletionValue_t ecma_MakeThrowValue( ecma_Object_t *exception_p); extern void ecma_free_completion_value( ecma_CompletionValue_t completion_value); +extern bool ecma_is_completion_value_normal( ecma_CompletionValue_t value); extern bool ecma_is_completion_value_normal_simple_value( ecma_CompletionValue_t value, ecma_SimpleValue_t simple_value); extern bool ecma_IsCompletionValueNormalFalse( ecma_CompletionValue_t value); extern bool ecma_IsCompletionValueNormalTrue( ecma_CompletionValue_t value); diff --git a/src/libecmaoperations/ecma-conversion.c b/src/libecmaoperations/ecma-conversion.c index d9008b1f9..340904e31 100644 --- a/src/libecmaoperations/ecma-conversion.c +++ b/src/libecmaoperations/ecma-conversion.c @@ -35,7 +35,7 @@ * ECMA-262 v5, 9.10 * * @return completion value - * Returned value must be free with ecma_FreeCompletionValue + * Returned value must be freed with ecma_free_completion_value */ ecma_CompletionValue_t ecma_op_check_object_coercible( ecma_Value_t value) /**< ecma-value */ @@ -87,10 +87,10 @@ ecma_op_check_object_coercible( ecma_Value_t value) /**< ecma-value */ * ToPrimitive operation. * * See also: - * ECMA-262 v5, 9.10 + * ECMA-262 v5, 9.1 * * @return completion value - * Returned value must be free with ecma_FreeCompletionValue + * Returned value must be freed with ecma_free_completion_value */ ecma_CompletionValue_t ecma_op_to_primitive( ecma_Value_t value) /**< ecma-value */ @@ -118,14 +118,58 @@ ecma_op_to_primitive( ecma_Value_t value) /**< ecma-value */ JERRY_UNREACHABLE(); } /* ecma_op_to_primitive */ +/** + * ToNumber operation. + * + * See also: + * ECMA-262 v5, 9.3 + * + * @return completion value + * Returned value must be freed with ecma_free_completion_value + */ +ecma_CompletionValue_t +ecma_op_to_number( ecma_Value_t value) /**< ecma-value */ +{ + switch ( (ecma_Type_t)value.m_ValueType ) + { + case ECMA_TYPE_NUMBER: + { + return ecma_MakeCompletionValue( ECMA_COMPLETION_TYPE_NORMAL, + ecma_CopyValue( value), + ECMA_TARGET_ID_RESERVED); + } + case ECMA_TYPE_SIMPLE: + case ECMA_TYPE_STRING: + { + JERRY_UNIMPLEMENTED(); + } + case ECMA_TYPE_OBJECT: + { + ecma_CompletionValue_t completion_to_primitive = ecma_op_to_primitive( value); + JERRY_ASSERT( ecma_is_completion_value_normal( completion_to_primitive) ); + + ecma_CompletionValue_t completion_to_number = ecma_op_to_number( completion_to_primitive.value); + ecma_free_completion_value( completion_to_primitive); + + return completion_to_number; + } + case ECMA_TYPE__COUNT: + { + JERRY_UNREACHABLE(); + } + } + + JERRY_UNREACHABLE(); +} /* ecma_op_to_number */ + /** * ToObject operation. * * See also: - * ECMA-262 v5, 9.10 + * ECMA-262 v5, 9.9 * * @return completion value - * Returned value must be free with ecma_FreeCompletionValue + * Returned value must be freed with ecma_free_completion_value */ ecma_CompletionValue_t ecma_op_to_object( ecma_Value_t value) /**< ecma-value */ diff --git a/src/libecmaoperations/ecma-conversion.h b/src/libecmaoperations/ecma-conversion.h index c52d101af..82980748b 100644 --- a/src/libecmaoperations/ecma-conversion.h +++ b/src/libecmaoperations/ecma-conversion.h @@ -28,6 +28,7 @@ extern ecma_CompletionValue_t ecma_op_check_object_coercible( ecma_Value_t value); extern ecma_CompletionValue_t ecma_op_to_primitive( ecma_Value_t value); +extern ecma_CompletionValue_t ecma_op_to_number( ecma_Value_t value); extern ecma_CompletionValue_t ecma_op_to_object( ecma_Value_t value); /**