From 0e8cb596d7dbe9a728cf36619f91ff2b602fea47 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Tue, 14 Jul 2015 22:30:24 +0300 Subject: [PATCH] Fix parse of preincrement / predecrement, applied to 'obj.prop'-like expressions. JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com --- jerry-core/parser/js/parser.cpp | 21 ++++++++++++++++++--- tests/jerry/arithmetics-2.js | 7 +++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/jerry-core/parser/js/parser.cpp b/jerry-core/parser/js/parser.cpp index 24012e3b9..91900067e 100644 --- a/jerry-core/parser/js/parser.cpp +++ b/jerry-core/parser/js/parser.cpp @@ -1041,7 +1041,12 @@ parse_left_hand_side_expression (operand *this_arg, operand *prop) : left_hand_side_expression ('++' | '--')? ; */ static operand -parse_postfix_expression (void) +parse_postfix_expression (operand *out_this_arg_gl_p, /**< out: if expression evaluates to object-based + * reference - the reference's base; + * otherwise - empty operand */ + operand *out_prop_gl_p) /**< out: if expression evaluates to object-based + * reference - the reference's name; + * otherwise - empty operand */ { operand this_arg = empty_operand (), prop = empty_operand (); operand expr = parse_left_hand_side_expression (&this_arg, &prop); @@ -1079,8 +1084,18 @@ parse_postfix_expression (void) lexer_save_token (tok); } + if (out_this_arg_gl_p != NULL) + { + *out_this_arg_gl_p = this_arg; + } + + if (out_prop_gl_p != NULL) + { + *out_prop_gl_p = prop; + } + return expr; -} +} /* parse_postfix_expression */ /* unary_expression : postfix_expression @@ -1172,7 +1187,7 @@ parse_unary_expression (operand *this_arg_gl, operand *prop_gl) } default: { - expr = parse_postfix_expression (); + expr = parse_postfix_expression (&this_arg, &prop); } } diff --git a/tests/jerry/arithmetics-2.js b/tests/jerry/arithmetics-2.js index edb234007..0e8c34257 100644 --- a/tests/jerry/arithmetics-2.js +++ b/tests/jerry/arithmetics-2.js @@ -36,3 +36,10 @@ assert(c == 21); c = a--; assert(c == 22); + +var o = { p : 1 }; + +assert (++o.p === 2); +assert (o.p === 2); +assert (--o.p === 1); +assert (o.p === 1);