Using ecma_is_value_* instead of switches for determining of ecma-value's type.
This commit is contained in:
+27
-48
@@ -1360,58 +1360,37 @@ opfunc_typeof (opcode_t opdata, /**< operation data */
|
|||||||
|
|
||||||
ecma_string_t *type_str_p = NULL;
|
ecma_string_t *type_str_p = NULL;
|
||||||
|
|
||||||
switch ((ecma_type_t)typeof_arg.value_type)
|
if (ecma_is_value_undefined (typeof_arg))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_SIMPLE:
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_null (typeof_arg))
|
||||||
|
{
|
||||||
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_boolean (typeof_arg))
|
||||||
|
{
|
||||||
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_BOOLEAN);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_number (typeof_arg))
|
||||||
|
{
|
||||||
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NUMBER);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_string (typeof_arg))
|
||||||
|
{
|
||||||
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_STRING);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
JERRY_ASSERT (ecma_is_value_object (typeof_arg));
|
||||||
|
|
||||||
|
if (ecma_op_is_callable (typeof_arg))
|
||||||
{
|
{
|
||||||
switch ((ecma_simple_value_t)typeof_arg.value)
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FUNCTION);
|
||||||
{
|
|
||||||
case ECMA_SIMPLE_VALUE_UNDEFINED:
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_NULL:
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_FALSE:
|
|
||||||
case ECMA_SIMPLE_VALUE_TRUE:
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_BOOLEAN);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_EMPTY:
|
|
||||||
case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT:
|
|
||||||
case ECMA_SIMPLE_VALUE__COUNT:
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case ECMA_TYPE_NUMBER:
|
else
|
||||||
{
|
{
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NUMBER);
|
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_STRING);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
|
||||||
if (ecma_op_is_callable (typeof_arg))
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FUNCTION);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,21 @@ ecma_is_value_object (ecma_value_t value) /**< ecma-value */
|
|||||||
return (value.value_type == ECMA_TYPE_OBJECT);
|
return (value.value_type == ECMA_TYPE_OBJECT);
|
||||||
} /* ecma_is_value_object */
|
} /* ecma_is_value_object */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug assertion that specified value's type is one of ECMA-defined
|
||||||
|
* script-visible types, i.e.: undefined, null, boolean, number, string, object.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ecma_check_value_type_is_spec_defined (ecma_value_t value) /**< ecma-value */
|
||||||
|
{
|
||||||
|
JERRY_ASSERT (ecma_is_value_undefined (value)
|
||||||
|
|| ecma_is_value_null (value)
|
||||||
|
|| ecma_is_value_boolean (value)
|
||||||
|
|| ecma_is_value_number (value)
|
||||||
|
|| ecma_is_value_string (value)
|
||||||
|
|| ecma_is_value_object (value));
|
||||||
|
} /* ecma_check_value_type_is_spec_defined */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple value constructor
|
* Simple value constructor
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ extern bool ecma_is_value_number (ecma_value_t value);
|
|||||||
extern bool ecma_is_value_string (ecma_value_t value);
|
extern bool ecma_is_value_string (ecma_value_t value);
|
||||||
extern bool ecma_is_value_object (ecma_value_t value);
|
extern bool ecma_is_value_object (ecma_value_t value);
|
||||||
|
|
||||||
|
extern void ecma_check_value_type_is_spec_defined (ecma_value_t value);
|
||||||
|
|
||||||
extern ecma_value_t ecma_make_simple_value (ecma_simple_value_t value);
|
extern ecma_value_t ecma_make_simple_value (ecma_simple_value_t value);
|
||||||
extern ecma_value_t ecma_make_number_value (ecma_number_t* num_p);
|
extern ecma_value_t ecma_make_number_value (ecma_number_t* num_p);
|
||||||
extern ecma_value_t ecma_make_string_value (ecma_string_t* ecma_string_p);
|
extern ecma_value_t ecma_make_string_value (ecma_string_t* ecma_string_p);
|
||||||
|
|||||||
@@ -51,36 +51,17 @@
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_check_object_coercible (ecma_value_t value) /**< ecma-value */
|
ecma_op_check_object_coercible (ecma_value_t value) /**< ecma-value */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
if (ecma_is_value_undefined (value)
|
||||||
|
|| ecma_is_value_null (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_SIMPLE:
|
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||||
{
|
}
|
||||||
if (ecma_is_value_undefined (value)
|
else
|
||||||
|| ecma_is_value_null (value))
|
{
|
||||||
{
|
return ecma_make_empty_completion_value ();
|
||||||
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
|
||||||
}
|
|
||||||
else if (ecma_is_value_boolean (value))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_TYPE_NUMBER:
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ecma_make_empty_completion_value ();
|
|
||||||
} /* ecma_op_check_object_coercible */
|
} /* ecma_op_check_object_coercible */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -179,24 +160,18 @@ ecma_completion_value_t
|
|||||||
ecma_op_to_primitive (ecma_value_t value, /**< ecma-value */
|
ecma_op_to_primitive (ecma_value_t value, /**< ecma-value */
|
||||||
ecma_preferred_type_hint_t preferred_type) /**< preferred type hint */
|
ecma_preferred_type_hint_t preferred_type) /**< preferred type hint */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
if (ecma_is_value_object (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_SIMPLE:
|
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
||||||
case ECMA_TYPE_NUMBER:
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_TYPE_OBJECT:
|
return ecma_op_object_default_value (obj_p, preferred_type);
|
||||||
{
|
}
|
||||||
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
else
|
||||||
|
{
|
||||||
return ecma_op_object_default_value (obj_p, preferred_type);
|
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_UNREACHABLE();
|
|
||||||
} /* ecma_op_to_primitive */
|
} /* ecma_op_to_primitive */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,60 +187,54 @@ ecma_op_to_primitive (ecma_value_t value, /**< ecma-value */
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_to_boolean (ecma_value_t value) /**< ecma-value */
|
ecma_op_to_boolean (ecma_value_t value) /**< ecma-value */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
ecma_simple_value_t ret_value;
|
||||||
|
|
||||||
|
if (ecma_is_value_boolean (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_NUMBER:
|
ret_value = value.value;
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_undefined (value)
|
||||||
|
|| ecma_is_value_null (value))
|
||||||
|
{
|
||||||
|
ret_value = ECMA_SIMPLE_VALUE_FALSE;
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_number (value))
|
||||||
|
{
|
||||||
|
ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER(value.value);
|
||||||
|
|
||||||
|
if (ecma_number_is_nan (*num_p)
|
||||||
|
|| ecma_number_is_zero (*num_p))
|
||||||
{
|
{
|
||||||
ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER(value.value);
|
ret_value = ECMA_SIMPLE_VALUE_FALSE;
|
||||||
|
|
||||||
if (ecma_number_is_nan (*num_p)
|
|
||||||
|| ecma_number_is_zero (*num_p))
|
|
||||||
{
|
|
||||||
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case ECMA_TYPE_SIMPLE:
|
else
|
||||||
{
|
{
|
||||||
if (ecma_is_value_boolean (value))
|
ret_value = ECMA_SIMPLE_VALUE_TRUE;
|
||||||
{
|
|
||||||
return ecma_make_simple_completion_value (value.value);
|
|
||||||
}
|
|
||||||
else if (ecma_is_value_undefined (value)
|
|
||||||
|| ecma_is_value_null (value))
|
|
||||||
{
|
|
||||||
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
ecma_string_t *str_p = ECMA_GET_NON_NULL_POINTER(value.value);
|
|
||||||
|
|
||||||
return ecma_make_simple_completion_value ((ecma_string_get_length (str_p) == 0) ? ECMA_SIMPLE_VALUE_FALSE
|
|
||||||
: ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
|
||||||
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ecma_is_value_string (value))
|
||||||
|
{
|
||||||
|
ecma_string_t *str_p = ECMA_GET_NON_NULL_POINTER(value.value);
|
||||||
|
|
||||||
JERRY_UNREACHABLE();
|
if (ecma_string_get_length (str_p) == 0)
|
||||||
|
{
|
||||||
|
ret_value = ECMA_SIMPLE_VALUE_FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret_value = ECMA_SIMPLE_VALUE_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
JERRY_ASSERT (ecma_is_value_object (value));
|
||||||
|
|
||||||
|
ret_value = ECMA_SIMPLE_VALUE_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ecma_make_simple_completion_value (ret_value);
|
||||||
} /* ecma_op_to_boolean */
|
} /* ecma_op_to_boolean */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -280,73 +249,63 @@ ecma_op_to_boolean (ecma_value_t value) /**< ecma-value */
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_to_number (ecma_value_t value) /**< ecma-value */
|
ecma_op_to_number (ecma_value_t value) /**< ecma-value */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
if (ecma_is_value_number (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_NUMBER:
|
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
||||||
{
|
|
||||||
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_SIMPLE:
|
|
||||||
{
|
|
||||||
ecma_number_t *num_p = ecma_alloc_number ();
|
|
||||||
|
|
||||||
switch ((ecma_simple_value_t)value.value)
|
|
||||||
{
|
|
||||||
case ECMA_SIMPLE_VALUE_UNDEFINED:
|
|
||||||
{
|
|
||||||
*num_p = ecma_number_make_nan ();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_NULL:
|
|
||||||
case ECMA_SIMPLE_VALUE_FALSE:
|
|
||||||
{
|
|
||||||
*num_p = ECMA_NUMBER_ZERO;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_TRUE:
|
|
||||||
{
|
|
||||||
*num_p = ECMA_NUMBER_ONE;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_EMPTY:
|
|
||||||
case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT:
|
|
||||||
case ECMA_SIMPLE_VALUE__COUNT:
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
ecma_string_t *str_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
|
||||||
|
|
||||||
ecma_number_t *num_p = ecma_alloc_number ();
|
|
||||||
*num_p = ecma_string_to_number (str_p);
|
|
||||||
|
|
||||||
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
|
||||||
ecma_completion_value_t ret_value;
|
|
||||||
|
|
||||||
ECMA_TRY_CATCH (completion_to_primitive,
|
|
||||||
ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER),
|
|
||||||
ret_value);
|
|
||||||
|
|
||||||
ret_value = ecma_op_to_number (completion_to_primitive.u.value);
|
|
||||||
|
|
||||||
ECMA_FINALIZE (completion_to_primitive);
|
|
||||||
|
|
||||||
return ret_value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if (ecma_is_value_string (value))
|
||||||
|
{
|
||||||
|
ecma_string_t *str_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
||||||
|
|
||||||
JERRY_UNREACHABLE();
|
ecma_number_t *num_p = ecma_alloc_number ();
|
||||||
|
*num_p = ecma_string_to_number (str_p);
|
||||||
|
|
||||||
|
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_object (value))
|
||||||
|
{
|
||||||
|
ecma_completion_value_t ret_value;
|
||||||
|
|
||||||
|
ECMA_TRY_CATCH (completion_to_primitive,
|
||||||
|
ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER),
|
||||||
|
ret_value);
|
||||||
|
|
||||||
|
ret_value = ecma_op_to_number (completion_to_primitive.u.value);
|
||||||
|
|
||||||
|
ECMA_FINALIZE (completion_to_primitive);
|
||||||
|
|
||||||
|
return ret_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ecma_number_t *num_p = ecma_alloc_number ();
|
||||||
|
|
||||||
|
if (ecma_is_value_undefined (value))
|
||||||
|
{
|
||||||
|
*num_p = ecma_number_make_nan ();
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_null (value))
|
||||||
|
{
|
||||||
|
*num_p = ECMA_NUMBER_ZERO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
JERRY_ASSERT (ecma_is_value_boolean (value));
|
||||||
|
|
||||||
|
if (ecma_is_value_true (value))
|
||||||
|
{
|
||||||
|
*num_p = ECMA_NUMBER_ONE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*num_p = ECMA_NUMBER_ZERO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||||
|
}
|
||||||
} /* ecma_op_to_number */
|
} /* ecma_op_to_number */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -361,6 +320,8 @@ ecma_op_to_number (ecma_value_t value) /**< ecma-value */
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_to_string (ecma_value_t value) /**< ecma-value */
|
ecma_op_to_string (ecma_value_t value) /**< ecma-value */
|
||||||
{
|
{
|
||||||
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
if (unlikely (ecma_is_value_object (value)))
|
if (unlikely (ecma_is_value_object (value)))
|
||||||
{
|
{
|
||||||
ecma_completion_value_t ret_value;
|
ecma_completion_value_t ret_value;
|
||||||
@@ -375,70 +336,44 @@ ecma_op_to_string (ecma_value_t value) /**< ecma-value */
|
|||||||
|
|
||||||
return ret_value;
|
return ret_value;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
ecma_string_t *res_p = NULL;
|
|
||||||
|
|
||||||
switch ((ecma_type_t) value.value_type)
|
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_SIMPLE:
|
ecma_string_t *res_p = NULL;
|
||||||
{
|
|
||||||
switch ((ecma_simple_value_t) value.value)
|
|
||||||
{
|
|
||||||
case ECMA_SIMPLE_VALUE_UNDEFINED:
|
|
||||||
{
|
|
||||||
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_NULL:
|
|
||||||
{
|
|
||||||
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_FALSE:
|
|
||||||
{
|
|
||||||
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_TRUE:
|
|
||||||
{
|
|
||||||
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_TRUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_SIMPLE_VALUE_EMPTY:
|
if (ecma_is_value_string (value))
|
||||||
case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT:
|
|
||||||
case ECMA_SIMPLE_VALUE__COUNT:
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_TYPE_NUMBER:
|
|
||||||
{
|
|
||||||
ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
|
||||||
res_p = ecma_new_ecma_string_from_number (*num_p);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
{
|
||||||
res_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
res_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
||||||
res_p = ecma_copy_or_ref_ecma_string (res_p);
|
res_p = ecma_copy_or_ref_ecma_string (res_p);
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else if (ecma_is_value_number (value))
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
{
|
||||||
JERRY_UNREACHABLE ();
|
ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER (value.value);
|
||||||
|
res_p = ecma_new_ecma_string_from_number (*num_p);
|
||||||
}
|
}
|
||||||
}
|
else if (ecma_is_value_undefined (value))
|
||||||
|
{
|
||||||
|
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_null (value))
|
||||||
|
{
|
||||||
|
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
JERRY_ASSERT (ecma_is_value_boolean (value));
|
||||||
|
|
||||||
return ecma_make_normal_completion_value (ecma_make_string_value (res_p));
|
if (ecma_is_value_true (value))
|
||||||
|
{
|
||||||
|
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ecma_make_normal_completion_value (ecma_make_string_value (res_p));
|
||||||
|
}
|
||||||
} /* ecma_op_to_string */
|
} /* ecma_op_to_string */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -453,48 +388,34 @@ ecma_op_to_string (ecma_value_t value) /**< ecma-value */
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_to_object (ecma_value_t value) /**< ecma-value */
|
ecma_op_to_object (ecma_value_t value) /**< ecma-value */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
if (ecma_is_value_number (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_SIMPLE:
|
return ecma_op_create_number_object (value);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_string (value))
|
||||||
|
{
|
||||||
|
return ecma_op_create_string_object (&value, 1);
|
||||||
|
}
|
||||||
|
else if (ecma_is_value_object (value))
|
||||||
|
{
|
||||||
|
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ecma_is_value_undefined (value)
|
||||||
|
|| ecma_is_value_null (value))
|
||||||
{
|
{
|
||||||
switch ((ecma_simple_value_t)value.value)
|
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||||
{
|
}
|
||||||
case ECMA_SIMPLE_VALUE_UNDEFINED:
|
else
|
||||||
case ECMA_SIMPLE_VALUE_NULL:
|
{
|
||||||
{
|
JERRY_ASSERT (ecma_is_value_boolean (value));
|
||||||
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECMA_SIMPLE_VALUE_FALSE:
|
return ecma_op_create_boolean_object (value);
|
||||||
case ECMA_SIMPLE_VALUE_TRUE:
|
|
||||||
{
|
|
||||||
return ecma_op_create_boolean_object (value);
|
|
||||||
}
|
|
||||||
case ECMA_SIMPLE_VALUE_EMPTY:
|
|
||||||
case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT:
|
|
||||||
case ECMA_SIMPLE_VALUE__COUNT:
|
|
||||||
{
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_NUMBER:
|
|
||||||
{
|
|
||||||
return ecma_op_create_number_object (value);
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
return ecma_op_create_string_object (&value, 1);
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_OBJECT:
|
|
||||||
{
|
|
||||||
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_UNREACHABLE ();
|
|
||||||
} /* ecma_op_to_object */
|
} /* ecma_op_to_object */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -82,38 +82,26 @@ ecma_op_create_object_object_noarg (void)
|
|||||||
ecma_completion_value_t
|
ecma_completion_value_t
|
||||||
ecma_op_create_object_object_arg (ecma_value_t value) /**< argument of constructor */
|
ecma_op_create_object_object_arg (ecma_value_t value) /**< argument of constructor */
|
||||||
{
|
{
|
||||||
switch ((ecma_type_t)value.value_type)
|
ecma_check_value_type_is_spec_defined (value);
|
||||||
|
|
||||||
|
if (ecma_is_value_object (value)
|
||||||
|
|| ecma_is_value_number (value)
|
||||||
|
|| ecma_is_value_string (value)
|
||||||
|
|| ecma_is_value_boolean (value))
|
||||||
{
|
{
|
||||||
case ECMA_TYPE_OBJECT:
|
// 1.b, 1.c, 1.d
|
||||||
{
|
return ecma_op_to_object (value);
|
||||||
// 1.a
|
|
||||||
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_NUMBER:
|
|
||||||
case ECMA_TYPE_STRING:
|
|
||||||
{
|
|
||||||
// 1.b, 1.d
|
|
||||||
return ecma_op_to_object (value);
|
|
||||||
}
|
|
||||||
case ECMA_TYPE_SIMPLE:
|
|
||||||
{
|
|
||||||
// 1.c
|
|
||||||
if (ecma_is_value_boolean (value))
|
|
||||||
{
|
|
||||||
return ecma_op_to_object (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2.
|
|
||||||
JERRY_ASSERT (ecma_is_value_undefined (value)
|
|
||||||
|| ecma_is_value_null (value));
|
|
||||||
|
|
||||||
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
|
|
||||||
|
|
||||||
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 2.
|
||||||
|
JERRY_ASSERT (ecma_is_value_undefined (value)
|
||||||
|
|| ecma_is_value_null (value));
|
||||||
|
|
||||||
JERRY_UNREACHABLE();
|
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
|
||||||
|
|
||||||
|
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
|
||||||
|
}
|
||||||
} /* ecma_op_create_object_object_arg */
|
} /* ecma_op_create_object_object_arg */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user