Rework error to use a global slot to store the error value.
This change frees up the error bit in ecma_value_t, which allows to define 4 more value types (e.g. symbols). To keep API compatibility we introduce a box for values with error flag. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -28,15 +28,10 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Masking the type and flags
|
||||
*/
|
||||
#define ECMA_VALUE_FULL_MASK (ECMA_VALUE_TYPE_MASK | ECMA_VALUE_ERROR_FLAG)
|
||||
|
||||
JERRY_STATIC_ASSERT (ECMA_TYPE___MAX <= ECMA_VALUE_TYPE_MASK,
|
||||
ecma_types_must_be_less_than_mask);
|
||||
|
||||
JERRY_STATIC_ASSERT ((ECMA_VALUE_FULL_MASK + 1) == (1 << ECMA_VALUE_SHIFT),
|
||||
JERRY_STATIC_ASSERT ((ECMA_VALUE_TYPE_MASK + 1) == (1 << ECMA_VALUE_SHIFT),
|
||||
ecma_value_part_must_start_after_flags);
|
||||
|
||||
JERRY_STATIC_ASSERT (ECMA_VALUE_SHIFT <= JMEM_ALIGNMENT_LOG,
|
||||
@@ -83,7 +78,7 @@ ecma_pointer_to_ecma_value (const void *ptr) /**< pointer */
|
||||
#ifdef ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY
|
||||
|
||||
uintptr_t uint_ptr = (uintptr_t) ptr;
|
||||
JERRY_ASSERT ((uint_ptr & ECMA_VALUE_FULL_MASK) == 0);
|
||||
JERRY_ASSERT ((uint_ptr & ECMA_VALUE_TYPE_MASK) == 0);
|
||||
return (ecma_value_t) uint_ptr;
|
||||
|
||||
#else /* !ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
|
||||
@@ -104,7 +99,7 @@ static inline void * __attr_pure___ __attr_always_inline___
|
||||
ecma_get_pointer_from_ecma_value (ecma_value_t value) /**< value */
|
||||
{
|
||||
#ifdef ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY
|
||||
return (void *) (uintptr_t) ((value) & ~ECMA_VALUE_FULL_MASK);
|
||||
return (void *) (uintptr_t) ((value) & ~ECMA_VALUE_TYPE_MASK);
|
||||
#else /* !ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
|
||||
return ECMA_GET_NON_NULL_POINTER (ecma_number_t,
|
||||
value >> ECMA_VALUE_SHIFT);
|
||||
@@ -145,7 +140,7 @@ static inline bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_value_equal_to_simple_value (ecma_value_t value, /**< ecma value */
|
||||
ecma_simple_value_t simple_value) /**< simple value */
|
||||
{
|
||||
return (value | ECMA_VALUE_ERROR_FLAG) == (ecma_make_simple_value (simple_value) | ECMA_VALUE_ERROR_FLAG);
|
||||
return value == ecma_make_simple_value (simple_value);
|
||||
} /* ecma_is_value_equal_to_simple_value */
|
||||
|
||||
/**
|
||||
@@ -321,6 +316,18 @@ ecma_is_value_object (ecma_value_t value) /**< ecma value */
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT);
|
||||
} /* ecma_is_value_object */
|
||||
|
||||
/**
|
||||
* Check if the value is error reference.
|
||||
*
|
||||
* @return true - if the value contains object value,
|
||||
* false - otherwise
|
||||
*/
|
||||
inline bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_value_error_reference (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_ERROR);
|
||||
} /* ecma_is_value_error_reference */
|
||||
|
||||
/**
|
||||
* Debug assertion that specified value's type is one of ECMA-defined
|
||||
* script-visible types, i.e.: undefined, null, boolean, number, string, object.
|
||||
@@ -485,7 +492,7 @@ ecma_make_uint32_value (uint32_t uint32_number) /**< uint32 number to be encoded
|
||||
/**
|
||||
* String value constructor
|
||||
*/
|
||||
ecma_value_t __attr_pure___
|
||||
inline ecma_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_string_value (const ecma_string_t *ecma_string_p) /**< string to reference in value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_string_p != NULL);
|
||||
@@ -496,7 +503,7 @@ ecma_make_string_value (const ecma_string_t *ecma_string_p) /**< string to refer
|
||||
/**
|
||||
* Object value constructor
|
||||
*/
|
||||
ecma_value_t __attr_pure___
|
||||
inline ecma_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_object_value (const ecma_object_t *object_p) /**< object to reference in value */
|
||||
{
|
||||
JERRY_ASSERT (object_p != NULL);
|
||||
@@ -505,25 +512,15 @@ ecma_make_object_value (const ecma_object_t *object_p) /**< object to reference
|
||||
} /* ecma_make_object_value */
|
||||
|
||||
/**
|
||||
* Error value constructor
|
||||
* Error reference constructor
|
||||
*/
|
||||
ecma_value_t __attr_const___
|
||||
ecma_make_error_value (ecma_value_t value) /**< original ecma value */
|
||||
inline ecma_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_error_reference_value (const ecma_error_reference_t *error_ref_p) /**< error reference */
|
||||
{
|
||||
/* Error values cannot be converted. */
|
||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (value));
|
||||
JERRY_ASSERT (error_ref_p != NULL);
|
||||
|
||||
return value | ECMA_VALUE_ERROR_FLAG;
|
||||
} /* ecma_make_error_value */
|
||||
|
||||
/**
|
||||
* Error value constructor
|
||||
*/
|
||||
ecma_value_t __attr_pure___
|
||||
ecma_make_error_obj_value (const ecma_object_t *object_p) /**< object to reference in value */
|
||||
{
|
||||
return ecma_make_error_value (ecma_make_object_value (object_p));
|
||||
} /* ecma_make_error_obj_value */
|
||||
return ecma_pointer_to_ecma_value (error_ref_p) | ECMA_TYPE_ERROR;
|
||||
} /* ecma_make_error_reference_value */
|
||||
|
||||
/**
|
||||
* Get integer value from an integer ecma value
|
||||
@@ -588,6 +585,19 @@ ecma_get_object_from_value (ecma_value_t value) /**< ecma value */
|
||||
return (ecma_object_t *) ecma_get_pointer_from_ecma_value (value);
|
||||
} /* ecma_get_object_from_value */
|
||||
|
||||
/**
|
||||
* Get pointer to error reference from ecma value
|
||||
*
|
||||
* @return the pointer
|
||||
*/
|
||||
inline ecma_error_reference_t *__attr_pure___ __attr_always_inline___
|
||||
ecma_get_error_reference_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_ERROR);
|
||||
|
||||
return (ecma_error_reference_t *) ecma_get_pointer_from_ecma_value (value);
|
||||
} /* ecma_get_error_reference_from_value */
|
||||
|
||||
/**
|
||||
* Invert a boolean value
|
||||
*
|
||||
@@ -601,23 +611,6 @@ ecma_invert_boolean_value (ecma_value_t value) /**< ecma value */
|
||||
return (value ^ (1 << ECMA_DIRECT_SHIFT));
|
||||
} /* ecma_invert_boolean_value */
|
||||
|
||||
/**
|
||||
* Get the value from an error ecma value
|
||||
*
|
||||
* @return ecma value
|
||||
*/
|
||||
ecma_value_t __attr_const___
|
||||
ecma_get_value_from_error_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ECMA_IS_VALUE_ERROR (value));
|
||||
|
||||
value = (ecma_value_t) (value & ~ECMA_VALUE_ERROR_FLAG);
|
||||
|
||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (value));
|
||||
|
||||
return value;
|
||||
} /* ecma_get_value_from_error_value */
|
||||
|
||||
/**
|
||||
* Copy ecma value.
|
||||
*
|
||||
@@ -648,9 +641,12 @@ ecma_copy_value (ecma_value_t value) /**< value description */
|
||||
ecma_ref_object (ecma_get_object_from_value (value));
|
||||
return value;
|
||||
}
|
||||
default:
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
}
|
||||
}
|
||||
|
||||
JERRY_UNREACHABLE ();
|
||||
} /* ecma_copy_value */
|
||||
|
||||
/**
|
||||
@@ -840,6 +836,12 @@ ecma_free_value (ecma_value_t value) /**< value description */
|
||||
ecma_deref_object (ecma_get_object_from_value (value));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
} /* ecma_free_value */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user