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
+8 -29
View File
@@ -1360,49 +1360,30 @@ 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:
{
switch ((ecma_simple_value_t)typeof_arg.value)
{
case ECMA_SIMPLE_VALUE_UNDEFINED:
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_UNDEFINED);
break;
} }
case ECMA_SIMPLE_VALUE_NULL: else if (ecma_is_value_null (typeof_arg))
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
break;
} }
case ECMA_SIMPLE_VALUE_FALSE: else if (ecma_is_value_boolean (typeof_arg))
case ECMA_SIMPLE_VALUE_TRUE:
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_BOOLEAN); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_BOOLEAN);
break;
} }
case ECMA_SIMPLE_VALUE_EMPTY: else if (ecma_is_value_number (typeof_arg))
case ECMA_SIMPLE_VALUE_ARRAY_REDIRECT:
case ECMA_SIMPLE_VALUE__COUNT:
{
JERRY_UNREACHABLE ();
}
}
break;
}
case ECMA_TYPE_NUMBER:
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NUMBER); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_NUMBER);
break;
} }
case ECMA_TYPE_STRING: else if (ecma_is_value_string (typeof_arg))
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_STRING); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_STRING);
break;
} }
case ECMA_TYPE_OBJECT: else
{ {
JERRY_ASSERT (ecma_is_value_object (typeof_arg));
if (ecma_op_is_callable (typeof_arg)) if (ecma_op_is_callable (typeof_arg))
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FUNCTION); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FUNCTION);
@@ -1411,8 +1392,6 @@ opfunc_typeof (opcode_t opdata, /**< operation data */
{ {
type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT); type_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_OBJECT);
} }
break;
}
} }
ret_value = set_variable_value (int_data, ret_value = set_variable_value (int_data,
+15
View File
@@ -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
*/ */
+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_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);
+113 -192
View File
@@ -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);
{
case ECMA_TYPE_SIMPLE:
{
if (ecma_is_value_undefined (value) if (ecma_is_value_undefined (value)
|| ecma_is_value_null (value)) || ecma_is_value_null (value))
{ {
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 if (ecma_is_value_boolean (value))
{
break;
}
else else
{ {
JERRY_UNREACHABLE();
}
break;
}
case ECMA_TYPE_NUMBER:
case ECMA_TYPE_STRING:
case ECMA_TYPE_OBJECT:
{
break;
}
}
return ecma_make_empty_completion_value (); 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);
{
case ECMA_TYPE_SIMPLE:
case ECMA_TYPE_NUMBER:
case ECMA_TYPE_STRING:
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
}
case ECMA_TYPE_OBJECT: if (ecma_is_value_object (value))
{ {
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (value.value); 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 */ } /* 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); ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER(value.value);
if (ecma_number_is_nan (*num_p) if (ecma_number_is_nan (*num_p)
|| ecma_number_is_zero (*num_p)) || ecma_number_is_zero (*num_p))
{ {
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE); ret_value = ECMA_SIMPLE_VALUE_FALSE;
} }
else else
{ {
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE); ret_value = ECMA_SIMPLE_VALUE_TRUE;
} }
break;
} }
case ECMA_TYPE_SIMPLE: else if (ecma_is_value_string (value))
{
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); 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 if (ecma_string_get_length (str_p) == 0)
: ECMA_SIMPLE_VALUE_TRUE);
break;
}
case ECMA_TYPE_OBJECT:
{ {
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE); ret_value = ECMA_SIMPLE_VALUE_FALSE;
}
break; else
{
ret_value = ECMA_SIMPLE_VALUE_TRUE;
} }
} }
else
{
JERRY_ASSERT (ecma_is_value_object (value));
JERRY_UNREACHABLE(); ret_value = ECMA_SIMPLE_VALUE_TRUE;
}
return ecma_make_simple_completion_value (ret_value);
} /* ecma_op_to_boolean */ } /* ecma_op_to_boolean */
/** /**
@@ -280,48 +249,13 @@ 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);
{
case ECMA_TYPE_NUMBER: if (ecma_is_value_number (value))
{ {
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: else if (ecma_is_value_string (value))
{
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_string_t *str_p = ECMA_GET_NON_NULL_POINTER (value.value);
@@ -330,7 +264,7 @@ ecma_op_to_number (ecma_value_t value) /**< ecma-value */
return ecma_make_normal_completion_value (ecma_make_number_value (num_p)); return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
} }
case ECMA_TYPE_OBJECT: else if (ecma_is_value_object (value))
{ {
ecma_completion_value_t ret_value; ecma_completion_value_t ret_value;
@@ -344,9 +278,34 @@ ecma_op_to_number (ecma_value_t value) /**< ecma-value */
return ret_value; 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;
}
} }
JERRY_UNREACHABLE(); 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; ecma_string_t *res_p = NULL;
switch ((ecma_type_t) value.value_type) if (ecma_is_value_string (value))
{
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;
}
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:
{ {
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));
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)); 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);
{
case ECMA_TYPE_SIMPLE:
{
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));
}
case ECMA_SIMPLE_VALUE_FALSE: if (ecma_is_value_number (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); return ecma_op_create_number_object (value);
} }
case ECMA_TYPE_STRING: else if (ecma_is_value_string (value))
{ {
return ecma_op_create_string_object (&value, 1); return ecma_op_create_string_object (&value, 1);
} }
case ECMA_TYPE_OBJECT: else if (ecma_is_value_object (value))
{ {
return ecma_make_normal_completion_value (ecma_copy_value (value, true)); return ecma_make_normal_completion_value (ecma_copy_value (value, true));
} }
else
{
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
{
JERRY_ASSERT (ecma_is_value_boolean (value));
JERRY_UNREACHABLE (); return ecma_op_create_boolean_object (value);
}
}
} /* ecma_op_to_object */ } /* ecma_op_to_object */
/** /**
+11 -23
View File
@@ -82,27 +82,18 @@ 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);
{
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);
}
if (ecma_is_value_object (value)
|| ecma_is_value_number (value)
|| ecma_is_value_string (value)
|| ecma_is_value_boolean (value))
{
// 1.b, 1.c, 1.d
return ecma_op_to_object (value);
}
else
{
// 2. // 2.
JERRY_ASSERT (ecma_is_value_undefined (value) JERRY_ASSERT (ecma_is_value_undefined (value)
|| ecma_is_value_null (value)); || ecma_is_value_null (value));
@@ -111,9 +102,6 @@ ecma_op_create_object_object_arg (ecma_value_t value) /**< argument of construct
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
} }
}
JERRY_UNREACHABLE();
} /* ecma_op_create_object_object_arg */ } /* ecma_op_create_object_object_arg */
/** /**