141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Use of this source code is governed by a BSD-style license that can be
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// found in the LICENSE file.
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "src/v8.h"
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "test/cctest/compiler/function-tester.h"
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgusing namespace v8::internal;
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgusing namespace v8::internal::compiler;
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(Conditional) {
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a) { return a ? 23 : 42; })");
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(23), T.true_value(), T.undefined());
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(42), T.false_value(), T.undefined());
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(42), T.undefined(), T.undefined());
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(42), T.Val(0.0), T.undefined());
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(23), T.Val(999), T.undefined());
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(23), T.Val("x"), T.undefined());
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(LogicalAnd) {
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { return a && b; })");
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.true_value(), T.true_value());
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.false_value(), T.false_value(), T.true_value());
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.false_value(), T.true_value(), T.false_value());
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.false_value(), T.false_value(), T.false_value());
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(999), T.Val(777), T.Val(999));
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(999));
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("b"), T.Val("a"), T.Val("b"));
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(LogicalOr) {
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { return a || b; })");
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.true_value(), T.true_value());
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.false_value(), T.true_value());
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.true_value(), T.false_value());
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.false_value(), T.false_value(), T.false_value());
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(LogicalEffect) {
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { a && (b = a); return b; })");
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.true_value(), T.true_value());
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.false_value(), T.true_value());
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.true_value(), T.true_value(), T.false_value());
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.false_value(), T.false_value(), T.false_value());
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(IfStatement) {
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a) { if (a) { return 1; } else { return 2; } })");
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.true_value(), T.undefined());
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.false_value(), T.undefined());
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.undefined(), T.undefined());
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.Val(0.0), T.undefined());
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(999), T.undefined());
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val("x"), T.undefined());
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(DoWhileStatement) {
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { do { a+=23; } while(a < b) return a; })");
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(24), T.Val(1), T.Val(1));
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("str23"), T.Val("str"), T.Val("str"));
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(WhileStatement) {
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { while(a < b) { a+=23; } return a; })");
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(ForStatement) {
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { for (; a < b; a+=23) {} return a; })");
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void TestForIn(const char* code) {
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(code);
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.undefined());
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.null());
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.NewObject("({})"));
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.Val(1));
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("2"), T.Val("str"));
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("a"), T.NewObject("({'a' : 1})"));
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("2"), T.NewObject("([1, 2, 3])"));
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("a"), T.NewObject("({'a' : 1, 'b' : 1})"), T.Val("b"));
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("1"), T.NewObject("([1, 2, 3])"), T.Val("2"));
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(ForInStatement) {
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Variable assignment.
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  TestForIn(
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a, b) {"
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "var last;"
12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "for (var x in a) {"
12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  if (b) { delete a[b]; b = undefined; }"
12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  last = x;"
13041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "}"
13141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "return last;})");
13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Indexed assignment.
13341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  TestForIn(
13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a, b) {"
13541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "var array = [0, 1, undefined];"
13641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "for (array[2] in a) {"
13741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  if (b) { delete a[b]; b = undefined; }"
13841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "}"
13941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "return array[2];})");
14041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Named assignment.
14141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  TestForIn(
14241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a, b) {"
14341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "var obj = {'a' : undefined};"
14441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "for (obj.a in a) {"
14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  if (b) { delete a[b]; b = undefined; }"
14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "}"
14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "return obj.a;})");
14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(ForInContinueStatement) {
15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char* src =
15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a,b) {"
15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  var r = '-';"
15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  for (var x in a) {"
15641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    r += 'A-';"
15741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    if (b) continue;"
15841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    r += 'B-';"
15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  }"
16041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  return r;"
16141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "})";
16241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(src);
16341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
16441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-A-B-"), T.NewObject("({x:1})"), T.false_value());
16541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-A-B-A-B-"), T.NewObject("({x:1,y:2})"), T.false_value());
16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-A-"), T.NewObject("({x:1})"), T.true_value());
16741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-A-A-"), T.NewObject("({x:1,y:2})"), T.true_value());
16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(SwitchStatement) {
17241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char* src =
17341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a,b) {"
17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  var r = '-';"
17541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  switch (a) {"
17641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    case 'x'    : r += 'X-';"
17741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    case b + 'b': r += 'B-';"
17841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    default     : r += 'D-';"
17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "    case 'y'    : r += 'Y-';"
18041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  }"
18141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  return r;"
18241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "})";
18341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(src);
18441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
18541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-X-B-D-Y-"), T.Val("x"), T.Val("B"));
18641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-B-D-Y-"), T.Val("Bb"), T.Val("B"));
18741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-D-Y-"), T.Val("z"), T.Val("B"));
18841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-Y-"), T.Val("y"), T.Val("B"));
18941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  CompileRun("var c = 0; var o = { toString:function(){return c++} };");
19141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
19241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-B-D-Y-"), T.Val("1b"), T.NewObject("o"));
19341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
19441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
19541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(BlockBreakStatement) {
19841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { L:{ if (a) break L; b=1; } return b; })");
19941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
20041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(7), T.true_value(), T.Val(7));
20141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.false_value(), T.Val(7));
20241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
20341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
20441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
20541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(BlockReturnStatement) {
20641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { L:{ if (a) b=1; return b; } })");
20741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
20841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.true_value(), T.Val(7));
20941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(7), T.false_value(), T.Val(7));
21041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
21141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
21241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
21341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedIfConditional) {
21441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { if (a) { b = (b?b:7) + 1; } return b; })");
21541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
21641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(4), T.false_value(), T.Val(4));
21741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(6), T.true_value(), T.Val(5));
21841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(8), T.true_value(), T.undefined());
21941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
22041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
22141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
22241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedIfLogical) {
22341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char* src =
22441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a,b) {"
22541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  if (a || b) { return 1; } else { return 2; }"
22641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "})";
22741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(src);
22841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
22941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.true_value(), T.true_value());
23041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.false_value(), T.true_value());
23141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.true_value(), T.false_value());
23241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.false_value(), T.false_value());
23341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(1.0), T.Val(1.0));
23441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(0.0), T.Val(1.0));
23541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(1.0), T.Val(0.0));
23641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.Val(0.0), T.Val(0.0));
23741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
23841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
23941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
24041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedIfElseFor) {
24141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char* src =
24241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a,b) {"
24341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  if (!a) { return b - 3; } else { for (; a < b; a++); }"
24441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  return a;"
24541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "})";
24641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(src);
24741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
24841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.false_value(), T.Val(4));
24941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.true_value(), T.Val(2));
25041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(3), T.Val(3), T.Val(1));
25141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
25241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
25341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
25441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedWhileWhile) {
25541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char* src =
25641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "(function(a) {"
25741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  var i = a; while (false) while(false) return i;"
25841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "  return i;"
25941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "})";
26041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T(src);
26141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2.0), T.Val(2.0), T.Val(-1.0));
26341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(65.0), T.Val(65.0), T.Val(-1.0));
26441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
26541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedForIf) {
26841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { for (; a > 1; a--) if (b) return 1; })");
26941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(3), T.true_value());
27141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.Val(2), T.false_value());
27241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.Val(1), T.null());
27341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
27441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(NestedForConditional) {
27741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  FunctionTester T("(function(a,b) { for (; a > 1; a--) return b ? 1 : 2; })");
27841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(1), T.Val(3), T.true_value());
28041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.Val(2), T.Val(2), T.false_value());
28141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  T.CheckCall(T.undefined(), T.Val(1), T.null());
28241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
28341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org