Fix 'this_arg'

This commit is contained in:
Ilmir Usmanov
2014-10-16 16:05:48 +04:00
parent 16556eb830
commit 2637911b3e
+11 -18
View File
@@ -958,11 +958,19 @@ parse_argument_list (argument_list_type alt, idx_t obj, idx_t this_arg)
current_token_must_be (STACK_HEAD (U8, 3)); current_token_must_be (STACK_HEAD (U8, 3));
if (alt == AL_CALL_EXPR && this_arg != INVALID_VALUE) switch (alt)
{
case AL_CALL_EXPR:
{
if (this_arg != INVALID_VALUE)
{ {
DUMP_OPCODE_3 (meta, OPCODE_META_TYPE_THIS_ARG, this_arg, INVALID_VALUE); DUMP_OPCODE_3 (meta, OPCODE_META_TYPE_THIS_ARG, this_arg, INVALID_VALUE);
STACK_INCR_HEAD (U8, 1); STACK_INCR_HEAD (U8, 1);
} }
break;
}
default: break;
}
STACK_PUSH (temp_names, TEMP_NAME ()); STACK_PUSH (temp_names, TEMP_NAME ());
@@ -1410,34 +1418,19 @@ parse_member_expression (idx_t *this_arg)
else if (is_keyword (KW_NEW)) else if (is_keyword (KW_NEW))
{ {
skip_newlines (); skip_newlines ();
parse_member_expression (this_arg); parse_member_expression (NULL);
skip_newlines (); skip_newlines ();
if (token_is (TOK_OPEN_PAREN)) if (token_is (TOK_OPEN_PAREN))
{
if (this_arg)
{
parse_argument_list (AL_CONSTRUCT_EXPR, ID(1), *this_arg); // push obj
}
else
{ {
parse_argument_list (AL_CONSTRUCT_EXPR, ID(1), INVALID_VALUE); // push obj parse_argument_list (AL_CONSTRUCT_EXPR, ID(1), INVALID_VALUE); // push obj
} }
}
else else
{ {
lexer_save_token (TOK ()); lexer_save_token (TOK ());
STACK_PUSH (IDX, next_temp_name ()); STACK_PUSH (IDX, next_temp_name ());
if (this_arg)
{
DUMP_OPCODE_3 (construct_n, ID (1), ID (2), 1);
DUMP_OPCODE_3 (meta, OPCODE_META_TYPE_THIS_ARG, *this_arg, INVALID_VALUE);
}
else
{
DUMP_OPCODE_3 (construct_n, ID (1), ID (2), 0); DUMP_OPCODE_3 (construct_n, ID (1), ID (2), 0);
} }
}
STACK_SWAP (IDX); STACK_SWAP (IDX);
STACK_DROP (IDX, 1); STACK_DROP (IDX, 1);
@@ -1511,7 +1504,7 @@ parse_call_expression (void)
STACK_DECLARE_USAGE (IDX) STACK_DECLARE_USAGE (IDX)
idx_t this_arg = INVALID_VALUE; idx_t this_arg = INVALID_VALUE;
parse_member_expression (NULL); parse_member_expression (&this_arg);
skip_newlines (); skip_newlines ();
if (!token_is (TOK_OPEN_PAREN)) if (!token_is (TOK_OPEN_PAREN))