Converting ecma_value_t to class that is used for on-stack storage of ecma-values.

Original ecma_value_t is renamed to ecma_value_packed_t and is used for on-heap storage.
Copy and move constructors, move assignment operator of ecma_value_t are not created.
New ecma-value return convention is introduced: ecma-values are now returned through ecma_value_t &ret_val argument.
This commit is contained in:
Ruben Ayrapetyan
2015-01-30 22:52:43 +03:00
parent 4cd7f96acc
commit 00afd4e0e2
70 changed files with 1192 additions and 976 deletions
+7 -4
View File
@@ -370,7 +370,7 @@ run_int (void)
ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
ecma_object_t *lex_env_p = ecma_op_create_global_environment (glob_obj_p);
ecma_value_t this_binding_value = ecma_make_object_value (glob_obj_p);
ecma_value_t this_binding_value (glob_obj_p);
ecma_completion_value_t completion = run_int_from_pos (start_pos,
this_binding_value,
@@ -384,7 +384,10 @@ run_int (void)
ecma_deref_object (lex_env_p);
ecma_finalize ();
return ecma_is_value_true (ecma_get_completion_value_value (completion));
ecma_value_t value_ret;
ecma_get_completion_value_value (value_ret, completion);
return ecma_is_value_true (value_ret);
}
else if (ecma_is_completion_value_throw (completion))
{
@@ -470,11 +473,11 @@ run_int_from_pos (opcode_counter_t start_pos,
const int32_t regs_num = max_reg_num - min_reg_num + 1;
MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_t);
MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_packed_t);
int_data_t int_data;
int_data.pos = (opcode_counter_t) (start_pos + 1);
int_data.this_binding = this_binding_value;
int_data.this_binding_p = &this_binding_value;
int_data.lex_env_p = lex_env_p;
int_data.is_strict = is_strict;
int_data.is_eval_code = is_eval_code;
+1
View File
@@ -17,6 +17,7 @@
#define INTERPRETER_H
#include "ecma-globals.h"
#include "ecma-value.h"
#include "globals.h"
#include "opcodes.h"
+4 -4
View File
@@ -86,7 +86,7 @@ do_number_arithmetic (int_data_t *int_data, /**< interpreter context */
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (res_p));
ecma_value_t (res_p));
ECMA_OP_TO_NUMBER_FINALIZE (num_right);
ECMA_OP_TO_NUMBER_FINALIZE (num_left);
@@ -134,7 +134,7 @@ opfunc_addition (opcode_t opdata, /**< operation data */
ecma_string_t *concat_str_p = ecma_concat_ecma_strings (string1_p, string2_p);
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_string_value (concat_str_p));
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (concat_str_p));
ecma_deref_ecma_string (concat_str_p);
@@ -327,7 +327,7 @@ opfunc_unary_plus (opcode_t opdata, /**< operation data */
*tmp_p = num_var_value;
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (tmp_p));
ecma_value_t (tmp_p));
ECMA_OP_TO_NUMBER_FINALIZE (num_var_value);
ECMA_FINALIZE (var_value);
@@ -364,7 +364,7 @@ opfunc_unary_minus (opcode_t opdata, /**< operation data */
*tmp_p = ecma_number_negate (num_var_value);
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (tmp_p));
ecma_value_t (tmp_p));
ECMA_OP_TO_NUMBER_FINALIZE (num_var_value);
ECMA_FINALIZE (var_value);
+1 -1
View File
@@ -102,7 +102,7 @@ do_number_bitwise_logic (int_data_t *int_data, /**< interpreter context */
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (res_p));
ecma_value_t (res_p));
ECMA_OP_TO_NUMBER_FINALIZE (num_right);
ECMA_OP_TO_NUMBER_FINALIZE (num_left);
+6 -6
View File
@@ -84,8 +84,8 @@ opfunc_not_equal_value (opcode_t opdata, /**< operation data */
bool is_equal = ecma_is_value_true (compare_result);
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx,
ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
: ECMA_SIMPLE_VALUE_TRUE));
ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_FALSE
: ECMA_SIMPLE_VALUE_TRUE));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
@@ -120,8 +120,8 @@ opfunc_equal_value_type (opcode_t opdata, /**< operation data */
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx,
ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE));
ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE));
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@@ -155,8 +155,8 @@ opfunc_not_equal_value_type (opcode_t opdata, /**< operation data */
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx,
ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
: ECMA_SIMPLE_VALUE_TRUE));
ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_FALSE
: ECMA_SIMPLE_VALUE_TRUE));
ECMA_FINALIZE (right_value);
+5 -5
View File
@@ -53,7 +53,7 @@ opfunc_less_than (opcode_t opdata, /**< operation data */
res = (ecma_is_value_true (compare_result) ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res));
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
@@ -101,7 +101,7 @@ opfunc_greater_than (opcode_t opdata, /**< operation data */
res = (ecma_is_value_true (compare_result) ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res));
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
@@ -156,7 +156,7 @@ opfunc_less_or_equal_than (opcode_t opdata, /**< operation data */
}
}
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res));
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
@@ -211,7 +211,7 @@ opfunc_greater_or_equal_than (opcode_t opdata, /**< operation data */
}
}
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res));
ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
@@ -312,7 +312,7 @@ opfunc_in (opcode_t opdata __unused, /**< operation data */
ret_value = set_variable_value (int_data, int_data->pos,
dst_idx,
ecma_make_simple_value (is_in));
ecma_value_t (is_in));
ECMA_FINALIZE (str_left_value);
}
+1
View File
@@ -31,6 +31,7 @@
#include "ecma-operations.h"
#include "ecma-reference.h"
#include "ecma-try-catch-macro.h"
#include "ecma-value.h"
#include "deserializer.h"
bool is_reg_variable (int_data_t *int_data, idx_t var_idx);
@@ -75,9 +75,12 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
false);
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
ecma_value_t catched_exc_value;
ecma_get_completion_value_value (catched_exc_value, try_completion);
completion = ecma_op_set_mutable_binding (catch_env_p,
catch_exc_var_name_str_p,
ecma_get_completion_value_value (try_completion),
catched_exc_value,
false);
JERRY_ASSERT (ecma_is_completion_value_empty (completion));
+16 -6
View File
@@ -81,12 +81,17 @@ get_variable_value (int_data_t *int_data, /**< interpreter context */
if (is_reg_variable (int_data, var_idx))
{
ecma_value_t reg_value = ecma_stack_frame_get_reg_value (&int_data->stack_frame,
var_idx - int_data->min_reg_num);
ecma_value_t reg_value;
ecma_stack_frame_get_reg_value (reg_value,
&int_data->stack_frame,
var_idx - int_data->min_reg_num);
JERRY_ASSERT (!ecma_is_value_empty (reg_value));
ret_value = ecma_make_normal_completion_value (ecma_copy_value (reg_value, true));
ecma_value_t value_copy;
ecma_copy_value (value_copy, reg_value, true);
ret_value = ecma_make_normal_completion_value (value_copy);
}
else
{
@@ -135,8 +140,10 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */
{
ret_value = ecma_make_empty_completion_value ();
ecma_value_t reg_value = ecma_stack_frame_get_reg_value (&int_data->stack_frame,
var_idx - int_data->min_reg_num);
ecma_value_t reg_value;
ecma_stack_frame_get_reg_value (reg_value,
&int_data->stack_frame,
var_idx - int_data->min_reg_num);
if (ecma_is_value_number (reg_value)
&& ecma_is_value_number (value))
@@ -150,9 +157,12 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */
ecma_free_value (reg_value, false);
}
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, false);
ecma_stack_frame_set_reg_value (&int_data->stack_frame,
var_idx - int_data->min_reg_num,
ecma_copy_value (value, false));
value_copy);
}
}
else
+1 -1
View File
@@ -54,7 +54,7 @@ fill_varg_list (int_data_t *int_data, /**< interpreter context */
if (ecma_is_completion_value_normal (get_arg_completion))
{
arg_values[arg_index] = ecma_get_completion_value_value (get_arg_completion);
ecma_get_completion_value_value (arg_values[arg_index], get_arg_completion);
}
else
{
+58 -40
View File
@@ -94,7 +94,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_simple_value ((ecma_simple_value_t) src_val_descr));
ecma_value_t ((ecma_simple_value_t) src_val_descr));
}
else if (type_value_right == OPCODE_ARG_TYPE_STRING)
{
@@ -104,7 +104,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_string_value (string_p));
ecma_value_t (string_p));
ecma_deref_ecma_string (string_p);
}
@@ -136,7 +136,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_number_value (num_p));
ecma_value_t (num_p));
}
else if (type_value_right == OPCODE_ARG_TYPE_NUMBER_NEGATE)
{
@@ -151,7 +151,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_number_value (num_p));
ecma_value_t (num_p));
}
else if (type_value_right == OPCODE_ARG_TYPE_SMALLINT)
{
@@ -162,7 +162,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_number_value (num_p));
ecma_value_t (num_p));
}
else
{
@@ -174,7 +174,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data,
int_data->pos,
dst_var_idx,
ecma_make_number_value (num_p));
ecma_value_t (num_p));
}
int_data->pos++;
@@ -208,7 +208,7 @@ opfunc_pre_incr (opcode_t opdata, /**< operation data */
*new_num_p = ecma_number_add (old_num, ECMA_NUMBER_ONE);
ecma_value_t new_num_value = ecma_make_number_value (new_num_p);
ecma_value_t new_num_value (new_num_p);
// 5.
ret_value = set_variable_value (int_data, int_data->pos,
@@ -255,7 +255,7 @@ opfunc_pre_decr (opcode_t opdata, /**< operation data */
*new_num_p = ecma_number_substract (old_num, ECMA_NUMBER_ONE);
ecma_value_t new_num_value = ecma_make_number_value (new_num_p);
ecma_value_t new_num_value (new_num_p);
// 5.
ret_value = set_variable_value (int_data, int_data->pos,
@@ -305,7 +305,7 @@ opfunc_post_incr (opcode_t opdata, /**< operation data */
// 5.
ret_value = set_variable_value (int_data, int_data->pos,
incr_var_idx,
ecma_make_number_value (new_num_p));
ecma_value_t (new_num_p));
ecma_number_t *tmp_p = int_data->tmp_num_p;
*tmp_p = old_num;
@@ -313,7 +313,7 @@ opfunc_post_incr (opcode_t opdata, /**< operation data */
// assignment of operator result to register variable
ecma_completion_value_t reg_assignment_res = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (tmp_p));
ecma_value_t (tmp_p));
JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res));
ECMA_OP_TO_NUMBER_FINALIZE (old_num);
@@ -353,7 +353,7 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */
// 5.
ret_value = set_variable_value (int_data, int_data->pos,
decr_var_idx,
ecma_make_number_value (new_num_p));
ecma_value_t (new_num_p));
ecma_number_t *tmp_p = int_data->tmp_num_p;
*tmp_p = old_num;
@@ -361,7 +361,7 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */
// assignment of operator result to register variable
ecma_completion_value_t reg_assignment_res = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_number_value (tmp_p));
ecma_value_t (tmp_p));
JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res));
ECMA_OP_TO_NUMBER_FINALIZE (old_num);
@@ -584,13 +584,13 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data, lit_oc,
dst_var_idx,
ecma_make_object_value (func_obj_p));
ecma_value_t (func_obj_p));
if (is_named_func_expr)
{
ecma_op_initialize_immutable_binding (scope_p,
function_name_string_p,
ecma_make_object_value (func_obj_p));
ecma_value_t (func_obj_p));
ecma_deref_ecma_string (function_name_string_p);
}
@@ -681,7 +681,8 @@ opfunc_call_n (opcode_t opdata, /**< operation data */
}
JERRY_ASSERT (ecma_is_completion_value_normal (get_this_completion_value));
ecma_value_t this_value = ecma_get_completion_value_value (get_this_completion_value);
ecma_value_t this_value;
ecma_get_completion_value_value (this_value, get_this_completion_value);
if (!ecma_op_is_callable (func_value))
{
@@ -913,11 +914,11 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
const idx_t prop_name_var_idx = next_opcode.data.meta.data_1;
const idx_t value_for_prop_desc_var_idx = next_opcode.data.meta.data_2;
ecma_completion_value_t value_for_prop_desc = get_variable_value (int_data,
value_for_prop_desc_var_idx,
false);
ecma_completion_value_t value_for_prop_desc_completion = get_variable_value (int_data,
value_for_prop_desc_var_idx,
false);
if (ecma_is_completion_value_normal (value_for_prop_desc))
if (ecma_is_completion_value_normal (value_for_prop_desc_completion))
{
JERRY_ASSERT (is_reg_variable (int_data, prop_name_var_idx));
@@ -951,10 +952,14 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
prop_desc.is_configurable = true;
}
ecma_value_t value_for_prop_desc;
ecma_get_completion_value_value (value_for_prop_desc, value_for_prop_desc_completion);
if (type == OPCODE_META_TYPE_VARG_PROP_DATA)
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_get_completion_value_value (value_for_prop_desc);
prop_desc.value = (ecma_value_packed_t) value_for_prop_desc;
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -970,7 +975,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
else if (type == OPCODE_META_TYPE_VARG_PROP_GETTER)
{
prop_desc.is_get_defined = true;
prop_desc.get_p = ecma_get_object_from_completion_value (value_for_prop_desc);
prop_desc.get_p = ecma_get_object_from_value (value_for_prop_desc);
if (!is_previous_undefined
&& is_previous_data_desc)
@@ -981,7 +986,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
else
{
prop_desc.is_set_defined = true;
prop_desc.set_p = ecma_get_object_from_completion_value (value_for_prop_desc);
prop_desc.set_p = ecma_get_object_from_value (value_for_prop_desc);
if (!is_previous_undefined
&& is_previous_data_desc)
@@ -1000,14 +1005,14 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
JERRY_ASSERT (ecma_is_completion_value_normal_true (define_prop_completion)
|| ecma_is_completion_value_normal_false (define_prop_completion));
ecma_free_completion_value (value_for_prop_desc);
ecma_free_completion_value (value_for_prop_desc_completion);
ECMA_FINALIZE (prop_name_str_value);
ECMA_FINALIZE (prop_name_value);
}
else
{
completion = value_for_prop_desc;
completion = value_for_prop_desc_completion;
break;
}
@@ -1026,7 +1031,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
if (ecma_is_completion_value_empty (completion))
{
ret_value = set_variable_value (int_data, obj_lit_oc, lhs_var_idx, ecma_make_object_value (obj_p));
ret_value = set_variable_value (int_data, obj_lit_oc, lhs_var_idx, ecma_value_t (obj_p));
}
else
{
@@ -1050,7 +1055,7 @@ ecma_completion_value_t
opfunc_ret (opcode_t opdata __unused, /**< operation data */
int_data_t *int_data __unused) /**< interpreter context */
{
return ecma_make_return_completion_value (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED));
return ecma_make_return_completion_value (ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED));
} /* opfunc_ret */
/**
@@ -1070,7 +1075,10 @@ opfunc_retval (opcode_t opdata __unused, /**< operation data */
ECMA_TRY_CATCH (expr_val, get_variable_value (int_data, opdata.data.retval.ret_value, false), ret_value);
ret_value = ecma_make_return_completion_value (ecma_copy_value (expr_val, true));
ecma_value_t value_copy;
ecma_copy_value (value_copy, expr_val, true);
ret_value = ecma_make_return_completion_value (value_copy);
ECMA_FINALIZE (expr_val);
@@ -1110,7 +1118,9 @@ opfunc_prop_getter (opcode_t opdata __unused, /**< operation data */
ret_value);
ecma_string_t *prop_name_string_p = ecma_get_string_from_value (prop_name_str_value);
ecma_reference_t ref = ecma_make_reference (base_value, prop_name_string_p, int_data->is_strict);
ecma_reference_t ref;
ecma_make_reference (ref, base_value, prop_name_string_p, int_data->is_strict);
ECMA_TRY_CATCH (prop_value, ecma_op_get_value_object_base (ref), ret_value);
@@ -1163,9 +1173,12 @@ opfunc_prop_setter (opcode_t opdata __unused, /**< operation data */
ret_value);
ecma_string_t *prop_name_string_p = ecma_get_string_from_value (prop_name_str_value);
ecma_reference_t ref = ecma_make_reference (base_value,
prop_name_string_p,
int_data->is_strict);
ecma_reference_t ref;
ecma_make_reference (ref,
base_value,
prop_name_string_p,
int_data->is_strict);
ECMA_TRY_CATCH (rhs_value, get_variable_value (int_data, rhs_var_idx, false), ret_value);
ret_value = ecma_op_put_value_object_base (ref, rhs_value);
@@ -1228,14 +1241,14 @@ opfunc_logical_not (opcode_t opdata, /**< operation data */
ecma_simple_value_t old_value = ECMA_SIMPLE_VALUE_TRUE;
ecma_completion_value_t to_bool_value = ecma_op_to_boolean (right_value);
if (ecma_is_value_true (ecma_get_completion_value_value (to_bool_value)))
if (ecma_is_completion_value_normal_true (to_bool_value))
{
old_value = ECMA_SIMPLE_VALUE_FALSE;
}
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_simple_value (old_value));
ecma_value_t (old_value));
ECMA_FINALIZE (right_value);
@@ -1265,7 +1278,7 @@ opfunc_this_binding (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data, lit_oc,
dst_var_idx,
int_data->this_binding);
*int_data->this_binding_p);
return ret_value;
} /* opfunc_this_binding */
@@ -1356,7 +1369,10 @@ opfunc_throw_value (opcode_t opdata, /**< operation data */
false),
ret_value);
ret_value = ecma_make_throw_completion_value (ecma_copy_value (var_value, true));
ecma_value_t var_value_copy;
ecma_copy_value (var_value_copy, var_value, true);
ret_value = ecma_make_throw_completion_value (var_value_copy);
ECMA_FINALIZE (var_value);
@@ -1474,7 +1490,7 @@ opfunc_typeof (opcode_t opdata, /**< operation data */
ret_value = set_variable_value (int_data, int_data->pos,
dst_var_idx,
ecma_make_string_value (type_str_p));
ecma_value_t (type_str_p));
ecma_deref_ecma_string (type_str_p);
@@ -1510,9 +1526,11 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */
ecma_string_t *name_string_p = ecma_new_ecma_string_from_lit_index (lit_id);
ecma_reference_t ref = ecma_op_get_identifier_reference (int_data->lex_env_p,
name_string_p,
int_data->is_strict);
ecma_reference_t ref;
ecma_op_get_identifier_reference (ref,
int_data->lex_env_p,
name_string_p,
int_data->is_strict);
if (ref.is_strict)
{
@@ -1525,7 +1543,7 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */
{
ret_value = set_variable_value (int_data, lit_oc,
dst_var_idx,
ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE));
ecma_value_t (ECMA_SIMPLE_VALUE_TRUE));
}
else
{
+2 -1
View File
@@ -18,6 +18,7 @@
#include "ecma-globals.h"
#include "ecma-stack.h"
#include "ecma-value.h"
#include "globals.h"
/* Maximum opcodes number in bytecode. */
@@ -76,7 +77,7 @@ typedef enum
typedef struct
{
opcode_counter_t pos; /**< current opcode to execute */
ecma_value_t this_binding; /**< this binding for current context */
const ecma_value_t* this_binding_p; /**< this binding for current context */
ecma_object_t *lex_env_p; /**< current lexical environment */
bool is_strict; /**< is current code execution mode strict? */
bool is_eval_code; /**< is current code executed with eval */
@@ -75,7 +75,7 @@ ecma_builtin_boolean_prototype_object_to_string (const ecma_value_t& this_arg) /
ret_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FALSE);
}
ret_value = ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (ret_str_p));
ECMA_FINALIZE (value_of_ret);
@@ -113,7 +113,7 @@ ecma_builtin_boolean_prototype_object_value_of (const ecma_value_t& this_arg) /*
ecma_simple_value_t prim_simple_value = (ecma_simple_value_t) prim_value_prop_p->u.internal_property.value;
ecma_value_t ret_boolean_value = ecma_make_simple_value (prim_simple_value);
ecma_value_t ret_boolean_value (prim_simple_value);
JERRY_ASSERT (ecma_is_value_boolean (ret_boolean_value));
+5 -6
View File
@@ -55,18 +55,17 @@ ecma_builtin_boolean_dispatch_call (const ecma_value_t *arguments_list_p, /**< a
{
JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
ecma_value_t arg_value;
if (arguments_list_len == 0)
{
arg_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_value_t value_undefined (ECMA_SIMPLE_VALUE_UNDEFINED);
return ecma_op_to_boolean (value_undefined);
}
else
{
arg_value = arguments_list_p [0];
return ecma_op_to_boolean (arguments_list_p [0]);
}
return ecma_op_to_boolean (arg_value);
} /* ecma_builtin_boolean_dispatch_call */
/**
@@ -82,7 +81,7 @@ ecma_builtin_boolean_dispatch_construct (const ecma_value_t *arguments_list_p, /
if (arguments_list_len == 0)
{
return ecma_op_create_boolean_object (ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE));
return ecma_op_create_boolean_object (ecma_value_t (ECMA_SIMPLE_VALUE_FALSE));
}
else
{
@@ -78,7 +78,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /**
{
ecma_string_t *error_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ERROR_UL);
name_to_str_completion = ecma_make_normal_completion_value (ecma_make_string_value (error_magic_string_p));
name_to_str_completion = ecma_make_normal_completion_value (ecma_value_t (error_magic_string_p));
}
else
{
@@ -103,7 +103,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /**
{
ecma_string_t *empty_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING__EMPTY);
msg_to_str_completion = ecma_make_normal_completion_value (ecma_make_string_value (empty_magic_string_p));
msg_to_str_completion = ecma_make_normal_completion_value (ecma_value_t (empty_magic_string_p));
}
else
{
@@ -116,8 +116,13 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /**
}
else
{
ecma_string_t *name_string_p = ecma_get_string_from_completion_value (name_to_str_completion);
ecma_string_t *msg_string_p = ecma_get_string_from_completion_value (msg_to_str_completion);
ecma_value_t name_to_str_value, msg_to_str_value;
ecma_get_completion_value_value (name_to_str_value, name_to_str_completion);
ecma_get_completion_value_value (msg_to_str_value, msg_to_str_completion);
ecma_string_t *name_string_p = ecma_get_string_from_value (name_to_str_value);
ecma_string_t *msg_string_p = ecma_get_string_from_value (msg_to_str_value);
ecma_string_t *ret_str_p;
@@ -177,7 +182,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /**
MEM_FINALIZE_LOCAL_ARRAY (ret_str_buffer);
}
ret_value = ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (ret_str_p));
}
ecma_free_completion_value (msg_to_str_completion);
+2 -2
View File
@@ -66,7 +66,7 @@ ecma_builtin_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< arg
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_COMMON,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< arg
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_COMMON);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_error_dispatch_call */
+2 -2
View File
@@ -66,7 +66,7 @@ ecma_builtin_eval_error_dispatch_call (const ecma_value_t *arguments_list_p, /**
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_EVAL,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_eval_error_dispatch_call (const ecma_value_t *arguments_list_p, /**
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_EVAL);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_eval_error_dispatch_call */
@@ -160,7 +160,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t
mask_prop_p->u.internal_property.value = bit_mask;
ecma_value_t value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
ecma_value_t value (ECMA_SIMPLE_VALUE_EMPTY);
ecma_property_writable_value_t writable;
ecma_property_enumerable_value_t enumerable;
ecma_property_configurable_value_t configurable;
@@ -177,13 +177,13 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t
enumerable = ECMA_PROPERTY_NOT_ENUMERABLE; \
configurable = ECMA_PROPERTY_CONFIGURABLE; \
\
value = ecma_make_object_value (func_obj_p); \
value = func_obj_p; \
\
break; \
}
#define OBJECT_VALUE(name, obj_getter, prop_writable, prop_enumerable, prop_configurable) case name: \
{ \
value = ecma_make_object_value (obj_getter); \
value = obj_getter; \
writable = prop_writable; \
enumerable = prop_enumerable; \
configurable = prop_configurable; \
@@ -191,7 +191,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t
}
#define SIMPLE_VALUE(name, simple_value, prop_writable, prop_enumerable, prop_configurable) case name: \
{ \
value = ecma_make_simple_value (simple_value); \
value = simple_value; \
\
writable = prop_writable; \
enumerable = prop_enumerable; \
@@ -204,7 +204,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t
ecma_number_t *num_p = ecma_alloc_number (); \
*num_p = number_value; \
\
value = ecma_make_number_value (num_p); \
value = num_p; \
\
writable = prop_writable; \
enumerable = prop_enumerable; \
@@ -216,7 +216,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t
{ \
ecma_string_t *magic_string_p = ecma_get_magic_string (magic_string_id); \
\
value = ecma_make_string_value (magic_string_p); \
value = magic_string_p; \
\
writable = prop_writable; \
enumerable = prop_enumerable; \
@@ -288,10 +288,11 @@ DISPATCH_ROUTINE_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_magic_string_id_t b
(void) arguments_list;
(void) arguments_number;
ecma_value_t value_undefined (ECMA_SIMPLE_VALUE_UNDEFINED);
switch (builtin_routine_id)
{
#define ROUTINE_ARG(n) (arguments_number >= n ? arguments_list[n - 1] \
: ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED))
: value_undefined)
#define ROUTINE_ARG_LIST_0
#define ROUTINE_ARG_LIST_1 , ROUTINE_ARG(1)
#define ROUTINE_ARG_LIST_2 ROUTINE_ARG_LIST_1, ROUTINE_ARG(2)
+11 -11
View File
@@ -73,7 +73,7 @@ ecma_builtin_math_object_abs (const ecma_value_t& this_arg __unused, /**< 'this'
*num_p = ecma_number_abs (arg_num);
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -222,7 +222,7 @@ ecma_builtin_math_object_cos (const ecma_value_t& this_arg __unused, /**< 'this'
*num_p = sum;
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -272,7 +272,7 @@ ecma_builtin_math_object_exp (const ecma_value_t& this_arg __unused, /**< 'this'
*num_p = ecma_number_exp (arg_num);
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -335,7 +335,7 @@ ecma_builtin_math_object_log (const ecma_value_t& this_arg __unused, /**< 'this'
*num_p = ecma_number_ln (arg_num);
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -426,7 +426,7 @@ ecma_builtin_math_object_max (const ecma_value_t& this_arg __unused, /**< 'this'
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ret_num;
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
return ecma_make_normal_completion_value (ecma_value_t (num_p));
} /* ecma_builtin_math_object_max */
/**
@@ -513,7 +513,7 @@ ecma_builtin_math_object_min (const ecma_value_t& this_arg __unused, /**< 'this'
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ret_num;
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
return ecma_make_normal_completion_value (ecma_value_t (num_p));
} /* ecma_builtin_math_object_min */
/**
@@ -742,7 +742,7 @@ ecma_builtin_math_object_pow (const ecma_value_t& this_arg __unused, /**< 'this'
}
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (y);
ECMA_OP_TO_NUMBER_FINALIZE (x);
@@ -788,7 +788,7 @@ ecma_builtin_math_object_random (const ecma_value_t& this_arg __unused) /**< 'th
ecma_number_t *rand_p = ecma_alloc_number ();
*rand_p = rand;
return ecma_make_normal_completion_value (ecma_make_number_value (rand_p));
return ecma_make_normal_completion_value (ecma_value_t (rand_p));
} /* ecma_builtin_math_object_random */
/**
@@ -838,7 +838,7 @@ ecma_builtin_math_object_round (const ecma_value_t& this_arg __unused, /**< 'thi
}
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -906,7 +906,7 @@ ecma_builtin_math_object_sin (const ecma_value_t& this_arg __unused, /**< 'this'
*num_p = sum;
}
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -956,7 +956,7 @@ ecma_builtin_math_object_sqrt (const ecma_value_t& this_arg __unused, /**< 'this
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ret_num;
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p));
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
@@ -95,7 +95,7 @@ ecma_builtin_number_prototype_object_to_string (const ecma_value_t& this_arg, /*
{
ecma_string_t *ret_str_p = ecma_new_ecma_string_from_number (this_arg_number);
return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
return ecma_make_normal_completion_value (ecma_value_t (ret_str_p));
}
{
ECMA_BUILTIN_CP_UNIMPLEMENTED (arguments_list_p);
@@ -131,7 +131,10 @@ ecma_builtin_number_prototype_object_value_of (const ecma_value_t& this_arg) /**
{
if (ecma_is_value_number (this_arg))
{
return ecma_make_normal_completion_value (ecma_copy_value (this_arg, true));
ecma_value_t this_arg_copy;
ecma_copy_value (this_arg_copy, this_arg, true);
return ecma_make_normal_completion_value (this_arg_copy);
}
else if (ecma_is_value_object (this_arg))
{
@@ -150,7 +153,7 @@ ecma_builtin_number_prototype_object_value_of (const ecma_value_t& this_arg) /**
ecma_number_t *ret_num_p = ecma_alloc_number ();
*ret_num_p = *prim_value_num_p;
return ecma_make_normal_completion_value (ecma_make_number_value (ret_num_p));
return ecma_make_normal_completion_value (ecma_value_t (ret_num_p));
}
}
+2 -2
View File
@@ -62,7 +62,7 @@ ecma_builtin_number_dispatch_call (const ecma_value_t *arguments_list_p, /**< ar
ecma_number_t *zero_num_p = ecma_alloc_number ();
*zero_num_p = ECMA_NUMBER_ZERO;
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (zero_num_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (zero_num_p));
}
else
{
@@ -88,7 +88,7 @@ ecma_builtin_number_dispatch_construct (const ecma_value_t *arguments_list_p, /*
ecma_number_t *zero_num_p = ecma_alloc_number ();
*zero_num_p = ECMA_NUMBER_ZERO;
ecma_completion_value_t completion = ecma_op_create_number_object (ecma_make_number_value (zero_num_p));
ecma_completion_value_t completion = ecma_op_create_number_object (ecma_value_t (zero_num_p));
ecma_dealloc_number (zero_num_p);
@@ -66,22 +66,22 @@ ecma_builtin_object_prototype_object_to_string (const ecma_value_t& this_arg) /*
}
else
{
ecma_completion_value_t obj_this = ecma_op_to_object (this_arg);
ecma_completion_value_t this_to_obj_completion = ecma_op_to_object (this_arg);
if (!ecma_is_completion_value_normal (obj_this))
if (!ecma_is_completion_value_normal (this_to_obj_completion))
{
return obj_this;
return this_to_obj_completion;
}
JERRY_ASSERT (ecma_is_value_object (ecma_get_completion_value_value (obj_this)));
ecma_value_t obj_this_value;
ecma_get_completion_value_value (obj_this_value, this_to_obj_completion);
ecma_object_t *obj_p = ecma_get_object_from_completion_value (obj_this);
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p,
JERRY_ASSERT (ecma_is_value_object (obj_this_value));
ecma_property_t *class_prop_p = ecma_get_internal_property (ecma_get_object_from_value (obj_this_value),
ECMA_INTERNAL_PROPERTY_CLASS);
type_string = (ecma_magic_string_id_t) class_prop_p->u.internal_property.value;
ecma_free_completion_value (obj_this);
ecma_free_completion_value (this_to_obj_completion);
}
ecma_string_t *ret_string_p;
@@ -127,7 +127,7 @@ ecma_builtin_object_prototype_object_to_string (const ecma_value_t& this_arg) /*
MEM_FINALIZE_LOCAL_ARRAY (str_buffer);
return ecma_make_normal_completion_value (ecma_make_string_value (ret_string_p));
return ecma_make_normal_completion_value (ecma_value_t (ret_string_p));
} /* ecma_builtin_object_prototype_object_to_string */
/**
+12 -6
View File
@@ -84,19 +84,22 @@ ecma_builtin_object_dispatch_construct (const ecma_value_t *arguments_list_p, /*
{
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
}
else
{
ecma_completion_value_t new_obj_value = ecma_op_create_object_object_arg (arguments_list_p [0]);
ecma_completion_value_t new_obj_completion = ecma_op_create_object_object_arg (arguments_list_p [0]);
if (!ecma_is_completion_value_normal (new_obj_value))
if (!ecma_is_completion_value_normal (new_obj_completion))
{
return new_obj_value;
return new_obj_completion;
}
else
{
return ecma_make_normal_completion_value (ecma_get_completion_value_value (new_obj_value));
ecma_value_t new_obj_value;
ecma_get_completion_value_value (new_obj_value, new_obj_completion);
return ecma_make_normal_completion_value (new_obj_value);
}
}
} /* ecma_builtin_object_dispatch_construct */
@@ -340,7 +343,10 @@ ecma_builtin_object_object_define_property (const ecma_value_t& this_arg __unuse
true),
ret_value);
ret_value = ecma_make_normal_completion_value (ecma_copy_value (arg1, true));
ecma_value_t arg1_copy;
ecma_copy_value (arg1_copy, arg1, true);
ret_value = ecma_make_normal_completion_value (arg1_copy);
ECMA_FINALIZE (define_own_prop_ret);
ecma_free_property_descriptor (&prop_desc);
@@ -66,7 +66,7 @@ ecma_builtin_range_error_dispatch_call (const ecma_value_t *arguments_list_p, /*
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_RANGE,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_range_error_dispatch_call (const ecma_value_t *arguments_list_p, /*
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_RANGE);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_range_error_dispatch_call */
@@ -66,7 +66,7 @@ ecma_builtin_reference_error_dispatch_call (const ecma_value_t *arguments_list_p
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_REFERENCE,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_reference_error_dispatch_call (const ecma_value_t *arguments_list_p
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_REFERENCE);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_reference_error_dispatch_call */
@@ -58,7 +58,10 @@ ecma_builtin_string_prototype_object_to_string (const ecma_value_t& this_arg) /*
{
if (ecma_is_value_string (this_arg))
{
return ecma_make_normal_completion_value (ecma_copy_value (this_arg, true));
ecma_value_t this_arg_copy;
ecma_copy_value (this_arg_copy, this_arg, true);
return ecma_make_normal_completion_value (this_arg_copy);
}
else if (ecma_is_value_object (this_arg))
{
@@ -76,7 +79,7 @@ ecma_builtin_string_prototype_object_to_string (const ecma_value_t& this_arg) /*
prim_value_str_p = ecma_copy_or_ref_ecma_string (prim_value_str_p);
return ecma_make_normal_completion_value (ecma_make_string_value (prim_value_str_p));
return ecma_make_normal_completion_value (ecma_value_t (prim_value_str_p));
}
}
+2 -2
View File
@@ -104,7 +104,7 @@ ecma_builtin_string_object_from_char_code (const ecma_value_t& this_arg __unused
mem_heap_free_block (ret_zt_str_p);
return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
return ecma_make_normal_completion_value (ecma_value_t (ret_str_p));
} /* ecma_builtin_string_object_from_char_code */
/**
@@ -123,7 +123,7 @@ ecma_builtin_string_dispatch_call (const ecma_value_t *arguments_list_p, /**< ar
if (arguments_list_len == 0)
{
ecma_string_t *str_p = ecma_new_ecma_string_from_magic_string_id (ECMA_MAGIC_STRING__EMPTY);
ecma_value_t str_value = ecma_make_string_value (str_p);
ecma_value_t str_value (str_p);
ret_value = ecma_make_normal_completion_value (str_value);
}
@@ -66,7 +66,7 @@ ecma_builtin_syntax_error_dispatch_call (const ecma_value_t *arguments_list_p, /
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_SYNTAX,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_syntax_error_dispatch_call (const ecma_value_t *arguments_list_p, /
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_SYNTAX);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_syntax_error_dispatch_call */
+2 -2
View File
@@ -66,7 +66,7 @@ ecma_builtin_type_error_dispatch_call (const ecma_value_t *arguments_list_p, /**
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_TYPE,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_type_error_dispatch_call (const ecma_value_t *arguments_list_p, /**
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_TYPE);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_type_error_dispatch_call */
+2 -2
View File
@@ -66,7 +66,7 @@ ecma_builtin_uri_error_dispatch_call (const ecma_value_t *arguments_list_p, /**<
ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value);
ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_URI,
message_string_p);
ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
ECMA_FINALIZE (msg_str_value);
@@ -76,7 +76,7 @@ ecma_builtin_uri_error_dispatch_call (const ecma_value_t *arguments_list_p, /**<
{
ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_URI);
return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p));
return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p));
}
} /* ecma_builtin_uri_error_dispatch_call */
@@ -22,6 +22,7 @@
#include "ecma-builtins.h"
#include "ecma-globals.h"
#include "ecma-value.h"
/**
* Position of built-in object's id field in [[Built-in routine ID]] internal property
+1 -1
View File
@@ -348,7 +348,7 @@ ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /**
ecma_number_t* len_p = ecma_alloc_number ();
*len_p = length_prop_num_value;
ecma_set_named_data_property_value (len_prop_p, ecma_make_number_value (len_p));
ecma_set_named_data_property_value (len_prop_p, ecma_value_t (len_p));
return func_obj_p;
} /* ecma_builtin_make_function_object_for_routine */
+1
View File
@@ -17,6 +17,7 @@
#define ECMA_BUILTINS_H
#include "ecma-globals.h"
#include "ecma-value.h"
/**
* A built-in object's identifier
+2 -2
View File
@@ -1,4 +1,4 @@
/* Copyright 2014 Samsung Electronics Co., Ltd.
/* Copyright 2014-2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
#include "globals.h"
#include "mem-poolman.h"
JERRY_STATIC_ASSERT (sizeof (ecma_value_t) <= sizeof (uint16_t));
JERRY_STATIC_ASSERT (sizeof (ecma_value_packed_t) <= sizeof (uint16_t));
JERRY_STATIC_ASSERT (sizeof (ecma_property_t) <= sizeof (uint64_t));
JERRY_STATIC_ASSERT (sizeof (ecma_object_t) <= sizeof (uint64_t));
@@ -0,0 +1,67 @@
/* Copyright 2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mem-allocator.h"
#ifndef ECMA_COMPRESSED_POINTERS_H
#define ECMA_COMPRESSED_POINTERS_H
/** \addtogroup ecma ECMA
* @{
*
* \addtogroup ecmacompressedpointers Helpers for operations with compressed heap pointers
* @{
*/
/**
* Get value of pointer from specified non-null compressed pointer field.
*/
#define ECMA_GET_NON_NULL_POINTER(type, field) \
((type *) mem_decompress_pointer (field))
/**
* Get value of pointer from specified compressed pointer field.
*/
#define ECMA_GET_POINTER(type, field) \
(((unlikely (field == ECMA_NULL_POINTER)) ? NULL : ECMA_GET_NON_NULL_POINTER (type, field)))
/**
* Set value of non-null compressed pointer field so that it will correspond
* to specified non_compressed_pointer.
*/
#define ECMA_SET_NON_NULL_POINTER(field, non_compressed_pointer) \
(field) = (mem_compress_pointer (non_compressed_pointer) & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1))
/**
* Set value of compressed pointer field so that it will correspond
* to specified non_compressed_pointer.
*/
#define ECMA_SET_POINTER(field, non_compressed_pointer) \
do \
{ \
auto __temp_pointer = non_compressed_pointer; \
non_compressed_pointer = __temp_pointer; \
} while (0); \
\
(field) = (unlikely ((non_compressed_pointer) == NULL) ? ECMA_NULL_POINTER \
: (mem_compress_pointer (non_compressed_pointer) \
& ((1u << ECMA_POINTER_FIELD_WIDTH) - 1)))
/**
* @}
* @}
*/
#endif /* ECMA_COMPRESSED_POINTERS_H */
+4 -2
View File
@@ -365,7 +365,8 @@ ecma_gc_mark (ecma_object_t *object_p, /**< start object */
{
case ECMA_PROPERTY_NAMEDDATA:
{
ecma_value_t value = ecma_get_named_data_property_value (property_p);
ecma_value_t value;
ecma_get_named_data_property_value (value, property_p);
if (ecma_is_value_object (value))
{
@@ -571,7 +572,8 @@ ecma_gc_run (ecma_gc_gen_t max_gen_to_collect) /**< maximum generation to run co
{
for (int32_t reg_index = 0; reg_index < frame_iter_p->regs_number; reg_index++)
{
ecma_value_t reg_value = ecma_stack_frame_get_reg_value (frame_iter_p, reg_index);
ecma_value_t reg_value;
ecma_stack_frame_get_reg_value (reg_value, frame_iter_p, reg_index);
if (ecma_is_value_object (reg_value))
{
+1
View File
@@ -24,6 +24,7 @@
#define ECMA_GC_H
#include "ecma-globals.h"
#include "ecma-value.h"
#include "mem-allocator.h"
/**
+5 -47
View File
@@ -113,11 +113,11 @@ typedef enum
} ecma_completion_type_t;
/**
* Description of an ecma-value
* Description of an packed ecma-value representation
*
* Bit-field structure: type (2) | value (ECMA_POINTER_FIELD_WIDTH)
*/
typedef uint16_t ecma_value_t;
typedef uint16_t ecma_value_packed_t;
/**
* Value type (ecma_type_t)
@@ -133,52 +133,10 @@ typedef uint16_t ecma_value_t;
#define ECMA_VALUE_VALUE_WIDTH (ECMA_POINTER_FIELD_WIDTH)
/**
* ecma_value_t size
* ecma_value_packed_t size
*/
#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) <
* label_desc_cp (16)
*/
typedef uint32_t ecma_completion_value_t;
/**
* Type (ecma_completion_type_t)
*/
#define ECMA_COMPLETION_VALUE_TYPE_POS (0)
#define ECMA_COMPLETION_VALUE_TYPE_WIDTH (8)
/**
* Padding (1 byte)
*/
#define ECMA_COMPLETION_VALUE_PADDING_WIDTH (8)
/**
* Value
*
* Used for normal, return, throw and exit completion types.
*/
#define ECMA_COMPLETION_VALUE_VALUE_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \
ECMA_COMPLETION_VALUE_TYPE_WIDTH + \
ECMA_COMPLETION_VALUE_PADDING_WIDTH)
#define ECMA_COMPLETION_VALUE_VALUE_WIDTH (ECMA_VALUE_SIZE)
/**
* Label
*
* Used for break and continue completion types.
*/
#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \
ECMA_COMPLETION_VALUE_TYPE_WIDTH + \
ECMA_COMPLETION_VALUE_PADDING_WIDTH)
#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH (ECMA_POINTER_FIELD_WIDTH)
/**
* Label
*
@@ -304,7 +262,7 @@ typedef struct ecma_property_t
unsigned int is_lcached : 1;
/** Value */
ecma_value_t value;
ecma_value_packed_t value;
} named_data_property;
/** Description of named accessor property */
@@ -531,7 +489,7 @@ typedef struct
unsigned int is_configurable_defined : 1;
/** [[Value]] */
ecma_value_t value;
ecma_value_packed_t value;
/** [[Get]] */
ecma_object_t* get_p;
@@ -44,8 +44,9 @@ ecma_new_values_collection (ecma_value_t values_buffer[], /**< ecma-values */
header_p->unit_number = values_number;
uint16_t* next_chunk_cp_p = &header_p->next_chunk_cp;
ecma_value_t* cur_value_buf_iter_p = (ecma_value_t*) header_p->data;
ecma_value_t* cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_t);
ecma_value_packed_t *cur_value_buf_iter_p, *cur_value_buf_end_p;
cur_value_buf_iter_p = (ecma_value_packed_t*) header_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_packed_t);
for (ecma_length_t value_index = 0;
value_index < values_number;
@@ -57,13 +58,15 @@ ecma_new_values_collection (ecma_value_t values_buffer[], /**< ecma-values */
ECMA_SET_POINTER (*next_chunk_cp_p, chunk_p);
next_chunk_cp_p = &chunk_p->next_chunk_cp;
cur_value_buf_iter_p = (ecma_value_t*) chunk_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_t);
cur_value_buf_iter_p = (ecma_value_packed_t*) chunk_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_packed_t);
}
JERRY_ASSERT (cur_value_buf_iter_p + 1 <= cur_value_buf_end_p);
*cur_value_buf_iter_p++ = ecma_copy_value (values_buffer[value_index], do_ref_if_object);
ecma_value_t value_copy;
ecma_copy_value (value_copy, values_buffer [value_index], do_ref_if_object);
*cur_value_buf_iter_p++ = (ecma_value_packed_t) value_copy;
}
*next_chunk_cp_p = ECMA_NULL_POINTER;
@@ -81,8 +84,9 @@ ecma_free_values_collection (ecma_collection_header_t* header_p, /**< collection
{
JERRY_ASSERT (header_p != NULL);
ecma_value_t* cur_value_buf_iter_p = (ecma_value_t*) header_p->data;
ecma_value_t* cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_t);
ecma_value_packed_t *cur_value_buf_iter_p, *cur_value_buf_end_p;
cur_value_buf_iter_p = (ecma_value_packed_t*) header_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_packed_t);
ecma_length_t string_index = 0;
while (cur_value_buf_iter_p != cur_value_buf_end_p
@@ -90,7 +94,8 @@ 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);
ecma_value_t value_to_free (*cur_value_buf_iter_p);
ecma_free_value (value_to_free, do_deref_if_object);
cur_value_buf_iter_p++;
string_index++;
@@ -103,15 +108,16 @@ ecma_free_values_collection (ecma_collection_header_t* header_p, /**< collection
{
JERRY_ASSERT (string_index < header_p->unit_number);
cur_value_buf_iter_p = (ecma_value_t*) chunk_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_t);
cur_value_buf_iter_p = (ecma_value_packed_t*) chunk_p->data;
cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_packed_t);
while (cur_value_buf_iter_p != cur_value_buf_end_p
&& string_index < header_p->unit_number)
{
JERRY_ASSERT (cur_value_buf_iter_p < cur_value_buf_end_p);
ecma_free_value (*cur_value_buf_iter_p, do_deref_if_object);
ecma_value_t value_to_free (*cur_value_buf_iter_p);
ecma_free_value (value_to_free, do_deref_if_object);
cur_value_buf_iter_p++;
string_index++;
@@ -146,7 +152,7 @@ ecma_new_strings_collection (ecma_string_t* string_ptrs_buffer[], /**< pointers
string_index < strings_number;
string_index++)
{
values_buffer[string_index] = ecma_make_string_value (string_ptrs_buffer[string_index]);
values_buffer[string_index] = string_ptrs_buffer[string_index];
}
new_collection_p = ecma_new_values_collection (values_buffer,
@@ -169,8 +175,8 @@ ecma_collection_iterator_init (ecma_collection_iterator_t *iterator_p, /**< cont
iterator_p->next_chunk_cp = collection_p->next_chunk_cp;
iterator_p->current_index = 0;
iterator_p->current_value_p = NULL;
iterator_p->current_chunk_end_p = ((ecma_value_t*) iterator_p->header_p->data
+ sizeof (iterator_p->header_p->data) / sizeof (ecma_value_t));
iterator_p->current_chunk_end_p = ((ecma_value_packed_t*) iterator_p->header_p->data
+ sizeof (iterator_p->header_p->data) / sizeof (ecma_value_packed_t));
} /* ecma_collection_iterator_init */
/**
@@ -190,7 +196,7 @@ ecma_collection_iterator_next (ecma_collection_iterator_t *iterator_p) /**< cont
if (iterator_p->current_value_p == NULL)
{
JERRY_ASSERT (iterator_p->current_index == 0);
iterator_p->current_value_p = (ecma_value_t*) iterator_p->header_p->data;
iterator_p->current_value_p = (ecma_value_packed_t*) iterator_p->header_p->data;
return true;
}
@@ -212,8 +218,9 @@ ecma_collection_iterator_next (ecma_collection_iterator_t *iterator_p) /**< cont
JERRY_ASSERT (next_chunk_p != NULL);
iterator_p->next_chunk_cp = next_chunk_p->next_chunk_cp;
iterator_p->current_value_p = (ecma_value_t*) &next_chunk_p->data;
iterator_p->current_chunk_end_p = iterator_p->current_value_p + sizeof (next_chunk_p->data) / sizeof (ecma_value_t);
iterator_p->current_value_p = (ecma_value_packed_t*) &next_chunk_p->data;
iterator_p->current_chunk_end_p = (iterator_p->current_value_p +
sizeof (next_chunk_p->data) / sizeof (ecma_value_packed_t));
}
else
{
+31 -22
View File
@@ -519,7 +519,7 @@ ecma_create_named_data_property (ecma_object_t *obj_p, /**< object */
prop_p->u.named_data_property.is_lcached = false;
prop_p->u.named_data_property.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_p->u.named_data_property.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
ecma_lcache_invalidate (obj_p, name_p, NULL);
@@ -690,8 +690,8 @@ ecma_free_named_data_property (ecma_object_t *object_p, /**< object the property
ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t,
property_p->u.named_data_property.name_p));
ecma_value_t v = property_p->u.named_data_property.value;
ecma_free_value (v, false);
ecma_value_t value_to_free (property_p->u.named_data_property.value);
ecma_free_value (value_to_free, false);
ecma_dealloc_property (property_p);
} /* ecma_free_named_data_property */
@@ -864,12 +864,13 @@ ecma_delete_property (ecma_object_t *obj_p, /**< object */
*
* @return ecma-value
*/
ecma_value_t
ecma_get_named_data_property_value (const ecma_property_t *prop_p) /**< property */
void
ecma_get_named_data_property_value (ecma_value_t &ret, /**< out: value */
const ecma_property_t *prop_p) /**< property */
{
JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA);
return prop_p->u.named_data_property.value;
ret = prop_p->u.named_data_property.value;
} /* ecma_get_named_data_property_value */
/**
@@ -884,7 +885,7 @@ ecma_set_named_data_property_value (ecma_property_t *prop_p, /**< property */
/* 'May ref younger' flag should be updated upon assignment of object value */
JERRY_ASSERT (!ecma_is_value_object (value));
prop_p->u.named_data_property.value = value;
prop_p->u.named_data_property.value = (ecma_value_packed_t) value;
} /* ecma_set_named_data_property_value */
/**
@@ -914,23 +915,29 @@ ecma_named_data_property_assign_value (ecma_object_t *obj_p, /**< object */
JERRY_ASSERT (prop_iter_p != NULL);
#endif /* !JERRY_NDEBUG */
if (ecma_is_value_number (value)
&& ecma_is_value_number (prop_p->u.named_data_property.value))
if (ecma_is_value_number (value))
{
const ecma_number_t *num_src_p = ecma_get_number_from_value (value);
ecma_number_t *num_dst_p = ecma_get_number_from_value (prop_p->u.named_data_property.value);
ecma_value_t num_value (prop_p->u.named_data_property.value);
*num_dst_p = *num_src_p;
}
else
{
ecma_value_t v = ecma_get_named_data_property_value (prop_p);
ecma_free_value (v, false);
if (ecma_is_value_number (num_value))
{
const ecma_number_t *num_src_p = ecma_get_number_from_value (value);
ecma_number_t *num_dst_p = ecma_get_number_from_value (num_value);
prop_p->u.named_data_property.value = ecma_copy_value (value, false);
ecma_gc_update_may_ref_younger_object_flag_by_value (obj_p,
prop_p->u.named_data_property.value);
*num_dst_p = *num_src_p;
return;
}
}
ecma_value_t v;
ecma_get_named_data_property_value (v, prop_p);
ecma_free_value (v, false);
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, false);
prop_p->u.named_data_property.value = (ecma_value_packed_t) value_copy;
ecma_gc_update_may_ref_younger_object_flag_by_value (obj_p, value_copy);
} /* ecma_named_data_property_assign_value */
/**
@@ -1097,7 +1104,7 @@ ecma_make_empty_property_descriptor (void)
ecma_property_descriptor_t prop_desc;
prop_desc.is_value_defined = false;
prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.is_writable_defined = false;
prop_desc.is_writable = false;
prop_desc.is_enumerable_defined = false;
@@ -1121,7 +1128,9 @@ 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_value_t value_to_free (prop_desc_p->value);
ecma_free_value (value_to_free, true);
}
if (prop_desc_p->is_get_defined
+6 -98
View File
@@ -24,100 +24,8 @@
#define JERRY_ECMA_HELPERS_H
#include "ecma-globals.h"
#include "mem-allocator.h"
/**
* Get value of pointer from specified non-null compressed pointer field.
*/
#define ECMA_GET_NON_NULL_POINTER(type, field) \
((type *) mem_decompress_pointer (field))
/**
* Get value of pointer from specified compressed pointer field.
*/
#define ECMA_GET_POINTER(type, field) \
(((unlikely (field == ECMA_NULL_POINTER)) ? NULL : ECMA_GET_NON_NULL_POINTER (type, field)))
/**
* Set value of non-null compressed pointer field so that it will correspond
* to specified non_compressed_pointer.
*/
#define ECMA_SET_NON_NULL_POINTER(field, non_compressed_pointer) \
(field) = (mem_compress_pointer (non_compressed_pointer) & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1))
/**
* Set value of compressed pointer field so that it will correspond
* to specified non_compressed_pointer.
*/
#define ECMA_SET_POINTER(field, non_compressed_pointer) \
do \
{ \
auto __temp_pointer = non_compressed_pointer; \
non_compressed_pointer = __temp_pointer; \
} while (0); \
\
(field) = (unlikely ((non_compressed_pointer) == NULL) ? ECMA_NULL_POINTER \
: (mem_compress_pointer (non_compressed_pointer) \
& ((1u << ECMA_POINTER_FIELD_WIDTH) - 1)))
/* ecma-helpers-value.c */
extern bool ecma_is_value_empty (const ecma_value_t& value);
extern bool ecma_is_value_undefined (const ecma_value_t& value);
extern bool ecma_is_value_null (const ecma_value_t& value);
extern bool ecma_is_value_boolean (const ecma_value_t& value);
extern bool ecma_is_value_true (const ecma_value_t& value);
extern bool ecma_is_value_number (const ecma_value_t& value);
extern bool ecma_is_value_string (const ecma_value_t& value);
extern bool ecma_is_value_object (const ecma_value_t& value);
extern void ecma_check_value_type_is_spec_defined (const ecma_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_string_value (ecma_string_t* ecma_string_p);
extern ecma_value_t ecma_make_object_value (ecma_object_t* object_p);
extern ecma_number_t* __attribute_pure__ ecma_get_number_from_value (const ecma_value_t& value);
extern ecma_string_t* __attribute_pure__ ecma_get_string_from_value (const ecma_value_t& value);
extern ecma_object_t* __attribute_pure__ ecma_get_object_from_value (const ecma_value_t& value);
extern ecma_value_t ecma_copy_value (const ecma_value_t& value, bool do_ref_if_object);
extern void ecma_free_value (ecma_value_t& value, bool do_deref_if_object);
extern ecma_completion_value_t ecma_make_completion_value (ecma_completion_type_t type,
const ecma_value_t& value);
extern ecma_completion_value_t ecma_make_label_completion_value (ecma_completion_type_t type,
uint8_t depth_level,
uint16_t offset);
extern ecma_completion_value_t ecma_make_simple_completion_value (ecma_simple_value_t simple_value);
extern ecma_completion_value_t ecma_make_normal_completion_value (const ecma_value_t& value);
extern ecma_completion_value_t ecma_make_throw_completion_value (const ecma_value_t& value);
extern ecma_completion_value_t ecma_make_throw_obj_completion_value (ecma_object_t *exception_p);
extern ecma_completion_value_t ecma_make_empty_completion_value (void);
extern ecma_completion_value_t ecma_make_return_completion_value (const ecma_value_t& value);
extern ecma_completion_value_t ecma_make_exit_completion_value (bool is_successful);
extern ecma_completion_value_t ecma_make_meta_completion_value (void);
extern ecma_value_t ecma_get_completion_value_value (ecma_completion_value_t completion_value);
extern ecma_number_t* __attribute_const__
ecma_get_number_from_completion_value (ecma_completion_value_t completion_value);
extern ecma_string_t* __attribute_const__
ecma_get_string_from_completion_value (ecma_completion_value_t completion_value);
extern ecma_object_t* __attribute_const__
ecma_get_object_from_completion_value (ecma_completion_value_t completion_value);
extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t value);
extern void ecma_free_completion_value (ecma_completion_value_t completion_value);
extern bool ecma_is_completion_value_normal (ecma_completion_value_t value);
extern bool ecma_is_completion_value_throw (ecma_completion_value_t value);
extern bool ecma_is_completion_value_return (ecma_completion_value_t value);
extern bool ecma_is_completion_value_exit (ecma_completion_value_t value);
extern bool ecma_is_completion_value_meta (ecma_completion_value_t value);
extern bool ecma_is_completion_value_break (ecma_completion_value_t value);
extern bool ecma_is_completion_value_continue (ecma_completion_value_t value);
extern bool ecma_is_completion_value_normal_simple_value (ecma_completion_value_t value,
ecma_simple_value_t simple_value);
extern bool ecma_is_completion_value_normal_true (ecma_completion_value_t value);
extern bool ecma_is_completion_value_normal_false (ecma_completion_value_t value);
extern bool ecma_is_completion_value_empty (ecma_completion_value_t value);
#include "ecma-compressed-pointers.h"
#include "ecma-value.h"
/* ecma-helpers-string.c */
extern ecma_string_t* ecma_new_ecma_string (const ecma_char_t *string_p);
@@ -211,9 +119,9 @@ typedef struct
ecma_collection_header_t *header_p; /**< collection header */
uint16_t next_chunk_cp; /**< compressed pointer to next chunk */
ecma_length_t current_index; /**< index of current element */
const ecma_value_t *current_value_p; /**< pointer to current element */
const ecma_value_t *current_chunk_beg_p; /**< pointer to beginning of current chunk's data */
const ecma_value_t *current_chunk_end_p; /**< pointer to place right after the end of current chunk's data */
const ecma_value_packed_t *current_value_p; /**< pointer to current element */
const ecma_value_packed_t *current_chunk_beg_p; /**< pointer to beginning of current chunk's data */
const ecma_value_packed_t *current_chunk_end_p; /**< pointer to place right after the end of current chunk's data */
} ecma_collection_iterator_t;
extern void
@@ -274,7 +182,7 @@ extern void ecma_free_property (ecma_object_t *obj_p, ecma_property_t *prop_p);
extern void ecma_delete_property (ecma_object_t *obj_p, ecma_property_t *prop_p);
extern ecma_value_t ecma_get_named_data_property_value (const ecma_property_t *prop_p);
extern void ecma_get_named_data_property_value (ecma_value_t &ret, const ecma_property_t *prop_p);
extern void ecma_set_named_data_property_value (ecma_property_t *prop_p, const ecma_value_t& value);
extern void ecma_named_data_property_assign_value (ecma_object_t *obj_p,
ecma_property_t *prop_p,
+19 -15
View File
@@ -74,7 +74,7 @@ ecma_stack_get_top_frame (void)
*/
void
ecma_stack_add_frame (ecma_stack_frame_t *frame_p, /**< frame to initialize */
ecma_value_t *regs_p, /**< array of register variables' values */
ecma_value_packed_t *regs_p, /**< array of register variables' values */
int32_t regs_num) /**< number of register variables */
{
frame_p->prev_frame_p = ecma_stack_top_frame_p;
@@ -88,7 +88,7 @@ ecma_stack_add_frame (ecma_stack_frame_t *frame_p, /**< frame to initialize */
for (int32_t i = 0; i < regs_num; i++)
{
regs_p [i] = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
regs_p [i] = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY);
}
} /* ecma_stack_add_frame */
@@ -115,7 +115,8 @@ ecma_stack_free_frame (ecma_stack_frame_t *frame_p) /**< frame to initialize */
reg_index < frame_p->regs_number;
reg_index++)
{
ecma_free_value (frame_p->regs_p [reg_index], false);
ecma_value_t value_to_free (frame_p->regs_p [reg_index]);
ecma_free_value (value_to_free, false);
}
} /* ecma_stack_free_frame */
@@ -124,13 +125,14 @@ ecma_stack_free_frame (ecma_stack_frame_t *frame_p) /**< frame to initialize */
*
* @return ecma-value
*/
ecma_value_t
ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, /**< frame */
void
ecma_stack_frame_get_reg_value (ecma_value_t &ret, /**< out: ecma-value */
ecma_stack_frame_t *frame_p, /**< frame */
int32_t reg_index) /**< index of register variable */
{
JERRY_ASSERT (reg_index >= 0 && reg_index < frame_p->regs_number);
return frame_p->regs_p [reg_index];
ret = frame_p->regs_p [reg_index];
} /* ecma_stack_frame_get_reg_value */
/**
@@ -139,11 +141,11 @@ ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, /**< frame */
void
ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p, /**< frame */
int32_t reg_index, /**< index of register variable */
ecma_value_t value) /**< ecma-value */
const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (reg_index >= 0 && reg_index < frame_p->regs_number);
frame_p->regs_p [reg_index] = value;
frame_p->regs_p [reg_index] = (ecma_value_packed_t) value;
} /* ecma_stack_frame_set_reg_value */
/**
@@ -177,7 +179,7 @@ ecma_stack_push_value_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack fra
ECMA_SET_POINTER (chunk_p->prev_chunk_p, frame_p->top_chunk_p);
frame_p->top_chunk_p = chunk_p;
frame_p->dynamically_allocated_value_slots_p = (ecma_value_t*) (frame_p->top_chunk_p + 1);
frame_p->dynamically_allocated_value_slots_p = (ecma_value_packed_t*) (frame_p->top_chunk_p + 1);
frame_p->current_slot_index = 0;
}
} /* ecma_stack_push_value_longpath */
@@ -199,20 +201,21 @@ ecma_stack_push_value (ecma_stack_frame_t *frame_p, /**< ecma-stack frame */
JERRY_ASSERT (frame_p->current_slot_index < ecma_stack_slots_in_top_chunk (frame_p));
frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index] = value;
frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index] = (ecma_value_packed_t) value;
} /* ecma_stack_push_value */
/**
* Get top value from ecma-stack
*/
inline ecma_value_t __attribute_always_inline__
ecma_stack_top_value (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */
inline void __attribute_always_inline__
ecma_stack_top_value (ecma_value_t &ret, /**< out: ecma-value */
ecma_stack_frame_t *frame_p) /**< ecma-stack frame */
{
const size_t slots_in_top_chunk = ecma_stack_slots_in_top_chunk (frame_p);
JERRY_ASSERT (frame_p->current_slot_index < slots_in_top_chunk);
return frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index];
ret = frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index];
} /* ecma_stack_top_value */
/**
@@ -229,7 +232,7 @@ ecma_stack_pop_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */
if (frame_p->top_chunk_p != NULL)
{
frame_p->dynamically_allocated_value_slots_p = (ecma_value_t*) (frame_p->top_chunk_p + 1);
frame_p->dynamically_allocated_value_slots_p = (ecma_value_packed_t*) (frame_p->top_chunk_p + 1);
frame_p->current_slot_index = (uint32_t) (ECMA_STACK_SLOTS_IN_DYNAMIC_CHUNK - 1u);
}
else
@@ -249,7 +252,8 @@ ecma_stack_pop (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */
{
JERRY_ASSERT (frame_p->current_slot_index < ecma_stack_slots_in_top_chunk (frame_p));
ecma_value_t value = ecma_stack_top_value (frame_p);
ecma_value_t value;
ecma_stack_top_value (value, frame_p);
if (unlikely (frame_p->current_slot_index == 0
&& frame_p->top_chunk_p != NULL))
+17 -10
View File
@@ -18,6 +18,7 @@
#include "config.h"
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
@@ -46,13 +47,14 @@ typedef struct ecma_stack_frame_t
{
struct ecma_stack_frame_t *prev_frame_p; /**< previous frame */
ecma_stack_chunk_header_t *top_chunk_p; /**< the top-most chunk of the frame */
ecma_value_t *dynamically_allocated_value_slots_p; /**< pointer to dynamically allocated value slots
* in the top-most chunk */
ecma_value_packed_t *dynamically_allocated_value_slots_p; /**< pointer to dynamically allocated value slots
* in the top-most chunk */
uint32_t current_slot_index; /**< index of first free slot in the top chunk */
ecma_value_t inlined_values [ECMA_STACK_FRAME_INLINED_VALUES_NUMBER]; /**< place for values inlined in stack frame
* (instead of being dynamically allocated
* on the heap) */
ecma_value_t *regs_p; /**< register variables */
ecma_value_packed_t inlined_values [ECMA_STACK_FRAME_INLINED_VALUES_NUMBER]; /**< place for values inlined
* in stack frame (instead of
* being dynamically allocated
* on the heap) */
ecma_value_packed_t *regs_p; /**< register variables */
int32_t regs_number; /**< number of register variables */
} ecma_stack_frame_t;
@@ -62,13 +64,18 @@ extern ecma_stack_frame_t*
ecma_stack_get_top_frame (void);
extern void
ecma_stack_add_frame (ecma_stack_frame_t *frame_p,
ecma_value_t *regs_p,
ecma_value_packed_t *regs_p,
int32_t regs_num);
extern void ecma_stack_free_frame (ecma_stack_frame_t *frame_p);
extern ecma_value_t ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, int32_t reg_index);
extern void ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p, int32_t reg_index, ecma_value_t value);
extern void ecma_stack_frame_get_reg_value (ecma_value_t &ret,
ecma_stack_frame_t *frame_p,
int32_t reg_index);
extern void
ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p,
int32_t reg_index,
const ecma_value_t& value);
extern void ecma_stack_push_value (ecma_stack_frame_t *frame_p, ecma_value_t value);
extern ecma_value_t ecma_stack_top_value (ecma_stack_frame_t *frame_p);
extern void ecma_stack_top_value (ecma_value_t &ret, ecma_stack_frame_t *frame_p);
extern void ecma_stack_pop (ecma_stack_frame_t *frame_p);
extern void ecma_stack_pop_multiple (ecma_stack_frame_t *frame_p, uint32_t number);
+341
View File
@@ -0,0 +1,341 @@
/* Copyright 2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ecma-alloc.h"
#include "ecma-gc.h"
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "ecma-value.h"
#include "globals.h"
#include "jrt-bit-fields.h"
JERRY_STATIC_ASSERT (sizeof (ecma_value_packed_t) * JERRY_BITSINBYTE == ECMA_VALUE_SIZE);
/**
* Get pointer to ecma-number from ecma-value
*
* @return the pointer
*/
ecma_number_t* __attribute_pure__
ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER);
return ECMA_GET_NON_NULL_POINTER (ecma_number_t,
ecma_get_value_value_field (value));
} /* ecma_get_number_from_value */
/**
* Get pointer to ecma-string from ecma-value
*
* @return the pointer
*/
ecma_string_t* __attribute_pure__
ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING);
return ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ecma_get_value_value_field (value));
} /* ecma_get_string_from_value */
/**
* Get pointer to ecma-object from ecma-value
*
* @return the pointer
*/
ecma_object_t* __attribute_pure__
ecma_get_object_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT);
return ECMA_GET_NON_NULL_POINTER (ecma_object_t,
ecma_get_value_value_field (value));
} /* ecma_get_object_from_value */
/**
* Copy ecma-value.
*
* Note:
* Operation algorithm.
* switch (valuetype)
* case simple:
* simply return the value as it was passed;
* case number:
* copy the number
* and return new ecma-value
* pointing to copy of the number;
* case string:
* increase reference counter of the string
* and return the value as it was passed.
* case object;
* increase reference counter of the object if do_ref_if_object is true
* and return the value as it was passed.
*
* @return See note.
*/
void
ecma_copy_value (ecma_value_t &ret, /**< out: ecma-value */
const ecma_value_t& value, /**< ecma-value */
bool do_ref_if_object) /**< if the value is object value,
increment reference counter of the object */
{
switch (ecma_get_value_type_field (value))
{
case ECMA_TYPE_SIMPLE:
{
ret = value;
break;
}
case ECMA_TYPE_NUMBER:
{
ecma_number_t *num_p = ecma_get_number_from_value (value);
ecma_number_t *number_copy_p = ecma_alloc_number ();
*number_copy_p = *num_p;
ret = number_copy_p;
break;
}
case ECMA_TYPE_STRING:
{
ecma_string_t *string_p = ecma_get_string_from_value (value);
string_p = ecma_copy_or_ref_ecma_string (string_p);
ret = string_p;
break;
}
case ECMA_TYPE_OBJECT:
{
ecma_object_t *obj_p = ecma_get_object_from_value (value);
if (do_ref_if_object)
{
ecma_ref_object (obj_p);
}
ret = value;
break;
}
}
} /* ecma_copy_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 */
{
switch (ecma_get_value_type_field (value))
{
case ECMA_TYPE_SIMPLE:
{
/* doesn't hold additional memory */
break;
}
case ECMA_TYPE_NUMBER:
{
ecma_number_t *number_p = ecma_get_number_from_value (value);
ecma_dealloc_number (number_p);
break;
}
case ECMA_TYPE_STRING:
{
ecma_string_t *string_p = ecma_get_string_from_value (value);
ecma_deref_ecma_string (string_p);
break;
}
case ECMA_TYPE_OBJECT:
{
if (do_deref_if_object)
{
ecma_deref_object (ecma_get_object_from_value (value));
}
break;
}
}
} /* ecma_free_value */
/**
* Get pointer to label descriptor from completion value
*
* @return pointer to label descriptor
*/
static ecma_label_descriptor_t* __attribute_const__
ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_value) /**< completion value */
{
return ECMA_GET_NON_NULL_POINTER (ecma_label_descriptor_t,
(uintptr_t) jrt_extract_bit_field (completion_value,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH));
} /* ecma_get_completion_value_label_descriptor */
/**
* Set label descriptor of completion value
*
* @return completion value with updated field
*/
static ecma_completion_value_t __attribute_const__
ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_value, /**< completion value
* to set field in */
ecma_label_descriptor_t* label_desc_p) /**< pointer to the
* label descriptor */
{
uintptr_t label_desc_cp;
ECMA_SET_NON_NULL_POINTER (label_desc_cp, label_desc_p);
return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value,
label_desc_cp,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH);
} /* ecma_set_completion_value_label_descriptor */
/**
* Break and continue completion values constructor
*
* @return completion value
*/
ecma_completion_value_t __attribute_const__
ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */
uint8_t depth_level, /**< depth level (in try constructions,
with blocks, etc.) */
uint16_t offset) /**< offset to label from end of last block */
{
JERRY_ASSERT (type == ECMA_COMPLETION_TYPE_BREAK
|| type == ECMA_COMPLETION_TYPE_CONTINUE);
ecma_label_descriptor_t *label_desc_p = ecma_alloc_label_descriptor ();
label_desc_p->offset = offset;
label_desc_p->depth = depth_level;
ecma_completion_value_t completion_value = 0;
completion_value = ecma_set_completion_value_type_field (completion_value,
type);
completion_value = ecma_set_completion_value_label_descriptor (completion_value,
label_desc_p);
return completion_value;
} /* ecma_make_label_completion_value */
/**
* Throw completion value constructor.
*
* @return 'throw' completion value
*/
ecma_completion_value_t __attribute_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 (exception_p);
return ecma_make_throw_completion_value (exception);
} /* ecma_make_throw_obj_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
#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT
|| type == ECMA_COMPLETION_TYPE_THROW
#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */
|| type == ECMA_COMPLETION_TYPE_RETURN
|| type == ECMA_COMPLETION_TYPE_EXIT);
JERRY_ASSERT (is_type_ok);
ecma_value_t v;
ecma_get_completion_value_value_field (v, value);
ecma_value_t value_copy;
ecma_copy_value (value_copy, v, true);
return ecma_make_completion_value (type, value_copy);
} /* ecma_copy_completion_value */
/**
* Free the completion value.
*/
void
ecma_free_completion_value (ecma_completion_value_t completion_value) /**< completion value */
{
switch (ecma_get_completion_value_type_field (completion_value))
{
case ECMA_COMPLETION_TYPE_NORMAL:
#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT
case ECMA_COMPLETION_TYPE_THROW:
#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */
case ECMA_COMPLETION_TYPE_RETURN:
{
ecma_value_t v;
ecma_get_completion_value_value_field (v, completion_value);
ecma_free_value (v, true);
break;
}
case ECMA_COMPLETION_TYPE_EXIT:
{
ecma_value_t v;
ecma_get_completion_value_value_field (v, completion_value);
JERRY_ASSERT(ecma_get_value_type_field (v) == ECMA_TYPE_SIMPLE);
break;
}
case ECMA_COMPLETION_TYPE_CONTINUE:
case ECMA_COMPLETION_TYPE_BREAK:
{
ecma_dealloc_label_descriptor (ecma_get_completion_value_label_descriptor (completion_value));
break;
}
case ECMA_COMPLETION_TYPE_META:
{
JERRY_UNREACHABLE ();
}
}
} /* ecma_free_completion_value */
/**
* 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 (const 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 */
@@ -13,31 +13,213 @@
* limitations under the License.
*/
#include "ecma-compressed-pointers.h"
#include "ecma-globals.h"
#include "jrt-bit-fields.h"
#ifndef ECMA_VALUE_H
#define ECMA_VALUE_H
/** \addtogroup ecma ECMA
* @{
*
* \addtogroup ecmahelpers Helpers for operations with ECMA data types
* \addtogroup ecmavalue ECMA value on-stack storage
* @{
*/
#include "ecma-alloc.h"
#include "ecma-gc.h"
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "globals.h"
#include "jrt-bit-fields.h"
/**
* Description of ecma-value on-stack storage
*/
class ecma_value_t
{
public:
/* Constructors */
__attribute_always_inline__
ecma_value_t (ecma_type_t type, /**< ecma-value type */
uintptr_t value) /**< compressed pointer
* or simple value */
{
_packed = pack (type, value);
} /* ecma_value_t */
JERRY_STATIC_ASSERT (sizeof (ecma_value_t) * JERRY_BITSINBYTE == ECMA_VALUE_SIZE);
__attribute_always_inline__
ecma_value_t (ecma_simple_value_t simple_value)
: ecma_value_t (ECMA_TYPE_SIMPLE, simple_value) { }
__attribute_always_inline__
ecma_value_t () : ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY) { }
__attribute_always_inline__
explicit ecma_value_t (ecma_number_t *num_p)
{
*this = num_p;
}
__attribute_always_inline__
explicit ecma_value_t (ecma_string_t *str_p)
{
*this = str_p;
}
__attribute_always_inline__
explicit ecma_value_t (ecma_object_t *obj_p)
{
*this = obj_p;
}
__attribute_always_inline__
explicit ecma_value_t (ecma_value_packed_t v)
{
*this = v;
}
ecma_value_t (const ecma_value_t&) = delete;
ecma_value_t (ecma_value_t&) = delete;
ecma_value_t (ecma_value_t&&) = delete;
ecma_value_t& operator = (ecma_value_t &) = delete;
ecma_value_t& operator = (ecma_value_t &&) = delete;
/* Extraction of packed representation */
__attribute_always_inline__
explicit operator ecma_value_packed_t () const { return _packed; }
/* Assignment operators */
__attribute_always_inline__
ecma_value_t& operator = (ecma_simple_value_t v)
{
_packed = pack (ECMA_TYPE_SIMPLE, v);
return *this;
}
ecma_value_t& operator = (ecma_number_t* num_p)
{
JERRY_ASSERT(num_p != NULL);
uint16_t num_cp;
ECMA_SET_NON_NULL_POINTER (num_cp, num_p);
_packed = pack (ECMA_TYPE_NUMBER, num_cp);
return *this;
}
ecma_value_t& operator = (ecma_string_t* str_p)
{
JERRY_ASSERT(str_p != NULL);
uint16_t str_cp;
ECMA_SET_NON_NULL_POINTER (str_cp, str_p);
_packed = pack (ECMA_TYPE_STRING, str_cp);
return *this;
}
ecma_value_t& operator = (ecma_object_t *obj_p)
{
JERRY_ASSERT(obj_p != NULL);
uint16_t obj_cp;
ECMA_SET_NON_NULL_POINTER (obj_cp, obj_p);
_packed = pack (ECMA_TYPE_OBJECT, obj_cp);
return *this;
}
ecma_value_t& operator = (ecma_value_packed_t packed)
{
_packed = packed;
return *this;
}
ecma_value_t& operator = (const ecma_value_t &v)
{
this->_packed = v._packed;
return *this;
}
private:
/**
* Combining type and value fields to packed representation
*
* @return packed ecma-value representation
*/
__attribute_always_inline__
ecma_value_packed_t pack (ecma_type_t type,
uintptr_t value)
{
ecma_value_packed_t packed;
packed = (ecma_value_packed_t) jrt_set_bit_field_value (0,
type,
ECMA_VALUE_TYPE_POS,
ECMA_VALUE_TYPE_WIDTH);
packed = (ecma_value_packed_t) jrt_set_bit_field_value (packed,
value,
ECMA_VALUE_VALUE_POS,
ECMA_VALUE_VALUE_WIDTH);
return packed;
}
ecma_value_packed_t _packed; /**< packed value representation */
};
/**
* Description of a block completion value
*
* See also: ECMA-262 v5, 8.9.
*
* value (16)
* Bit-field structure: type (8) | padding (8) <
* label_desc_cp (16)
*/
typedef uint32_t ecma_completion_value_t;
/**
* Type (ecma_completion_type_t)
*/
#define ECMA_COMPLETION_VALUE_TYPE_POS (0)
#define ECMA_COMPLETION_VALUE_TYPE_WIDTH (8)
/**
* Padding (1 byte)
*/
#define ECMA_COMPLETION_VALUE_PADDING_WIDTH (8)
/**
* Value
*
* Used for normal, return, throw and exit completion types.
*/
#define ECMA_COMPLETION_VALUE_VALUE_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \
ECMA_COMPLETION_VALUE_TYPE_WIDTH + \
ECMA_COMPLETION_VALUE_PADDING_WIDTH)
#define ECMA_COMPLETION_VALUE_VALUE_WIDTH (ECMA_VALUE_SIZE)
/**
* Label
*
* Used for break and continue completion types.
*/
#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \
ECMA_COMPLETION_VALUE_TYPE_WIDTH + \
ECMA_COMPLETION_VALUE_PADDING_WIDTH)
#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH (ECMA_POINTER_FIELD_WIDTH)
/**
* Get type field of ecma-value
*
* @return type field
*/
static ecma_type_t __attribute_pure__
inline ecma_type_t __attribute_pure__ __attribute_always_inline__
ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */
{
return (ecma_type_t) jrt_extract_bit_field (value,
return (ecma_type_t) jrt_extract_bit_field ((ecma_value_packed_t) value,
ECMA_VALUE_TYPE_POS,
ECMA_VALUE_TYPE_WIDTH);
} /* ecma_get_value_type_field */
@@ -47,44 +229,14 @@ ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */
*
* @return value field
*/
static uintptr_t __attribute_pure__
inline uintptr_t __attribute_pure__ __attribute_always_inline__
ecma_get_value_value_field (const ecma_value_t& value) /**< ecma-value */
{
return (uintptr_t) jrt_extract_bit_field (value,
return (uintptr_t) jrt_extract_bit_field ((ecma_value_packed_t) value,
ECMA_VALUE_VALUE_POS,
ECMA_VALUE_VALUE_WIDTH);
} /* ecma_get_value_value_field */
/**
* Set type field of ecma-value
*
* @return ecma-value with updated field
*/
static ecma_value_t __attribute_pure__
ecma_set_value_type_field (const 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,
type_field,
ECMA_VALUE_TYPE_POS,
ECMA_VALUE_TYPE_WIDTH);
} /* ecma_set_value_type_field */
/**
* Set value field of ecma-value
*
* @return ecma-value with updated field
*/
static ecma_value_t __attribute_pure__
ecma_set_value_value_field (const 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,
value_field,
ECMA_VALUE_VALUE_POS,
ECMA_VALUE_VALUE_WIDTH);
} /* ecma_set_value_value_field */
/**
* Check if the value is empty.
*
@@ -190,256 +342,18 @@ ecma_is_value_object (const ecma_value_t& value) /**< ecma-value */
return (ecma_get_value_type_field (value) == ECMA_TYPE_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 (const 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
*/
inline ecma_value_t __attribute_const__ __attribute_always_inline__
ecma_make_simple_value (ecma_simple_value_t value) /**< simple value */
{
ecma_value_t ret_value = 0;
ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_SIMPLE);
ret_value = ecma_set_value_value_field (ret_value, value);
return ret_value;
} /* ecma_make_simple_value */
/**
* Number value constructor
*/
ecma_value_t __attribute_const__
ecma_make_number_value (ecma_number_t* num_p) /**< number to reference in value */
{
JERRY_ASSERT(num_p != NULL);
uint16_t num_cp;
ECMA_SET_NON_NULL_POINTER (num_cp, num_p);
ecma_value_t ret_value = 0;
ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_NUMBER);
ret_value = ecma_set_value_value_field (ret_value, num_cp);
return ret_value;
} /* ecma_make_number_value */
/**
* String value constructor
*/
ecma_value_t __attribute_const__
ecma_make_string_value (ecma_string_t* ecma_string_p) /**< string to reference in value */
{
JERRY_ASSERT(ecma_string_p != NULL);
uint16_t string_cp;
ECMA_SET_NON_NULL_POINTER (string_cp, ecma_string_p);
ecma_value_t ret_value = 0;
ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_STRING);
ret_value = ecma_set_value_value_field (ret_value, string_cp);
return ret_value;
} /* ecma_make_string_value */
/**
* object value constructor
*/
ecma_value_t __attribute_const__
ecma_make_object_value (ecma_object_t* object_p) /**< object to reference in value */
{
JERRY_ASSERT(object_p != NULL);
uint16_t object_cp;
ECMA_SET_NON_NULL_POINTER (object_cp, object_p);
ecma_value_t ret_value = 0;
ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_OBJECT);
ret_value = ecma_set_value_value_field (ret_value, object_cp);
return ret_value;
} /* ecma_make_object_value */
/**
* Get pointer to ecma-number from ecma-value
*
* @return the pointer
*/
ecma_number_t* __attribute_pure__
ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER);
return ECMA_GET_NON_NULL_POINTER (ecma_number_t,
ecma_get_value_value_field (value));
} /* ecma_get_number_from_value */
/**
* Get pointer to ecma-string from ecma-value
*
* @return the pointer
*/
ecma_string_t* __attribute_pure__
ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING);
return ECMA_GET_NON_NULL_POINTER (ecma_string_t,
ecma_get_value_value_field (value));
} /* ecma_get_string_from_value */
/**
* Get pointer to ecma-object from ecma-value
*
* @return the pointer
*/
ecma_object_t* __attribute_pure__
ecma_get_object_from_value (const ecma_value_t& value) /**< ecma-value */
{
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT);
return ECMA_GET_NON_NULL_POINTER (ecma_object_t,
ecma_get_value_value_field (value));
} /* ecma_get_object_from_value */
/**
* Copy ecma-value.
*
* Note:
* Operation algorithm.
* switch (valuetype)
* case simple:
* simply return the value as it was passed;
* case number:
* copy the number
* and return new ecma-value
* pointing to copy of the number;
* case string:
* increase reference counter of the string
* and return the value as it was passed.
* case object;
* increase reference counter of the object if do_ref_if_object is true
* and return the value as it was passed.
*
* @return See note.
*/
ecma_value_t
ecma_copy_value (const ecma_value_t& value, /**< ecma-value */
bool do_ref_if_object) /**< if the value is object value,
increment reference counter of the object */
{
ecma_value_t value_copy = 0;
switch (ecma_get_value_type_field (value))
{
case ECMA_TYPE_SIMPLE:
{
value_copy = value;
break;
}
case ECMA_TYPE_NUMBER:
{
ecma_number_t *num_p = ecma_get_number_from_value (value);
ecma_number_t *number_copy_p = ecma_alloc_number ();
*number_copy_p = *num_p;
value_copy = ecma_make_number_value (number_copy_p);
break;
}
case ECMA_TYPE_STRING:
{
ecma_string_t *string_p = ecma_get_string_from_value (value);
string_p = ecma_copy_or_ref_ecma_string (string_p);
value_copy = ecma_make_string_value (string_p);
break;
}
case ECMA_TYPE_OBJECT:
{
ecma_object_t *obj_p = ecma_get_object_from_value (value);
if (do_ref_if_object)
{
ecma_ref_object (obj_p);
}
value_copy = value;
break;
}
}
return value_copy;
} /* ecma_copy_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 */
{
switch (ecma_get_value_type_field (value))
{
case ECMA_TYPE_SIMPLE:
{
/* doesn't hold additional memory */
break;
}
case ECMA_TYPE_NUMBER:
{
ecma_number_t *number_p = ecma_get_number_from_value (value);
ecma_dealloc_number (number_p);
break;
}
case ECMA_TYPE_STRING:
{
ecma_string_t *string_p = ecma_get_string_from_value (value);
ecma_deref_ecma_string (string_p);
break;
}
case ECMA_TYPE_OBJECT:
{
if (do_deref_if_object)
{
ecma_deref_object (ecma_get_object_from_value (value));
}
break;
}
}
} /* ecma_free_value */
extern ecma_number_t* __attribute_pure__ ecma_get_number_from_value (const ecma_value_t& value);
extern ecma_string_t* __attribute_pure__ ecma_get_string_from_value (const ecma_value_t& value);
extern ecma_object_t* __attribute_pure__ ecma_get_object_from_value (const ecma_value_t& value);
extern void ecma_copy_value (ecma_value_t &ret, const ecma_value_t& value, bool do_ref_if_object);
extern void ecma_free_value (ecma_value_t& value, bool do_deref_if_object);
/**
* Get type field of completion value
*
* @return type field
*/
static ecma_completion_type_t __attribute_const__
inline ecma_completion_type_t __attribute_const__ __attribute_always_inline__
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,
@@ -452,34 +366,21 @@ ecma_get_completion_value_type_field (ecma_completion_value_t completion_value)
*
* @return value field
*/
static ecma_value_t __attribute_const__
ecma_get_completion_value_value_field (ecma_completion_value_t completion_value) /**< completion value */
inline void __attribute_always_inline__
ecma_get_completion_value_value_field (ecma_value_t &ret, /**< out: ecma-value */
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);
ret = (ecma_value_packed_t) jrt_extract_bit_field (completion_value,
ECMA_COMPLETION_VALUE_VALUE_POS,
ECMA_COMPLETION_VALUE_VALUE_WIDTH);
} /* ecma_get_completion_value_value_field */
/**
* Get pointer to label descriptor from completion value
*
* @return pointer to label descriptor
*/
static ecma_label_descriptor_t* __attribute_const__
ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_value) /**< completion value */
{
return ECMA_GET_NON_NULL_POINTER (ecma_label_descriptor_t,
(uintptr_t) jrt_extract_bit_field (completion_value,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH));
} /* ecma_get_completion_value_label_descriptor */
/**
* Set type field of completion value
*
* @return completion value with updated field
*/
static ecma_completion_value_t __attribute_const__
inline ecma_completion_value_t __attribute_const__ __attribute_always_inline__
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 */
@@ -495,37 +396,17 @@ ecma_set_completion_value_type_field (ecma_completion_value_t completion_value,
*
* @return completion value with updated field
*/
static ecma_completion_value_t __attribute_pure__
inline ecma_completion_value_t __attribute_pure__ __attribute_always_inline__
ecma_set_completion_value_value_field (ecma_completion_value_t completion_value, /**< completion value
* to set field in */
const ecma_value_t& value_field) /**< new field value */
{
return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value,
value_field,
(ecma_value_packed_t) value_field,
ECMA_COMPLETION_VALUE_VALUE_POS,
ECMA_COMPLETION_VALUE_VALUE_WIDTH);
} /* ecma_set_completion_value_value_field */
/**
* Set label descriptor of completion value
*
* @return completion value with updated field
*/
static ecma_completion_value_t __attribute_const__
ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_value, /**< completion value
* to set field in */
ecma_label_descriptor_t* label_desc_p) /**< pointer to the
* label descriptor */
{
uintptr_t label_desc_cp;
ECMA_SET_NON_NULL_POINTER (label_desc_cp, label_desc_p);
return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value,
label_desc_cp,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS,
ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH);
} /* ecma_set_completion_value_label_descriptor */
/**
* Normal, throw, return, exit and meta completion values constructor
*
@@ -556,34 +437,9 @@ ecma_make_completion_value (ecma_completion_type_t type, /**< type */
return completion_value;
} /* ecma_make_completion_value */
/**
* Break and continue completion values constructor
*
* @return completion value
*/
ecma_completion_value_t __attribute_const__
ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */
uint8_t depth_level, /**< depth level (in try constructions,
with blocks, etc.) */
uint16_t offset) /**< offset to label from end of last block */
{
JERRY_ASSERT (type == ECMA_COMPLETION_TYPE_BREAK
|| type == ECMA_COMPLETION_TYPE_CONTINUE);
ecma_label_descriptor_t *label_desc_p = ecma_alloc_label_descriptor ();
label_desc_p->offset = offset;
label_desc_p->depth = depth_level;
ecma_completion_value_t completion_value = 0;
completion_value = ecma_set_completion_value_type_field (completion_value,
type);
completion_value = ecma_set_completion_value_label_descriptor (completion_value,
label_desc_p);
return completion_value;
} /* ecma_make_label_completion_value */
extern ecma_completion_value_t ecma_make_label_completion_value (ecma_completion_type_t type,
uint8_t depth_level,
uint16_t offset);
/**
* Simple normal completion value constructor
*
@@ -598,7 +454,7 @@ ecma_make_simple_completion_value (ecma_simple_value_t simple_value) /**< simple
|| simple_value == ECMA_SIMPLE_VALUE_TRUE);
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL,
ecma_make_simple_value (simple_value));
ecma_value_t (simple_value));
} /* ecma_make_simple_completion_value */
/**
@@ -629,21 +485,7 @@ ecma_make_throw_completion_value (const ecma_value_t& value) /**< value */
#endif /* !CONFIG_ECMA_EXCEPTION_SUPPORT */
} /* ecma_make_throw_completion_value */
/**
* Throw completion value constructor.
*
* @return 'throw' completion value
*/
ecma_completion_value_t __attribute_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 */
extern ecma_completion_value_t ecma_make_throw_obj_completion_value (ecma_object_t *exception_p);
/**
* Empty completion value constructor.
@@ -654,7 +496,7 @@ inline ecma_completion_value_t __attribute_const__ __attribute_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_value_t ());
} /* ecma_make_empty_completion_value */
/**
@@ -679,8 +521,8 @@ ecma_make_exit_completion_value (bool is_successful) /**< does completion value
of script execution (true) or not (false) */
{
return ecma_make_completion_value (ECMA_COMPLETION_TYPE_EXIT,
ecma_make_simple_value (is_successful ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE));
ecma_value_t (is_successful ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE));
} /* ecma_make_exit_completion_value */
/**
@@ -692,7 +534,7 @@ inline ecma_completion_value_t __attribute_const__ __attribute_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_value_t (ECMA_SIMPLE_VALUE_EMPTY));
} /* ecma_make_meta_completion_value */
/**
@@ -700,8 +542,9 @@ ecma_make_meta_completion_value (void)
*
* @return ecma-value
*/
inline ecma_value_t __attribute_const__ __attribute_always_inline__
ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< completion value */
inline void __attribute_always_inline__
ecma_get_completion_value_value (ecma_value_t &ret, /**< out: ecma-value */
ecma_completion_value_t completion_value) /**< completion value */
{
const ecma_completion_type_t type = ecma_get_completion_value_type_field (completion_value);
@@ -714,101 +557,11 @@ ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**<
JERRY_ASSERT (is_type_ok);
return ecma_get_completion_value_value_field (completion_value);
ecma_get_completion_value_value_field (ret, completion_value);
} /* ecma_get_completion_value_value */
/**
* Get pointer to ecma-number from completion value
*
* @return pointer
*/
ecma_number_t* __attribute_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* __attribute_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* __attribute_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
#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT
|| type == ECMA_COMPLETION_TYPE_THROW
#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */
|| type == ECMA_COMPLETION_TYPE_RETURN
|| type == ECMA_COMPLETION_TYPE_EXIT);
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.
*/
void
ecma_free_completion_value (ecma_completion_value_t completion_value) /**< completion value */
{
switch (ecma_get_completion_value_type_field (completion_value))
{
case ECMA_COMPLETION_TYPE_NORMAL:
#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT
case ECMA_COMPLETION_TYPE_THROW:
#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */
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_EXIT:
{
ecma_value_t v = ecma_get_completion_value_value_field (completion_value);
JERRY_ASSERT(ecma_get_value_type_field (v) == ECMA_TYPE_SIMPLE);
break;
}
case ECMA_COMPLETION_TYPE_CONTINUE:
case ECMA_COMPLETION_TYPE_BREAK:
{
ecma_dealloc_label_descriptor (ecma_get_completion_value_label_descriptor (completion_value));
break;
}
case ECMA_COMPLETION_TYPE_META:
{
JERRY_UNREACHABLE ();
}
}
} /* ecma_free_completion_value */
extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t value);
extern void ecma_free_completion_value (ecma_completion_value_t completion_value);
/**
* Check if the completion value is normal value.
@@ -863,7 +616,13 @@ ecma_is_completion_value_exit (ecma_completion_value_t value) /**< completion va
{
if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_EXIT)
{
JERRY_ASSERT (ecma_is_value_boolean (ecma_get_completion_value_value_field (value)));
#ifndef JERRY_NDEBUG
ecma_value_t v;
ecma_get_completion_value_value_field (v, value);
JERRY_ASSERT (ecma_is_value_boolean (v));
#endif /* !JERRY_NDEBUG */
return true;
}
@@ -884,7 +643,13 @@ ecma_is_completion_value_meta (ecma_completion_value_t value) /**< completion va
{
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)));
#ifndef JERRY_NDEBUG
ecma_value_t v;
ecma_get_completion_value_value_field (v, value);
JERRY_ASSERT (ecma_is_value_empty (v));
#endif /* !JERRY_NDEBUG */
return true;
}
@@ -969,11 +734,25 @@ ecma_is_completion_value_normal_false (ecma_completion_value_t value) /**< compl
inline bool __attribute_const__ __attribute_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)));
if (ecma_is_completion_value_normal (value))
{
ecma_value_t v;
ecma_get_completion_value_value_field (v, value);
return ecma_is_value_empty (v);
}
else
{
return false;
}
} /* ecma_is_completion_value_empty */
extern void ecma_check_value_type_is_spec_defined (const ecma_value_t& value);
/**
* @}
* @}
*/
#endif /* !ECMA_VALUE_H */
+19 -15
View File
@@ -120,7 +120,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
ecma_property_t *length_prop_p = ecma_create_named_data_property (obj_p,
length_magic_string_p,
true, false, false);
ecma_set_named_data_property_value (length_prop_p, ecma_make_number_value (length_num_p));
ecma_set_named_data_property_value (length_prop_p, ecma_value_t (length_num_p));
ecma_deref_ecma_string (length_magic_string_p);
@@ -133,7 +133,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
ecma_property_descriptor_t item_prop_desc = ecma_make_empty_property_descriptor ();
{
item_prop_desc.is_value_defined = true;
item_prop_desc.value = array_items_p [index];
item_prop_desc.value = (ecma_value_packed_t) array_items_p [index];
item_prop_desc.is_writable_defined = true;
item_prop_desc.is_writable = true;
@@ -153,7 +153,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of
ecma_deref_ecma_string (item_name_string_p);
}
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
} /* ecma_op_create_array_object */
/**
@@ -181,7 +181,8 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
JERRY_ASSERT (len_prop_p != NULL && len_prop_p->type == ECMA_PROPERTY_NAMEDDATA);
// 2.
ecma_value_t old_len_value = ecma_get_named_data_property_value (len_prop_p);
ecma_value_t old_len_value;
ecma_get_named_data_property_value (old_len_value, len_prop_p);
ecma_number_t *num_p = ecma_get_number_from_value (old_len_value);
uint32_t old_len_uint32 = ecma_number_to_uint32 (*num_p);
@@ -204,18 +205,20 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
ecma_number_t new_len_num;
// c.
ecma_completion_value_t completion = ecma_op_to_number (property_desc_p->value);
if (ecma_is_completion_value_throw (completion))
ecma_completion_value_t prop_val_to_num_completion = ecma_op_to_number (ecma_value_t (property_desc_p->value));
if (ecma_is_completion_value_throw (prop_val_to_num_completion))
{
return completion;
return prop_val_to_num_completion;
}
JERRY_ASSERT (ecma_is_completion_value_normal (completion)
&& ecma_is_value_number (ecma_get_completion_value_value (completion)));
JERRY_ASSERT (ecma_is_completion_value_normal (prop_val_to_num_completion));
new_len_num = *ecma_get_number_from_completion_value (completion);
ecma_value_t new_len_value;
ecma_get_completion_value_value (new_len_value, prop_val_to_num_completion);
ecma_free_completion_value (completion);
new_len_num = *ecma_get_number_from_value (new_len_value);
ecma_free_completion_value (prop_val_to_num_completion);
uint32_t new_len_uint32 = ecma_number_to_uint32 (new_len_num);
@@ -231,7 +234,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
*new_len_num_p = new_len_num;
ecma_property_descriptor_t new_len_property_desc = *property_desc_p;
new_len_property_desc.value = ecma_make_number_value (new_len_num_p);
new_len_property_desc.value = (ecma_value_packed_t) ecma_value_t (new_len_num_p);
ecma_completion_value_t ret_value;
@@ -311,9 +314,10 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
// iii
if (ecma_is_completion_value_normal_false (delete_succeeded))
{
JERRY_ASSERT (ecma_is_value_number (new_len_property_desc.value));
ecma_value_t new_len_value (new_len_property_desc.value);
JERRY_ASSERT (ecma_is_value_number (new_len_value));
ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_property_desc.value);
ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_value);
// 1.
*new_len_num_p = ecma_uint32_to_number (old_len_uint32 + 1);
@@ -444,7 +448,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ecma_number_add (ecma_uint32_to_number (index), ECMA_NUMBER_ONE);
ecma_named_data_property_assign_value (obj_p, len_prop_p, ecma_make_number_value (num_p));
ecma_named_data_property_assign_value (obj_p, len_prop_p, ecma_value_t (num_p));
ecma_dealloc_number (num_p);
}
@@ -17,6 +17,7 @@
#define ECMA_ARRAY_OBJECT_H
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+2 -2
View File
@@ -48,7 +48,7 @@ ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to
return conv_to_boolean_completion;
}
ecma_simple_value_t bool_value = (ecma_is_value_true (ecma_get_completion_value_value (conv_to_boolean_completion)) ?
ecma_simple_value_t bool_value = (ecma_is_completion_value_normal_true (conv_to_boolean_completion) ?
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN
@@ -69,5 +69,5 @@ ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to
ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE);
prim_value_prop_p->u.internal_property.value = bool_value;
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
} /* ecma_op_create_boolean_object */
@@ -17,6 +17,7 @@
#define ECMA_BOOLEAN_OBJECT_H
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+1
View File
@@ -18,6 +18,7 @@
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+28 -16
View File
@@ -170,7 +170,10 @@ ecma_op_to_primitive (const ecma_value_t& value, /**< ecma-value */
}
else
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
}
} /* ecma_op_to_primitive */
@@ -254,7 +257,10 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
if (ecma_is_value_number (value))
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
}
else if (ecma_is_value_string (value))
{
@@ -263,7 +269,7 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = ecma_string_to_number (str_p);
return ecma_make_normal_completion_value (ecma_make_number_value (num_p));
return ecma_make_normal_completion_value (ecma_value_t (num_p));
}
else if (ecma_is_value_object (value))
{
@@ -305,7 +311,7 @@ ecma_op_to_number (const 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_value_t (num_p));
}
} /* ecma_op_to_number */
@@ -373,7 +379,7 @@ ecma_op_to_string (const ecma_value_t& value) /**< ecma-value */
}
}
return ecma_make_normal_completion_value (ecma_make_string_value (res_p));
return ecma_make_normal_completion_value (ecma_value_t (res_p));
}
} /* ecma_op_to_string */
@@ -401,7 +407,10 @@ ecma_op_to_object (const ecma_value_t& value) /**< ecma-value */
}
else if (ecma_is_value_object (value))
{
return ecma_make_normal_completion_value (ecma_copy_value (value, true));
ecma_value_t value_copy;
ecma_copy_value (value_copy, value, true);
return ecma_make_normal_completion_value (value_copy);
}
else
{
@@ -467,7 +476,7 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
// b.
const bool is_writable = (src_prop_desc_p->is_writable);
prop_desc.value = ecma_make_simple_value (is_writable ? ECMA_SIMPLE_VALUE_TRUE
prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_writable ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *writable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_WRITABLE);
@@ -486,11 +495,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
// a.
if (src_prop_desc_p->get_p == NULL)
{
prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
prop_desc.value = ecma_make_object_value (src_prop_desc_p->get_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (src_prop_desc_p->get_p);
}
ecma_string_t *get_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_GET);
@@ -504,11 +513,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
// b.
if (src_prop_desc_p->set_p == NULL)
{
prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
{
prop_desc.value = ecma_make_object_value (src_prop_desc_p->set_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (src_prop_desc_p->set_p);
}
ecma_string_t *set_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_SET);
@@ -521,8 +530,8 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
}
const bool is_enumerable = src_prop_desc_p->is_enumerable;
prop_desc.value = ecma_make_simple_value (is_enumerable ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_enumerable ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *enumerable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ENUMERABLE);
completion = ecma_op_object_define_own_property (obj_p,
@@ -533,8 +542,8 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
const bool is_configurable = src_prop_desc_p->is_configurable;
prop_desc.value = ecma_make_simple_value (is_configurable ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_configurable ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
ecma_string_t *configurable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CONFIGURABLE);
completion = ecma_op_object_define_own_property (obj_p,
@@ -654,8 +663,11 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value
ecma_op_object_get (obj_p, value_magic_string_p),
ret_value);
ecma_value_t value_copy;
ecma_copy_value (value_copy, value_prop_value, true);
prop_desc.is_value_defined = true;
prop_desc.value = ecma_copy_value (value_prop_value, true);
prop_desc.value = (ecma_value_packed_t) value_copy;
ECMA_FINALIZE (value_prop_value);
}
+1
View File
@@ -18,6 +18,7 @@
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+2 -2
View File
@@ -1,4 +1,4 @@
/* Copyright 2014 Samsung Electronics Co., Ltd.
/* Copyright 2014-2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -124,7 +124,7 @@ ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< nat
true, false, true);
ecma_set_named_data_property_value (prop_p,
ecma_make_string_value (ecma_copy_or_ref_ecma_string (message_string_p)));
ecma_value_t (ecma_copy_or_ref_ecma_string (message_string_p)));
ecma_deref_ecma_string (message_magic_string_p);
return new_error_obj_p;
+29 -30
View File
@@ -190,7 +190,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
// 15.
ecma_property_descriptor_t length_prop_desc = ecma_make_empty_property_descriptor ();
length_prop_desc.is_value_defined = true;
length_prop_desc.value = ecma_make_number_value (len_p);
length_prop_desc.value = (ecma_value_packed_t) ecma_value_t (len_p);
ecma_string_t* magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
ecma_completion_value_t completion = ecma_op_object_define_own_property (f,
@@ -212,7 +212,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_make_object_value (f);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (f);
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -232,7 +232,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f
ecma_deref_ecma_string (magic_string_constructor_p);
// 18.
prop_desc.value = ecma_make_object_value (proto_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (proto_p);
prop_desc.is_configurable = false;
ecma_string_t *magic_string_prototype_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE);
ecma_op_object_define_own_property (f,
@@ -319,12 +319,8 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
n < formal_parameters_count;
n++)
{
ecma_value_t v;
if (n >= arguments_list_len)
{
v = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
}
else
ecma_value_t v (ECMA_SIMPLE_VALUE_UNDEFINED);
if (n < arguments_list_len)
{
v = arguments_list_p[n];
}
@@ -332,7 +328,7 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio
bool is_moved = ecma_collection_iterator_next (&formal_params_iterator);
JERRY_ASSERT (is_moved);
ecma_value_t formal_parameter_name_value = *formal_params_iterator.current_value_p;
ecma_value_t formal_parameter_name_value (*formal_params_iterator.current_value_p);
ecma_string_t *formal_parameter_name_string_p = ecma_get_string_from_value (formal_parameter_name_value);
bool arg_already_declared = ecma_op_has_binding (env_p, formal_parameter_name_string_p);
@@ -463,7 +459,7 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
{
JERRY_ASSERT(func_obj_p != NULL
&& !ecma_is_lexical_environment (func_obj_p));
JERRY_ASSERT(ecma_op_is_callable (ecma_make_object_value (func_obj_p)));
JERRY_ASSERT(ecma_op_is_callable (ecma_value_t (func_obj_p)));
JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL);
if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION)
@@ -492,21 +488,21 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
// 1.
if (is_strict)
{
this_binding = ecma_copy_value (this_arg_value, true);
ecma_copy_value (this_binding, this_arg_value, true);
}
else if (ecma_is_value_undefined (this_arg_value)
|| ecma_is_value_null (this_arg_value))
{
// 2.
this_binding = ecma_make_object_value (ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL));
this_binding = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
}
else
{
// 3., 4.
ecma_completion_value_t completion = ecma_op_to_object (this_arg_value);
JERRY_ASSERT (ecma_is_completion_value_normal (completion));
ecma_completion_value_t to_obj_completion = ecma_op_to_object (this_arg_value);
JERRY_ASSERT (ecma_is_completion_value_normal (to_obj_completion));
this_binding = ecma_get_completion_value_value (completion);
ecma_get_completion_value_value (this_binding, to_obj_completion);
}
// 5.
@@ -521,18 +517,21 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
is_strict),
ret_value);
ecma_completion_value_t completion = run_int_from_pos (code_first_opcode_idx,
this_binding,
local_env_p,
is_strict,
false);
if (ecma_is_completion_value_return (completion))
ecma_completion_value_t run_completion = run_int_from_pos (code_first_opcode_idx,
this_binding,
local_env_p,
is_strict,
false);
if (ecma_is_completion_value_return (run_completion))
{
ret_value = ecma_make_normal_completion_value (ecma_get_completion_value_value (completion));
ecma_value_t value_to_ret;
ecma_get_completion_value_value (value_to_ret, run_completion);
ret_value = ecma_make_normal_completion_value (value_to_ret);
}
else
{
ret_value = completion;
ret_value = run_completion;
}
ECMA_FINALIZE (args_var_declaration_ret);
@@ -569,7 +568,7 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
{
JERRY_ASSERT(func_obj_p != NULL
&& !ecma_is_lexical_environment (func_obj_p));
JERRY_ASSERT(ecma_is_constructor (ecma_make_object_value (func_obj_p)));
JERRY_ASSERT(ecma_is_constructor (ecma_value_t (func_obj_p)));
JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL);
if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION)
@@ -614,7 +613,7 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
// 8.
ECMA_TRY_CATCH (call_completion,
ecma_op_function_call (func_obj_p,
ecma_make_object_value (obj_p),
ecma_value_t (obj_p),
arguments_list_p,
arguments_list_len),
ret_value);
@@ -626,12 +625,12 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */
{
ecma_deref_object (obj_p);
obj_value = ecma_copy_value (call_completion, true);
ecma_copy_value (obj_value, call_completion, true);
}
else
{
// 10.
obj_value = ecma_make_object_value (obj_p);
obj_value = obj_p;
}
ret_value = ecma_make_normal_completion_value (obj_value);
@@ -701,7 +700,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
ecma_property_descriptor_t property_desc = ecma_make_empty_property_descriptor ();
{
property_desc.is_value_defined = true;
property_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
property_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
property_desc.is_writable_defined = true;
property_desc.is_writable = true;
@@ -749,7 +748,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment
// f.
ret_value = ecma_op_set_mutable_binding (lex_env_p,
function_name_p,
ecma_make_object_value (func_obj_p),
ecma_value_t (func_obj_p),
is_strict);
}
@@ -17,6 +17,7 @@
#define ECMA_FUNCTION_OBJECT_H
#include "ecma-globals.h"
#include "ecma-value.h"
#include "interpreter.h"
/** \addtogroup ecma ECMA
+4 -4
View File
@@ -75,9 +75,9 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_get_value_object_base (ecma_reference_t ref) /**< ECMA-reference */
ecma_op_get_value_object_base (const ecma_reference_t& ref) /**< ECMA-reference */
{
const ecma_value_t base = ref.base;
const ecma_value_t& base = ref.base;
const bool is_unresolvable_reference = ecma_is_value_undefined (base);
const bool has_primitive_base = (ecma_is_value_boolean (base)
|| ecma_is_value_number (base)
@@ -203,10 +203,10 @@ ecma_reject_put (bool is_throw) /**< Throw flag */
* Returned value must be freed with ecma_free_completion_value.
*/
ecma_completion_value_t
ecma_op_put_value_object_base (ecma_reference_t ref, /**< ECMA-reference */
ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference */
const ecma_value_t& value) /**< ECMA-value */
{
const ecma_value_t base = ref.base;
const ecma_value_t& base = ref.base;
const bool is_unresolvable_reference = ecma_is_value_undefined (base);
const bool has_primitive_base = (ecma_is_value_boolean (base)
|| ecma_is_value_number (base)
+20 -8
View File
@@ -93,7 +93,7 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED);
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -241,7 +241,8 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
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 (prop_value, property_p);
/* is the binding mutable? */
if (!ecma_is_property_writable (property_p)
@@ -258,7 +259,10 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */
}
}
return ecma_make_normal_completion_value (ecma_copy_value (prop_value, true));
ecma_value_t prop_value_copy;
ecma_copy_value (prop_value_copy, prop_value, true);
return ecma_make_normal_completion_value (prop_value_copy);
}
else
{
@@ -364,7 +368,7 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment
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));
return ecma_make_normal_completion_value (ecma_value_t (binding_obj_p));
}
else
{
@@ -394,10 +398,15 @@ ecma_op_create_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environ
name_p,
false, false, false);
JERRY_ASSERT(ecma_is_value_undefined (ecma_get_named_data_property_value (prop_p)));
#ifndef JERRY_NDEBUG
ecma_value_t prop_value;
ecma_get_named_data_property_value (prop_value, prop_p);
JERRY_ASSERT(ecma_is_value_undefined (prop_value));
#endif /* !JERRY_NDEBUG */
ecma_set_named_data_property_value (prop_p,
ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY));
ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY));
} /* ecma_op_create_immutable_binding */
/**
@@ -416,9 +425,12 @@ ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p, /**< lexical env
ecma_property_t *prop_p = ecma_get_named_data_property (lex_env_p, name_p);
ecma_value_t prop_value;
ecma_get_named_data_property_value (prop_value, prop_p);
/* The binding must be unitialized immutable binding */
JERRY_ASSERT(!ecma_is_property_writable (prop_p)
&& ecma_is_value_empty (ecma_get_named_data_property_value (prop_p)));
JERRY_ASSERT (!ecma_is_property_writable (prop_p)
&& ecma_is_value_empty (prop_value));
ecma_named_data_property_assign_value (lex_env_p, prop_p, value);
} /* ecma_op_initialize_immutable_binding */
+3 -2
View File
@@ -18,6 +18,7 @@
#include "ecma-globals.h"
#include "ecma-reference.h"
#include "ecma-value.h"
#include "globals.h"
/** \addtogroup ecma ECMA
@@ -33,12 +34,12 @@
extern ecma_completion_value_t ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict);
extern ecma_completion_value_t ecma_op_get_value_object_base (ecma_reference_t ref);
extern ecma_completion_value_t ecma_op_get_value_object_base (const ecma_reference_t& ref);
extern ecma_completion_value_t ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p,
ecma_string_t *var_name_string_p,
bool is_strict,
const ecma_value_t& value);
extern ecma_completion_value_t ecma_op_put_value_object_base (ecma_reference_t ref,
extern ecma_completion_value_t ecma_op_put_value_object_base (const ecma_reference_t& ref,
const ecma_value_t& value);
/* ECMA-262 v5, Table 17. Abstract methods of Environment Records */
+8 -5
View File
@@ -41,14 +41,17 @@
ecma_completion_value_t
ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to the Number constructor */
{
ecma_completion_value_t conv_to_num_completion = ecma_op_to_number (arg);
ecma_completion_value_t to_num_completion = ecma_op_to_number (arg);
if (!ecma_is_completion_value_normal (conv_to_num_completion))
if (!ecma_is_completion_value_normal (to_num_completion))
{
return conv_to_num_completion;
return to_num_completion;
}
ecma_number_t *prim_value_p = ecma_get_number_from_completion_value (conv_to_num_completion);
ecma_value_t num_value;
ecma_get_completion_value_value (num_value, to_num_completion);
ecma_number_t *prim_value_p = ecma_get_number_from_value (num_value);
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_NUMBER_PROTOTYPE);
@@ -68,5 +71,5 @@ ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to t
ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE);
ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_p);
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
} /* ecma_op_create_number_object */
@@ -17,6 +17,7 @@
#define ECMA_NUMBER_OBJECT_H
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+16 -11
View File
@@ -69,7 +69,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_make_number_value (len_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (len_p);
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -98,7 +98,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = arguments_list_p[indx];
prop_desc.value = (ecma_value_packed_t) arguments_list_p[indx];
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -141,8 +141,9 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
JERRY_ASSERT (formal_params_iter_p->current_value_p != NULL);
JERRY_ASSERT (param_index < formal_params_number);
JERRY_ASSERT (ecma_is_value_string (*formal_params_iter_p->current_value_p));
formal_params[param_index] = ecma_get_string_from_value (*formal_params_iter_p->current_value_p);
ecma_value_t string_value (*formal_params_iter_p->current_value_p);
JERRY_ASSERT (ecma_is_value_string (string_value));
formal_params[param_index] = ecma_get_string_from_value (string_value);
}
JERRY_ASSERT (param_index == formal_params_number);
@@ -172,7 +173,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_make_string_value (name_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (name_p);
}
completion = ecma_op_object_define_own_property (map_p,
@@ -209,7 +210,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
prop_desc = ecma_make_empty_property_descriptor ();
{
prop_desc.is_value_defined = true;
prop_desc.value = ecma_make_object_value (func_obj_p);
prop_desc.value = (ecma_value_packed_t) ecma_value_t (func_obj_p);
prop_desc.is_writable_defined = true;
prop_desc.is_writable = true;
@@ -286,7 +287,8 @@ ecma_arguments_get_mapped_arg_value (ecma_object_t *map_p, /**< [[ParametersMap]
JERRY_ASSERT(lex_env_p != NULL
&& ecma_is_lexical_environment (lex_env_p));
ecma_value_t arg_name_prop_value = ecma_get_named_data_property_value (arg_name_prop_p);
ecma_value_t arg_name_prop_value;
ecma_get_named_data_property_value (arg_name_prop_value, arg_name_prop_p);
ecma_string_t *arg_name_p = ecma_get_string_from_value (arg_name_prop_value);
@@ -370,11 +372,14 @@ ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object
if (mapped_prop_p != NULL)
{
// a.
ecma_completion_value_t completion = ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p);
ecma_completion_value_t get_mapped_arg_completion = ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p);
ecma_named_data_property_assign_value (obj_p, desc_p, ecma_get_completion_value_value (completion));
ecma_value_t value_to_assign;
ecma_get_completion_value_value (value_to_assign, get_mapped_arg_completion);
ecma_free_completion_value (completion);
ecma_named_data_property_assign_value (obj_p, desc_p, value_to_assign);
ecma_free_completion_value (get_mapped_arg_completion);
}
// 6.
@@ -441,7 +446,7 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj
{
completion = ecma_op_object_put (map_p,
property_name_p,
property_desc_p->value,
ecma_value_t (property_desc_p->value),
is_throw);
}
@@ -18,6 +18,7 @@
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "ecma-value.h"
extern ecma_object_t*
ecma_create_arguments_object (ecma_object_t *func_obj_p,
+38 -19
View File
@@ -100,7 +100,7 @@ ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of co
ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
}
} /* ecma_op_create_object_object_arg */
@@ -134,8 +134,13 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
// 3.
if (prop_p->type == ECMA_PROPERTY_NAMEDDATA)
{
return ecma_make_normal_completion_value (ecma_copy_value (ecma_get_named_data_property_value (prop_p),
true));
ecma_value_t prop_value;
ecma_get_named_data_property_value (prop_value, prop_p);
ecma_value_t prop_value_copy;
ecma_copy_value (prop_value_copy, prop_value, true);
return ecma_make_normal_completion_value (prop_value_copy);
}
else
{
@@ -151,7 +156,7 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */
else
{
return ecma_op_function_call (getter_p,
ecma_make_object_value (obj_p),
ecma_value_t (obj_p),
NULL,
0);
}
@@ -268,7 +273,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
ecma_property_descriptor_t value_desc = ecma_make_empty_property_descriptor ();
{
value_desc.is_value_defined = true;
value_desc.value = value;
value_desc.value = (ecma_value_packed_t) value;
}
// b., c.
@@ -294,7 +299,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
ECMA_TRY_CATCH (call_ret,
ecma_op_function_call (setter_p,
ecma_make_object_value (obj_p),
ecma_value_t (obj_p),
&value,
1),
ret_value);
@@ -313,7 +318,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */
ecma_property_descriptor_t new_desc = ecma_make_empty_property_descriptor ();
{
new_desc.is_value_defined = true;
new_desc.value = value;
new_desc.value = (ecma_value_packed_t) value;
new_desc.is_writable_defined = true;
new_desc.is_writable = true;
@@ -548,12 +553,15 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
ecma_completion_value_t call_completion = ecma_make_empty_completion_value ();
if (ecma_op_is_callable (ecma_get_completion_value_value (function_value_get_completion)))
ecma_value_t function_value_get;
ecma_get_completion_value_value (function_value_get, function_value_get_completion);
if (ecma_op_is_callable (function_value_get))
{
ecma_object_t *func_obj_p = ecma_get_object_from_completion_value (function_value_get_completion);
ecma_object_t *func_obj_p = ecma_get_object_from_value (function_value_get);
call_completion = ecma_op_function_call (func_obj_p,
ecma_make_object_value (obj_p),
ecma_value_t (obj_p),
NULL, 0);
}
@@ -564,10 +572,15 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */
return call_completion;
}
if (!ecma_is_completion_value_empty (call_completion)
&& !ecma_is_value_object (ecma_get_completion_value_value (call_completion)))
if (!ecma_is_completion_value_empty (call_completion))
{
return call_completion;
ecma_value_t call_ret_value;
ecma_get_completion_value_value (call_ret_value, call_completion);
if (!ecma_is_value_object (call_ret_value))
{
return call_completion;
}
}
ecma_free_completion_value (call_completion);
@@ -632,7 +645,7 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
property_desc_p->is_enumerable,
property_desc_p->is_configurable);
ecma_named_data_property_assign_value (obj_p, new_prop_p, property_desc_p->value);
ecma_named_data_property_assign_value (obj_p, new_prop_p, ecma_value_t (property_desc_p->value));
}
else
{
@@ -668,9 +681,12 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
bool is_every_field_in_desc_also_occurs_in_current_desc_with_same_value = true;
if (property_desc_p->is_value_defined)
{
ecma_value_t prop_value;
ecma_get_named_data_property_value (prop_value, current_p);
if (!is_current_data_descriptor
|| !ecma_op_same_value (property_desc_p->value,
ecma_get_named_data_property_value (current_p)))
|| !ecma_op_same_value (ecma_value_t (property_desc_p->value),
prop_value))
{
is_every_field_in_desc_also_occurs_in_current_desc_with_same_value = false;
}
@@ -791,9 +807,12 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
}
// ii.
ecma_value_t prop_value;
ecma_get_named_data_property_value (prop_value, current_p);
if (property_desc_p->is_value_defined
&& !ecma_op_same_value (property_desc_p->value,
ecma_get_named_data_property_value (current_p)))
&& !ecma_op_same_value (ecma_value_t (property_desc_p->value),
prop_value))
{
return ecma_reject (is_throw);
}
@@ -828,7 +847,7 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec
{
JERRY_ASSERT(is_current_data_descriptor);
ecma_named_data_property_assign_value (obj_p, current_p, property_desc_p->value);
ecma_named_data_property_assign_value (obj_p, current_p, ecma_value_t (property_desc_p->value));
}
if (property_desc_p->is_writable_defined)
@@ -18,6 +18,7 @@
#include "ecma-conversion.h"
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+1
View File
@@ -18,6 +18,7 @@
#include "ecma-conversion.h"
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+18 -17
View File
@@ -63,8 +63,9 @@ ecma_op_resolve_reference_base (ecma_object_t *lex_env_p, /**< starting lexical
* @return ECMA-reference
* Returned value must be freed through ecma_free_reference.
*/
ecma_reference_t
ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environment */
void
ecma_op_get_identifier_reference (ecma_reference_t &ret, /**< out: reference */
ecma_object_t *lex_env_p, /**< lexical environment */
ecma_string_t *name_p, /**< identifier's name */
bool is_strict) /**< strict reference flag */
{
@@ -74,15 +75,17 @@ ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environ
if (base_lex_env_p != NULL)
{
return ecma_make_reference (ecma_make_object_value (base_lex_env_p),
name_p,
is_strict);
ecma_make_reference (ret,
ecma_value_t (base_lex_env_p),
name_p,
is_strict);
}
else
{
return ecma_make_reference (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED),
name_p,
is_strict);
ecma_make_reference (ret,
ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED),
name_p,
is_strict);
}
} /* ecma_op_get_identifier_reference */
@@ -92,20 +95,18 @@ ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environ
* @return ECMA-reference
* Returned value must be freed through ecma_free_reference.
*/
ecma_reference_t
ecma_make_reference (const ecma_value_t& base, /**< base value */
void
ecma_make_reference (ecma_reference_t &ret, /**< out: reference */
const ecma_value_t& base, /**< base value */
ecma_string_t *name_p, /**< referenced name */
bool is_strict) /**< strict reference flag */
{
name_p = ecma_copy_or_ref_ecma_string (name_p);
ecma_reference_t ref;
ref.base = ecma_copy_value (base, true);
ref.is_strict = is_strict;
ecma_copy_value (ret.base, base, true);
ret.is_strict = is_strict;
ECMA_SET_POINTER (ref.referenced_name_cp, name_p);
return ref;
ECMA_SET_POINTER (ret.referenced_name_cp, name_p);
} /* ecma_make_reference */
/**
@@ -115,7 +116,7 @@ ecma_make_reference (const ecma_value_t& base, /**< base value */
* freeing invalidates all copies of the reference.
*/
void
ecma_free_reference (ecma_reference_t ref) /**< reference */
ecma_free_reference (ecma_reference_t& ref) /**< reference */
{
ecma_free_value (ref.base, true);
ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t,
+15 -8
View File
@@ -17,6 +17,7 @@
#define ECMA_REFERENCE_H
#include "ecma-globals.h"
#include "ecma-value.h"
#include "globals.h"
/** \addtogroup ecma ECMA
@@ -31,8 +32,12 @@
/**
* ECMA-reference (see also: ECMA-262 v5, 8.7).
*/
typedef struct
typedef struct ecma_reference_t
{
ecma_reference_t () : base (), referenced_name_cp (ECMA_NULL_POINTER), is_strict (false)
{
}
/** base value */
ecma_value_t base;
@@ -46,13 +51,15 @@ typedef struct
extern ecma_object_t* ecma_op_resolve_reference_base (ecma_object_t *lex_env_p,
ecma_string_t *name_p);
extern ecma_reference_t ecma_op_get_identifier_reference (ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_strict);
extern ecma_reference_t ecma_make_reference (const ecma_value_t& base,
ecma_string_t *name_p,
bool is_strict);
extern void ecma_free_reference (ecma_reference_t ref);
extern void ecma_op_get_identifier_reference (ecma_reference_t &ret,
ecma_object_t *lex_env_p,
ecma_string_t *name_p,
bool is_strict);
extern void ecma_make_reference (ecma_reference_t &ret,
const ecma_value_t& base,
ecma_string_t *name_p,
bool is_strict);
extern void ecma_free_reference (ecma_reference_t& ref);
/**
* @}
+12 -9
View File
@@ -57,18 +57,21 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of
}
else
{
ecma_completion_value_t to_str_arg_value = ecma_op_to_string (arguments_list_p [0]);
ecma_completion_value_t to_str_arg_completion = ecma_op_to_string (arguments_list_p [0]);
if (ecma_is_completion_value_throw (to_str_arg_value))
if (ecma_is_completion_value_throw (to_str_arg_completion))
{
return to_str_arg_value;
return to_str_arg_completion;
}
else
{
JERRY_ASSERT (ecma_is_completion_value_normal (to_str_arg_value));
JERRY_ASSERT (ecma_is_completion_value_normal (to_str_arg_completion));
JERRY_ASSERT (ecma_is_value_string (ecma_get_completion_value_value (to_str_arg_value)));
prim_prop_str_value_p = ecma_get_string_from_completion_value (to_str_arg_value);
ecma_value_t to_str_arg_value;
ecma_get_completion_value_value (to_str_arg_value, to_str_arg_completion);
JERRY_ASSERT (ecma_is_value_string (to_str_arg_value));
prim_prop_str_value_p = ecma_get_string_from_value (to_str_arg_value);
int32_t string_len = ecma_string_get_length (prim_prop_str_value_p);
JERRY_ASSERT (string_len >= 0);
@@ -102,10 +105,10 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of
false, false, false);
ecma_number_t *length_prop_value_p = ecma_alloc_number ();
*length_prop_value_p = length_value;
ecma_set_named_data_property_value (length_prop_p, ecma_make_number_value (length_prop_value_p));
ecma_set_named_data_property_value (length_prop_p, ecma_value_t (length_prop_value_p));
ecma_deref_ecma_string (length_magic_string_p);
return ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
return ecma_make_normal_completion_value (ecma_value_t (obj_p));
} /* ecma_op_create_string_object */
/**
@@ -195,7 +198,7 @@ ecma_op_string_object_get_own_property (ecma_object_t *obj_p, /**< the array obj
false, true, false);
ecma_set_named_data_property_value (new_prop_p,
ecma_make_string_value (new_prop_str_value_p));
ecma_value_t (new_prop_str_value_p));
}
ecma_deref_ecma_string (new_prop_name_p);
@@ -17,6 +17,7 @@
#define ECMA_STRING_OBJECT_H
#include "ecma-globals.h"
#include "ecma-value.h"
/** \addtogroup ecma ECMA
* @{
+2 -1
View File
@@ -39,7 +39,8 @@
{ \
JERRY_ASSERT(ecma_is_completion_value_normal (var ## _completion)); \
\
ecma_value_t var __unused = ecma_get_completion_value_value (var ## _completion)
ecma_value_t var; \
ecma_get_completion_value_value (var, var ## _completion)
/**
* The macro marks end of code block that is defined by corresponding