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:
@@ -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;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define INTERPRETER_H
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-value.h"
|
||||
#include "globals.h"
|
||||
#include "opcodes.h"
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/**
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define ECMA_BUILTINS_H
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-value.h"
|
||||
|
||||
/**
|
||||
* A built-in object's identifier
|
||||
|
||||
@@ -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 */
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#define ECMA_GC_H
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-value.h"
|
||||
#include "mem-allocator.h"
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
* @{
|
||||
|
||||
@@ -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
|
||||
* @{
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-helpers.h"
|
||||
#include "ecma-value.h"
|
||||
|
||||
/** \addtogroup ecma ECMA
|
||||
* @{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-helpers.h"
|
||||
#include "ecma-value.h"
|
||||
|
||||
/** \addtogroup ecma ECMA
|
||||
* @{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
* @{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
* @{
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "ecma-conversion.h"
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-value.h"
|
||||
|
||||
/** \addtogroup ecma ECMA
|
||||
* @{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
||||
@@ -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
|
||||
* @{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user