1818#include "ecma-conversion.h"
1919#include "ecma-helpers.h"
2020#include "ecma-number-arithmetic.h"
21+ #include "ecma-objects.h"
2122#include "ecma-try-catch-macro.h"
2223#include "opcodes.h"
2324#include "jrt-libc-includes.h"
@@ -59,12 +60,6 @@ do_number_arithmetic (number_arithmetic_op op, /**< number arithmetic operation
5960 {
6061 switch (op )
6162 {
62- case NUMBER_ARITHMETIC_ADDITION :
63- {
64- ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value );
65- ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value );
66- return ecma_make_int32_value ((int32_t ) (left_integer + right_integer ));
67- }
6863 case NUMBER_ARITHMETIC_SUBSTRACTION :
6964 {
7065 ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value );
@@ -117,11 +112,6 @@ do_number_arithmetic (number_arithmetic_op op, /**< number arithmetic operation
117112
118113 switch (op )
119114 {
120- case NUMBER_ARITHMETIC_ADDITION :
121- {
122- result = ecma_number_add (num_left , num_right );
123- break ;
124- }
125115 case NUMBER_ARITHMETIC_SUBSTRACTION :
126116 {
127117 result = ecma_number_substract (num_left , num_right );
@@ -164,22 +154,58 @@ ecma_value_t
164154opfunc_addition (ecma_value_t left_value , /**< left value */
165155 ecma_value_t right_value ) /**< right value */
166156{
157+ if (ecma_are_values_integer_numbers (left_value , right_value ))
158+ {
159+ ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value );
160+ ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value );
161+ return ecma_make_int32_value ((int32_t ) (left_integer + right_integer ));
162+ }
163+
164+ if (ecma_is_value_number (left_value ) && ecma_is_value_number (right_value ))
165+ {
166+ ecma_number_t num_left = ecma_get_number_from_value (left_value );
167+ ecma_number_t num_right = ecma_get_number_from_value (right_value );
168+ return ecma_make_number_value (ecma_number_add (num_left , num_right ));
169+ }
170+
171+ bool free_left_value = false;
172+ bool free_right_value = false;
173+
174+ if (ecma_is_value_object (left_value ))
175+ {
176+ ecma_object_t * obj_p = ecma_get_object_from_value (left_value );
177+ left_value = ecma_op_object_default_value (obj_p , ECMA_PREFERRED_TYPE_NO );
178+ free_left_value = true;
179+
180+ if (ecma_is_value_error (left_value ))
181+ {
182+ return left_value ;
183+ }
184+ }
185+
186+ if (ecma_is_value_object (right_value ))
187+ {
188+ ecma_object_t * obj_p = ecma_get_object_from_value (right_value );
189+ right_value = ecma_op_object_default_value (obj_p , ECMA_PREFERRED_TYPE_NO );
190+ free_right_value = true;
191+
192+ if (ecma_is_value_error (right_value ))
193+ {
194+ if (free_left_value )
195+ {
196+ ecma_free_value (left_value );
197+ }
198+ return right_value ;
199+ }
200+ }
201+
167202 ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY );
168203
169- ECMA_TRY_CATCH (prim_left_value ,
170- ecma_op_to_primitive (left_value ,
171- ECMA_PREFERRED_TYPE_NO ),
172- ret_value );
173- ECMA_TRY_CATCH (prim_right_value ,
174- ecma_op_to_primitive (right_value ,
175- ECMA_PREFERRED_TYPE_NO ),
176- ret_value );
177-
178- if (ecma_is_value_string (prim_left_value )
179- || ecma_is_value_string (prim_right_value ))
204+ if (ecma_is_value_string (left_value )
205+ || ecma_is_value_string (right_value ))
180206 {
181- ECMA_TRY_CATCH (str_left_value , ecma_op_to_string (prim_left_value ), ret_value );
182- ECMA_TRY_CATCH (str_right_value , ecma_op_to_string (prim_right_value ), ret_value );
207+ ECMA_TRY_CATCH (str_left_value , ecma_op_to_string (left_value ), ret_value );
208+ ECMA_TRY_CATCH (str_right_value , ecma_op_to_string (right_value ), ret_value );
183209
184210 ecma_string_t * string1_p = ecma_get_string_from_value (str_left_value );
185211 ecma_string_t * string2_p = ecma_get_string_from_value (str_right_value );
@@ -193,13 +219,24 @@ opfunc_addition (ecma_value_t left_value, /**< left value */
193219 }
194220 else
195221 {
196- ret_value = do_number_arithmetic (NUMBER_ARITHMETIC_ADDITION ,
197- left_value ,
198- right_value );
222+ ECMA_OP_TO_NUMBER_TRY_CATCH (num_left , left_value , ret_value );
223+ ECMA_OP_TO_NUMBER_TRY_CATCH (num_right , right_value , ret_value );
224+
225+ ret_value = ecma_make_number_value (ecma_number_add (num_left , num_right ));
226+
227+ ECMA_OP_TO_NUMBER_FINALIZE (num_right );
228+ ECMA_OP_TO_NUMBER_FINALIZE (num_left );
199229 }
200230
201- ECMA_FINALIZE (prim_right_value );
202- ECMA_FINALIZE (prim_left_value );
231+ if (free_left_value )
232+ {
233+ ecma_free_value (left_value );
234+ }
235+
236+ if (free_right_value )
237+ {
238+ ecma_free_value (right_value );
239+ }
203240
204241 return ret_value ;
205242} /* opfunc_addition */
0 commit comments