blob: 401ea1411ba52ccde08cd33ca18ea16db4df4b2d [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdochda12d292016-06-02 14:46:10 +01005#include <fstream>
6
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007#include "src/v8.h"
8
9#include "src/compiler.h"
10#include "src/interpreter/bytecode-array-iterator.h"
11#include "src/interpreter/bytecode-generator.h"
12#include "src/interpreter/interpreter.h"
13#include "test/cctest/cctest.h"
Ben Murdochda12d292016-06-02 14:46:10 +010014#include "test/cctest/interpreter/bytecode-expectations-printer.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000015#include "test/cctest/test-feedback-vector.h"
16
17namespace v8 {
18namespace internal {
19namespace interpreter {
20
Ben Murdochda12d292016-06-02 14:46:10 +010021#define XSTR(A) #A
22#define STR(A) XSTR(A)
Ben Murdoch097c5b22016-05-18 11:27:45 +010023
Ben Murdochda12d292016-06-02 14:46:10 +010024#define UNIQUE_VAR() "var a" STR(__COUNTER__) " = 0;\n"
25
26#define REPEAT_2(...) __VA_ARGS__ __VA_ARGS__
27#define REPEAT_4(...) REPEAT_2(__VA_ARGS__) REPEAT_2(__VA_ARGS__)
28#define REPEAT_8(...) REPEAT_4(__VA_ARGS__) REPEAT_4(__VA_ARGS__)
29#define REPEAT_16(...) REPEAT_8(__VA_ARGS__) REPEAT_8(__VA_ARGS__)
30#define REPEAT_32(...) REPEAT_16(__VA_ARGS__) REPEAT_16(__VA_ARGS__)
31#define REPEAT_64(...) REPEAT_32(__VA_ARGS__) REPEAT_32(__VA_ARGS__)
32#define REPEAT_128(...) REPEAT_64(__VA_ARGS__) REPEAT_64(__VA_ARGS__)
33#define REPEAT_256(...) REPEAT_128(__VA_ARGS__) REPEAT_128(__VA_ARGS__)
34
35#define REPEAT_127(...) \
36 REPEAT_64(__VA_ARGS__) \
37 REPEAT_32(__VA_ARGS__) \
38 REPEAT_16(__VA_ARGS__) \
39 REPEAT_8(__VA_ARGS__) \
40 REPEAT_4(__VA_ARGS__) \
41 REPEAT_2(__VA_ARGS__) \
42 __VA_ARGS__
43
44#define REPEAT_249(...) \
45 REPEAT_127(__VA_ARGS__) \
46 REPEAT_64(__VA_ARGS__) \
47 REPEAT_32(__VA_ARGS__) \
48 REPEAT_16(__VA_ARGS__) \
49 REPEAT_8(__VA_ARGS__) \
50 REPEAT_2(__VA_ARGS__)
51
52#define REPEAT_2_UNIQUE_VARS() UNIQUE_VAR() UNIQUE_VAR()
53#define REPEAT_4_UNIQUE_VARS() REPEAT_2_UNIQUE_VARS() REPEAT_2_UNIQUE_VARS()
54#define REPEAT_8_UNIQUE_VARS() REPEAT_4_UNIQUE_VARS() REPEAT_4_UNIQUE_VARS()
55#define REPEAT_16_UNIQUE_VARS() REPEAT_8_UNIQUE_VARS() REPEAT_8_UNIQUE_VARS()
56#define REPEAT_32_UNIQUE_VARS() REPEAT_16_UNIQUE_VARS() REPEAT_16_UNIQUE_VARS()
57#define REPEAT_64_UNIQUE_VARS() REPEAT_32_UNIQUE_VARS() REPEAT_32_UNIQUE_VARS()
58#define REPEAT_128_UNIQUE_VARS() REPEAT_64_UNIQUE_VARS() REPEAT_64_UNIQUE_VARS()
59
60#define REPEAT_249_UNIQUE_VARS() \
61 REPEAT_128_UNIQUE_VARS() \
62 REPEAT_64_UNIQUE_VARS() \
63 REPEAT_32_UNIQUE_VARS() \
64 REPEAT_16_UNIQUE_VARS() \
65 REPEAT_8_UNIQUE_VARS() \
66 UNIQUE_VAR()
67
68static const char* kGoldenFileDirectory =
69 "test/cctest/interpreter/bytecode_expectations/";
70
71class InitializedIgnitionHandleScope : public InitializedHandleScope {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072 public:
Ben Murdochda12d292016-06-02 14:46:10 +010073 InitializedIgnitionHandleScope() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 i::FLAG_ignition = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000075 i::FLAG_always_opt = false;
76 i::FLAG_allow_natives_syntax = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000077 CcTest::i_isolate()->interpreter()->Initialize();
78 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079};
80
Ben Murdochda12d292016-06-02 14:46:10 +010081void SkipGoldenFileHeader(std::istream& stream) { // NOLINT
82 std::string line;
83 int separators_seen = 0;
84 while (std::getline(stream, line)) {
85 if (line == "---") separators_seen += 1;
86 if (separators_seen == 2) return;
Ben Murdoch097c5b22016-05-18 11:27:45 +010087 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088}
89
Ben Murdochda12d292016-06-02 14:46:10 +010090std::string LoadGolden(const std::string& golden_filename) {
91 std::ifstream expected_file((kGoldenFileDirectory + golden_filename).c_str());
92 CHECK(expected_file.is_open());
93 SkipGoldenFileHeader(expected_file);
94 std::ostringstream expected_stream;
95 // Restore the first separator, which was consumed by SkipGoldenFileHeader
96 expected_stream << "---\n" << expected_file.rdbuf();
97 return expected_stream.str();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000098}
99
Ben Murdochda12d292016-06-02 14:46:10 +0100100template <size_t N>
101std::string BuildActual(const BytecodeExpectationsPrinter& printer,
102 const char* (&snippet_list)[N],
103 const char* prologue = nullptr,
104 const char* epilogue = nullptr) {
105 std::ostringstream actual_stream;
106 for (const char* snippet : snippet_list) {
107 std::string source_code;
108 if (prologue) source_code += prologue;
109 source_code += snippet;
110 if (epilogue) source_code += epilogue;
111 printer.PrintExpectation(actual_stream, source_code);
112 }
113 return actual_stream.str();
114}
115
Ben Murdochc5610432016-08-08 18:44:38 +0100116bool CompareTexts(const std::string& generated, const std::string& expected) {
117 std::istringstream generated_stream(generated);
118 std::istringstream expected_stream(expected);
119 std::string generated_line;
120 std::string expected_line;
121 // Line number does not include golden file header.
122 int line_number = 0;
123
124 do {
125 std::getline(generated_stream, generated_line);
126 std::getline(expected_stream, expected_line);
127
128 if (!generated_stream.good() && !expected_stream.good()) {
129 return true;
130 }
131
132 if (!generated_stream.good()) {
133 std::cerr << "Expected has extra lines after line " << line_number
134 << "\n";
135 std::cerr << " Expected: '" << expected_line << "'\n";
136 return false;
137 } else if (!expected_stream.good()) {
138 std::cerr << "Generated has extra lines after line " << line_number
139 << "\n";
140 std::cerr << " Generated: '" << generated_line << "'\n";
141 return false;
142 }
143
144 if (generated_line != expected_line) {
145 std::cerr << "Inputs differ at line " << line_number << "\n";
146 std::cerr << " Generated: '" << generated_line << "'\n";
147 std::cerr << " Expected: '" << expected_line << "'\n";
148 return false;
149 }
150 line_number++;
151 } while (true);
152}
153
Ben Murdochda12d292016-06-02 14:46:10 +0100154using ConstantPoolType = BytecodeExpectationsPrinter::ConstantPoolType;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155
156TEST(PrimitiveReturnStatements) {
Ben Murdochda12d292016-06-02 14:46:10 +0100157 InitializedIgnitionHandleScope scope;
158 BytecodeExpectationsPrinter printer(CcTest::isolate(),
159 ConstantPoolType::kNumber);
160 const char* snippets[] = {
161 "",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000162
Ben Murdochc5610432016-08-08 18:44:38 +0100163 "return;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100164
Ben Murdochc5610432016-08-08 18:44:38 +0100165 "return null;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100166
Ben Murdochc5610432016-08-08 18:44:38 +0100167 "return true;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100168
Ben Murdochc5610432016-08-08 18:44:38 +0100169 "return false;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100170
Ben Murdochc5610432016-08-08 18:44:38 +0100171 "return 0;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100172
Ben Murdochc5610432016-08-08 18:44:38 +0100173 "return +1;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100174
Ben Murdochc5610432016-08-08 18:44:38 +0100175 "return -1;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100176
Ben Murdochc5610432016-08-08 18:44:38 +0100177 "return +127;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100178
Ben Murdochc5610432016-08-08 18:44:38 +0100179 "return -128;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000180 };
181
Ben Murdochc5610432016-08-08 18:44:38 +0100182 CHECK(CompareTexts(BuildActual(printer, snippets),
183 LoadGolden("PrimitiveReturnStatements.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184}
185
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000186TEST(PrimitiveExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100187 InitializedIgnitionHandleScope scope;
188 BytecodeExpectationsPrinter printer(CcTest::isolate(),
189 ConstantPoolType::kNumber);
190 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100191 "var x = 0; return x;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192
Ben Murdochc5610432016-08-08 18:44:38 +0100193 "var x = 0; return x + 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100194
Ben Murdochc5610432016-08-08 18:44:38 +0100195 "var x = 0; return x - 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100196
Ben Murdochc5610432016-08-08 18:44:38 +0100197 "var x = 4; return x * 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100198
Ben Murdochc5610432016-08-08 18:44:38 +0100199 "var x = 4; return x / 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100200
Ben Murdochc5610432016-08-08 18:44:38 +0100201 "var x = 4; return x % 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100202
Ben Murdochc5610432016-08-08 18:44:38 +0100203 "var x = 1; return x | 2;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100204
Ben Murdochc5610432016-08-08 18:44:38 +0100205 "var x = 1; return x ^ 2;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100206
Ben Murdochc5610432016-08-08 18:44:38 +0100207 "var x = 1; return x & 2;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100208
Ben Murdochc5610432016-08-08 18:44:38 +0100209 "var x = 10; return x << 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100210
Ben Murdochc5610432016-08-08 18:44:38 +0100211 "var x = 10; return x >> 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100212
Ben Murdochc5610432016-08-08 18:44:38 +0100213 "var x = 10; return x >>> 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100214
Ben Murdochc5610432016-08-08 18:44:38 +0100215 "var x = 0; return (x, 3);\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100216 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217
Ben Murdochc5610432016-08-08 18:44:38 +0100218 CHECK(CompareTexts(BuildActual(printer, snippets),
219 LoadGolden("PrimitiveExpressions.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000220}
221
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000222TEST(LogicalExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100223 InitializedIgnitionHandleScope scope;
224 BytecodeExpectationsPrinter printer(CcTest::isolate(),
225 ConstantPoolType::kNumber);
226 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100227 "var x = 0; return x || 3;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228
Ben Murdochc5610432016-08-08 18:44:38 +0100229 "var x = 0; return (x == 1) || 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100230
Ben Murdochc5610432016-08-08 18:44:38 +0100231 "var x = 0; return x && 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100232
Ben Murdochc5610432016-08-08 18:44:38 +0100233 "var x = 0; return (x == 0) && 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100234
Ben Murdochc5610432016-08-08 18:44:38 +0100235 "var x = 0; return x || (1, 2, 3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100236
Ben Murdochc5610432016-08-08 18:44:38 +0100237 "var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100238
239 "var x = 1; var a = 2, b = 3; return x || (" //
240 REPEAT_32("\n a = 1, b = 2, ") //
Ben Murdochc5610432016-08-08 18:44:38 +0100241 "3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100242
243 "var x = 0; var a = 2, b = 3; return x && (" //
244 REPEAT_32("\n a = 1, b = 2, ") //
Ben Murdochc5610432016-08-08 18:44:38 +0100245 "3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100246
247 "var x = 1; var a = 2, b = 3; return (x > 3) || (" //
248 REPEAT_32("\n a = 1, b = 2, ") //
Ben Murdochc5610432016-08-08 18:44:38 +0100249 "3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100250
251 "var x = 0; var a = 2, b = 3; return (x < 5) && (" //
252 REPEAT_32("\n a = 1, b = 2, ") //
Ben Murdochc5610432016-08-08 18:44:38 +0100253 "3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100254
Ben Murdochc5610432016-08-08 18:44:38 +0100255 "return 0 && 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100256
Ben Murdochc5610432016-08-08 18:44:38 +0100257 "return 1 || 3;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100258
Ben Murdochc5610432016-08-08 18:44:38 +0100259 "var x = 1; return x && 3 || 0, 1;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100260 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000261
Ben Murdochc5610432016-08-08 18:44:38 +0100262 CHECK(CompareTexts(BuildActual(printer, snippets),
263 LoadGolden("LogicalExpressions.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264}
265
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266TEST(Parameters) {
Ben Murdochda12d292016-06-02 14:46:10 +0100267 InitializedIgnitionHandleScope scope;
268 BytecodeExpectationsPrinter printer(CcTest::isolate(),
269 ConstantPoolType::kNumber);
270 printer.set_wrap(false);
271 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272
Ben Murdochda12d292016-06-02 14:46:10 +0100273 const char* snippets[] = {
274 "function f() { return this; }",
275
276 "function f(arg1) { return arg1; }",
277
278 "function f(arg1) { return this; }",
279
280 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }",
281
282 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }",
283
284 "function f(arg1) { arg1 = 1; }",
285
286 "function f(arg1, arg2, arg3, arg4) { arg2 = 1; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000287 };
288
Ben Murdochc5610432016-08-08 18:44:38 +0100289 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
290 LoadGolden("Parameters.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291}
292
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000293TEST(IntegerConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100294 InitializedIgnitionHandleScope scope;
295 BytecodeExpectationsPrinter printer(CcTest::isolate(),
296 ConstantPoolType::kNumber);
297 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100298 "return 12345678;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299
Ben Murdochc5610432016-08-08 18:44:38 +0100300 "var a = 1234; return 5678;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100301
Ben Murdochc5610432016-08-08 18:44:38 +0100302 "var a = 1234; return 1234;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100303 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000304
Ben Murdochc5610432016-08-08 18:44:38 +0100305 CHECK(CompareTexts(BuildActual(printer, snippets),
306 LoadGolden("IntegerConstants.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307}
308
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000309TEST(HeapNumberConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100310 InitializedIgnitionHandleScope scope;
311 BytecodeExpectationsPrinter printer(CcTest::isolate(),
312 ConstantPoolType::kNumber);
313 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100314 "return 1.2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000315
Ben Murdochc5610432016-08-08 18:44:38 +0100316 "var a = 1.2; return 2.6;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000317
Ben Murdochc5610432016-08-08 18:44:38 +0100318 "var a = 3.14; return 3.14;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100319
320 "var a;" //
321 REPEAT_256("\na = 1.414;") //
Ben Murdochc5610432016-08-08 18:44:38 +0100322 " a = 3.14;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000323 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100324
Ben Murdochc5610432016-08-08 18:44:38 +0100325 CHECK(CompareTexts(BuildActual(printer, snippets),
326 LoadGolden("HeapNumberConstants.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000327}
328
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000329TEST(StringConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100330 InitializedIgnitionHandleScope scope;
331 BytecodeExpectationsPrinter printer(CcTest::isolate(),
332 ConstantPoolType::kString);
333 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100334 "return \"This is a string\";\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000335
Ben Murdochc5610432016-08-08 18:44:38 +0100336 "var a = \"First string\"; return \"Second string\";\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100337
Ben Murdochc5610432016-08-08 18:44:38 +0100338 "var a = \"Same string\"; return \"Same string\";\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100339 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000340
Ben Murdochc5610432016-08-08 18:44:38 +0100341 CHECK(CompareTexts(BuildActual(printer, snippets),
342 LoadGolden("StringConstants.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343}
344
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345TEST(PropertyLoads) {
Ben Murdochda12d292016-06-02 14:46:10 +0100346 InitializedIgnitionHandleScope scope;
347 BytecodeExpectationsPrinter printer(CcTest::isolate(),
348 ConstantPoolType::kString);
349 printer.set_wrap(false);
350 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351
Ben Murdochda12d292016-06-02 14:46:10 +0100352 const char* snippets[] = {
353 "function f(a) { return a.name; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100354 "f({name : \"test\"});\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355
Ben Murdochda12d292016-06-02 14:46:10 +0100356 "function f(a) { return a[\"key\"]; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100357 "f({key : \"test\"});\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358
Ben Murdochda12d292016-06-02 14:46:10 +0100359 "function f(a) { return a[100]; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100360 "f({100 : \"test\"});\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361
Ben Murdochda12d292016-06-02 14:46:10 +0100362 "function f(a, b) { return a[b]; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100363 "f({arg : \"test\"}, \"arg\");\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100364
365 "function f(a) { var b = a.name; return a[-124]; }\n"
366 "f({\"-124\" : \"test\", name : 123 })",
367
368 "function f(a) {\n"
369 " var b;\n"
370 " b = a.name;\n"
371 REPEAT_127(" b = a.name;\n")
372 " return a.name;\n"
373 "}\n"
374 "f({name : \"test\"})\n",
375
376 "function f(a, b) {\n"
377 " var c;\n"
378 " c = a[b];\n"
379 REPEAT_127(" c = a[b];\n")
380 " return a[b];\n"
381 "}\n"
382 "f({name : \"test\"}, \"name\")\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100384
Ben Murdochc5610432016-08-08 18:44:38 +0100385 CHECK(CompareTexts(BuildActual(printer, snippets),
386 LoadGolden("PropertyLoads.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387}
388
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389TEST(PropertyStores) {
Ben Murdochda12d292016-06-02 14:46:10 +0100390 InitializedIgnitionHandleScope scope;
391 BytecodeExpectationsPrinter printer(CcTest::isolate(),
392 ConstantPoolType::kString);
393 printer.set_wrap(false);
394 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395
Ben Murdochda12d292016-06-02 14:46:10 +0100396 const char* snippets[] = {
397 "function f(a) { a.name = \"val\"; }\n"
398 "f({name : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000399
Ben Murdochda12d292016-06-02 14:46:10 +0100400 "function f(a) { a[\"key\"] = \"val\"; }\n"
401 "f({key : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000402
Ben Murdochda12d292016-06-02 14:46:10 +0100403 "function f(a) { a[100] = \"val\"; }\n"
404 "f({100 : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405
Ben Murdochda12d292016-06-02 14:46:10 +0100406 "function f(a, b) { a[b] = \"val\"; }\n"
407 "f({arg : \"test\"}, \"arg\")",
408
409 "function f(a) { a.name = a[-124]; }\n"
410 "f({\"-124\" : \"test\", name : 123 })",
411
412 "function f(a) { \"use strict\"; a.name = \"val\"; }\n"
413 "f({name : \"test\"})",
414
415 "function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n"
416 "f({arg : \"test\"}, \"arg\")",
417
418 "function f(a) {\n"
419 " a.name = 1;\n"
420 REPEAT_127(" a.name = 1;\n")
421 " a.name = 2;\n"
422 "}\n"
423 "f({name : \"test\"})\n",
424
425 "function f(a) {\n"
426 " 'use strict';\n"
427 " a.name = 1;\n"
428 REPEAT_127(" a.name = 1;\n")
429 " a.name = 2;\n"
430 "}\n"
431 "f({name : \"test\"})\n",
432
433 "function f(a, b) {\n"
434 " a[b] = 1;\n"
435 REPEAT_127(" a[b] = 1;\n")
436 " a[b] = 2;\n"
437 "}\n"
438 "f({name : \"test\"})\n",
439
440 "function f(a, b) {\n"
441 " 'use strict';\n"
442 " a[b] = 1;\n"
443 REPEAT_127(" a[b] = 1;\n")
444 " a[b] = 2;\n"
445 "}\n"
446 "f({name : \"test\"})\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100447 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100448
Ben Murdochc5610432016-08-08 18:44:38 +0100449 CHECK(CompareTexts(BuildActual(printer, snippets),
450 LoadGolden("PropertyStores.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000451}
452
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453#define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()"
454
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000455TEST(PropertyCall) {
Ben Murdochda12d292016-06-02 14:46:10 +0100456 InitializedIgnitionHandleScope scope;
457 BytecodeExpectationsPrinter printer(CcTest::isolate(),
458 ConstantPoolType::kString);
459 printer.set_wrap(false);
460 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000461
Ben Murdochda12d292016-06-02 14:46:10 +0100462 const char* snippets[] = {
463 "function f(a) { return a.func(); }\n"
464 "f(" FUNC_ARG ")",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000465
Ben Murdochda12d292016-06-02 14:46:10 +0100466 "function f(a, b, c) { return a.func(b, c); }\n"
467 "f(" FUNC_ARG ", 1, 2)",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000468
Ben Murdochda12d292016-06-02 14:46:10 +0100469 "function f(a, b) { return a.func(b + b, b); }\n"
470 "f(" FUNC_ARG ", 1)",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000471
Ben Murdochda12d292016-06-02 14:46:10 +0100472 "function f(a) {\n"
473 " a.func;\n" //
474 REPEAT_127(" a.func;\n") //
475 " return a.func(); }\n"
476 "f(" FUNC_ARG ")",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000477 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100478
Ben Murdochc5610432016-08-08 18:44:38 +0100479 CHECK(CompareTexts(BuildActual(printer, snippets),
480 LoadGolden("PropertyCall.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000481}
482
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000483TEST(LoadGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100484 InitializedIgnitionHandleScope scope;
485 BytecodeExpectationsPrinter printer(CcTest::isolate(),
486 ConstantPoolType::kString);
487 printer.set_wrap(false);
488 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000489
Ben Murdochda12d292016-06-02 14:46:10 +0100490 const char* snippets[] = {
491 "var a = 1;\n"
492 "function f() { return a; }\n"
493 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000494
Ben Murdochda12d292016-06-02 14:46:10 +0100495 "function t() { }\n"
496 "function f() { return t; }\n"
497 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000498
Ben Murdochda12d292016-06-02 14:46:10 +0100499 "a = 1;\n"
500 "function f() { return a; }\n"
501 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000502
Ben Murdochda12d292016-06-02 14:46:10 +0100503 "a = 1;\n"
504 "function f(b) {\n"
505 " b.name;\n"
506 REPEAT_127(" b.name;\n")
507 " return a;\n"
508 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100509 "f({name: 1});\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000510 };
511
Ben Murdochc5610432016-08-08 18:44:38 +0100512 CHECK(CompareTexts(BuildActual(printer, snippets),
513 LoadGolden("LoadGlobal.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000514}
515
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000516TEST(StoreGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100517 InitializedIgnitionHandleScope scope;
518 BytecodeExpectationsPrinter printer(CcTest::isolate(),
519 ConstantPoolType::kString);
520 printer.set_wrap(false);
521 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000522
Ben Murdochda12d292016-06-02 14:46:10 +0100523 const char* snippets[] = {
524 "var a = 1;\n"
525 "function f() { a = 2; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100526 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000527
Ben Murdochda12d292016-06-02 14:46:10 +0100528 "var a = \"test\"; function f(b) { a = b; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100529 "f(\"global\");\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000530
Ben Murdochda12d292016-06-02 14:46:10 +0100531 "'use strict'; var a = 1;\n"
532 "function f() { a = 2; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100533 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000534
Ben Murdochda12d292016-06-02 14:46:10 +0100535 "a = 1;\n"
536 "function f() { a = 2; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100537 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100538
539 "a = 1;\n"
540 "function f(b) {\n"
541 " b.name;\n"
542 REPEAT_127(" b.name;\n")
543 " a = 2;\n"
544 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100545 "f({name: 1});\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100546
547 "a = 1;\n"
548 "function f(b) {\n"
549 " 'use strict';\n"
550 " b.name;\n"
551 REPEAT_127(" b.name;\n")
552 " a = 2;\n"
553 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100554 "f({name: 1});\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000555 };
556
Ben Murdochc5610432016-08-08 18:44:38 +0100557 CHECK(CompareTexts(BuildActual(printer, snippets),
558 LoadGolden("StoreGlobal.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000559}
560
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000561TEST(CallGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100562 InitializedIgnitionHandleScope scope;
563 BytecodeExpectationsPrinter printer(CcTest::isolate(),
564 ConstantPoolType::kString);
565 printer.set_wrap(false);
566 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000567
Ben Murdochda12d292016-06-02 14:46:10 +0100568 const char* snippets[] = {
569 "function t() { }\n"
570 "function f() { return t(); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100571 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000572
Ben Murdochda12d292016-06-02 14:46:10 +0100573 "function t(a, b, c) { }\n"
574 "function f() { return t(1, 2, 3); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100575 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000576 };
577
Ben Murdochc5610432016-08-08 18:44:38 +0100578 CHECK(CompareTexts(BuildActual(printer, snippets),
579 LoadGolden("CallGlobal.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000580}
581
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000582TEST(CallRuntime) {
Ben Murdochda12d292016-06-02 14:46:10 +0100583 InitializedIgnitionHandleScope scope;
584 BytecodeExpectationsPrinter printer(CcTest::isolate(),
585 ConstantPoolType::kMixed);
586 printer.set_wrap(false);
587 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000588
Ben Murdochda12d292016-06-02 14:46:10 +0100589 const char* snippets[] = {
590 "function f() { %TheHole() }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100591 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100592
593 "function f(a) { return %IsArray(a) }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100594 "f(undefined);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100595
596 "function f() { return %Add(1, 2) }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100597 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100598
599 "function f() { return %spread_iterable([1]) }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100600 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000601 };
602
Ben Murdochc5610432016-08-08 18:44:38 +0100603 CHECK(CompareTexts(BuildActual(printer, snippets),
604 LoadGolden("CallRuntime.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000605}
606
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000607TEST(IfConditions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100608 InitializedIgnitionHandleScope scope;
609 BytecodeExpectationsPrinter printer(CcTest::isolate(),
Ben Murdochc5610432016-08-08 18:44:38 +0100610 ConstantPoolType::kMixed);
Ben Murdochda12d292016-06-02 14:46:10 +0100611 printer.set_wrap(false);
612 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000613
Ben Murdochda12d292016-06-02 14:46:10 +0100614 const char* snippets[] = {
615 "function f() {\n"
616 " if (0) {\n"
617 " return 1;\n"
618 " } else {\n"
619 " return -1;\n"
620 " }\n"
621 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100622 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100623
624 "function f() {\n"
625 " if ('lucky') {\n"
626 " return 1;\n"
627 " } else {\n"
628 " return -1;\n"
629 " }\n"
630 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100631 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100632
633 "function f() {\n"
634 " if (false) {\n"
635 " return 1;\n"
636 " } else {\n"
637 " return -1;\n"
638 " }\n"
639 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100640 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100641
642 "function f() {\n"
643 " if (false) {\n"
644 " return 1;\n"
645 " }\n"
646 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100647 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100648
649 "function f() {\n"
650 " var a = 1;\n"
651 " if (a) {\n"
652 " a += 1;\n"
653 " } else {\n"
654 " return 2;\n"
655 " }\n"
656 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100657 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100658
659 "function f(a) {\n"
660 " if (a <= 0) {\n"
661 " return 200;\n"
662 " } else {\n"
663 " return -200;\n"
664 " }\n"
665 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100666 "f(99);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100667
668 "function f(a, b) { if (a in b) { return 200; } }"
Ben Murdochc5610432016-08-08 18:44:38 +0100669 "f('prop', { prop: 'yes'});\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100670
671 "function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n"
672 REPEAT_64(" b = a; a = b;\n")
Ben Murdochc5610432016-08-08 18:44:38 +0100673 " return 200; } else { return -200; } } f(0.001);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100674
675 "function f() {\n"
676 " var a = 0; var b = 0;\n"
677 " if (a) {\n"
678 REPEAT_64(" b = a; a = b;\n")
679 " return 200; } else { return -200; }\n"
680 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100681 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100682
683 "function f(a, b) {\n"
684 " if (a == b) { return 1; }\n"
685 " if (a === b) { return 1; }\n"
686 " if (a < b) { return 1; }\n"
687 " if (a > b) { return 1; }\n"
688 " if (a <= b) { return 1; }\n"
689 " if (a >= b) { return 1; }\n"
690 " if (a in b) { return 1; }\n"
691 " if (a instanceof b) { return 1; }\n"
692 " return 0;\n"
693 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100694 "f(1, 1);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100695
696 "function f() {\n"
697 " var a = 0;\n"
698 " if (a) {\n"
699 " return 20;\n"
700 " } else {\n"
701 " return -20;\n"
702 " }\n"
703 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100704 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100705 };
706
Ben Murdochc5610432016-08-08 18:44:38 +0100707 CHECK(CompareTexts(BuildActual(printer, snippets),
708 LoadGolden("IfConditions.golden")));
Ben Murdochda12d292016-06-02 14:46:10 +0100709}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000710
711TEST(DeclareGlobals) {
Ben Murdochda12d292016-06-02 14:46:10 +0100712 InitializedIgnitionHandleScope scope;
713 BytecodeExpectationsPrinter printer(CcTest::isolate(),
714 ConstantPoolType::kMixed);
715 printer.set_wrap(false);
716 printer.set_test_function_name("f");
717 printer.set_execute(false);
718 printer.set_top_level(true);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000719
Ben Murdochda12d292016-06-02 14:46:10 +0100720 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100721 "var a = 1;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000722
Ben Murdochc5610432016-08-08 18:44:38 +0100723 "function f() {}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000724
Ben Murdochda12d292016-06-02 14:46:10 +0100725 "var a = 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100726 "a=2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000727
Ben Murdochda12d292016-06-02 14:46:10 +0100728 "function f() {}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100729 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000730 };
731
Ben Murdochc5610432016-08-08 18:44:38 +0100732 CHECK(CompareTexts(BuildActual(printer, snippets),
733 LoadGolden("DeclareGlobals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000734}
735
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000736TEST(BreakableBlocks) {
Ben Murdochda12d292016-06-02 14:46:10 +0100737 InitializedIgnitionHandleScope scope;
738 BytecodeExpectationsPrinter printer(CcTest::isolate(),
739 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000740
Ben Murdochda12d292016-06-02 14:46:10 +0100741 const char* snippets[] = {
742 "var x = 0;\n"
743 "label: {\n"
744 " x = x + 1;\n"
745 " break label;\n"
746 " x = x + 1;\n"
747 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100748 "return x;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100749
Ben Murdochda12d292016-06-02 14:46:10 +0100750 "var sum = 0;\n"
751 "outer: {\n"
752 " for (var x = 0; x < 10; ++x) {\n"
753 " for (var y = 0; y < 3; ++y) {\n"
754 " ++sum;\n"
755 " if (x + y == 12) { break outer; }\n"
756 " }\n"
757 " }\n"
758 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100759 "return sum;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100760
761 "outer: {\n"
762 " let y = 10;\n"
763 " function f() { return y; }\n"
764 " break outer;\n"
765 "}\n",
766
767 "let x = 1;\n"
768 "outer: {\n"
769 " inner: {\n"
770 " let y = 2;\n"
771 " function f() { return x + y; }\n"
772 " if (y) break outer;\n"
773 " y = 3;\n"
774 " }\n"
775 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100776 "x = 4;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000777 };
778
Ben Murdochc5610432016-08-08 18:44:38 +0100779 CHECK(CompareTexts(BuildActual(printer, snippets),
780 LoadGolden("BreakableBlocks.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000781}
782
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000783TEST(BasicLoops) {
Ben Murdochda12d292016-06-02 14:46:10 +0100784 InitializedIgnitionHandleScope scope;
785 BytecodeExpectationsPrinter printer(CcTest::isolate(),
786 ConstantPoolType::kMixed);
787 const char* snippets[] = {
788 "var x = 0;\n"
789 "while (false) { x = 99; break; continue; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100790 "return x;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000791
Ben Murdochda12d292016-06-02 14:46:10 +0100792 "var x = 0;\n"
793 "while (false) {\n"
794 " x = x + 1;\n"
795 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100796 "return x;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100797
Ben Murdochda12d292016-06-02 14:46:10 +0100798 "var x = 0;\n"
799 "var y = 1;\n"
800 "while (x < 10) {\n"
801 " y = y * 12;\n"
802 " x = x + 1;\n"
803 " if (x == 3) continue;\n"
804 " if (x == 4) break;\n"
805 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100806 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100807
808 "var i = 0;\n"
809 "while (true) {\n"
810 " if (i < 0) continue;\n"
811 " if (i == 3) break;\n"
812 " if (i == 4) break;\n"
813 " if (i == 10) continue;\n"
814 " if (i == 5) break;\n"
815 " i = i + 1;\n"
816 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100817 "return i;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100818
819 "var i = 0;\n"
820 "while (true) {\n"
821 " while (i < 3) {\n"
822 " if (i == 2) break;\n"
823 " i = i + 1;\n"
824 " }\n"
825 " i = i + 1;\n"
826 " break;\n"
827 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100828 "return i;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100829
830 "var x = 10;\n"
831 "var y = 1;\n"
832 "while (x) {\n"
833 " y = y * 12;\n"
834 " x = x - 1;\n"
835 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100836 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100837
838 "var x = 0; var y = 1;\n"
839 "do {\n"
840 " y = y * 10;\n"
841 " if (x == 5) break;\n"
842 " if (x == 6) continue;\n"
843 " x = x + 1;\n"
844 "} while (x < 10);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100845 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100846
847 "var x = 10;\n"
848 "var y = 1;\n"
849 "do {\n"
850 " y = y * 12;\n"
851 " x = x - 1;\n"
852 "} while (x);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100853 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100854
855 "var x = 0; var y = 1;\n"
856 "do {\n"
857 " y = y * 10;\n"
858 " if (x == 5) break;\n"
859 " x = x + 1;\n"
860 " if (x == 6) continue;\n"
861 "} while (false);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100862 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100863
864 "var x = 0; var y = 1;\n"
865 "do {\n"
866 " y = y * 10;\n"
867 " if (x == 5) break;\n"
868 " x = x + 1;\n"
869 " if (x == 6) continue;\n"
870 "} while (true);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100871 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100872
873 "var x = 0;\n"
874 "for (;;) {\n"
875 " if (x == 1) break;\n"
876 " if (x == 2) continue;\n"
877 " x = x + 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100878 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100879
880 "for (var x = 0;;) {\n"
881 " if (x == 1) break;\n"
882 " if (x == 2) continue;\n"
883 " x = x + 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100884 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100885
886 "var x = 0;\n"
887 "for (;; x = x + 1) {\n"
888 " if (x == 1) break;\n"
889 " if (x == 2) continue;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100890 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100891
892 "for (var x = 0;; x = x + 1) {\n"
893 " if (x == 1) break;\n"
894 " if (x == 2) continue;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100895 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100896
897 "var u = 0;\n"
898 "for (var i = 0; i < 100; i = i + 1) {\n"
899 " u = u + 1;\n"
900 " continue;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100901 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100902
903 "var y = 1;\n"
904 "for (var x = 10; x; --x) {\n"
905 " y = y * 12;\n"
906 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100907 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100908
909 "var x = 0;\n"
910 "for (var i = 0; false; i++) {\n"
911 " x = x + 1;\n"
912 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100913 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100914
915 "var x = 0;\n"
916 "for (var i = 0; true; ++i) {\n"
917 " x = x + 1;\n"
918 " if (x == 20) break;\n"
919 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100920 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100921
922 "var a = 0;\n"
923 "while (a) {\n"
924 " { \n"
925 " let z = 1;\n"
926 " function f() { z = 2; }\n"
927 " if (z) continue;\n"
928 " z++;\n"
929 " }\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100930 "}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000931 };
932
Ben Murdochc5610432016-08-08 18:44:38 +0100933 CHECK(CompareTexts(BuildActual(printer, snippets),
934 LoadGolden("BasicLoops.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000935}
936
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000937TEST(JumpsRequiringConstantWideOperands) {
Ben Murdochda12d292016-06-02 14:46:10 +0100938 InitializedIgnitionHandleScope scope;
939 BytecodeExpectationsPrinter printer(CcTest::isolate(),
940 ConstantPoolType::kNumber);
941 const char* snippets[] = {
942 REPEAT_256("var x = 0.1;\n")
943 REPEAT_32("var x = 0.2;\n")
944 REPEAT_16("var x = 0.3;\n")
945 REPEAT_8("var x = 0.4;\n")
946 "for (var i = 0; i < 3; i++) {\n"
947 " if (i == 1) continue;\n"
948 " if (i == 2) break;\n"
949 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100950 "return 3;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100951 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000952
Ben Murdochc5610432016-08-08 18:44:38 +0100953 CHECK(CompareTexts(BuildActual(printer, snippets),
954 LoadGolden("JumpsRequiringConstantWideOperands.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000955}
956
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000957TEST(UnaryOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +0100958 InitializedIgnitionHandleScope scope;
959 BytecodeExpectationsPrinter printer(CcTest::isolate(),
960 ConstantPoolType::kNumber);
961 const char* snippets[] = {
962 "var x = 0;\n"
963 "while (x != 10) {\n"
964 " x = x + 10;\n"
965 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100966 "return x;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000967
Ben Murdochda12d292016-06-02 14:46:10 +0100968 "var x = false;\n"
969 "do {\n"
970 " x = !x;\n"
971 "} while(x == false);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100972 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100973
974 "var x = 101;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100975 "return void(x * 3);\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100976
977 "var x = 1234;\n"
978 "var y = void (x * x - 1);\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100979 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100980
981 "var x = 13;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100982 "return ~x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100983
984 "var x = 13;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100985 "return +x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +0100986
987 "var x = 13;\n"
Ben Murdochc5610432016-08-08 18:44:38 +0100988 "return -x;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100989 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000990
Ben Murdochc5610432016-08-08 18:44:38 +0100991 CHECK(CompareTexts(BuildActual(printer, snippets),
992 LoadGolden("UnaryOperators.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000993}
994
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000995TEST(Typeof) {
Ben Murdochda12d292016-06-02 14:46:10 +0100996 InitializedIgnitionHandleScope scope;
997 BytecodeExpectationsPrinter printer(CcTest::isolate(),
998 ConstantPoolType::kString);
999 printer.set_wrap(false);
1000 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001001
Ben Murdochda12d292016-06-02 14:46:10 +01001002 const char* snippets[] = {
1003 "function f() {\n"
1004 " var x = 13;\n"
1005 " return typeof(x);\n"
1006 "};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001007
Ben Murdochda12d292016-06-02 14:46:10 +01001008 "var x = 13;\n"
1009 "function f() {\n"
1010 " return typeof(x);\n"
1011 "};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001012 };
1013
Ben Murdochc5610432016-08-08 18:44:38 +01001014 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1015 LoadGolden("Typeof.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001016}
1017
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001018TEST(Delete) {
Ben Murdochda12d292016-06-02 14:46:10 +01001019 InitializedIgnitionHandleScope scope;
1020 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1021 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001022
Ben Murdochda12d292016-06-02 14:46:10 +01001023 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001024 "var a = {x:13, y:14}; return delete a.x;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001025
Ben Murdochc5610432016-08-08 18:44:38 +01001026 "'use strict'; var a = {x:13, y:14}; return delete a.x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001027
Ben Murdochc5610432016-08-08 18:44:38 +01001028 "var a = {1:13, 2:14}; return delete a[2];\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001029
Ben Murdochc5610432016-08-08 18:44:38 +01001030 "var a = 10; return delete a;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001031
1032 "'use strict';\n"
1033 "var a = {1:10};\n"
1034 "(function f1() {return a;});\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001035 "return delete a[1];\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001036
Ben Murdochc5610432016-08-08 18:44:38 +01001037 "return delete 'test';\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001038 };
1039
Ben Murdochc5610432016-08-08 18:44:38 +01001040 CHECK(CompareTexts(BuildActual(printer, snippets),
1041 LoadGolden("Delete.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001042}
1043
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001044TEST(GlobalDelete) {
Ben Murdochda12d292016-06-02 14:46:10 +01001045 InitializedIgnitionHandleScope scope;
1046 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1047 ConstantPoolType::kMixed);
1048 printer.set_wrap(false);
1049 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001050
Ben Murdochda12d292016-06-02 14:46:10 +01001051 const char* snippets[] = {
1052 "var a = {x:13, y:14};\n"
1053 "function f() {\n"
1054 " return delete a.x;\n"
1055 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001056 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001057
Ben Murdochda12d292016-06-02 14:46:10 +01001058 "a = {1:13, 2:14};\n"
1059 "function f() {\n"
1060 " 'use strict';\n"
1061 " return delete a[1];\n"
1062 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001063 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001064
Ben Murdochda12d292016-06-02 14:46:10 +01001065 "var a = {x:13, y:14};\n"
1066 "function f() {\n"
1067 " return delete a;\n"
1068 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001069 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001070
1071 "b = 30;\n"
1072 "function f() {\n"
1073 " return delete b;\n"
1074 "};\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001075 "f();\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001076 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001077
Ben Murdochc5610432016-08-08 18:44:38 +01001078 CHECK(CompareTexts(BuildActual(printer, snippets),
1079 LoadGolden("GlobalDelete.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001080}
1081
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001082TEST(FunctionLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001083 InitializedIgnitionHandleScope scope;
1084 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1085 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001086
Ben Murdochda12d292016-06-02 14:46:10 +01001087 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001088 "return function(){ }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001089
Ben Murdochc5610432016-08-08 18:44:38 +01001090 "return (function(){ })()\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001091
Ben Murdochc5610432016-08-08 18:44:38 +01001092 "return (function(x){ return x; })(1)\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001093 };
1094
Ben Murdochc5610432016-08-08 18:44:38 +01001095 CHECK(CompareTexts(BuildActual(printer, snippets),
1096 LoadGolden("FunctionLiterals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001097}
1098
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001099TEST(RegExpLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001100 InitializedIgnitionHandleScope scope;
1101 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1102 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001103
Ben Murdochda12d292016-06-02 14:46:10 +01001104 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001105 "return /ab+d/;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001106
Ben Murdochc5610432016-08-08 18:44:38 +01001107 "return /(\\w+)\\s(\\w+)/i;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001108
Ben Murdochc5610432016-08-08 18:44:38 +01001109 "return /ab+d/.exec('abdd');\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001110 };
1111
Ben Murdochc5610432016-08-08 18:44:38 +01001112 CHECK(CompareTexts(BuildActual(printer, snippets),
1113 LoadGolden("RegExpLiterals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001114}
1115
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001116TEST(RegExpLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001117 InitializedIgnitionHandleScope scope;
1118 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1119 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001120
Ben Murdochda12d292016-06-02 14:46:10 +01001121 const char* snippets[] = {
1122 "var a;" //
1123 REPEAT_256("\na = 1.23;") //
Ben Murdochc5610432016-08-08 18:44:38 +01001124 "\nreturn /ab+d/;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001125 };
1126
Ben Murdochc5610432016-08-08 18:44:38 +01001127 CHECK(CompareTexts(BuildActual(printer, snippets),
1128 LoadGolden("RegExpLiteralsWide.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001129}
1130
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001131TEST(ArrayLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001132 InitializedIgnitionHandleScope scope;
1133 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1134 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001135
Ben Murdochda12d292016-06-02 14:46:10 +01001136 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001137 "return [ 1, 2 ];\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001138
Ben Murdochc5610432016-08-08 18:44:38 +01001139 "var a = 1; return [ a, a + 1 ];\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001140
Ben Murdochc5610432016-08-08 18:44:38 +01001141 "return [ [ 1, 2 ], [ 3 ] ];\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001142
Ben Murdochc5610432016-08-08 18:44:38 +01001143 "var a = 1; return [ [ a, 2 ], [ a + 2 ] ];\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001144 };
1145
Ben Murdochc5610432016-08-08 18:44:38 +01001146 CHECK(CompareTexts(BuildActual(printer, snippets),
1147 LoadGolden("ArrayLiterals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001148}
1149
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001150TEST(ArrayLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001151 InitializedIgnitionHandleScope scope;
1152 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1153 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001154
Ben Murdochda12d292016-06-02 14:46:10 +01001155 const char* snippets[] = {
1156 "var a;" //
1157 REPEAT_256("\na = 1.23;") //
Ben Murdochc5610432016-08-08 18:44:38 +01001158 "\nreturn [ 1 , 2 ];\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001159 };
1160
Ben Murdochc5610432016-08-08 18:44:38 +01001161 CHECK(CompareTexts(BuildActual(printer, snippets),
1162 LoadGolden("ArrayLiteralsWide.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001163}
1164
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001165TEST(ObjectLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001166 InitializedIgnitionHandleScope scope;
1167 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1168 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001169
Ben Murdochda12d292016-06-02 14:46:10 +01001170 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001171 "return { };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001172
Ben Murdochc5610432016-08-08 18:44:38 +01001173 "return { name: 'string', val: 9.2 };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001174
Ben Murdochc5610432016-08-08 18:44:38 +01001175 "var a = 1; return { name: 'string', val: a };\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001176
Ben Murdochc5610432016-08-08 18:44:38 +01001177 "var a = 1; return { val: a, val: a + 1 };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001178
Ben Murdochc5610432016-08-08 18:44:38 +01001179 "return { func: function() { } };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001180
Ben Murdochc5610432016-08-08 18:44:38 +01001181 "return { func(a) { return a; } };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001182
Ben Murdochc5610432016-08-08 18:44:38 +01001183 "return { get a() { return 2; } };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001184
Ben Murdochc5610432016-08-08 18:44:38 +01001185 "return { get a() { return this.x; }, set a(val) { this.x = val } };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001186
Ben Murdochc5610432016-08-08 18:44:38 +01001187 "return { set b(val) { this.y = val } };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001188
Ben Murdochc5610432016-08-08 18:44:38 +01001189 "var a = 1; return { 1: a };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001190
Ben Murdochc5610432016-08-08 18:44:38 +01001191 "return { __proto__: null };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001192
Ben Murdochc5610432016-08-08 18:44:38 +01001193 "var a = 'test'; return { [a]: 1 };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001194
Ben Murdochc5610432016-08-08 18:44:38 +01001195 "var a = 'test'; return { val: a, [a]: 1 };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001196
Ben Murdochc5610432016-08-08 18:44:38 +01001197 "var a = 'test'; return { [a]: 1, __proto__: {} };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001198
Ben Murdochc5610432016-08-08 18:44:38 +01001199 "var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001200 };
1201
Ben Murdochc5610432016-08-08 18:44:38 +01001202 CHECK(CompareTexts(BuildActual(printer, snippets),
1203 LoadGolden("ObjectLiterals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001204}
1205
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001206TEST(ObjectLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001207 InitializedIgnitionHandleScope scope;
1208 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1209 ConstantPoolType::kMixed);
1210 const char* snippets[] = {
1211 "var a;" //
1212 REPEAT_256("\na = 1.23;") //
Ben Murdochc5610432016-08-08 18:44:38 +01001213 "\nreturn { name: 'string', val: 9.2 };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001214 };
1215
Ben Murdochc5610432016-08-08 18:44:38 +01001216 CHECK(CompareTexts(BuildActual(printer, snippets),
1217 LoadGolden("ObjectLiteralsWide.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001218}
1219
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001220TEST(TopLevelObjectLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001221 InitializedIgnitionHandleScope scope;
1222 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1223 ConstantPoolType::kMixed);
1224 printer.set_wrap(false);
1225 printer.set_test_function_name("f");
1226 printer.set_execute(false);
1227 printer.set_top_level(true);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001228
Ben Murdochda12d292016-06-02 14:46:10 +01001229 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001230 "var a = { func: function() { } };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001231 };
1232
Ben Murdochc5610432016-08-08 18:44:38 +01001233 CHECK(CompareTexts(BuildActual(printer, snippets),
1234 LoadGolden("TopLevelObjectLiterals.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001235}
1236
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001237TEST(TryCatch) {
Ben Murdochda12d292016-06-02 14:46:10 +01001238 InitializedIgnitionHandleScope scope;
1239 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1240 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001241
Ben Murdochda12d292016-06-02 14:46:10 +01001242 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001243 "try { return 1; } catch(e) { return 2; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001244
Ben Murdochda12d292016-06-02 14:46:10 +01001245 "var a;\n"
1246 "try { a = 1 } catch(e1) {};\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001247 "try { a = 2 } catch(e2) { a = 3 }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001248 };
1249
Ben Murdochc5610432016-08-08 18:44:38 +01001250 CHECK(CompareTexts(BuildActual(printer, snippets),
1251 LoadGolden("TryCatch.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001252}
1253
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001254TEST(TryFinally) {
Ben Murdochda12d292016-06-02 14:46:10 +01001255 InitializedIgnitionHandleScope scope;
1256 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1257 ConstantPoolType::kString);
1258 const char* snippets[] = {
1259 "var a = 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001260 "try { a = 2; } finally { a = 3; }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001261
Ben Murdochda12d292016-06-02 14:46:10 +01001262 "var a = 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001263 "try { a = 2; } catch(e) { a = 20 } finally { a = 3; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001264
Ben Murdochda12d292016-06-02 14:46:10 +01001265 "var a; try {\n"
1266 " try { a = 1 } catch(e) { a = 2 }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001267 "} catch(e) { a = 20 } finally { a = 3; }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001268 };
1269
Ben Murdochc5610432016-08-08 18:44:38 +01001270 CHECK(CompareTexts(BuildActual(printer, snippets),
1271 LoadGolden("TryFinally.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001272}
1273
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001274TEST(Throw) {
Ben Murdochda12d292016-06-02 14:46:10 +01001275 InitializedIgnitionHandleScope scope;
1276 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1277 ConstantPoolType::kString);
1278 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001279 "throw 1;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001280
Ben Murdochc5610432016-08-08 18:44:38 +01001281 "throw 'Error';\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001282
Ben Murdochc5610432016-08-08 18:44:38 +01001283 "var a = 1; if (a) { throw 'Error'; };\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001284 };
1285
Ben Murdochc5610432016-08-08 18:44:38 +01001286 CHECK(
1287 CompareTexts(BuildActual(printer, snippets), LoadGolden("Throw.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001288}
1289
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001290TEST(CallNew) {
Ben Murdochda12d292016-06-02 14:46:10 +01001291 InitializedIgnitionHandleScope scope;
1292 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1293 ConstantPoolType::kMixed);
1294 printer.set_wrap(false);
1295 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001296
Ben Murdochda12d292016-06-02 14:46:10 +01001297 const char* snippets[] = {
1298 "function bar() { this.value = 0; }\n"
1299 "function f() { return new bar(); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001300 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001301
Ben Murdochda12d292016-06-02 14:46:10 +01001302 "function bar(x) { this.value = 18; this.x = x;}\n"
1303 "function f() { return new bar(3); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001304 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001305
Ben Murdochda12d292016-06-02 14:46:10 +01001306 "function bar(w, x, y, z) {\n"
1307 " this.value = 18;\n"
1308 " this.x = x;\n"
1309 " this.y = y;\n"
1310 " this.z = z;\n"
1311 "}\n"
1312 "function f() { return new bar(3, 4, 5); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001313 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001314 };
1315
Ben Murdochc5610432016-08-08 18:44:38 +01001316 CHECK(CompareTexts(BuildActual(printer, snippets),
1317 LoadGolden("CallNew.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001318}
1319
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001320TEST(ContextVariables) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001321 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this
1322 // ever changes, the REPEAT_XXX should be changed to output the correct number
1323 // of unique variables to trigger the wide slot load / store.
1324 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001325
Ben Murdochda12d292016-06-02 14:46:10 +01001326 InitializedIgnitionHandleScope scope;
1327 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1328 ConstantPoolType::kMixed);
1329 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001330 "var a; return function() { a = 1; };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001331
Ben Murdochc5610432016-08-08 18:44:38 +01001332 "var a = 1; return function() { a = 2; };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001333
Ben Murdochc5610432016-08-08 18:44:38 +01001334 "var a = 1; var b = 2; return function() { a = 2; b = 3 };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001335
Ben Murdochc5610432016-08-08 18:44:38 +01001336 "var a; (function() { a = 2; })(); return a;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001337
1338 "'use strict';\n"
1339 "let a = 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001340 "{ let b = 2; return function() { a + b; }; }\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001341
1342 "'use strict';\n"
1343 REPEAT_249_UNIQUE_VARS()
1344 "eval();\n"
1345 "var b = 100;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001346 "return b\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001347 };
1348
Ben Murdochc5610432016-08-08 18:44:38 +01001349 CHECK(CompareTexts(BuildActual(printer, snippets),
1350 LoadGolden("ContextVariables.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001351}
1352
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001353TEST(ContextParameters) {
Ben Murdochda12d292016-06-02 14:46:10 +01001354 InitializedIgnitionHandleScope scope;
1355 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1356 ConstantPoolType::kMixed);
1357 printer.set_wrap(false);
1358 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001359
Ben Murdochda12d292016-06-02 14:46:10 +01001360 const char* snippets[] = {
1361 "function f(arg1) { return function() { arg1 = 2; }; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001362
Ben Murdochda12d292016-06-02 14:46:10 +01001363 "function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }",
1364
1365 "function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }",
1366
1367 "function f() { var self = this; return function() { self = 2; }; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001368 };
1369
Ben Murdochc5610432016-08-08 18:44:38 +01001370 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1371 LoadGolden("ContextParameters.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001372}
1373
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001374TEST(OuterContextVariables) {
Ben Murdochda12d292016-06-02 14:46:10 +01001375 InitializedIgnitionHandleScope scope;
1376 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1377 ConstantPoolType::kMixed);
1378 printer.set_wrap(false);
1379 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001380
Ben Murdochda12d292016-06-02 14:46:10 +01001381 const char* snippets[] = {
1382 "function Outer() {\n"
1383 " var outerVar = 1;\n"
1384 " function Inner(innerArg) {\n"
1385 " this.innerFunc = function() { return outerVar * innerArg; }\n"
1386 " }\n"
1387 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
1388 "}\n"
1389 "var f = new Outer().getInnerFunc();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001390
Ben Murdochda12d292016-06-02 14:46:10 +01001391 "function Outer() {\n"
1392 " var outerVar = 1;\n"
1393 " function Inner(innerArg) {\n"
1394 " this.innerFunc = function() { outerVar = innerArg; }\n"
1395 " }\n"
1396 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
1397 "}\n"
1398 "var f = new Outer().getInnerFunc();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001399 };
1400
Ben Murdochc5610432016-08-08 18:44:38 +01001401 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1402 LoadGolden("OuterContextVariables.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001403}
1404
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001405TEST(CountOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +01001406 InitializedIgnitionHandleScope scope;
1407 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1408 ConstantPoolType::kMixed);
1409 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001410 "var a = 1; return ++a;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001411
Ben Murdochc5610432016-08-08 18:44:38 +01001412 "var a = 1; return a++;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001413
Ben Murdochc5610432016-08-08 18:44:38 +01001414 "var a = 1; return --a;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001415
Ben Murdochc5610432016-08-08 18:44:38 +01001416 "var a = 1; return a--;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001417
Ben Murdochc5610432016-08-08 18:44:38 +01001418 "var a = { val: 1 }; return a.val++;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001419
Ben Murdochc5610432016-08-08 18:44:38 +01001420 "var a = { val: 1 }; return --a.val;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001421
Ben Murdochc5610432016-08-08 18:44:38 +01001422 "var name = 'var'; var a = { val: 1 }; return a[name]--;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001423
Ben Murdochc5610432016-08-08 18:44:38 +01001424 "var name = 'var'; var a = { val: 1 }; return ++a[name];\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001425
Ben Murdochc5610432016-08-08 18:44:38 +01001426 "var a = 1; var b = function() { return a }; return ++a;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001427
Ben Murdochc5610432016-08-08 18:44:38 +01001428 "var a = 1; var b = function() { return a }; return a--;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001429
Ben Murdochc5610432016-08-08 18:44:38 +01001430 "var idx = 1; var a = [1, 2]; return a[idx++] = 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001431 };
1432
Ben Murdochc5610432016-08-08 18:44:38 +01001433 CHECK(CompareTexts(BuildActual(printer, snippets),
1434 LoadGolden("CountOperators.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001435}
1436
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001437TEST(GlobalCountOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +01001438 InitializedIgnitionHandleScope scope;
1439 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1440 ConstantPoolType::kString);
1441 printer.set_wrap(false);
1442 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001443
Ben Murdochda12d292016-06-02 14:46:10 +01001444 const char* snippets[] = {
1445 "var global = 1;\n"
1446 "function f() { return ++global; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001447 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001448
Ben Murdochda12d292016-06-02 14:46:10 +01001449 "var global = 1;\n"
1450 "function f() { return global--; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001451 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001452
Ben Murdochda12d292016-06-02 14:46:10 +01001453 "unallocated = 1;\n"
1454 "function f() { 'use strict'; return --unallocated; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001455 "f();\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001456
1457 "unallocated = 1;\n"
1458 "function f() { return unallocated++; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001459 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001460 };
1461
Ben Murdochc5610432016-08-08 18:44:38 +01001462 CHECK(CompareTexts(BuildActual(printer, snippets),
1463 LoadGolden("GlobalCountOperators.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001464}
1465
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001466TEST(CompoundExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +01001467 InitializedIgnitionHandleScope scope;
1468 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1469 ConstantPoolType::kMixed);
1470 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001471 "var a = 1; a += 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001472
Ben Murdochc5610432016-08-08 18:44:38 +01001473 "var a = 1; a /= 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001474
Ben Murdochc5610432016-08-08 18:44:38 +01001475 "var a = { val: 2 }; a.name *= 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001476
Ben Murdochc5610432016-08-08 18:44:38 +01001477 "var a = { 1: 2 }; a[1] ^= 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001478
Ben Murdochc5610432016-08-08 18:44:38 +01001479 "var a = 1; (function f() { return a; }); a |= 24;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001480 };
1481
Ben Murdochc5610432016-08-08 18:44:38 +01001482 CHECK(CompareTexts(BuildActual(printer, snippets),
1483 LoadGolden("CompoundExpressions.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001484}
1485
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001486TEST(GlobalCompoundExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +01001487 InitializedIgnitionHandleScope scope;
1488 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1489 ConstantPoolType::kString);
1490 printer.set_wrap(false);
1491 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001492
Ben Murdochda12d292016-06-02 14:46:10 +01001493 const char* snippets[] = {
1494 "var global = 1;\n"
1495 "function f() { return global &= 1; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001496 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001497
Ben Murdochda12d292016-06-02 14:46:10 +01001498 "unallocated = 1;\n"
1499 "function f() { return unallocated += 1; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001500 "f();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001501 };
1502
Ben Murdochc5610432016-08-08 18:44:38 +01001503 CHECK(CompareTexts(BuildActual(printer, snippets),
1504 LoadGolden("GlobalCompoundExpressions.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001505}
1506
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001507TEST(CreateArguments) {
Ben Murdochda12d292016-06-02 14:46:10 +01001508 InitializedIgnitionHandleScope scope;
1509 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1510 ConstantPoolType::kString);
1511 printer.set_wrap(false);
1512 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001513
Ben Murdochda12d292016-06-02 14:46:10 +01001514 const char* snippets[] = {
1515 "function f() { return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001516
Ben Murdochda12d292016-06-02 14:46:10 +01001517 "function f() { return arguments[0]; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001518
Ben Murdochda12d292016-06-02 14:46:10 +01001519 "function f() { 'use strict'; return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001520
Ben Murdochda12d292016-06-02 14:46:10 +01001521 "function f(a) { return arguments[0]; }",
1522
1523 "function f(a, b, c) { return arguments; }",
1524
1525 "function f(a, b, c) { 'use strict'; return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001526 };
1527
Ben Murdochc5610432016-08-08 18:44:38 +01001528 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1529 LoadGolden("CreateArguments.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001530}
1531
Ben Murdoch097c5b22016-05-18 11:27:45 +01001532TEST(CreateRestParameter) {
Ben Murdochda12d292016-06-02 14:46:10 +01001533 InitializedIgnitionHandleScope scope;
1534 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1535 ConstantPoolType::kNumber);
1536 printer.set_wrap(false);
1537 printer.set_test_function_name("f");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001538
Ben Murdochda12d292016-06-02 14:46:10 +01001539 const char* snippets[] = {
1540 "function f(...restArgs) { return restArgs; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001541
Ben Murdochda12d292016-06-02 14:46:10 +01001542 "function f(a, ...restArgs) { return restArgs; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001543
Ben Murdochda12d292016-06-02 14:46:10 +01001544 "function f(a, ...restArgs) { return restArgs[0]; }",
1545
1546 "function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001547 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001548
Ben Murdochc5610432016-08-08 18:44:38 +01001549 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1550 LoadGolden("CreateRestParameter.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001551}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001552
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001553TEST(ForIn) {
Ben Murdochda12d292016-06-02 14:46:10 +01001554 InitializedIgnitionHandleScope scope;
1555 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1556 ConstantPoolType::kMixed);
1557 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001558 "for (var p in null) {}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001559
Ben Murdochc5610432016-08-08 18:44:38 +01001560 "for (var p in undefined) {}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001561
Ben Murdochc5610432016-08-08 18:44:38 +01001562 "for (var p in undefined) {}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001563
Ben Murdochda12d292016-06-02 14:46:10 +01001564 "var x = 'potatoes';\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001565 "for (var p in x) { return p; }\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001566
1567 "var x = 0;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001568 "for (var p in [1,2,3]) { x += p; }\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001569
1570 "var x = { 'a': 1, 'b': 2 };\n"
1571 "for (x['a'] in [10, 20, 30]) {\n"
1572 " if (x['a'] == 10) continue;\n"
1573 " if (x['a'] == 20) break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001574 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001575
1576 "var x = [ 10, 11, 12 ] ;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001577 "for (x[0] in [1,2,3]) { return x[3]; }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001578 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001579
Ben Murdochc5610432016-08-08 18:44:38 +01001580 CHECK(
1581 CompareTexts(BuildActual(printer, snippets), LoadGolden("ForIn.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001582}
1583
Ben Murdochda12d292016-06-02 14:46:10 +01001584TEST(ForOf) {
1585 InitializedIgnitionHandleScope scope;
1586 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1587 ConstantPoolType::kMixed);
1588 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001589 "for (var p of [0, 1, 2]) {}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001590
Ben Murdochda12d292016-06-02 14:46:10 +01001591 "var x = 'potatoes';\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001592 "for (var p of x) { return p; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001593
Ben Murdochda12d292016-06-02 14:46:10 +01001594 "for (var x of [10, 20, 30]) {\n"
1595 " if (x == 10) continue;\n"
1596 " if (x == 20) break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001597 "}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001598
Ben Murdochda12d292016-06-02 14:46:10 +01001599 "var x = { 'a': 1, 'b': 2 };\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001600 "for (x['a'] of [1,2,3]) { return x['a']; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001601 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001602
Ben Murdochc5610432016-08-08 18:44:38 +01001603 CHECK(
1604 CompareTexts(BuildActual(printer, snippets), LoadGolden("ForOf.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001605}
1606
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001607TEST(Conditional) {
Ben Murdochda12d292016-06-02 14:46:10 +01001608 InitializedIgnitionHandleScope scope;
1609 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1610 ConstantPoolType::kNumber);
1611 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001612 "return 1 ? 2 : 3;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001613
Ben Murdochc5610432016-08-08 18:44:38 +01001614 "return 1 ? 2 ? 3 : 4 : 5;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001615 };
1616
Ben Murdochc5610432016-08-08 18:44:38 +01001617 CHECK(CompareTexts(BuildActual(printer, snippets),
1618 LoadGolden("Conditional.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001619}
1620
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001621TEST(Switch) {
Ben Murdochda12d292016-06-02 14:46:10 +01001622 InitializedIgnitionHandleScope scope;
1623 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1624 ConstantPoolType::kNumber);
1625 const char* snippets[] = {
1626 "var a = 1;\n"
1627 "switch(a) {\n"
1628 " case 1: return 2;\n"
1629 " case 2: return 3;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001630 "}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001631
Ben Murdochda12d292016-06-02 14:46:10 +01001632 "var a = 1;\n"
1633 "switch(a) {\n"
1634 " case 1: a = 2; break;\n"
1635 " case 2: a = 3; break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001636 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001637
1638 "var a = 1;\n"
1639 "switch(a) {\n"
1640 " case 1: a = 2; // fall-through\n"
1641 " case 2: a = 3; break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001642 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001643
1644 "var a = 1;\n"
1645 "switch(a) {\n"
1646 " case 2: break;\n"
1647 " case 3: break;\n"
1648 " default: a = 1; break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001649 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001650
1651 "var a = 1;\n"
1652 "switch(typeof(a)) {\n"
1653 " case 2: a = 1; break;\n"
1654 " case 3: a = 2; break;\n"
1655 " default: a = 3; break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001656 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001657
1658 "var a = 1;\n"
1659 "switch(a) {\n"
1660 " case typeof(a): a = 1; break;\n"
1661 " default: a = 2; break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001662 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001663
1664 "var a = 1;\n"
1665 "switch(a) {\n"
1666 " case 1:\n"
1667 REPEAT_64(" a = 2;\n")
1668 " break;\n"
1669 " case 2:\n"
1670 " a = 3;\n"
1671 " break;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001672 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001673
1674 "var a = 1;\n"
1675 "switch(a) {\n"
1676 " case 1: \n"
1677 " switch(a + 1) {\n"
1678 " case 2 : a = 1; break;\n"
1679 " default : a = 2; break;\n"
1680 " } // fall-through\n"
1681 " case 2: a = 3;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001682 "}\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001683 };
1684
Ben Murdochc5610432016-08-08 18:44:38 +01001685 CHECK(CompareTexts(BuildActual(printer, snippets),
1686 LoadGolden("Switch.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001687}
1688
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001689TEST(BasicBlockToBoolean) {
Ben Murdochda12d292016-06-02 14:46:10 +01001690 InitializedIgnitionHandleScope scope;
1691 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1692 ConstantPoolType::kNumber);
1693 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001694 "var a = 1; if (a || a < 0) { return 1; }\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001695
Ben Murdochc5610432016-08-08 18:44:38 +01001696 "var a = 1; if (a && a < 0) { return 1; }\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001697
Ben Murdochc5610432016-08-08 18:44:38 +01001698 "var a = 1; a = (a || a < 0) ? 2 : 3;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001699 };
1700
Ben Murdochc5610432016-08-08 18:44:38 +01001701 CHECK(CompareTexts(BuildActual(printer, snippets),
1702 LoadGolden("BasicBlockToBoolean.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001703}
1704
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001705TEST(DeadCodeRemoval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001706 InitializedIgnitionHandleScope scope;
1707 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1708 ConstantPoolType::kNumber);
1709 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001710 "return; var a = 1; a();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001711
Ben Murdochc5610432016-08-08 18:44:38 +01001712 "if (false) { return; }; var a = 1;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001713
Ben Murdochc5610432016-08-08 18:44:38 +01001714 "if (true) { return 1; } else { return 2; };\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001715
Ben Murdochc5610432016-08-08 18:44:38 +01001716 "var a = 1; if (a) { return 1; }; return 2;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001717 };
1718
Ben Murdochc5610432016-08-08 18:44:38 +01001719 CHECK(CompareTexts(BuildActual(printer, snippets),
1720 LoadGolden("DeadCodeRemoval.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001721}
1722
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001723TEST(ThisFunction) {
Ben Murdochda12d292016-06-02 14:46:10 +01001724 InitializedIgnitionHandleScope scope;
1725 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1726 ConstantPoolType::kNumber);
1727 printer.set_wrap(false);
1728 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001729
Ben Murdochda12d292016-06-02 14:46:10 +01001730 const char* snippets[] = {
1731 "var f;\n"
1732 "f = function f() {};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001733
Ben Murdochda12d292016-06-02 14:46:10 +01001734 "var f;\n"
1735 "f = function f() { return f; };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001736 };
1737
Ben Murdochc5610432016-08-08 18:44:38 +01001738 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
1739 LoadGolden("ThisFunction.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001740}
1741
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001742TEST(NewTarget) {
Ben Murdochda12d292016-06-02 14:46:10 +01001743 InitializedIgnitionHandleScope scope;
1744 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1745 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001746
Ben Murdochda12d292016-06-02 14:46:10 +01001747 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001748 "return new.target;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001749
Ben Murdochc5610432016-08-08 18:44:38 +01001750 "new.target;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001751 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001752
Ben Murdochc5610432016-08-08 18:44:38 +01001753 CHECK(CompareTexts(BuildActual(printer, snippets),
1754 LoadGolden("NewTarget.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001755}
1756
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001757TEST(RemoveRedundantLdar) {
Ben Murdochda12d292016-06-02 14:46:10 +01001758 InitializedIgnitionHandleScope scope;
1759 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1760 ConstantPoolType::kNumber);
1761 const char* snippets[] = {
1762 "var ld_a = 1;\n" // This test is to check Ldar does not
1763 "while(true) {\n" // get removed if the preceding Star is
1764 " ld_a = ld_a + ld_a;\n" // in a different basicblock.
1765 " if (ld_a > 10) break;\n"
1766 "}\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001767 "return ld_a;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001768
Ben Murdochda12d292016-06-02 14:46:10 +01001769 "var ld_a = 1;\n"
1770 "do {\n"
1771 " ld_a = ld_a + ld_a;\n"
1772 " if (ld_a > 10) continue;\n"
1773 "} while(false);\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001774 "return ld_a;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001775
1776 "var ld_a = 1;\n"
1777 " ld_a = ld_a + ld_a;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001778 " return ld_a;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001779 };
1780
Ben Murdochc5610432016-08-08 18:44:38 +01001781 CHECK(CompareTexts(BuildActual(printer, snippets),
1782 LoadGolden("RemoveRedundantLdar.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001783}
1784
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001785TEST(AssignmentsInBinaryExpression) {
Ben Murdochda12d292016-06-02 14:46:10 +01001786 InitializedIgnitionHandleScope scope;
1787 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1788 ConstantPoolType::kString);
1789 const char* snippets[] = {
1790 "var x = 0, y = 1;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001791 "return (x = 2, y = 3, x = 4, y = 5);\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001792
Ben Murdochda12d292016-06-02 14:46:10 +01001793 "var x = 55;\n"
1794 "var y = (x = 100);\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001795 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001796
1797 "var x = 55;\n"
1798 "x = x + (x = 100) + (x = 101);\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001799 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001800
1801 "var x = 55;\n"
1802 "x = (x = 56) - x + (x = 57);\n"
1803 "x++;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001804 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001805
1806 "var x = 55;\n"
1807 "var y = x + (x = 1) + (x = 2) + (x = 3);\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001808 "return y;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001809
1810 "var x = 55;\n"
1811 "var x = x + (x = 1) + (x = 2) + (x = 3);\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001812 "return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001813
1814 "var x = 10, y = 20;\n"
1815 "return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + "
1816 "y;\n",
1817
1818 "var x = 17;\n"
1819 "return 1 + x + (x++) + (++x);\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001820 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001821
Ben Murdochc5610432016-08-08 18:44:38 +01001822 CHECK(CompareTexts(BuildActual(printer, snippets),
1823 LoadGolden("AssignmentsInBinaryExpression.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001824}
1825
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001826TEST(Eval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001827 InitializedIgnitionHandleScope scope;
1828 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1829 ConstantPoolType::kString);
1830 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001831 "return eval('1;');\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001832 };
1833
Ben Murdochc5610432016-08-08 18:44:38 +01001834 CHECK(
1835 CompareTexts(BuildActual(printer, snippets), LoadGolden("Eval.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001836}
1837
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001838TEST(LookupSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01001839 InitializedIgnitionHandleScope scope;
1840 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1841 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001842
Ben Murdochda12d292016-06-02 14:46:10 +01001843 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001844 "eval('var x = 10;'); return x;\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001845
Ben Murdochc5610432016-08-08 18:44:38 +01001846 "eval('var x = 10;'); return typeof x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001847
Ben Murdochc5610432016-08-08 18:44:38 +01001848 "x = 20; return eval('');\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001849 };
1850
Ben Murdochc5610432016-08-08 18:44:38 +01001851 CHECK(CompareTexts(BuildActual(printer, snippets),
1852 LoadGolden("LookupSlot.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001853}
1854
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001855TEST(CallLookupSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01001856 InitializedIgnitionHandleScope scope;
1857 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1858 ConstantPoolType::kMixed);
1859 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001860 "g = function(){}; eval(''); return g();\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001861 };
1862
Ben Murdochc5610432016-08-08 18:44:38 +01001863 CHECK(CompareTexts(BuildActual(printer, snippets),
1864 LoadGolden("CallLookupSlot.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001865}
1866
Ben Murdoch097c5b22016-05-18 11:27:45 +01001867// TODO(mythria): tests for variable/function declaration in lookup slots.
1868
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001869TEST(LookupSlotInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001870 InitializedIgnitionHandleScope scope;
1871 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1872 ConstantPoolType::kString);
1873 printer.set_wrap(false);
1874 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001875
Ben Murdochda12d292016-06-02 14:46:10 +01001876 const char* snippets[] = {
1877 "return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001878
Ben Murdochda12d292016-06-02 14:46:10 +01001879 "x = 10;",
1880
1881 "'use strict'; x = 10;",
1882
1883 "return typeof x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001884 };
1885
Ben Murdochda12d292016-06-02 14:46:10 +01001886 std::string actual = BuildActual(printer, snippets,
1887 "var f;\n"
1888 "var x = 1;\n"
1889 "function f1() {\n"
1890 " eval(\"function t() { ",
1891
1892 " }; f = t; f();\");\n"
1893 "}\n"
1894 "f1();");
1895
Ben Murdochc5610432016-08-08 18:44:38 +01001896 CHECK(CompareTexts(actual, LoadGolden("LookupSlotInEval.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001897}
1898
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001899TEST(LookupSlotWideInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001900 InitializedIgnitionHandleScope scope;
1901 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1902 ConstantPoolType::kMixed);
1903 printer.set_wrap(false);
1904 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001905
Ben Murdochda12d292016-06-02 14:46:10 +01001906 const char* snippets[] = {
1907 REPEAT_256(" \"var y = 2.3;\" +\n") //
1908 " \"return x;\" +\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001909
Ben Murdochda12d292016-06-02 14:46:10 +01001910 REPEAT_256(" \"var y = 2.3;\" +\n") //
1911 " \"return typeof x;\" +\n",
1912
1913 REPEAT_256(" \"var y = 2.3;\" +\n") //
1914 " \"x = 10;\" +\n",
1915
1916 " \"'use strict';\" +\n" //
1917 REPEAT_256(" \"var y = 2.3;\" +\n") //
1918 " \"x = 10;\" +\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001919 };
1920
Ben Murdochda12d292016-06-02 14:46:10 +01001921 std::string actual = BuildActual(printer, snippets,
1922 "var f;\n"
1923 "var x = 1;\n"
1924 "function f1() {\n"
1925 " eval(\"function t() {\" +\n",
1926
1927 " \"};\" +\n"
1928 " \"f = t; f();\"\n);\n"
1929 "}\n"
1930 "f1();");
1931
Ben Murdochc5610432016-08-08 18:44:38 +01001932 CHECK(CompareTexts(actual, LoadGolden("LookupSlotWideInEval.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001933}
1934
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001935TEST(DeleteLookupSlotInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001936 InitializedIgnitionHandleScope scope;
1937 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1938 ConstantPoolType::kString);
1939 printer.set_wrap(false);
1940 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001941
Ben Murdochda12d292016-06-02 14:46:10 +01001942 const char* snippets[] = {
1943 "delete x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001944
Ben Murdochda12d292016-06-02 14:46:10 +01001945 "return delete y;",
1946
1947 "return delete z;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001948 };
1949
Ben Murdochda12d292016-06-02 14:46:10 +01001950 std::string actual = BuildActual(printer, snippets,
1951 "var f;\n"
1952 "var x = 1;\n"
1953 "z = 10;\n"
1954 "function f1() {\n"
1955 " var y;\n"
1956 " eval(\"function t() { ",
1957
1958 " }; f = t; f();\");\n"
1959 "}\n"
1960 "f1();");
1961
Ben Murdochc5610432016-08-08 18:44:38 +01001962 CHECK(CompareTexts(actual, LoadGolden("DeleteLookupSlotInEval.golden")));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001963}
1964
Ben Murdoch097c5b22016-05-18 11:27:45 +01001965TEST(WideRegisters) {
1966 // Prepare prologue that creates frame for lots of registers.
1967 std::ostringstream os;
1968 for (size_t i = 0; i < 157; ++i) {
1969 os << "var x" << i << ";\n";
1970 }
1971 std::string prologue(os.str());
1972
Ben Murdochda12d292016-06-02 14:46:10 +01001973 InitializedIgnitionHandleScope scope;
1974 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1975 ConstantPoolType::kNumber);
1976 const char* snippets[] = {
1977 "x0 = x127;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001978 "return x0;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001979
1980 "x127 = x126;\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001981 "return x127;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001982
1983 "if (x2 > 3) { return x129; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001984 "return x128;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001985
1986 "var x0 = 0;\n"
1987 "if (x129 == 3) { var x129 = x0; }\n"
1988 "if (x2 > 3) { return x0; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01001989 "return x129;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001990
1991 "var x0 = 0;\n"
1992 "var x1 = 0;\n"
1993 "for (x128 = 0; x128 < 64; x128++) {"
1994 " x1 += x128;"
1995 "}"
Ben Murdochc5610432016-08-08 18:44:38 +01001996 "return x128;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01001997
1998 "var x0 = 1234;\n"
1999 "var x1 = 0;\n"
2000 "for (x128 in x0) {"
2001 " x1 += x128;"
2002 "}"
Ben Murdochc5610432016-08-08 18:44:38 +01002003 "return x1;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002004
2005 "x0 = %Add(x64, x63);\n"
2006 "x1 = %Add(x27, x143);\n"
2007 "%TheHole();\n"
Ben Murdochc5610432016-08-08 18:44:38 +01002008 "return x1;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002009 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002010
Ben Murdochc5610432016-08-08 18:44:38 +01002011 CHECK(CompareTexts(BuildActual(printer, snippets, prologue.c_str()),
2012 LoadGolden("WideRegisters.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002013}
2014
2015TEST(ConstVariable) {
Ben Murdochda12d292016-06-02 14:46:10 +01002016 InitializedIgnitionHandleScope scope;
2017 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2018 ConstantPoolType::kString);
2019 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002020 "const x = 10;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002021
Ben Murdochc5610432016-08-08 18:44:38 +01002022 "const x = 10; return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002023
Ben Murdochc5610432016-08-08 18:44:38 +01002024 "const x = ( x = 20);\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002025
Ben Murdochc5610432016-08-08 18:44:38 +01002026 "const x = 10; x = 20;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002027 };
2028
Ben Murdochc5610432016-08-08 18:44:38 +01002029 CHECK(CompareTexts(BuildActual(printer, snippets),
2030 LoadGolden("ConstVariable.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002031}
2032
2033TEST(LetVariable) {
Ben Murdochda12d292016-06-02 14:46:10 +01002034 InitializedIgnitionHandleScope scope;
2035 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2036 ConstantPoolType::kString);
2037 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002038 "let x = 10;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002039
Ben Murdochc5610432016-08-08 18:44:38 +01002040 "let x = 10; return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002041
Ben Murdochc5610432016-08-08 18:44:38 +01002042 "let x = (x = 20);\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002043
Ben Murdochc5610432016-08-08 18:44:38 +01002044 "let x = 10; x = 20;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002045 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002046
Ben Murdochc5610432016-08-08 18:44:38 +01002047 CHECK(CompareTexts(BuildActual(printer, snippets),
2048 LoadGolden("LetVariable.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002049}
2050
2051TEST(ConstVariableContextSlot) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01002052 // TODO(mythria): Add tests for initialization of this via super calls.
2053 // TODO(mythria): Add tests that walk the context chain.
Ben Murdochda12d292016-06-02 14:46:10 +01002054 InitializedIgnitionHandleScope scope;
2055 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2056 ConstantPoolType::kMixed);
2057 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002058 "const x = 10; function f1() {return x;}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002059
Ben Murdochc5610432016-08-08 18:44:38 +01002060 "const x = 10; function f1() {return x;} return x;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002061
Ben Murdochc5610432016-08-08 18:44:38 +01002062 "const x = (x = 20); function f1() {return x;}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002063
Ben Murdochc5610432016-08-08 18:44:38 +01002064 "const x = 10; x = 20; function f1() {return x;}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002065 };
2066
Ben Murdochc5610432016-08-08 18:44:38 +01002067 CHECK(CompareTexts(BuildActual(printer, snippets),
2068 LoadGolden("ConstVariableContextSlot.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002069}
2070
2071TEST(LetVariableContextSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01002072 InitializedIgnitionHandleScope scope;
2073 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2074 ConstantPoolType::kMixed);
2075 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002076 "let x = 10; function f1() {return x;}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002077
Ben Murdochc5610432016-08-08 18:44:38 +01002078 "let x = 10; function f1() {return x;} return x;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002079
Ben Murdochc5610432016-08-08 18:44:38 +01002080 "let x = (x = 20); function f1() {return x;}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002081
Ben Murdochc5610432016-08-08 18:44:38 +01002082 "let x = 10; x = 20; function f1() {return x;}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002083 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002084
Ben Murdochc5610432016-08-08 18:44:38 +01002085 CHECK(CompareTexts(BuildActual(printer, snippets),
2086 LoadGolden("LetVariableContextSlot.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002087}
2088
2089TEST(DoExpression) {
2090 bool old_flag = FLAG_harmony_do_expressions;
2091 FLAG_harmony_do_expressions = true;
2092
Ben Murdochda12d292016-06-02 14:46:10 +01002093 InitializedIgnitionHandleScope scope;
2094 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2095 ConstantPoolType::kString);
2096 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002097 "var a = do { }; return a;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002098
Ben Murdochc5610432016-08-08 18:44:38 +01002099 "var a = do { var x = 100; }; return a;\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002100
Ben Murdochc5610432016-08-08 18:44:38 +01002101 "while(true) { var a = 10; a = do { ++a; break; }; a = 20; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002102 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002103
Ben Murdochc5610432016-08-08 18:44:38 +01002104 CHECK(CompareTexts(BuildActual(printer, snippets),
2105 LoadGolden("DoExpression.golden")));
Ben Murdochda12d292016-06-02 14:46:10 +01002106
Ben Murdoch097c5b22016-05-18 11:27:45 +01002107 FLAG_harmony_do_expressions = old_flag;
2108}
2109
2110TEST(WithStatement) {
Ben Murdochda12d292016-06-02 14:46:10 +01002111 InitializedIgnitionHandleScope scope;
2112 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2113 ConstantPoolType::kMixed);
2114 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002115 "with ({x:42}) { return x; }\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002116 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002117
Ben Murdochc5610432016-08-08 18:44:38 +01002118 CHECK(CompareTexts(BuildActual(printer, snippets),
2119 LoadGolden("WithStatement.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002120}
2121
2122TEST(DoDebugger) {
Ben Murdochda12d292016-06-02 14:46:10 +01002123 InitializedIgnitionHandleScope scope;
2124 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2125 ConstantPoolType::kString);
2126 const char* snippets[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01002127 "debugger;\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002128 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002129
Ben Murdochc5610432016-08-08 18:44:38 +01002130 CHECK(CompareTexts(BuildActual(printer, snippets),
2131 LoadGolden("DoDebugger.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002132}
2133
Ben Murdoch097c5b22016-05-18 11:27:45 +01002134TEST(ClassDeclarations) {
Ben Murdochda12d292016-06-02 14:46:10 +01002135 InitializedIgnitionHandleScope scope;
2136 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2137 ConstantPoolType::kMixed);
2138 const char* snippets[] = {
2139 "class Person {\n"
2140 " constructor(name) { this.name = name; }\n"
2141 " speak() { console.log(this.name + ' is speaking.'); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01002142 "}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002143
Ben Murdochda12d292016-06-02 14:46:10 +01002144 "class person {\n"
2145 " constructor(name) { this.name = name; }\n"
2146 " speak() { console.log(this.name + ' is speaking.'); }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01002147 "}\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002148
Ben Murdochda12d292016-06-02 14:46:10 +01002149 "var n0 = 'a';\n"
2150 "var n1 = 'b';\n"
2151 "class N {\n"
2152 " [n0]() { return n0; }\n"
2153 " static [n1]() { return n1; }\n"
Ben Murdochc5610432016-08-08 18:44:38 +01002154 "}\n",
Ben Murdochda12d292016-06-02 14:46:10 +01002155
2156 "var count = 0;\n"
2157 "class C { constructor() { count++; }}\n"
2158 "return new C();\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002159 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002160
Ben Murdochc5610432016-08-08 18:44:38 +01002161 CHECK(CompareTexts(BuildActual(printer, snippets),
2162 LoadGolden("ClassDeclarations.golden")));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002163}
2164
Ben Murdochda12d292016-06-02 14:46:10 +01002165TEST(ClassAndSuperClass) {
2166 InitializedIgnitionHandleScope scope;
2167 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2168 ConstantPoolType::kMixed);
2169 printer.set_wrap(false);
2170 printer.set_test_function_name("test");
2171 const char* snippets[] = {
2172 "var test;\n"
2173 "(function() {\n"
2174 " class A {\n"
2175 " method() { return 2; }\n"
2176 " }\n"
2177 " class B extends A {\n"
2178 " method() { return super.method() + 1; }\n"
2179 " }\n"
2180 " test = new B().method;\n"
2181 " test();\n"
2182 "})();\n",
2183
2184 "var test;\n"
2185 "(function() {\n"
2186 " class A {\n"
2187 " get x() { return 1; }\n"
2188 " set x(val) { return; }\n"
2189 " }\n"
2190 " class B extends A {\n"
2191 " method() { super.x = 2; return super.x; }\n"
2192 " }\n"
2193 " test = new B().method;\n"
2194 " test();\n"
2195 "})();\n",
2196
2197 "var test;\n"
2198 "(function() {\n"
2199 " class A {\n"
2200 " constructor(x) { this.x_ = x; }\n"
2201 " }\n"
2202 " class B extends A {\n"
2203 " constructor() { super(1); this.y_ = 2; }\n"
2204 " }\n"
2205 " test = new B().constructor;\n"
2206 "})();\n",
2207
2208 "var test;\n"
2209 "(function() {\n"
2210 " class A {\n"
2211 " constructor() { this.x_ = 1; }\n"
2212 " }\n"
2213 " class B extends A {\n"
2214 " constructor() { super(); this.y_ = 2; }\n"
2215 " }\n"
2216 " test = new B().constructor;\n"
2217 "})();\n",
2218 };
2219
Ben Murdochc5610432016-08-08 18:44:38 +01002220 CHECK(CompareTexts(BuildActual(printer, snippets),
2221 LoadGolden("ClassAndSuperClass.golden")));
2222}
2223
2224TEST(Generators) {
2225 bool old_flag = FLAG_ignition_generators;
2226 FLAG_ignition_generators = true;
2227
2228 InitializedIgnitionHandleScope scope;
2229 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2230 ConstantPoolType::kMixed);
2231 printer.set_wrap(false);
2232 printer.set_test_function_name("f");
2233
2234 const char* snippets[] = {
Ben Murdoch61f157c2016-09-16 13:49:30 +01002235 "function* f() { }\n"
2236 "f();\n",
Ben Murdochc5610432016-08-08 18:44:38 +01002237
Ben Murdoch61f157c2016-09-16 13:49:30 +01002238 "function* f() { yield 42 }\n"
2239 "f();\n",
Ben Murdochc5610432016-08-08 18:44:38 +01002240
Ben Murdoch61f157c2016-09-16 13:49:30 +01002241 "function* f() { for (let x of [42]) yield x }\n"
2242 "f();\n",
Ben Murdochc5610432016-08-08 18:44:38 +01002243 };
2244
2245 CHECK(CompareTexts(BuildActual(printer, snippets),
2246 LoadGolden("Generators.golden")));
2247
2248 FLAG_ignition_generators = old_flag;
Ben Murdochda12d292016-06-02 14:46:10 +01002249}
Ben Murdoch097c5b22016-05-18 11:27:45 +01002250
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002251} // namespace interpreter
2252} // namespace internal
2253} // namespace v8