Fix generation of this_arg. Fix pretty-printing of retval, prop_setter, prop_getter and string assignments

This commit is contained in:
Ilmir Usmanov
2014-10-15 12:57:11 +04:00
parent c8686d9d9b
commit a49b52105e
2 changed files with 30 additions and 38 deletions
+26 -34
View File
@@ -1514,14 +1514,13 @@ parse_call_expression (void)
goto cleanup; goto cleanup;
} }
TODO (/* Uncomment when interpreter will catch this properly. */) if (this_arg < lexer_get_reserved_ids_count ())
// if (this_arg < lexer_get_reserved_ids_count ()) {
// { STACK_PUSH (IDX, next_temp_name ());
// STACK_PUSH (IDX, next_temp_name ()); DUMP_OPCODE_3 (assignment, ID(1), OPCODE_ARG_TYPE_VARIABLE, this_arg);
// DUMP_OPCODE_3 (assignment, ID(1), OPCODE_ARG_TYPE_VARIABLE, this_arg); this_arg = ID(1);
// this_arg = ID(1); STACK_DROP (IDX, 1);
// STACK_DROP (IDX, 1); }
// }
parse_argument_list (AL_CALL_EXPR, ID(1), this_arg); // push lhs parse_argument_list (AL_CALL_EXPR, ID(1), this_arg); // push lhs
this_arg = INVALID_VALUE; this_arg = INVALID_VALUE;
@@ -1531,44 +1530,37 @@ parse_call_expression (void)
while (token_is (TOK_OPEN_PAREN) || token_is (TOK_OPEN_SQUARE) while (token_is (TOK_OPEN_PAREN) || token_is (TOK_OPEN_SQUARE)
|| token_is (TOK_DOT)) || token_is (TOK_DOT))
{ {
switch (TOK ().type) STACK_DROP (IDX, 1);
if (TOK ().type == TOK_OPEN_PAREN)
{ {
case TOK_OPEN_PAREN: parse_argument_list (AL_CALL_EXPR, ID(1), this_arg); // push lhs
skip_newlines ();
}
else
{
this_arg = ID (1);
if (TOK ().type == TOK_OPEN_SQUARE)
{ {
STACK_DROP (IDX, 1);
parse_argument_list (AL_CALL_EXPR, ID(1), this_arg); // push lhs
skip_newlines ();
break;
}
case TOK_OPEN_SQUARE:
{
this_arg = ID (1);
NEXT (expression); // push prop NEXT (expression); // push prop
next_token_must_be (TOK_CLOSE_SQUARE); next_token_must_be (TOK_CLOSE_SQUARE);
DUMP_OPCODE_3 (prop_getter, ID(2), ID(3), ID(1));
STACK_DROP (IDX, 1);
STACK_SWAP (IDX);
skip_newlines ();
break;
} }
case TOK_DOT: else if (TOK ().type == TOK_DOT)
{ {
this_arg = ID (1);
token_after_newlines_must_be (TOK_NAME); token_after_newlines_must_be (TOK_NAME);
STACK_PUSH (IDX, token_data ()); STACK_PUSH (IDX, next_temp_name ());
DUMP_OPCODE_3 (assignment, ID(1), OPCODE_ARG_TYPE_STRING, token_data ());
DUMP_OPCODE_3 (prop_getter, ID(2), ID(3), ID(1));
STACK_DROP (IDX, 1);
STACK_SWAP (IDX);
skip_newlines ();
break;
} }
default: else
{ {
JERRY_UNREACHABLE (); JERRY_UNREACHABLE ();
} }
STACK_PUSH (IDX, next_temp_name ());
DUMP_OPCODE_3 (prop_getter, ID(1), ID(3), ID(2));
STACK_SWAP (IDX);
STACK_DROP (IDX, 1);
skip_newlines ();
} }
STACK_SWAP (IDX);
} }
lexer_save_token (TOK ()); lexer_save_token (TOK ());
+4 -4
View File
@@ -244,10 +244,10 @@ pp_opcode (opcode_counter_t oc, opcode_t opcode, bool is_rewrite)
PP_OP_1 (var_decl, "var %s;", variable_name); PP_OP_1 (var_decl, "var %s;", variable_name);
PP_OP_0 (nop, ";"); PP_OP_0 (nop, ";");
PP_OP_1 (exitval, "exit %d;", status_code); PP_OP_1 (exitval, "exit %d;", status_code);
PP_OP_1 (retval, "return %d;", ret_value); PP_OP_1 (retval, "return %s;", ret_value);
PP_OP_0 (ret, "ret;"); PP_OP_0 (ret, "ret;");
PP_OP_3 (prop_getter, "%s = %s.%s;", lhs, obj, prop); PP_OP_3 (prop_getter, "%s = %s[%s];", lhs, obj, prop);
PP_OP_3 (prop_setter, "%s.%s = %s;", obj, prop, rhs); PP_OP_3 (prop_setter, "%s[%s] = %s;", obj, prop, rhs);
PP_OP_1 (this, "%s = this;", lhs); PP_OP_1 (this, "%s = this;", lhs);
PP_OP_2 (delete_var, "%s = delete %s;", lhs, name); PP_OP_2 (delete_var, "%s = delete %s;", lhs, name);
PP_OP_3 (delete_prop, "%s = delete %s.%s;", lhs, base, name); PP_OP_3 (delete_prop, "%s = delete %s.%s;", lhs, base, name);
@@ -321,7 +321,7 @@ pp_opcode (opcode_counter_t oc, opcode_t opcode, bool is_rewrite)
} }
case OPCODE_ARG_TYPE_STRING: case OPCODE_ARG_TYPE_STRING:
{ {
pp_printf ("%s: STRING;", opcode.data.assignment.value_right); pp_printf ("'%s': STRING;", opcode.data.assignment.value_right);
break; break;
} }
case OPCODE_ARG_TYPE_NUMBER: case OPCODE_ARG_TYPE_NUMBER: