Remove 'ecma_completion_value_t'
Remove ecma_completion_value_t, and add an extra bit to ecma_value_t to represent errors. From the long list of completion types only normal and error remained. JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
committed by
László Langó
parent
c25d8617a5
commit
b2426a7a94
@@ -29,8 +29,6 @@ JERRY_STATIC_ASSERT (ECMA_OBJECT_LEX_ENV_TYPE_SIZE <= sizeof (uint64_t) * JERRY_
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_collection_header_t) == sizeof (uint64_t));
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_collection_chunk_t) == sizeof (uint64_t));
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_string_t) == sizeof (uint64_t));
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_completion_value_t) == sizeof (uint32_t));
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_label_descriptor_t) == sizeof (uint64_t));
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_getter_setter_pointers_t) <= sizeof (uint64_t));
|
||||
|
||||
/** \addtogroup ecma ECMA
|
||||
@@ -87,7 +85,6 @@ DECLARE_ROUTINES_FOR (number)
|
||||
DECLARE_ROUTINES_FOR (collection_header)
|
||||
DECLARE_ROUTINES_FOR (collection_chunk)
|
||||
DECLARE_ROUTINES_FOR (string)
|
||||
DECLARE_ROUTINES_FOR (label_descriptor)
|
||||
DECLARE_ROUTINES_FOR (getter_setter_pointers)
|
||||
DECLARE_ROUTINES_FOR (external_pointer)
|
||||
|
||||
|
||||
@@ -97,18 +97,6 @@ extern ecma_string_t *ecma_alloc_string (void);
|
||||
*/
|
||||
extern void ecma_dealloc_string (ecma_string_t *);
|
||||
|
||||
/**
|
||||
* Allocate memory for label descriptor
|
||||
*
|
||||
* @return pointer to allocated memory
|
||||
*/
|
||||
extern ecma_label_descriptor_t *ecma_alloc_label_descriptor (void);
|
||||
|
||||
/**
|
||||
* Dealloc memory from label descriptor
|
||||
*/
|
||||
extern void ecma_dealloc_label_descriptor (ecma_label_descriptor_t *);
|
||||
|
||||
/**
|
||||
* Allocate memory for getter-setter pointer pair
|
||||
*
|
||||
|
||||
@@ -329,8 +329,8 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case ECMA_INTERNAL_PROPERTY_NUMBER_INDEXED_ARRAY_VALUES: /* a collection of ecma-values */
|
||||
case ECMA_INTERNAL_PROPERTY_STRING_INDEXED_ARRAY_VALUES: /* a collection of ecma-values */
|
||||
case ECMA_INTERNAL_PROPERTY_NUMBER_INDEXED_ARRAY_VALUES: /* a collection of ecma values */
|
||||
case ECMA_INTERNAL_PROPERTY_STRING_INDEXED_ARRAY_VALUES: /* a collection of ecma values */
|
||||
{
|
||||
JERRY_UNIMPLEMENTED ("Indexed array storage is not implemented yet.");
|
||||
}
|
||||
@@ -363,7 +363,7 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
break;
|
||||
}
|
||||
|
||||
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS: /* an ecma-value */
|
||||
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS: /* an ecma value */
|
||||
{
|
||||
if (ecma_is_value_object (property_value))
|
||||
{
|
||||
@@ -375,7 +375,7 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
|
||||
break;
|
||||
}
|
||||
|
||||
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS: /* a collection of ecma-values */
|
||||
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS: /* a collection of ecma values */
|
||||
{
|
||||
ecma_collection_header_t *bound_arg_list_p = ECMA_GET_NON_NULL_POINTER (ecma_collection_header_t,
|
||||
property_value);
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ecma-pointer field is used to calculate ecma-value's address.
|
||||
* Ecma-pointer field is used to calculate ecma value's address.
|
||||
*
|
||||
* Ecma-pointer contains value's shifted offset from common Ecma-pointers' base.
|
||||
* The offset is shifted right by MEM_ALIGNMENT_LOG.
|
||||
@@ -52,7 +52,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Type of ecma-value
|
||||
* Type of ecma value
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
@@ -63,7 +63,7 @@ typedef enum
|
||||
} ecma_type_t;
|
||||
|
||||
/**
|
||||
* Simple ecma-values
|
||||
* Simple ecma values
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
@@ -80,7 +80,7 @@ typedef enum
|
||||
ECMA_SIMPLE_VALUE_TRUE, /**< boolean true */
|
||||
ECMA_SIMPLE_VALUE_ARRAY_HOLE, /**< array hole, used for initialization of an array literal */
|
||||
ECMA_SIMPLE_VALUE_REGISTER_REF, /**< register reference, a special "base" value for vm */
|
||||
ECMA_SIMPLE_VALUE__COUNT /** count of simple ecma-values */
|
||||
ECMA_SIMPLE_VALUE__COUNT /** count of simple ecma values */
|
||||
} ecma_simple_value_t;
|
||||
|
||||
/**
|
||||
@@ -94,40 +94,9 @@ typedef enum
|
||||
} ecma_property_type_t;
|
||||
|
||||
/**
|
||||
* Type of block evaluation (completion) result.
|
||||
* Description of an ecma value
|
||||
*
|
||||
* See also: ECMA-262 v5, 8.9.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
ECMA_COMPLETION_TYPE_NORMAL, /**< default completion */
|
||||
ECMA_COMPLETION_TYPE_RETURN, /**< completion with return */
|
||||
ECMA_COMPLETION_TYPE_JUMP, /**< implementation-defined completion type
|
||||
* for jump statements (break, continue)
|
||||
* that require completion of one or several
|
||||
* statements, before performing related jump.
|
||||
*
|
||||
* For example, 'break' in the following code
|
||||
* requires to return from opfunc_with handler
|
||||
* before performing jump to the loop end:
|
||||
*
|
||||
* for (var i = 0; i < 10; i++)
|
||||
* {
|
||||
* with (obj)
|
||||
* {
|
||||
* break;
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
ECMA_COMPLETION_TYPE_THROW, /**< completion with throw */
|
||||
ECMA_COMPLETION_TYPE_META /**< implementation-defined completion type
|
||||
for meta opcode */
|
||||
} ecma_completion_type_t;
|
||||
|
||||
/**
|
||||
* Description of an ecma-value
|
||||
*
|
||||
* Bit-field structure: type (2) | value (ECMA_POINTER_FIELD_WIDTH)
|
||||
* Bit-field structure: type (2) | error (1) | value (ECMA_POINTER_FIELD_WIDTH)
|
||||
*/
|
||||
typedef uint32_t ecma_value_t;
|
||||
|
||||
@@ -137,11 +106,18 @@ typedef uint32_t ecma_value_t;
|
||||
#define ECMA_VALUE_TYPE_POS (0)
|
||||
#define ECMA_VALUE_TYPE_WIDTH (2)
|
||||
|
||||
/**
|
||||
* Value is error (boolean)
|
||||
*/
|
||||
#define ECMA_VALUE_ERROR_POS (ECMA_VALUE_TYPE_POS + \
|
||||
ECMA_VALUE_TYPE_WIDTH)
|
||||
#define ECMA_VALUE_ERROR_WIDTH (1)
|
||||
|
||||
/**
|
||||
* Simple value (ecma_simple_value_t) or compressed pointer to value (depending on value_type)
|
||||
*/
|
||||
#define ECMA_VALUE_VALUE_POS (ECMA_VALUE_TYPE_POS + \
|
||||
ECMA_VALUE_TYPE_WIDTH)
|
||||
#define ECMA_VALUE_VALUE_POS (ECMA_VALUE_ERROR_POS + \
|
||||
ECMA_VALUE_ERROR_WIDTH)
|
||||
#define ECMA_VALUE_VALUE_WIDTH (ECMA_POINTER_FIELD_WIDTH)
|
||||
|
||||
/**
|
||||
@@ -149,53 +125,6 @@ typedef uint32_t ecma_value_t;
|
||||
*/
|
||||
#define ECMA_VALUE_SIZE (ECMA_VALUE_VALUE_POS + ECMA_VALUE_VALUE_WIDTH)
|
||||
|
||||
/**
|
||||
* Description of a block completion value
|
||||
*
|
||||
* See also: ECMA-262 v5, 8.9.
|
||||
*
|
||||
* value (16)
|
||||
* Bit-field structure: type (8) | padding (8) <
|
||||
* break / continue target
|
||||
*/
|
||||
typedef uint32_t ecma_completion_value_t;
|
||||
|
||||
/**
|
||||
* Value
|
||||
*
|
||||
* Used for normal, return, throw and exit completion types.
|
||||
*/
|
||||
#define ECMA_COMPLETION_VALUE_VALUE_POS (0)
|
||||
#define ECMA_COMPLETION_VALUE_VALUE_WIDTH (ECMA_VALUE_SIZE)
|
||||
|
||||
/**
|
||||
* Type (ecma_completion_type_t)
|
||||
*/
|
||||
#define ECMA_COMPLETION_VALUE_TYPE_POS (JERRY_ALIGNUP (ECMA_COMPLETION_VALUE_VALUE_POS + \
|
||||
ECMA_COMPLETION_VALUE_VALUE_WIDTH, \
|
||||
JERRY_BITSINBYTE))
|
||||
#define ECMA_COMPLETION_VALUE_TYPE_WIDTH (8)
|
||||
|
||||
/**
|
||||
* Size of ecma completion value description, in bits
|
||||
*/
|
||||
#define ECMA_COMPLETION_VALUE_SIZE (ECMA_COMPLETION_VALUE_TYPE_POS + \
|
||||
ECMA_COMPLETION_VALUE_TYPE_WIDTH)
|
||||
|
||||
/**
|
||||
* Label
|
||||
*
|
||||
* Used for break and continue completion types.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
/** Target's offset */
|
||||
uint32_t offset;
|
||||
|
||||
/** Levels to label left */
|
||||
uint32_t depth;
|
||||
} ecma_label_descriptor_t;
|
||||
|
||||
/**
|
||||
* Internal properties' identifiers.
|
||||
*/
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
JERRY_STATIC_ASSERT (sizeof (ecma_value_t) * JERRY_BITSINBYTE >= ECMA_VALUE_SIZE);
|
||||
|
||||
/**
|
||||
* Get type field of ecma-value
|
||||
* Get type field of ecma value
|
||||
*
|
||||
* @return type field
|
||||
*/
|
||||
ecma_type_t __attr_pure___
|
||||
ecma_get_value_type_field (ecma_value_t value) /**< ecma-value */
|
||||
ecma_get_value_type_field (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_type_t) jrt_extract_bit_field (value,
|
||||
ECMA_VALUE_TYPE_POS,
|
||||
@@ -44,12 +44,12 @@ ecma_get_value_type_field (ecma_value_t value) /**< ecma-value */
|
||||
} /* ecma_get_value_type_field */
|
||||
|
||||
/**
|
||||
* Get value field of ecma-value
|
||||
* Get value field of ecma value
|
||||
*
|
||||
* @return value field
|
||||
*/
|
||||
static uintptr_t __attr_pure___
|
||||
ecma_get_value_value_field (ecma_value_t value) /**< ecma-value */
|
||||
ecma_get_value_value_field (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (uintptr_t) jrt_extract_bit_field (value,
|
||||
ECMA_VALUE_VALUE_POS,
|
||||
@@ -57,12 +57,12 @@ ecma_get_value_value_field (ecma_value_t value) /**< ecma-value */
|
||||
} /* ecma_get_value_value_field */
|
||||
|
||||
/**
|
||||
* Set type field of ecma-value
|
||||
* Set type field of ecma value
|
||||
*
|
||||
* @return ecma-value with updated field
|
||||
* @return ecma value with updated field
|
||||
*/
|
||||
static ecma_value_t __attr_pure___
|
||||
ecma_set_value_type_field (ecma_value_t value, /**< ecma-value to set field in */
|
||||
ecma_set_value_type_field (ecma_value_t value, /**< ecma value to set field in */
|
||||
ecma_type_t type_field) /**< new field value */
|
||||
{
|
||||
return (ecma_value_t) jrt_set_bit_field_value (value,
|
||||
@@ -72,12 +72,12 @@ ecma_set_value_type_field (ecma_value_t value, /**< ecma-value to set field in *
|
||||
} /* ecma_set_value_type_field */
|
||||
|
||||
/**
|
||||
* Set value field of ecma-value
|
||||
* Set value field of ecma value
|
||||
*
|
||||
* @return ecma-value with updated field
|
||||
* @return ecma value with updated field
|
||||
*/
|
||||
static ecma_value_t __attr_pure___
|
||||
ecma_set_value_value_field (ecma_value_t value, /**< ecma-value to set field in */
|
||||
ecma_set_value_value_field (ecma_value_t value, /**< ecma value to set field in */
|
||||
uintptr_t value_field) /**< new field value */
|
||||
{
|
||||
return (ecma_value_t) jrt_set_bit_field_value (value,
|
||||
@@ -93,7 +93,7 @@ ecma_set_value_value_field (ecma_value_t value, /**< ecma-value to set field in
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_empty (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_empty (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_EMPTY);
|
||||
@@ -106,7 +106,7 @@ ecma_is_value_empty (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_undefined (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_undefined (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
@@ -119,7 +119,7 @@ ecma_is_value_undefined (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_null (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_null (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_NULL);
|
||||
@@ -132,7 +132,7 @@ ecma_is_value_null (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_boolean (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_boolean (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& (ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_TRUE
|
||||
@@ -142,19 +142,29 @@ ecma_is_value_boolean (ecma_value_t value) /**< ecma-value */
|
||||
/**
|
||||
* Check if the value is true.
|
||||
*
|
||||
* Warning:
|
||||
* value must be boolean
|
||||
*
|
||||
* @return true - if the value contains ecma-true simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_true (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_true (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_TRUE);
|
||||
} /* ecma_is_value_true */
|
||||
|
||||
/**
|
||||
* Check if the value is false.
|
||||
*
|
||||
* @return true - if the value contains ecma-false simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_false (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_FALSE);
|
||||
} /* ecma_is_value_false */
|
||||
|
||||
/**
|
||||
* Check if the value is array hole.
|
||||
*
|
||||
@@ -162,7 +172,7 @@ ecma_is_value_true (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_array_hole (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_array_hole (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE
|
||||
&& ecma_get_value_value_field (value) == ECMA_SIMPLE_VALUE_ARRAY_HOLE);
|
||||
@@ -175,7 +185,7 @@ ecma_is_value_array_hole (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_number (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_number (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER);
|
||||
} /* ecma_is_value_number */
|
||||
@@ -187,7 +197,7 @@ ecma_is_value_number (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_string (ecma_value_t value) /**< ecma-value */
|
||||
ecma_is_value_string (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (ecma_get_value_type_field (value) == ECMA_TYPE_STRING);
|
||||
} /* ecma_is_value_string */
|
||||
@@ -199,17 +209,29 @@ ecma_is_value_string (ecma_value_t value) /**< ecma-value */
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_object (ecma_value_t value) /**< ecma-value */
|
||||
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 an error value.
|
||||
*
|
||||
* @return true - if the value contains an error value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_error (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (value & (1u << ECMA_VALUE_ERROR_POS)) != 0;
|
||||
} /* ecma_is_value_error */
|
||||
|
||||
/**
|
||||
* 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 */
|
||||
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)
|
||||
@@ -272,7 +294,7 @@ ecma_make_string_value (const ecma_string_t *ecma_string_p) /**< string to refer
|
||||
} /* ecma_make_string_value */
|
||||
|
||||
/**
|
||||
* object value constructor
|
||||
* Object value constructor
|
||||
*/
|
||||
ecma_value_t __attr_const___
|
||||
ecma_make_object_value (const ecma_object_t *object_p) /**< object to reference in value */
|
||||
@@ -291,12 +313,34 @@ ecma_make_object_value (const ecma_object_t *object_p) /**< object to reference
|
||||
} /* ecma_make_object_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-number from ecma-value
|
||||
* Error value constructor
|
||||
*/
|
||||
ecma_value_t __attr_const___
|
||||
ecma_make_error_value (ecma_value_t value) /**< original ecma value */
|
||||
{
|
||||
/* Error values cannot be converted. */
|
||||
JERRY_ASSERT (!ecma_is_value_error (value));
|
||||
|
||||
return value | (1u << ECMA_VALUE_ERROR_POS);
|
||||
} /* ecma_make_error_value */
|
||||
|
||||
|
||||
/**
|
||||
* Error value constructor
|
||||
*/
|
||||
ecma_value_t __attr_const___
|
||||
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 */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-number from ecma value
|
||||
*
|
||||
* @return the pointer
|
||||
*/
|
||||
ecma_number_t *__attr_pure___
|
||||
ecma_get_number_from_value (ecma_value_t value) /**< ecma-value */
|
||||
ecma_get_number_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER);
|
||||
|
||||
@@ -305,12 +349,12 @@ ecma_get_number_from_value (ecma_value_t value) /**< ecma-value */
|
||||
} /* ecma_get_number_from_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-string from ecma-value
|
||||
* Get pointer to ecma-string from ecma value
|
||||
*
|
||||
* @return the pointer
|
||||
*/
|
||||
ecma_string_t *__attr_pure___
|
||||
ecma_get_string_from_value (ecma_value_t value) /**< ecma-value */
|
||||
ecma_get_string_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING);
|
||||
|
||||
@@ -319,12 +363,12 @@ ecma_get_string_from_value (ecma_value_t value) /**< ecma-value */
|
||||
} /* ecma_get_string_from_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-object from ecma-value
|
||||
* Get pointer to ecma-object from ecma value
|
||||
*
|
||||
* @return the pointer
|
||||
*/
|
||||
ecma_object_t *__attr_pure___
|
||||
ecma_get_object_from_value (ecma_value_t value) /**< ecma-value */
|
||||
ecma_get_object_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT);
|
||||
|
||||
@@ -333,7 +377,24 @@ ecma_get_object_from_value (ecma_value_t value) /**< ecma-value */
|
||||
} /* ecma_get_object_from_value */
|
||||
|
||||
/**
|
||||
* Copy ecma-value.
|
||||
* Get the value from an error ecma value
|
||||
*
|
||||
* @return ecma value
|
||||
*/
|
||||
ecma_value_t __attr_pure___
|
||||
ecma_get_value_from_error_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_error (value));
|
||||
|
||||
value = (ecma_value_t) (value & ~(1u << ECMA_VALUE_ERROR_POS));
|
||||
|
||||
JERRY_ASSERT (!ecma_is_value_error (value));
|
||||
|
||||
return value;
|
||||
} /* ecma_get_value_from_error_value */
|
||||
|
||||
/**
|
||||
* Copy ecma value.
|
||||
*
|
||||
* Note:
|
||||
* Operation algorithm.
|
||||
@@ -342,7 +403,7 @@ ecma_get_object_from_value (ecma_value_t value) /**< ecma-value */
|
||||
* simply return the value as it was passed;
|
||||
* case number:
|
||||
* copy the number
|
||||
* and return new ecma-value
|
||||
* and return new ecma value
|
||||
* pointing to copy of the number;
|
||||
* case string:
|
||||
* increase reference counter of the string
|
||||
@@ -354,7 +415,7 @@ ecma_get_object_from_value (ecma_value_t value) /**< ecma-value */
|
||||
* @return See note.
|
||||
*/
|
||||
ecma_value_t
|
||||
ecma_copy_value (ecma_value_t value, /**< ecma-value */
|
||||
ecma_copy_value (ecma_value_t value, /**< ecma value */
|
||||
bool do_ref_if_object) /**< if the value is object value,
|
||||
increment reference counter of the object */
|
||||
{
|
||||
@@ -408,12 +469,10 @@ ecma_copy_value (ecma_value_t value, /**< ecma-value */
|
||||
} /* ecma_copy_value */
|
||||
|
||||
/**
|
||||
* Free the ecma-value
|
||||
* Free the ecma value
|
||||
*/
|
||||
void
|
||||
ecma_free_value (ecma_value_t value, /**< value description */
|
||||
bool do_deref_if_object) /**< if the value is object value,
|
||||
decrement reference counter of the object */
|
||||
ecma_free_value (ecma_value_t value) /**< value description */
|
||||
{
|
||||
switch (ecma_get_value_type_field (value))
|
||||
{
|
||||
@@ -439,414 +498,23 @@ ecma_free_value (ecma_value_t value, /**< value description */
|
||||
|
||||
case ECMA_TYPE_OBJECT:
|
||||
{
|
||||
if (do_deref_if_object)
|
||||
{
|
||||
ecma_deref_object (ecma_get_object_from_value (value));
|
||||
}
|
||||
ecma_deref_object (ecma_get_object_from_value (value));
|
||||
break;
|
||||
}
|
||||
}
|
||||
} /* ecma_free_value */
|
||||
|
||||
/**
|
||||
* Get type field of completion value
|
||||
*
|
||||
* @return type field
|
||||
*/
|
||||
static ecma_completion_type_t __attr_const___
|
||||
ecma_get_completion_value_type_field (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
return (ecma_completion_type_t) jrt_extract_bit_field (completion_value,
|
||||
ECMA_COMPLETION_VALUE_TYPE_POS,
|
||||
ECMA_COMPLETION_VALUE_TYPE_WIDTH);
|
||||
} /* ecma_get_completion_value_type_field */
|
||||
|
||||
/**
|
||||
* Get value field of completion value
|
||||
*
|
||||
* @return value field
|
||||
*/
|
||||
static ecma_value_t __attr_const___
|
||||
ecma_get_completion_value_value_field (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
return (ecma_value_t) jrt_extract_bit_field (completion_value,
|
||||
ECMA_COMPLETION_VALUE_VALUE_POS,
|
||||
ECMA_COMPLETION_VALUE_VALUE_WIDTH);
|
||||
} /* ecma_get_completion_value_value_field */
|
||||
|
||||
/**
|
||||
* Set type field of completion value
|
||||
*
|
||||
* @return completion value with updated field
|
||||
*/
|
||||
static ecma_completion_value_t __attr_const___
|
||||
ecma_set_completion_value_type_field (ecma_completion_value_t completion_value, /**< completion value
|
||||
* to set field in */
|
||||
ecma_completion_type_t type_field) /**< new field value */
|
||||
{
|
||||
return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value,
|
||||
type_field,
|
||||
ECMA_COMPLETION_VALUE_TYPE_POS,
|
||||
ECMA_COMPLETION_VALUE_TYPE_WIDTH);
|
||||
} /* ecma_set_completion_value_type_field */
|
||||
|
||||
/**
|
||||
* Set value field of completion value
|
||||
*
|
||||
* @return completion value with updated field
|
||||
*/
|
||||
static ecma_completion_value_t __attr_pure___
|
||||
ecma_set_completion_value_value_field (ecma_completion_value_t completion_value, /**< completion value
|
||||
* to set field in */
|
||||
ecma_value_t value_field) /**< new field value */
|
||||
{
|
||||
return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value,
|
||||
value_field,
|
||||
ECMA_COMPLETION_VALUE_VALUE_POS,
|
||||
ECMA_COMPLETION_VALUE_VALUE_WIDTH);
|
||||
} /* ecma_set_completion_value_value_field */
|
||||
|
||||
|
||||
/**
|
||||
* Normal, throw, return, exit and meta completion values constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_completion_value (ecma_completion_type_t type, /**< type */
|
||||
ecma_value_t value) /**< value */
|
||||
{
|
||||
const bool is_type_ok = (type == ECMA_COMPLETION_TYPE_NORMAL
|
||||
|| type == ECMA_COMPLETION_TYPE_THROW
|
||||
|| type == ECMA_COMPLETION_TYPE_RETURN
|
||||
|| (type == ECMA_COMPLETION_TYPE_META
|
||||
&& ecma_is_value_empty (value)));
|
||||
|
||||
JERRY_ASSERT (is_type_ok);
|
||||
|
||||
ecma_completion_value_t completion_value = 0;
|
||||
|
||||
completion_value = ecma_set_completion_value_type_field (completion_value,
|
||||
type);
|
||||
completion_value = ecma_set_completion_value_value_field (completion_value,
|
||||
value);
|
||||
|
||||
return completion_value;
|
||||
} /* ecma_make_completion_value */
|
||||
|
||||
/**
|
||||
* Simple normal completion value constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_const___ __attr_always_inline___
|
||||
ecma_make_simple_completion_value (ecma_simple_value_t simple_value) /**< simple ecma-value */
|
||||
{
|
||||
JERRY_ASSERT (simple_value == ECMA_SIMPLE_VALUE_UNDEFINED
|
||||
|| simple_value == ECMA_SIMPLE_VALUE_NULL
|
||||
|| simple_value == ECMA_SIMPLE_VALUE_FALSE
|
||||
|| simple_value == ECMA_SIMPLE_VALUE_TRUE);
|
||||
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_make_simple_value (simple_value));
|
||||
} /* ecma_make_simple_completion_value */
|
||||
|
||||
/**
|
||||
* Normal completion value constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_normal_completion_value (ecma_value_t value) /**< value */
|
||||
{
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL, value);
|
||||
} /* ecma_make_normal_completion_value */
|
||||
|
||||
/**
|
||||
* Throw completion value constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_throw_completion_value (ecma_value_t value) /**< value */
|
||||
{
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_THROW, value);
|
||||
} /* ecma_make_throw_completion_value */
|
||||
|
||||
/**
|
||||
* Throw completion value constructor.
|
||||
*
|
||||
* @return 'throw' completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_const___
|
||||
ecma_make_throw_obj_completion_value (ecma_object_t *exception_p) /**< an object */
|
||||
{
|
||||
JERRY_ASSERT (exception_p != NULL
|
||||
&& !ecma_is_lexical_environment (exception_p));
|
||||
|
||||
ecma_value_t exception = ecma_make_object_value (exception_p);
|
||||
|
||||
return ecma_make_throw_completion_value (exception);
|
||||
} /* ecma_make_throw_obj_completion_value */
|
||||
|
||||
/**
|
||||
* Empty completion value constructor.
|
||||
*
|
||||
* @return (normal, empty, reserved) completion value.
|
||||
*/
|
||||
ecma_completion_value_t __attr_const___ __attr_always_inline___
|
||||
ecma_make_empty_completion_value (void)
|
||||
{
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY));
|
||||
} /* ecma_make_empty_completion_value */
|
||||
|
||||
/**
|
||||
* Return completion value constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_make_return_completion_value (ecma_value_t value) /**< value */
|
||||
{
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_RETURN, value);
|
||||
} /* ecma_make_return_completion_value */
|
||||
|
||||
/**
|
||||
* Meta completion value constructor
|
||||
*
|
||||
* @return completion value
|
||||
*/
|
||||
ecma_completion_value_t __attr_const___ __attr_always_inline___
|
||||
ecma_make_meta_completion_value (void)
|
||||
{
|
||||
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_META,
|
||||
ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY));
|
||||
} /* ecma_make_meta_completion_value */
|
||||
|
||||
/**
|
||||
* Get ecma-value from specified completion value
|
||||
*
|
||||
* @return ecma-value
|
||||
*/
|
||||
ecma_value_t __attr_const___ __attr_always_inline___
|
||||
ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
const ecma_completion_type_t type = ecma_get_completion_value_type_field (completion_value);
|
||||
|
||||
const bool is_type_ok = (type == ECMA_COMPLETION_TYPE_NORMAL
|
||||
|| type == ECMA_COMPLETION_TYPE_THROW
|
||||
|| type == ECMA_COMPLETION_TYPE_RETURN);
|
||||
|
||||
JERRY_ASSERT (is_type_ok);
|
||||
|
||||
return ecma_get_completion_value_value_field (completion_value);
|
||||
} /* ecma_get_completion_value_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-number from completion value
|
||||
*
|
||||
* @return pointer
|
||||
*/
|
||||
ecma_number_t *__attr_const___
|
||||
ecma_get_number_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
return ecma_get_number_from_value (ecma_get_completion_value_value (completion_value));
|
||||
} /* ecma_get_number_from_completion_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-string from completion value
|
||||
*
|
||||
* @return pointer
|
||||
*/
|
||||
ecma_string_t *__attr_const___
|
||||
ecma_get_string_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
return ecma_get_string_from_value (ecma_get_completion_value_value (completion_value));
|
||||
} /* ecma_get_string_from_completion_value */
|
||||
|
||||
/**
|
||||
* Get pointer to ecma-object from completion value
|
||||
*
|
||||
* @return pointer
|
||||
*/
|
||||
ecma_object_t *__attr_const___
|
||||
ecma_get_object_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */
|
||||
{
|
||||
return ecma_get_object_from_value (ecma_get_completion_value_value (completion_value));
|
||||
} /* ecma_get_object_from_completion_value */
|
||||
|
||||
/**
|
||||
* Copy ecma-completion value.
|
||||
*
|
||||
* @return (source.type, ecma_copy_value (source.value), source.target).
|
||||
*/
|
||||
ecma_completion_value_t
|
||||
ecma_copy_completion_value (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
const ecma_completion_type_t type = ecma_get_completion_value_type_field (value);
|
||||
const bool is_type_ok = (type == ECMA_COMPLETION_TYPE_NORMAL
|
||||
|| type == ECMA_COMPLETION_TYPE_THROW
|
||||
|| type == ECMA_COMPLETION_TYPE_RETURN
|
||||
|| type == ECMA_COMPLETION_TYPE_JUMP);
|
||||
|
||||
JERRY_ASSERT (is_type_ok);
|
||||
|
||||
return ecma_make_completion_value (type,
|
||||
ecma_copy_value (ecma_get_completion_value_value_field (value),
|
||||
true));
|
||||
} /* ecma_copy_completion_value */
|
||||
|
||||
/**
|
||||
* Free the completion value.
|
||||
* Free the ecma value if not an object
|
||||
*/
|
||||
void
|
||||
ecma_free_completion_value (ecma_completion_value_t completion_value) /**< completion value */
|
||||
ecma_free_value_if_not_object (ecma_value_t value) /**< value description */
|
||||
{
|
||||
switch (ecma_get_completion_value_type_field (completion_value))
|
||||
if (ecma_get_value_type_field (value) != ECMA_TYPE_OBJECT)
|
||||
{
|
||||
case ECMA_COMPLETION_TYPE_NORMAL:
|
||||
case ECMA_COMPLETION_TYPE_THROW:
|
||||
case ECMA_COMPLETION_TYPE_RETURN:
|
||||
{
|
||||
ecma_value_t v = ecma_get_completion_value_value_field (completion_value);
|
||||
ecma_free_value (v, true);
|
||||
break;
|
||||
}
|
||||
case ECMA_COMPLETION_TYPE_JUMP:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case ECMA_COMPLETION_TYPE_META:
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
}
|
||||
ecma_free_value (value);
|
||||
}
|
||||
} /* ecma_free_completion_value */
|
||||
|
||||
/**
|
||||
* Check if the completion value is normal value.
|
||||
*
|
||||
* @return true - if the completion type is normal,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_normal (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_NORMAL);
|
||||
} /* ecma_is_completion_value_normal */
|
||||
|
||||
/**
|
||||
* Check if the completion value is throw value.
|
||||
*
|
||||
* @return true - if the completion type is throw,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_throw (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_THROW);
|
||||
} /* ecma_is_completion_value_throw */
|
||||
|
||||
/**
|
||||
* Check if the completion value is return value.
|
||||
*
|
||||
* @return true - if the completion type is return,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_return (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_RETURN);
|
||||
} /* ecma_is_completion_value_return */
|
||||
|
||||
/**
|
||||
* Check if the completion value is meta value.
|
||||
*
|
||||
* @return true - if the completion type is meta,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_meta (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_META)
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_empty (ecma_get_completion_value_value_field (value)));
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
} /* ecma_is_completion_value_meta */
|
||||
|
||||
/**
|
||||
* Check if the completion value is break / continue value.
|
||||
*
|
||||
* @return true - if the completion type is break / continue,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_jump (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_JUMP);
|
||||
} /* ecma_is_completion_value_jump */
|
||||
|
||||
/**
|
||||
* Check if the completion value is specified normal simple value.
|
||||
*
|
||||
* @return true - if the completion type is normal and
|
||||
* value contains specified simple ecma-value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_normal_simple_value (ecma_completion_value_t value, /**< completion value */
|
||||
ecma_simple_value_t simple_value) /**< simple value to check
|
||||
for equality with */
|
||||
{
|
||||
return (value == ecma_make_simple_completion_value (simple_value));
|
||||
} /* ecma_is_completion_value_normal_simple_value */
|
||||
|
||||
/**
|
||||
* Check if the completion value is normal true.
|
||||
*
|
||||
* @return true - if the completion type is normal and
|
||||
* value contains ecma-true simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_normal_true (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return ecma_is_completion_value_normal_simple_value (value, ECMA_SIMPLE_VALUE_TRUE);
|
||||
} /* ecma_is_completion_value_normal_true */
|
||||
|
||||
/**
|
||||
* Check if the completion value is normal false.
|
||||
*
|
||||
* @return true - if the completion type is normal and
|
||||
* value contains ecma-false simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_normal_false (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return ecma_is_completion_value_normal_simple_value (value, ECMA_SIMPLE_VALUE_FALSE);
|
||||
} /* ecma_is_completion_value_normal_false */
|
||||
|
||||
/**
|
||||
* Check if the completion value is normal empty value.
|
||||
*
|
||||
* @return true - if the completion type is normal and
|
||||
* value contains empty simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
bool __attr_const___ __attr_always_inline___
|
||||
ecma_is_completion_value_empty (ecma_completion_value_t value) /**< completion value */
|
||||
{
|
||||
return (ecma_is_completion_value_normal (value)
|
||||
&& ecma_is_value_empty (ecma_get_completion_value_value_field (value)));
|
||||
} /* ecma_is_completion_value_empty */
|
||||
} /* ecma_free_value_if_not_object */
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
#include "jrt.h"
|
||||
|
||||
/**
|
||||
* Allocate a collection of ecma-values.
|
||||
* Allocate a collection of ecma values.
|
||||
*
|
||||
* @return pointer to the collection's header
|
||||
*/
|
||||
ecma_collection_header_t *
|
||||
ecma_new_values_collection (const ecma_value_t values_buffer[], /**< ecma-values */
|
||||
ecma_length_t values_number, /**< number of ecma-values */
|
||||
ecma_new_values_collection (const ecma_value_t values_buffer[], /**< ecma values */
|
||||
ecma_length_t values_number, /**< number of ecma values */
|
||||
bool do_ref_if_object) /**< if the value is object value,
|
||||
increase reference counter of the object */
|
||||
{
|
||||
@@ -77,7 +77,7 @@ ecma_new_values_collection (const ecma_value_t values_buffer[], /**< ecma-values
|
||||
} /* ecma_new_values_collection */
|
||||
|
||||
/**
|
||||
* Free the collection of ecma-values.
|
||||
* Free the collection of ecma values.
|
||||
*/
|
||||
void
|
||||
ecma_free_values_collection (ecma_collection_header_t *header_p, /**< collection's header */
|
||||
@@ -104,7 +104,14 @@ ecma_free_values_collection (ecma_collection_header_t *header_p, /**< collection
|
||||
{
|
||||
JERRY_ASSERT (cur_value_buf_iter_p < cur_value_buf_end_p);
|
||||
|
||||
ecma_free_value (*cur_value_buf_iter_p, do_deref_if_object);
|
||||
if (do_deref_if_object)
|
||||
{
|
||||
ecma_free_value (*cur_value_buf_iter_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_free_value_if_not_object (*cur_value_buf_iter_p);
|
||||
}
|
||||
|
||||
cur_value_buf_iter_p++;
|
||||
value_index++;
|
||||
@@ -120,11 +127,11 @@ ecma_free_values_collection (ecma_collection_header_t *header_p, /**< collection
|
||||
} /* ecma_free_values_collection */
|
||||
|
||||
/**
|
||||
* Append new value to ecma-values collection
|
||||
* Append new value to ecma values collection
|
||||
*/
|
||||
void
|
||||
ecma_append_to_values_collection (ecma_collection_header_t *header_p, /**< collection's header */
|
||||
ecma_value_t v, /**< ecma-value to append */
|
||||
ecma_value_t v, /**< ecma value to append */
|
||||
bool do_ref_if_object) /**< if the value is object value,
|
||||
increase reference counter of the object */
|
||||
{
|
||||
@@ -192,10 +199,7 @@ ecma_append_to_values_collection (ecma_collection_header_t *header_p, /**< colle
|
||||
* the function invalidates all iterators that are configured to access the passed collection
|
||||
*/
|
||||
void
|
||||
ecma_remove_last_value_from_values_collection (ecma_collection_header_t *header_p, /**< collection's header */
|
||||
bool do_deref_if_object) /**< if the value to remove
|
||||
* is object value, decrement
|
||||
* reference counter of the object */
|
||||
ecma_remove_last_value_from_values_collection (ecma_collection_header_t *header_p) /**< collection's header */
|
||||
{
|
||||
JERRY_ASSERT (header_p != NULL && header_p->unit_number > 0);
|
||||
|
||||
@@ -211,7 +215,7 @@ ecma_remove_last_value_from_values_collection (ecma_collection_header_t *header_
|
||||
|
||||
ecma_value_t value_to_remove = values_p[pos_of_value_to_remove_in_chunk];
|
||||
|
||||
ecma_free_value (value_to_remove, do_deref_if_object);
|
||||
ecma_free_value (value_to_remove);
|
||||
|
||||
header_p->unit_number--;
|
||||
|
||||
|
||||
@@ -716,7 +716,7 @@ ecma_free_named_data_property (ecma_object_t *object_p, /**< object the property
|
||||
property_p->u.named_data_property.name_p));
|
||||
|
||||
ecma_value_t v = ecma_get_named_data_property_value (property_p);
|
||||
ecma_free_value (v, false);
|
||||
ecma_free_value_if_not_object (v);
|
||||
|
||||
ecma_dealloc_property (property_p);
|
||||
} /* ecma_free_named_data_property */
|
||||
@@ -811,7 +811,7 @@ ecma_free_internal_property (ecma_property_t *property_p) /**< the property */
|
||||
|
||||
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS:
|
||||
{
|
||||
ecma_free_value (property_value, false);
|
||||
ecma_free_value_if_not_object (property_value);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -951,7 +951,7 @@ ecma_assert_object_contains_the_property (const ecma_object_t *object_p, /**< ec
|
||||
/**
|
||||
* Get value field of named data property
|
||||
*
|
||||
* @return ecma-value
|
||||
* @return ecma value
|
||||
*/
|
||||
ecma_value_t
|
||||
ecma_get_named_data_property_value (const ecma_property_t *prop_p) /**< property */
|
||||
@@ -998,7 +998,7 @@ ecma_named_data_property_assign_value (ecma_object_t *obj_p, /**< object */
|
||||
else
|
||||
{
|
||||
ecma_value_t v = ecma_get_named_data_property_value (prop_p);
|
||||
ecma_free_value (v, false);
|
||||
ecma_free_value_if_not_object (v);
|
||||
|
||||
ecma_set_named_data_property_value (prop_p, ecma_copy_value (value, false));
|
||||
}
|
||||
@@ -1262,7 +1262,7 @@ ecma_free_property_descriptor (ecma_property_descriptor_t *prop_desc_p) /**< pro
|
||||
{
|
||||
if (prop_desc_p->is_value_defined)
|
||||
{
|
||||
ecma_free_value (prop_desc_p->value, true);
|
||||
ecma_free_value (prop_desc_p->value);
|
||||
}
|
||||
|
||||
if (prop_desc_p->is_get_defined
|
||||
@@ -1340,7 +1340,7 @@ ecma_bytecode_ref (ecma_compiled_code_t *bytecode_p) /**< byte code pointer */
|
||||
jerry_fatal (ERR_REF_COUNT_LIMIT);
|
||||
}
|
||||
|
||||
bytecode_p->status_flags = (uint16_t) (bytecode_p->status_flags + (1 << ECMA_BYTECODE_REF_SHIFT));
|
||||
bytecode_p->status_flags = (uint16_t) (bytecode_p->status_flags + (1u << ECMA_BYTECODE_REF_SHIFT));
|
||||
} /* ecma_bytecode_ref */
|
||||
|
||||
/**
|
||||
@@ -1352,9 +1352,9 @@ ecma_bytecode_deref (ecma_compiled_code_t *bytecode_p) /**< byte code pointer */
|
||||
{
|
||||
JERRY_ASSERT ((bytecode_p->status_flags >> ECMA_BYTECODE_REF_SHIFT) > 0);
|
||||
|
||||
bytecode_p->status_flags = (uint16_t) (bytecode_p->status_flags - (1 << ECMA_BYTECODE_REF_SHIFT));
|
||||
bytecode_p->status_flags = (uint16_t) (bytecode_p->status_flags - (1u << ECMA_BYTECODE_REF_SHIFT));
|
||||
|
||||
if (bytecode_p->status_flags >= (1 << ECMA_BYTECODE_REF_SHIFT))
|
||||
if (bytecode_p->status_flags >= (1u << ECMA_BYTECODE_REF_SHIFT))
|
||||
{
|
||||
/* Non-zero reference counter. */
|
||||
return;
|
||||
|
||||
@@ -59,11 +59,13 @@ extern bool ecma_is_value_undefined (ecma_value_t);
|
||||
extern bool ecma_is_value_null (ecma_value_t);
|
||||
extern bool ecma_is_value_boolean (ecma_value_t);
|
||||
extern bool ecma_is_value_true (ecma_value_t);
|
||||
extern bool ecma_is_value_false (ecma_value_t);
|
||||
extern bool ecma_is_value_array_hole (ecma_value_t);
|
||||
|
||||
extern bool ecma_is_value_number (ecma_value_t);
|
||||
extern bool ecma_is_value_string (ecma_value_t);
|
||||
extern bool ecma_is_value_object (ecma_value_t);
|
||||
extern bool ecma_is_value_error (ecma_value_t);
|
||||
|
||||
extern void ecma_check_value_type_is_spec_defined (ecma_value_t);
|
||||
|
||||
@@ -71,36 +73,15 @@ extern ecma_value_t ecma_make_simple_value (const ecma_simple_value_t value);
|
||||
extern ecma_value_t ecma_make_number_value (const ecma_number_t *);
|
||||
extern ecma_value_t ecma_make_string_value (const ecma_string_t *);
|
||||
extern ecma_value_t ecma_make_object_value (const ecma_object_t *);
|
||||
extern ecma_value_t ecma_make_error_value (ecma_value_t);
|
||||
extern ecma_value_t ecma_make_error_obj_value (const ecma_object_t *);
|
||||
extern ecma_number_t *ecma_get_number_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_string_t *ecma_get_string_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_object_t *ecma_get_object_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_value_t ecma_get_value_from_error_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_value_t ecma_copy_value (ecma_value_t, bool);
|
||||
extern void ecma_free_value (ecma_value_t, bool);
|
||||
|
||||
extern ecma_completion_value_t ecma_make_completion_value (ecma_completion_type_t, ecma_value_t);
|
||||
extern ecma_completion_value_t ecma_make_simple_completion_value (ecma_simple_value_t);
|
||||
extern ecma_completion_value_t ecma_make_normal_completion_value (ecma_value_t);
|
||||
extern ecma_completion_value_t ecma_make_throw_completion_value (ecma_value_t);
|
||||
extern ecma_completion_value_t ecma_make_throw_obj_completion_value (ecma_object_t *);
|
||||
extern ecma_completion_value_t ecma_make_empty_completion_value (void);
|
||||
extern ecma_completion_value_t ecma_make_return_completion_value (ecma_value_t);
|
||||
extern ecma_completion_value_t ecma_make_meta_completion_value (void);
|
||||
extern ecma_value_t ecma_get_completion_value_value (ecma_completion_value_t);
|
||||
extern ecma_number_t *ecma_get_number_from_completion_value (ecma_completion_value_t) __attr_const___;
|
||||
extern ecma_string_t *ecma_get_string_from_completion_value (ecma_completion_value_t) __attr_const___;
|
||||
extern ecma_object_t *ecma_get_object_from_completion_value (ecma_completion_value_t) __attr_const___;
|
||||
extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t);
|
||||
extern void ecma_free_completion_value (ecma_completion_value_t);
|
||||
|
||||
extern bool ecma_is_completion_value_normal (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_throw (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_return (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_meta (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_jump (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_normal_simple_value (ecma_completion_value_t, ecma_simple_value_t);
|
||||
extern bool ecma_is_completion_value_normal_true (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_normal_false (ecma_completion_value_t);
|
||||
extern bool ecma_is_completion_value_empty (ecma_completion_value_t);
|
||||
extern void ecma_free_value (ecma_value_t);
|
||||
extern void ecma_free_value_if_not_object (ecma_value_t);
|
||||
|
||||
/* ecma-helpers-string.c */
|
||||
extern ecma_string_t *ecma_new_ecma_string_from_utf8 (const lit_utf8_byte_t *, lit_utf8_size_t);
|
||||
@@ -167,11 +148,11 @@ extern void ecma_number_to_decimal (ecma_number_t, uint64_t *, int32_t *, int32_
|
||||
extern ecma_collection_header_t *ecma_new_values_collection (const ecma_value_t[], ecma_length_t, bool);
|
||||
extern void ecma_free_values_collection (ecma_collection_header_t *, bool);
|
||||
extern void ecma_append_to_values_collection (ecma_collection_header_t *, ecma_value_t, bool);
|
||||
extern void ecma_remove_last_value_from_values_collection (ecma_collection_header_t *, bool);
|
||||
extern void ecma_remove_last_value_from_values_collection (ecma_collection_header_t *);
|
||||
extern ecma_collection_header_t *ecma_new_strings_collection (ecma_string_t *[], ecma_length_t);
|
||||
|
||||
/**
|
||||
* Context of ecma-values' collection iterator
|
||||
* Context of ecma values' collection iterator
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user