Removing JERRY_UNREACHABLE from lexical environment related routines.

This commit is contained in:
Ruben Ayrapetyan
2014-12-05 13:25:41 +03:00
parent 5bb90fb8ca
commit 1182f7bbfe
+186 -230
View File
@@ -45,24 +45,20 @@ ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */
JERRY_ASSERT(lex_env_p != NULL JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
switch (ecma_get_lex_env_type (lex_env_p)) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{ {
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE: ecma_property_t *property_p = ecma_find_named_property (lex_env_p, name_p);
{
ecma_property_t *property_p = ecma_find_named_property (lex_env_p, name_p);
return (property_p != NULL); return (property_p != NULL);
}
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
return (ecma_op_object_get_property (binding_obj_p, name_p) != NULL);
}
} }
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
JERRY_UNREACHABLE (); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
return (ecma_op_object_get_property (binding_obj_p, name_p) != NULL);
}
} /* ecma_op_has_binding */ } /* ecma_op_has_binding */
/** /**
@@ -82,48 +78,46 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT(name_p != NULL); JERRY_ASSERT(name_p != NULL);
switch (ecma_get_lex_env_type (lex_env_p)) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{ {
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE: ecma_create_named_data_property (lex_env_p,
name_p,
true, false, is_deletable);
}
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
{ {
ecma_create_named_data_property (lex_env_p, prop_desc.is_value_defined = true;
name_p, prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
true, false, is_deletable);
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
break; prop_desc.is_enumerable_defined = true;
prop_desc.is_enumerable = true;
prop_desc.is_configurable_defined = true;
prop_desc.is_configurable = is_deletable;
} }
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
ecma_completion_value_t completion = ecma_op_object_define_own_property (binding_obj_p,
name_p,
&prop_desc,
true);
if (ecma_is_completion_value_throw (completion))
{ {
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); return completion;
}
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); else
{ {
prop_desc.is_value_defined = true; JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); || ecma_is_completion_value_normal_false (completion));
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
prop_desc.is_enumerable_defined = true;
prop_desc.is_enumerable = true;
prop_desc.is_configurable_defined = true;
prop_desc.is_configurable = is_deletable;
}
ecma_completion_value_t completion = ecma_op_object_define_own_property (binding_obj_p,
name_p,
&prop_desc,
true);
if (!(ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion)))
{
JERRY_ASSERT(ecma_is_completion_value_throw (completion));
return completion;
}
} }
} }
@@ -148,60 +142,58 @@ ecma_op_set_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environment
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT(name_p != NULL); JERRY_ASSERT(name_p != NULL);
switch (ecma_get_lex_env_type (lex_env_p)) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{ {
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE:
{
#ifndef JERRY_NDEBUG #ifndef JERRY_NDEBUG
# ifdef CONFIG_ECMA_COMPACT_PROFILE # ifdef CONFIG_ECMA_COMPACT_PROFILE
bool is_equal = false; bool is_equal = false;
ecma_string_t *arguments_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS); ecma_string_t *arguments_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS);
if (ecma_compare_ecma_strings (name_p, arguments_magic_string_p)) if (ecma_compare_ecma_strings (name_p, arguments_magic_string_p))
{ {
is_equal = true; is_equal = true;
} }
ecma_deref_ecma_string (arguments_magic_string_p); ecma_deref_ecma_string (arguments_magic_string_p);
JERRY_ASSERT (!is_equal); JERRY_ASSERT (!is_equal);
if (is_equal) if (is_equal)
{ {
return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR)); return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
} }
# endif /* CONFIG_ECMA_COMPACT_PROFILE */ # endif /* CONFIG_ECMA_COMPACT_PROFILE */
#endif /* !JERRY_NDEBUG */ #endif /* !JERRY_NDEBUG */
ecma_property_t *property_p = ecma_get_named_data_property (lex_env_p, name_p); ecma_property_t *property_p = ecma_get_named_data_property (lex_env_p, name_p);
if (ecma_is_property_writable (property_p)) if (ecma_is_property_writable (property_p))
{
ecma_named_data_property_assign_value (lex_env_p, property_p, value);
}
else if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
}
break;
}
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{ {
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); ecma_named_data_property_assign_value (lex_env_p, property_p, value);
}
else if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
}
}
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
ecma_completion_value_t completion = ecma_op_object_put (binding_obj_p, ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
name_p,
value,
is_strict);
if (!(ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion)))
{
JERRY_ASSERT(ecma_is_completion_value_throw (completion));
return completion; ecma_completion_value_t completion = ecma_op_object_put (binding_obj_p,
} name_p,
value,
is_strict);
break; if (ecma_is_completion_value_throw (completion))
{
return completion;
}
else
{
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|| ecma_is_completion_value_normal_false (completion));
} }
} }
@@ -225,74 +217,69 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT(name_p != NULL); JERRY_ASSERT(name_p != NULL);
switch (ecma_get_lex_env_type (lex_env_p)) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{ {
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE:
{
#ifndef JERRY_NDEBUG #ifndef JERRY_NDEBUG
# ifdef CONFIG_ECMA_COMPACT_PROFILE # ifdef CONFIG_ECMA_COMPACT_PROFILE
bool is_equal = false; bool is_equal = false;
ecma_string_t *arguments_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS); ecma_string_t *arguments_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ARGUMENTS);
if (ecma_compare_ecma_strings (name_p, arguments_magic_string_p)) if (ecma_compare_ecma_strings (name_p, arguments_magic_string_p))
{ {
is_equal = true; is_equal = true;
} }
ecma_deref_ecma_string (arguments_magic_string_p); ecma_deref_ecma_string (arguments_magic_string_p);
JERRY_ASSERT (!is_equal); JERRY_ASSERT (!is_equal);
if (is_equal) if (is_equal)
{ {
return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR)); return ecma_make_throw_obj_completion_value (ecma_builtin_get (ECMA_BUILTIN_ID_COMPACT_PROFILE_ERROR));
} }
# endif /* CONFIG_ECMA_COMPACT_PROFILE */ # endif /* CONFIG_ECMA_COMPACT_PROFILE */
#endif /* !JERRY_NDEBUG */ #endif /* !JERRY_NDEBUG */
ecma_property_t *property_p = ecma_get_named_data_property (lex_env_p, name_p); ecma_property_t *property_p = ecma_get_named_data_property (lex_env_p, name_p);
ecma_value_t prop_value = ecma_get_named_data_property_value (property_p); ecma_value_t prop_value = ecma_get_named_data_property_value (property_p);
/* is the binding mutable? */ /* is the binding mutable? */
if (!ecma_is_property_writable (property_p) if (!ecma_is_property_writable (property_p)
&& ecma_is_value_empty (prop_value)) && ecma_is_value_empty (prop_value))
{
/* unitialized immutable binding */
if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
}
return ecma_make_normal_completion_value (ecma_copy_value (prop_value, true));
break;
}
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{ {
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); /* unitialized immutable binding */
if (is_strict)
if (ecma_op_object_get_property (binding_obj_p, name_p) == NULL)
{ {
if (is_strict) return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
{ }
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE)); else
} {
else return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
} }
return ecma_op_object_get (binding_obj_p, name_p);
} }
}
JERRY_UNREACHABLE(); return ecma_make_normal_completion_value (ecma_copy_value (prop_value, true));
}
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
if (ecma_op_object_get_property (binding_obj_p, name_p) == NULL)
{
if (is_strict)
{
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_REFERENCE));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
}
return ecma_op_object_get (binding_obj_p, name_p);
}
} /* ecma_op_get_binding_value */ } /* ecma_op_get_binding_value */
/** /**
@@ -312,44 +299,42 @@ ecma_op_delete_binding (ecma_object_t *lex_env_p, /**< lexical environment */
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT(name_p != NULL); JERRY_ASSERT(name_p != NULL);
switch (ecma_get_lex_env_type (lex_env_p))
{
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE:
{
ecma_property_t *prop_p = ecma_find_named_property (lex_env_p, name_p);
ecma_simple_value_t ret_val;
if (prop_p == NULL) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{
ecma_property_t *prop_p = ecma_find_named_property (lex_env_p, name_p);
ecma_simple_value_t ret_val;
if (prop_p == NULL)
{
ret_val = ECMA_SIMPLE_VALUE_TRUE;
}
else
{
JERRY_ASSERT(prop_p->type == ECMA_PROPERTY_NAMEDDATA);
if (!ecma_is_property_configurable (prop_p))
{ {
ret_val = ECMA_SIMPLE_VALUE_TRUE; ret_val = ECMA_SIMPLE_VALUE_FALSE;
} }
else else
{ {
JERRY_ASSERT(prop_p->type == ECMA_PROPERTY_NAMEDDATA); ecma_delete_property (lex_env_p, prop_p);
if (!ecma_is_property_configurable (prop_p)) ret_val = ECMA_SIMPLE_VALUE_TRUE;
{
ret_val = ECMA_SIMPLE_VALUE_FALSE;
}
else
{
ecma_delete_property (lex_env_p, prop_p);
ret_val = ECMA_SIMPLE_VALUE_TRUE;
}
} }
return ecma_make_simple_completion_value (ret_val);
} }
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
return ecma_op_object_delete (binding_obj_p, name_p, false); return ecma_make_simple_completion_value (ret_val);
}
} }
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
JERRY_UNREACHABLE(); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
return ecma_op_object_delete (binding_obj_p, name_p, false);
}
} /* ecma_op_delete_binding */ } /* ecma_op_delete_binding */
/** /**
@@ -366,29 +351,26 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment
JERRY_ASSERT(lex_env_p != NULL JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
switch (ecma_get_lex_env_type (lex_env_p)) if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE)
{ {
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE: return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND);
if (ecma_get_lex_env_provide_this (lex_env_p))
{
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
ecma_ref_object (binding_obj_p);
return ecma_make_normal_completion_value (ecma_make_object_value (binding_obj_p));
}
else
{ {
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED); return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
} }
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{
if (ecma_get_lex_env_provide_this (lex_env_p))
{
ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p);
ecma_ref_object (binding_obj_p);
return ecma_make_normal_completion_value (ecma_make_object_value (binding_obj_p));
}
else
{
return ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
}
} }
JERRY_UNREACHABLE();
} /* ecma_op_implicit_this_value */ } /* ecma_op_implicit_this_value */
/** /**
@@ -402,33 +384,20 @@ ecma_op_create_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environ
{ {
JERRY_ASSERT(lex_env_p != NULL JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE);
switch (ecma_get_lex_env_type (lex_env_p)) /*
{ * Warning:
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE: * Whether immutable bindings are deletable seems not to be defined by ECMA v5.
{ */
/* ecma_property_t *prop_p = ecma_create_named_data_property (lex_env_p,
* Warning: name_p,
* Whether immutable bindings are deletable seems not to be defined by ECMA v5. false, false, false);
*/
ecma_property_t *prop_p = ecma_create_named_data_property (lex_env_p,
name_p,
false, false, false);
JERRY_ASSERT(ecma_is_value_undefined (ecma_get_named_data_property_value (prop_p))); JERRY_ASSERT(ecma_is_value_undefined (ecma_get_named_data_property_value (prop_p)));
ecma_set_named_data_property_value (prop_p, ecma_set_named_data_property_value (prop_p,
ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY)); ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY));
return;
}
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{
JERRY_UNREACHABLE();
}
}
JERRY_UNREACHABLE();
} /* ecma_op_create_immutable_binding */ } /* ecma_op_create_immutable_binding */
/** /**
@@ -443,28 +412,15 @@ ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p, /**< lexical env
{ {
JERRY_ASSERT(lex_env_p != NULL JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p)); && ecma_is_lexical_environment (lex_env_p));
JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE);
switch (ecma_get_lex_env_type (lex_env_p)) ecma_property_t *prop_p = ecma_get_named_data_property (lex_env_p, name_p);
{
case ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE:
{
ecma_property_t *prop_p = ecma_get_named_data_property (lex_env_p, name_p);
/* The binding must be unitialized immutable binding */ /* The binding must be unitialized immutable binding */
JERRY_ASSERT(!ecma_is_property_writable (prop_p) JERRY_ASSERT(!ecma_is_property_writable (prop_p)
&& ecma_is_value_empty (ecma_get_named_data_property_value (prop_p))); && ecma_is_value_empty (ecma_get_named_data_property_value (prop_p)));
ecma_named_data_property_assign_value (lex_env_p, prop_p, value); ecma_named_data_property_assign_value (lex_env_p, prop_p, value);
return;
}
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
{
JERRY_UNREACHABLE();
}
}
JERRY_UNREACHABLE();
} /* ecma_op_initialize_immutable_binding */ } /* ecma_op_initialize_immutable_binding */
/** /**