Improve equal operations.
The implementation is simplified and optimized resulting the removal a large amount of code. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -47,29 +47,13 @@ opfunc_equal_value (ecma_value_t left_value, /**< left value */
|
||||
JERRY_ASSERT (!ecma_is_value_error (left_value)
|
||||
&& !ecma_is_value_error (right_value));
|
||||
|
||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||
{
|
||||
if (left_value == right_value)
|
||||
{
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
ecma_value_t compare_result = ecma_op_abstract_equality_compare (left_value,
|
||||
right_value);
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result)
|
||||
|| ecma_is_value_error (compare_result));
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_equality_compare (left_value,
|
||||
right_value),
|
||||
ret_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
|
||||
ret_value = compare_result;
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
return compare_result;
|
||||
} /* opfunc_equal_value */
|
||||
|
||||
/**
|
||||
@@ -87,93 +71,20 @@ opfunc_not_equal_value (ecma_value_t left_value, /**< left value */
|
||||
JERRY_ASSERT (!ecma_is_value_error (left_value)
|
||||
&& !ecma_is_value_error (right_value));
|
||||
|
||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||
ecma_value_t compare_result = ecma_op_abstract_equality_compare (left_value,
|
||||
right_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result)
|
||||
|| ecma_is_value_error (compare_result));
|
||||
|
||||
if (!ecma_is_value_error (compare_result))
|
||||
{
|
||||
if (left_value == right_value)
|
||||
{
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
compare_result = ecma_invert_boolean_value (compare_result);
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_equality_compare (left_value, right_value),
|
||||
ret_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
|
||||
bool is_equal = ecma_is_value_true (compare_result);
|
||||
|
||||
ret_value = ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
|
||||
: ECMA_SIMPLE_VALUE_TRUE);
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
return compare_result;
|
||||
} /* opfunc_not_equal_value */
|
||||
|
||||
/**
|
||||
* 'Strict Equals' opcode handler.
|
||||
*
|
||||
* See also: ECMA-262 v5, 11.9.4
|
||||
*
|
||||
* @return ecma value
|
||||
* Returned value must be freed with ecma_free_value
|
||||
*/
|
||||
ecma_value_t
|
||||
opfunc_equal_value_type (ecma_value_t left_value, /**< left value */
|
||||
ecma_value_t right_value) /**< right value */
|
||||
{
|
||||
JERRY_ASSERT (!ecma_is_value_error (left_value)
|
||||
&& !ecma_is_value_error (right_value));
|
||||
|
||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||
{
|
||||
if (left_value == right_value)
|
||||
{
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
|
||||
|
||||
return ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE
|
||||
: ECMA_SIMPLE_VALUE_FALSE);
|
||||
} /* opfunc_equal_value_type */
|
||||
|
||||
/**
|
||||
* 'Strict Does-not-equals' opcode handler.
|
||||
*
|
||||
* See also: ECMA-262 v5, 11.9.5
|
||||
*
|
||||
* @return ecma value
|
||||
* Returned value must be freed with ecma_free_value
|
||||
*/
|
||||
ecma_value_t
|
||||
opfunc_not_equal_value_type (ecma_value_t left_value, /**< left value */
|
||||
ecma_value_t right_value) /**< right value */
|
||||
{
|
||||
JERRY_ASSERT (!ecma_is_value_error (left_value)
|
||||
&& !ecma_is_value_error (right_value));
|
||||
|
||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||
{
|
||||
if (left_value == right_value)
|
||||
{
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
|
||||
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
|
||||
|
||||
return ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
|
||||
: ECMA_SIMPLE_VALUE_TRUE);
|
||||
} /* opfunc_not_equal_value_type */
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
|
||||
@@ -62,12 +62,6 @@ opfunc_equal_value (ecma_value_t, ecma_value_t);
|
||||
ecma_value_t
|
||||
opfunc_not_equal_value (ecma_value_t, ecma_value_t);
|
||||
|
||||
ecma_value_t
|
||||
opfunc_equal_value_type (ecma_value_t, ecma_value_t);
|
||||
|
||||
ecma_value_t
|
||||
opfunc_not_equal_value_type (ecma_value_t, ecma_value_t);
|
||||
|
||||
ecma_value_t
|
||||
do_number_arithmetic (number_arithmetic_op, ecma_value_t, ecma_value_t);
|
||||
|
||||
|
||||
+8
-25
@@ -19,6 +19,7 @@
|
||||
#include "ecma-alloc.h"
|
||||
#include "ecma-array-object.h"
|
||||
#include "ecma-builtins.h"
|
||||
#include "ecma-comparison.h"
|
||||
#include "ecma-conversion.h"
|
||||
#include "ecma-exceptions.h"
|
||||
#include "ecma-function-object.h"
|
||||
@@ -1483,17 +1484,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
||||
{
|
||||
JERRY_ASSERT (stack_top_p > frame_ctx_p->registers_p + register_end);
|
||||
|
||||
last_completion_value = opfunc_equal_value_type (left_value,
|
||||
stack_top_p[-1]);
|
||||
|
||||
if (ecma_is_value_error (last_completion_value))
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
result = last_completion_value;
|
||||
|
||||
if (result == ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE))
|
||||
if (ecma_op_strict_equality_compare (left_value, stack_top_p[-1]))
|
||||
{
|
||||
byte_code_p = byte_code_start_p + branch_offset;
|
||||
ecma_free_value (*--stack_top_p);
|
||||
@@ -1726,26 +1717,18 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
||||
}
|
||||
case VM_OC_STRICT_EQUAL:
|
||||
{
|
||||
last_completion_value = opfunc_equal_value_type (left_value, right_value);
|
||||
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
|
||||
|
||||
if (ecma_is_value_error (last_completion_value))
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
result = last_completion_value;
|
||||
result = ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE
|
||||
: ECMA_SIMPLE_VALUE_FALSE);
|
||||
break;
|
||||
}
|
||||
case VM_OC_STRICT_NOT_EQUAL:
|
||||
{
|
||||
last_completion_value = opfunc_not_equal_value_type (left_value, right_value);
|
||||
bool is_equal = ecma_op_strict_equality_compare (left_value, right_value);
|
||||
|
||||
if (ecma_is_value_error (last_completion_value))
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
result = last_completion_value;
|
||||
result = ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
|
||||
: ECMA_SIMPLE_VALUE_TRUE);
|
||||
break;
|
||||
}
|
||||
case VM_OC_BIT_OR:
|
||||
|
||||
Reference in New Issue
Block a user