From 7803e073c496811ac75486bde9387a8bc3d2a8a1 Mon Sep 17 00:00:00 2001 From: "e.gavrin" Date: Thu, 14 Aug 2014 16:36:53 +0400 Subject: [PATCH] Add opfuncs for greater_or_equal_than and less_or_equal_than opcodes. Add test. --- src/libcoreint/opcodes.c | 116 +++++++++++++++++++++++++++++++++++++- tests/jerry/relational.js | 9 ++- 2 files changed, 121 insertions(+), 4 deletions(-) diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index 681c5700e..a719a1f46 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -356,8 +356,6 @@ do_number_arithmetic (struct __int_data *int_data, /**< interpreter context */ op (logical_or) \ op (equal_value_type) \ op (not_equal_value_type) \ - op (less_or_equal_than) \ - op (greater_or_equal_than) \ op (construct_0) \ op (construct_1) \ op (construct_n) \ @@ -1275,6 +1273,120 @@ opfunc_greater_than (OPCODE opdata, /**< operation data */ return ret_value; } /* opfunc_greater_than */ +/** + * 'Less-than-or-equal' opcode handler. + * + * See also: ECMA-262 v5, 11.8.3 + * + * @return completion value + * Returned value must be freed with ecma_free_completion_value + */ +ecma_completion_value_t +opfunc_less_or_equal_than (OPCODE opdata, /**< operation data */ + struct __int_data *int_data) /**< interpreter context */ +{ + const T_IDX dst_var_idx = opdata.data.less_than.dst; + const T_IDX left_var_idx = opdata.data.less_than.var_left; + const T_IDX right_var_idx = opdata.data.less_than.var_right; + + int_data->pos++; + + ecma_completion_value_t ret_value; + + ECMA_TRY_CATCH (left_value, get_variable_value (int_data, left_var_idx, false), ret_value); + ECMA_TRY_CATCH (right_value, get_variable_value (int_data, right_var_idx, false), ret_value); + ECMA_TRY_CATCH (compare_result, + ecma_op_abstract_relational_compare (right_value.value, + left_value.value, + false), + ret_value); + + ecma_simple_value_t res; + + if (ecma_is_value_undefined (compare_result.value)) + { + res = ECMA_SIMPLE_VALUE_FALSE; + } + else + { + JERRY_ASSERT (ecma_is_value_boolean (compare_result.value)); + + if (compare_result.value.value == ECMA_SIMPLE_VALUE_TRUE) + { + res = ECMA_SIMPLE_VALUE_FALSE; + } + else + { + res = ECMA_SIMPLE_VALUE_TRUE; + } + } + + ret_value = set_variable_value (int_data, dst_var_idx, ecma_make_simple_value (res)); + + ECMA_FINALIZE (compare_result); + ECMA_FINALIZE (right_value); + ECMA_FINALIZE (left_value); + + return ret_value; +} /* opfunc_less_or_equal_than */ + +/** + * 'Greater-than-or-equal' opcode handler. + * + * See also: ECMA-262 v5, 11.8.4 + * + * @return completion value + * Returned value must be freed with ecma_free_completion_value + */ +ecma_completion_value_t +opfunc_greater_or_equal_than (OPCODE opdata, /**< operation data */ + struct __int_data *int_data) /**< interpreter context */ +{ + const T_IDX dst_var_idx = opdata.data.less_than.dst; + const T_IDX left_var_idx = opdata.data.less_than.var_left; + const T_IDX right_var_idx = opdata.data.less_than.var_right; + + int_data->pos++; + + ecma_completion_value_t ret_value; + + ECMA_TRY_CATCH (left_value, get_variable_value (int_data, left_var_idx, false), ret_value); + ECMA_TRY_CATCH (right_value, get_variable_value (int_data, right_var_idx, false), ret_value); + ECMA_TRY_CATCH (compare_result, + ecma_op_abstract_relational_compare (left_value.value, + right_value.value, + true), + ret_value); + + ecma_simple_value_t res; + + if (ecma_is_value_undefined (compare_result.value)) + { + res = ECMA_SIMPLE_VALUE_FALSE; + } + else + { + JERRY_ASSERT (ecma_is_value_boolean (compare_result.value)); + + if (compare_result.value.value == ECMA_SIMPLE_VALUE_TRUE) + { + res = ECMA_SIMPLE_VALUE_FALSE; + } + else + { + res = ECMA_SIMPLE_VALUE_TRUE; + } + } + + ret_value = set_variable_value (int_data, dst_var_idx, ecma_make_simple_value (res)); + + ECMA_FINALIZE (compare_result); + ECMA_FINALIZE (right_value); + ECMA_FINALIZE (left_value); + + return ret_value; +} /* opfunc_greater_or_equal_than */ + /** * 'Register variable declaration' opcode handler. * diff --git a/tests/jerry/relational.js b/tests/jerry/relational.js index 90a7447c9..320cb0e2f 100644 --- a/tests/jerry/relational.js +++ b/tests/jerry/relational.js @@ -14,7 +14,12 @@ assert((5 == 5) == true); assert((7 != 2) == true); + assert((7 < 4) == false); assert((7 > 4) == true); -//assert((7 <= 11) == true); -//assert((7 >= 11) == false); + +assert((7 <= 11) == true); +assert((11 <= 11) == true); + +assert((7 >= 11) == false); +assert((7 >= 7) == true);