Add if_else.js test. Fix bytecode generation.

This commit is contained in:
Ilmir Usmanov
2014-09-17 20:21:17 +04:00
parent 2edc921be7
commit 56e6d2a380
2 changed files with 45 additions and 2 deletions
+10 -2
View File
@@ -2145,16 +2145,24 @@ parse_if_statement (void)
skip_newlines ();
parse_statement ();
REWRITE_COND_JMP (HEAD (U16, 1), is_false_jmp_down, OPCODE_COUNTER () - HEAD (U16, 1));
skip_newlines ();
if (is_keyword (KW_ELSE))
{
PUSH (U16, OPCODE_COUNTER ());
DUMP_OPCODE_2 (jmp_down, INVALID_VALUE, INVALID_VALUE);
REWRITE_COND_JMP (HEAD (U16, 2), is_false_jmp_down, OPCODE_COUNTER () - HEAD (U16, 2));
skip_newlines ();
parse_statement ();
REWRITE_JMP (HEAD (U16, 1), jmp_down, OPCODE_COUNTER () - HEAD (U16, 1));
DROP (U16, 1);
}
else
{
REWRITE_COND_JMP (HEAD (U16, 1), is_false_jmp_down, OPCODE_COUNTER () - HEAD (U16, 1));
lexer_save_token (TOK ());
}
+35
View File
@@ -0,0 +1,35 @@
// Copyright 2014 Samsung Electronics Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var was_then = false, was_else = false;
if (true) {
was_then = true;
} else {
was_else = true;
}
assert (was_then && !was_else);
was_then = false;
was_else = false;
if (false) {
was_then = true;
} else {
was_else = true;
}
assert (was_else && !was_then);