Skip to content

Commit b4625ce

Browse files
committed
Introduce integer ecma-value representation to reduce the double allocations.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
1 parent 7e0cd85 commit b4625ce

32 files changed

+784
-588
lines changed

jerry-core/ecma/base/ecma-globals.h

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@
5555
*/
5656
typedef enum
5757
{
58-
ECMA_TYPE_SIMPLE, /**< simple value */
59-
ECMA_TYPE_NUMBER, /**< 64-bit integer */
58+
ECMA_TYPE_DIRECT, /**< directly encoded value, a 28 bit signed integer or a simple value */
59+
ECMA_TYPE_FLOAT, /**< pointer to a 64 or 32 bit floating point number */
6060
ECMA_TYPE_STRING, /**< pointer to description of a string */
6161
ECMA_TYPE_OBJECT, /**< pointer to description of an object */
6262
ECMA_TYPE___MAX = ECMA_TYPE_OBJECT /** highest value for ecma types */
@@ -68,10 +68,10 @@ typedef enum
6868
typedef enum
6969
{
7070
/**
71-
* Empty value is implementation defined value, used for:
72-
* - representing empty value in completion values (see also: ECMA-262 v5, 8.9 Completion specification type);
73-
* - values of uninitialized immutable bindings;
74-
* - values of empty register variables.
71+
* Empty value is implementation defined value, used for representing:
72+
* - empty (uninitialized) values
73+
* - immutable binding values
74+
* - special register or stack values for vm
7575
*/
7676
ECMA_SIMPLE_VALUE_EMPTY,
7777
ECMA_SIMPLE_VALUE_UNDEFINED, /**< undefined value */
@@ -90,6 +90,11 @@ typedef enum
9090
*/
9191
typedef uint32_t ecma_value_t;
9292

93+
/**
94+
* Type for directly encoded integer numbers in JerryScript.
95+
*/
96+
typedef int32_t ecma_integer_value_t;
97+
9398
#if UINTPTR_MAX <= UINT32_MAX
9499

95100
/**
@@ -114,6 +119,36 @@ typedef uint32_t ecma_value_t;
114119
*/
115120
#define ECMA_VALUE_SHIFT 3
116121

122+
/**
123+
* Mask for directly encoded values
124+
*/
125+
#define ECMA_DIRECT_TYPE_MASK ((1u << ECMA_VALUE_SHIFT) | ECMA_VALUE_TYPE_MASK)
126+
127+
/**
128+
* Ecma integer value type
129+
*/
130+
#define ECMA_DIRECT_TYPE_INTEGER_VALUE ((0u << ECMA_VALUE_SHIFT) | ECMA_TYPE_DIRECT)
131+
132+
/**
133+
* Ecma simple value type
134+
*/
135+
#define ECMA_DIRECT_TYPE_SIMPLE_VALUE ((1u << ECMA_VALUE_SHIFT) | ECMA_TYPE_DIRECT)
136+
137+
/**
138+
* Shift for directly encoded values in ecma_value_t
139+
*/
140+
#define ECMA_DIRECT_SHIFT 4
141+
142+
/**
143+
* Maximum integer number for an ecma value
144+
*/
145+
#define ECMA_INTEGER_NUMBER_MAX 0x7ffffff
146+
147+
/**
148+
* Minimum integer number for an ecma value
149+
*/
150+
#define ECMA_INTEGER_NUMBER_MIN -0x8000000
151+
117152
/**
118153
* Internal properties' identifiers.
119154
*/

jerry-core/ecma/base/ecma-helpers-number.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@
2424
* @{
2525
*/
2626

27+
JERRY_STATIC_ASSERT (sizeof (ecma_value_t) == sizeof (ecma_integer_value_t),
28+
size_of_ecma_value_t_must_be_equal_to_the_size_of_ecma_integer_value_t);
29+
30+
JERRY_STATIC_ASSERT (ECMA_DIRECT_SHIFT == ECMA_VALUE_SHIFT + 1,
31+
currently_directly_encoded_values_has_one_extra_flag);
32+
33+
JERRY_STATIC_ASSERT (((1 << (ECMA_DIRECT_SHIFT - 1)) | ECMA_TYPE_DIRECT) == ECMA_DIRECT_TYPE_SIMPLE_VALUE,
34+
currently_directly_encoded_values_start_after_direct_type_simple_value);
35+
2736
#define ECMA_NUMBER_SIGN_POS (ECMA_NUMBER_FRACTION_WIDTH + \
2837
ECMA_NUMBER_BIASED_EXP_WIDTH)
2938

0 commit comments

Comments
 (0)