Using ecma_is_value_* instead of switches for determining of ecma-value's type.

This commit is contained in:
Ruben Ayrapetyan
2014-11-19 20:28:14 +03:00
parent 7b3eaf146b
commit 6dd357a554
5 changed files with 228 additions and 323 deletions
+27 -48
View File
@@ -1360,58 +1360,37 @@ opfunc_typeof (opcode_t opdata, /**< operation data */
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)
{
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;
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FUNCTION);
}
case ECMA_TYPE_NUMBER:
else
{
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NUMBER);
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;
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
}
}
+15
View File
@@ -128,6 +128,21 @@ ecma_is_value_object (ecma_value_t value) /**< ecma-value */
return (value.value_type == ECMA_TYPE_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
*/
+2
View File
@@ -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_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_number_value (ecma_number_t* num_p);
extern ecma_value_t ecma_make_string_value (ecma_string_t* ecma_string_p);
+167 -246
View File
@@ -51,36 +51,17 @@
ecma_completion_value_t
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:
{
if (ecma_is_value_undefined (value)
|| ecma_is_value_null (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_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
return ecma_make_empty_completion_value ();
}
return ecma_make_empty_completion_value ();
} /* ecma_op_check_object_coercible */
/**
@@ -179,24 +160,18 @@ ecma_completion_value_t
ecma_op_to_primitive (ecma_value_t value, /**< ecma-value */
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:
case ECMA_TYPE_NUMBER:
case ECMA_TYPE_STRING:
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
}
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (value.value);
case ECMA_TYPE_OBJECT:
{
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (value.value);
return ecma_op_object_default_value (obj_p, preferred_type);
}
return ecma_op_object_default_value (obj_p, preferred_type);
}
else
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
}
JERRY_UNREACHABLE();
} /* ecma_op_to_primitive */
/**
@@ -212,60 +187,54 @@ ecma_op_to_primitive (ecma_value_t value, /**< ecma-value */
ecma_completion_value_t
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);
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;
ret_value = ECMA_SIMPLE_VALUE_FALSE;
}
case ECMA_TYPE_SIMPLE:
else
{
if (ecma_is_value_boolean (value))
{
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;
ret_value = ECMA_SIMPLE_VALUE_TRUE;
}
}
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 */
/**
@@ -280,73 +249,63 @@ ecma_op_to_boolean (ecma_value_t value) /**< ecma-value */
ecma_completion_value_t
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));
}
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;
}
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
}
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 */
/**
@@ -361,6 +320,8 @@ ecma_op_to_number (ecma_value_t value) /**< ecma-value */
ecma_completion_value_t
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)))
{
ecma_completion_value_t ret_value;
@@ -375,70 +336,44 @@ ecma_op_to_string (ecma_value_t value) /**< ecma-value */
return ret_value;
}
ecma_string_t *res_p = NULL;
switch ((ecma_type_t) value.value_type)
else
{
case ECMA_TYPE_SIMPLE:
{
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;
}
ecma_string_t *res_p = NULL;
case ECMA_SIMPLE_VALUE_EMPTY:
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:
if (ecma_is_value_string (value))
{
res_p = ECMA_GET_NON_NULL_POINTER (value.value);
res_p = ecma_copy_or_ref_ecma_string (res_p);
break;
}
case ECMA_TYPE_OBJECT:
else if (ecma_is_value_number (value))
{
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 */
/**
@@ -453,48 +388,34 @@ ecma_op_to_string (ecma_value_t value) /**< ecma-value */
ecma_completion_value_t
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)
{
case ECMA_SIMPLE_VALUE_UNDEFINED:
case ECMA_SIMPLE_VALUE_NULL:
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
}
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (value));
case ECMA_SIMPLE_VALUE_FALSE:
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));
return ecma_op_create_boolean_object (value);
}
}
JERRY_UNREACHABLE ();
} /* ecma_op_to_object */
/**
+17 -29
View File
@@ -82,38 +82,26 @@ ecma_op_create_object_object_noarg (void)
ecma_completion_value_t
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.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));
}
// 1.b, 1.c, 1.d
return ecma_op_to_object (value);
}
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 */
/**