blob: 2519f25142a9065193b11a551cb83707331c97fd [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
116using ConstantPoolType = BytecodeExpectationsPrinter::ConstantPoolType;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117
118TEST(PrimitiveReturnStatements) {
Ben Murdochda12d292016-06-02 14:46:10 +0100119 InitializedIgnitionHandleScope scope;
120 BytecodeExpectationsPrinter printer(CcTest::isolate(),
121 ConstantPoolType::kNumber);
122 const char* snippets[] = {
123 "",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000124
Ben Murdochda12d292016-06-02 14:46:10 +0100125 "return;",
126
127 "return null;",
128
129 "return true;",
130
131 "return false;",
132
133 "return 0;",
134
135 "return +1;",
136
137 "return -1;",
138
139 "return +127;",
140
141 "return -128;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000142 };
143
Ben Murdochda12d292016-06-02 14:46:10 +0100144 CHECK_EQ(BuildActual(printer, snippets),
145 LoadGolden("PrimitiveReturnStatements.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146}
147
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148TEST(PrimitiveExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100149 InitializedIgnitionHandleScope scope;
150 BytecodeExpectationsPrinter printer(CcTest::isolate(),
151 ConstantPoolType::kNumber);
152 const char* snippets[] = {
153 "var x = 0; return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154
Ben Murdochda12d292016-06-02 14:46:10 +0100155 "var x = 0; return x + 3;",
156
157 "var x = 0; return x - 3;",
158
159 "var x = 4; return x * 3;",
160
161 "var x = 4; return x / 3;",
162
163 "var x = 4; return x % 3;",
164
165 "var x = 1; return x | 2;",
166
167 "var x = 1; return x ^ 2;",
168
169 "var x = 1; return x & 2;",
170
171 "var x = 10; return x << 3;",
172
173 "var x = 10; return x >> 3;",
174
175 "var x = 10; return x >>> 3;",
176
177 "var x = 0; return (x, 3);",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100178 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179
Ben Murdochda12d292016-06-02 14:46:10 +0100180 CHECK_EQ(BuildActual(printer, snippets),
181 LoadGolden("PrimitiveExpressions.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182}
183
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184TEST(LogicalExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100185 InitializedIgnitionHandleScope scope;
186 BytecodeExpectationsPrinter printer(CcTest::isolate(),
187 ConstantPoolType::kNumber);
188 const char* snippets[] = {
189 "var x = 0; return x || 3;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190
Ben Murdochda12d292016-06-02 14:46:10 +0100191 "var x = 0; return (x == 1) || 3;",
192
193 "var x = 0; return x && 3;",
194
195 "var x = 0; return (x == 0) && 3;",
196
197 "var x = 0; return x || (1, 2, 3);",
198
199 "var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);",
200
201 "var x = 1; var a = 2, b = 3; return x || (" //
202 REPEAT_32("\n a = 1, b = 2, ") //
203 "3);",
204
205 "var x = 0; var a = 2, b = 3; return x && (" //
206 REPEAT_32("\n a = 1, b = 2, ") //
207 "3);",
208
209 "var x = 1; var a = 2, b = 3; return (x > 3) || (" //
210 REPEAT_32("\n a = 1, b = 2, ") //
211 "3);",
212
213 "var x = 0; var a = 2, b = 3; return (x < 5) && (" //
214 REPEAT_32("\n a = 1, b = 2, ") //
215 "3);",
216
217 "return 0 && 3;",
218
219 "return 1 || 3;",
220
221 "var x = 1; return x && 3 || 0, 1;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100222 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000223
Ben Murdochda12d292016-06-02 14:46:10 +0100224 CHECK_EQ(BuildActual(printer, snippets),
225 LoadGolden("LogicalExpressions.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000226}
227
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228TEST(Parameters) {
Ben Murdochda12d292016-06-02 14:46:10 +0100229 InitializedIgnitionHandleScope scope;
230 BytecodeExpectationsPrinter printer(CcTest::isolate(),
231 ConstantPoolType::kNumber);
232 printer.set_wrap(false);
233 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000234
Ben Murdochda12d292016-06-02 14:46:10 +0100235 const char* snippets[] = {
236 "function f() { return this; }",
237
238 "function f(arg1) { return arg1; }",
239
240 "function f(arg1) { return this; }",
241
242 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }",
243
244 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }",
245
246 "function f(arg1) { arg1 = 1; }",
247
248 "function f(arg1, arg2, arg3, arg4) { arg2 = 1; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 };
250
Ben Murdochda12d292016-06-02 14:46:10 +0100251 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
252 LoadGolden("Parameters.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253}
254
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255TEST(IntegerConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100256 InitializedIgnitionHandleScope scope;
257 BytecodeExpectationsPrinter printer(CcTest::isolate(),
258 ConstantPoolType::kNumber);
259 const char* snippets[] = {
260 "return 12345678;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000261
Ben Murdochda12d292016-06-02 14:46:10 +0100262 "var a = 1234; return 5678;",
263
264 "var a = 1234; return 1234;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100265 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266
Ben Murdochda12d292016-06-02 14:46:10 +0100267 CHECK_EQ(BuildActual(printer, snippets),
268 LoadGolden("IntegerConstants.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000269}
270
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000271TEST(HeapNumberConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100272 InitializedIgnitionHandleScope scope;
273 BytecodeExpectationsPrinter printer(CcTest::isolate(),
274 ConstantPoolType::kNumber);
275 const char* snippets[] = {
276 "return 1.2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000277
Ben Murdochda12d292016-06-02 14:46:10 +0100278 "var a = 1.2; return 2.6;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279
Ben Murdochda12d292016-06-02 14:46:10 +0100280 "var a = 3.14; return 3.14;",
281
282 "var a;" //
283 REPEAT_256("\na = 1.414;") //
284 " a = 3.14;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100286
Ben Murdochda12d292016-06-02 14:46:10 +0100287 CHECK_EQ(BuildActual(printer, snippets),
288 LoadGolden("HeapNumberConstants.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289}
290
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291TEST(StringConstants) {
Ben Murdochda12d292016-06-02 14:46:10 +0100292 InitializedIgnitionHandleScope scope;
293 BytecodeExpectationsPrinter printer(CcTest::isolate(),
294 ConstantPoolType::kString);
295 const char* snippets[] = {
296 "return \"This is a string\";",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297
Ben Murdochda12d292016-06-02 14:46:10 +0100298 "var a = \"First string\"; return \"Second string\";",
299
300 "var a = \"Same string\"; return \"Same string\";",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100301 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302
Ben Murdochda12d292016-06-02 14:46:10 +0100303 CHECK_EQ(BuildActual(printer, snippets),
304 LoadGolden("StringConstants.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305}
306
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307TEST(PropertyLoads) {
Ben Murdochda12d292016-06-02 14:46:10 +0100308 InitializedIgnitionHandleScope scope;
309 BytecodeExpectationsPrinter printer(CcTest::isolate(),
310 ConstantPoolType::kString);
311 printer.set_wrap(false);
312 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313
Ben Murdochda12d292016-06-02 14:46:10 +0100314 const char* snippets[] = {
315 "function f(a) { return a.name; }\n"
316 "f({name : \"test\"});",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000317
Ben Murdochda12d292016-06-02 14:46:10 +0100318 "function f(a) { return a[\"key\"]; }\n"
319 "f({key : \"test\"});",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000320
Ben Murdochda12d292016-06-02 14:46:10 +0100321 "function f(a) { return a[100]; }\n"
322 "f({100 : \"test\"});",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000323
Ben Murdochda12d292016-06-02 14:46:10 +0100324 "function f(a, b) { return a[b]; }\n"
325 "f({arg : \"test\"}, \"arg\");",
326
327 "function f(a) { var b = a.name; return a[-124]; }\n"
328 "f({\"-124\" : \"test\", name : 123 })",
329
330 "function f(a) {\n"
331 " var b;\n"
332 " b = a.name;\n"
333 REPEAT_127(" b = a.name;\n")
334 " return a.name;\n"
335 "}\n"
336 "f({name : \"test\"})\n",
337
338 "function f(a, b) {\n"
339 " var c;\n"
340 " c = a[b];\n"
341 REPEAT_127(" c = a[b];\n")
342 " return a[b];\n"
343 "}\n"
344 "f({name : \"test\"}, \"name\")\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100346
Ben Murdochda12d292016-06-02 14:46:10 +0100347 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyLoads.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000348}
349
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000350TEST(PropertyStores) {
Ben Murdochda12d292016-06-02 14:46:10 +0100351 InitializedIgnitionHandleScope scope;
352 BytecodeExpectationsPrinter printer(CcTest::isolate(),
353 ConstantPoolType::kString);
354 printer.set_wrap(false);
355 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356
Ben Murdochda12d292016-06-02 14:46:10 +0100357 const char* snippets[] = {
358 "function f(a) { a.name = \"val\"; }\n"
359 "f({name : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360
Ben Murdochda12d292016-06-02 14:46:10 +0100361 "function f(a) { a[\"key\"] = \"val\"; }\n"
362 "f({key : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000363
Ben Murdochda12d292016-06-02 14:46:10 +0100364 "function f(a) { a[100] = \"val\"; }\n"
365 "f({100 : \"test\"})",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000366
Ben Murdochda12d292016-06-02 14:46:10 +0100367 "function f(a, b) { a[b] = \"val\"; }\n"
368 "f({arg : \"test\"}, \"arg\")",
369
370 "function f(a) { a.name = a[-124]; }\n"
371 "f({\"-124\" : \"test\", name : 123 })",
372
373 "function f(a) { \"use strict\"; a.name = \"val\"; }\n"
374 "f({name : \"test\"})",
375
376 "function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n"
377 "f({arg : \"test\"}, \"arg\")",
378
379 "function f(a) {\n"
380 " a.name = 1;\n"
381 REPEAT_127(" a.name = 1;\n")
382 " a.name = 2;\n"
383 "}\n"
384 "f({name : \"test\"})\n",
385
386 "function f(a) {\n"
387 " 'use strict';\n"
388 " a.name = 1;\n"
389 REPEAT_127(" a.name = 1;\n")
390 " a.name = 2;\n"
391 "}\n"
392 "f({name : \"test\"})\n",
393
394 "function f(a, b) {\n"
395 " a[b] = 1;\n"
396 REPEAT_127(" a[b] = 1;\n")
397 " a[b] = 2;\n"
398 "}\n"
399 "f({name : \"test\"})\n",
400
401 "function f(a, b) {\n"
402 " 'use strict';\n"
403 " a[b] = 1;\n"
404 REPEAT_127(" a[b] = 1;\n")
405 " a[b] = 2;\n"
406 "}\n"
407 "f({name : \"test\"})\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100408 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100409
Ben Murdochda12d292016-06-02 14:46:10 +0100410 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyStores.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000411}
412
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000413#define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()"
414
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000415TEST(PropertyCall) {
Ben Murdochda12d292016-06-02 14:46:10 +0100416 InitializedIgnitionHandleScope scope;
417 BytecodeExpectationsPrinter printer(CcTest::isolate(),
418 ConstantPoolType::kString);
419 printer.set_wrap(false);
420 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000421
Ben Murdochda12d292016-06-02 14:46:10 +0100422 const char* snippets[] = {
423 "function f(a) { return a.func(); }\n"
424 "f(" FUNC_ARG ")",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425
Ben Murdochda12d292016-06-02 14:46:10 +0100426 "function f(a, b, c) { return a.func(b, c); }\n"
427 "f(" FUNC_ARG ", 1, 2)",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000428
Ben Murdochda12d292016-06-02 14:46:10 +0100429 "function f(a, b) { return a.func(b + b, b); }\n"
430 "f(" FUNC_ARG ", 1)",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000431
Ben Murdochda12d292016-06-02 14:46:10 +0100432 "function f(a) {\n"
433 " a.func;\n" //
434 REPEAT_127(" a.func;\n") //
435 " return a.func(); }\n"
436 "f(" FUNC_ARG ")",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000437 };
Ben Murdoch097c5b22016-05-18 11:27:45 +0100438
Ben Murdochda12d292016-06-02 14:46:10 +0100439 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyCall.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000440}
441
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000442TEST(LoadGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100443 InitializedIgnitionHandleScope scope;
444 BytecodeExpectationsPrinter printer(CcTest::isolate(),
445 ConstantPoolType::kString);
446 printer.set_wrap(false);
447 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000448
Ben Murdochda12d292016-06-02 14:46:10 +0100449 const char* snippets[] = {
450 "var a = 1;\n"
451 "function f() { return a; }\n"
452 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453
Ben Murdochda12d292016-06-02 14:46:10 +0100454 "function t() { }\n"
455 "function f() { return t; }\n"
456 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000457
Ben Murdochda12d292016-06-02 14:46:10 +0100458 "a = 1;\n"
459 "function f() { return a; }\n"
460 "f()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000461
Ben Murdochda12d292016-06-02 14:46:10 +0100462 "a = 1;\n"
463 "function f(b) {\n"
464 " b.name;\n"
465 REPEAT_127(" b.name;\n")
466 " return a;\n"
467 "}\n"
468 "f({name: 1});",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000469 };
470
Ben Murdochda12d292016-06-02 14:46:10 +0100471 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LoadGlobal.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000472}
473
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000474TEST(StoreGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100475 InitializedIgnitionHandleScope scope;
476 BytecodeExpectationsPrinter printer(CcTest::isolate(),
477 ConstantPoolType::kString);
478 printer.set_wrap(false);
479 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000480
Ben Murdochda12d292016-06-02 14:46:10 +0100481 const char* snippets[] = {
482 "var a = 1;\n"
483 "function f() { a = 2; }\n"
484 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000485
Ben Murdochda12d292016-06-02 14:46:10 +0100486 "var a = \"test\"; function f(b) { a = b; }\n"
487 "f(\"global\");",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000488
Ben Murdochda12d292016-06-02 14:46:10 +0100489 "'use strict'; var a = 1;\n"
490 "function f() { a = 2; }\n"
491 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000492
Ben Murdochda12d292016-06-02 14:46:10 +0100493 "a = 1;\n"
494 "function f() { a = 2; }\n"
495 "f();",
496
497 "a = 1;\n"
498 "function f(b) {\n"
499 " b.name;\n"
500 REPEAT_127(" b.name;\n")
501 " a = 2;\n"
502 "}\n"
503 "f({name: 1});",
504
505 "a = 1;\n"
506 "function f(b) {\n"
507 " 'use strict';\n"
508 " b.name;\n"
509 REPEAT_127(" b.name;\n")
510 " a = 2;\n"
511 "}\n"
512 "f({name: 1});",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000513 };
514
Ben Murdochda12d292016-06-02 14:46:10 +0100515 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("StoreGlobal.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000516}
517
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000518TEST(CallGlobal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100519 InitializedIgnitionHandleScope scope;
520 BytecodeExpectationsPrinter printer(CcTest::isolate(),
521 ConstantPoolType::kString);
522 printer.set_wrap(false);
523 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000524
Ben Murdochda12d292016-06-02 14:46:10 +0100525 const char* snippets[] = {
526 "function t() { }\n"
527 "function f() { return t(); }\n"
528 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000529
Ben Murdochda12d292016-06-02 14:46:10 +0100530 "function t(a, b, c) { }\n"
531 "function f() { return t(1, 2, 3); }\n"
532 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000533 };
534
Ben Murdochda12d292016-06-02 14:46:10 +0100535 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallGlobal.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000536}
537
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000538TEST(CallRuntime) {
Ben Murdochda12d292016-06-02 14:46:10 +0100539 InitializedIgnitionHandleScope scope;
540 BytecodeExpectationsPrinter printer(CcTest::isolate(),
541 ConstantPoolType::kMixed);
542 printer.set_wrap(false);
543 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000544
Ben Murdochda12d292016-06-02 14:46:10 +0100545 const char* snippets[] = {
546 "function f() { %TheHole() }\n"
547 "f();",
548
549 "function f(a) { return %IsArray(a) }\n"
550 "f(undefined);",
551
552 "function f() { return %Add(1, 2) }\n"
553 "f();",
554
555 "function f() { return %spread_iterable([1]) }\n"
556 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000557 };
558
Ben Murdochda12d292016-06-02 14:46:10 +0100559 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallRuntime.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000560}
561
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000562TEST(IfConditions) {
Ben Murdochda12d292016-06-02 14:46:10 +0100563 if (FLAG_harmony_instanceof) {
564 // TODO(mvstanton): when ES6 instanceof ships, regenerate the bytecode
565 // expectations and remove this flag check.
566 return;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000567 }
Ben Murdochda12d292016-06-02 14:46:10 +0100568 InitializedIgnitionHandleScope scope;
569 BytecodeExpectationsPrinter printer(CcTest::isolate(),
570 ConstantPoolType::kNumber);
571 printer.set_wrap(false);
572 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000573
Ben Murdochda12d292016-06-02 14:46:10 +0100574 const char* snippets[] = {
575 "function f() {\n"
576 " if (0) {\n"
577 " return 1;\n"
578 " } else {\n"
579 " return -1;\n"
580 " }\n"
581 "};\n"
582 "f();",
583
584 "function f() {\n"
585 " if ('lucky') {\n"
586 " return 1;\n"
587 " } else {\n"
588 " return -1;\n"
589 " }\n"
590 "};\n"
591 "f();",
592
593 "function f() {\n"
594 " if (false) {\n"
595 " return 1;\n"
596 " } else {\n"
597 " return -1;\n"
598 " }\n"
599 "};\n"
600 "f();",
601
602 "function f() {\n"
603 " if (false) {\n"
604 " return 1;\n"
605 " }\n"
606 "};\n"
607 "f();",
608
609 "function f() {\n"
610 " var a = 1;\n"
611 " if (a) {\n"
612 " a += 1;\n"
613 " } else {\n"
614 " return 2;\n"
615 " }\n"
616 "};\n"
617 "f();",
618
619 "function f(a) {\n"
620 " if (a <= 0) {\n"
621 " return 200;\n"
622 " } else {\n"
623 " return -200;\n"
624 " }\n"
625 "};\n"
626 "f(99);",
627
628 "function f(a, b) { if (a in b) { return 200; } }"
629 "f('prop', { prop: 'yes'});",
630
631 "function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n"
632 REPEAT_64(" b = a; a = b;\n")
633 " return 200; } else { return -200; } } f(0.001);",
634
635 "function f() {\n"
636 " var a = 0; var b = 0;\n"
637 " if (a) {\n"
638 REPEAT_64(" b = a; a = b;\n")
639 " return 200; } else { return -200; }\n"
640 "};\n"
641 "f();",
642
643 "function f(a, b) {\n"
644 " if (a == b) { return 1; }\n"
645 " if (a === b) { return 1; }\n"
646 " if (a < b) { return 1; }\n"
647 " if (a > b) { return 1; }\n"
648 " if (a <= b) { return 1; }\n"
649 " if (a >= b) { return 1; }\n"
650 " if (a in b) { return 1; }\n"
651 " if (a instanceof b) { return 1; }\n"
652 " return 0;\n"
653 "}\n"
654 "f(1, 1);",
655
656 "function f() {\n"
657 " var a = 0;\n"
658 " if (a) {\n"
659 " return 20;\n"
660 " } else {\n"
661 " return -20;\n"
662 " }\n"
663 "};\n"
664 "f();",
665 };
666
667 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("IfConditions.golden"));
668}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000669
670TEST(DeclareGlobals) {
Ben Murdochda12d292016-06-02 14:46:10 +0100671 InitializedIgnitionHandleScope scope;
672 BytecodeExpectationsPrinter printer(CcTest::isolate(),
673 ConstantPoolType::kMixed);
674 printer.set_wrap(false);
675 printer.set_test_function_name("f");
676 printer.set_execute(false);
677 printer.set_top_level(true);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000678
Ben Murdochda12d292016-06-02 14:46:10 +0100679 const char* snippets[] = {
680 "var a = 1;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000681
Ben Murdochda12d292016-06-02 14:46:10 +0100682 "function f() {}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000683
Ben Murdochda12d292016-06-02 14:46:10 +0100684 "var a = 1;\n"
685 "a=2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000686
Ben Murdochda12d292016-06-02 14:46:10 +0100687 "function f() {}\n"
688 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000689 };
690
Ben Murdochda12d292016-06-02 14:46:10 +0100691 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DeclareGlobals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000692}
693
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000694TEST(BreakableBlocks) {
Ben Murdochda12d292016-06-02 14:46:10 +0100695 InitializedIgnitionHandleScope scope;
696 BytecodeExpectationsPrinter printer(CcTest::isolate(),
697 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000698
Ben Murdochda12d292016-06-02 14:46:10 +0100699 const char* snippets[] = {
700 "var x = 0;\n"
701 "label: {\n"
702 " x = x + 1;\n"
703 " break label;\n"
704 " x = x + 1;\n"
705 "}\n"
706 "return x;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100707
Ben Murdochda12d292016-06-02 14:46:10 +0100708 "var sum = 0;\n"
709 "outer: {\n"
710 " for (var x = 0; x < 10; ++x) {\n"
711 " for (var y = 0; y < 3; ++y) {\n"
712 " ++sum;\n"
713 " if (x + y == 12) { break outer; }\n"
714 " }\n"
715 " }\n"
716 "}\n"
717 "return sum;",
718
719 "outer: {\n"
720 " let y = 10;\n"
721 " function f() { return y; }\n"
722 " break outer;\n"
723 "}\n",
724
725 "let x = 1;\n"
726 "outer: {\n"
727 " inner: {\n"
728 " let y = 2;\n"
729 " function f() { return x + y; }\n"
730 " if (y) break outer;\n"
731 " y = 3;\n"
732 " }\n"
733 "}\n"
734 "x = 4;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000735 };
736
Ben Murdochda12d292016-06-02 14:46:10 +0100737 CHECK_EQ(BuildActual(printer, snippets),
738 LoadGolden("BreakableBlocks.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000739}
740
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000741TEST(BasicLoops) {
Ben Murdochda12d292016-06-02 14:46:10 +0100742 InitializedIgnitionHandleScope scope;
743 BytecodeExpectationsPrinter printer(CcTest::isolate(),
744 ConstantPoolType::kMixed);
745 const char* snippets[] = {
746 "var x = 0;\n"
747 "while (false) { x = 99; break; continue; }\n"
748 "return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000749
Ben Murdochda12d292016-06-02 14:46:10 +0100750 "var x = 0;\n"
751 "while (false) {\n"
752 " x = x + 1;\n"
753 "};\n"
754 "return x;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100755
Ben Murdochda12d292016-06-02 14:46:10 +0100756 "var x = 0;\n"
757 "var y = 1;\n"
758 "while (x < 10) {\n"
759 " y = y * 12;\n"
760 " x = x + 1;\n"
761 " if (x == 3) continue;\n"
762 " if (x == 4) break;\n"
763 "}\n"
764 "return y;",
765
766 "var i = 0;\n"
767 "while (true) {\n"
768 " if (i < 0) continue;\n"
769 " if (i == 3) break;\n"
770 " if (i == 4) break;\n"
771 " if (i == 10) continue;\n"
772 " if (i == 5) break;\n"
773 " i = i + 1;\n"
774 "}\n"
775 "return i;",
776
777 "var i = 0;\n"
778 "while (true) {\n"
779 " while (i < 3) {\n"
780 " if (i == 2) break;\n"
781 " i = i + 1;\n"
782 " }\n"
783 " i = i + 1;\n"
784 " break;\n"
785 "}\n"
786 "return i;",
787
788 "var x = 10;\n"
789 "var y = 1;\n"
790 "while (x) {\n"
791 " y = y * 12;\n"
792 " x = x - 1;\n"
793 "}\n"
794 "return y;",
795
796 "var x = 0; var y = 1;\n"
797 "do {\n"
798 " y = y * 10;\n"
799 " if (x == 5) break;\n"
800 " if (x == 6) continue;\n"
801 " x = x + 1;\n"
802 "} while (x < 10);\n"
803 "return y;",
804
805 "var x = 10;\n"
806 "var y = 1;\n"
807 "do {\n"
808 " y = y * 12;\n"
809 " x = x - 1;\n"
810 "} while (x);\n"
811 "return y;",
812
813 "var x = 0; var y = 1;\n"
814 "do {\n"
815 " y = y * 10;\n"
816 " if (x == 5) break;\n"
817 " x = x + 1;\n"
818 " if (x == 6) continue;\n"
819 "} while (false);\n"
820 "return y;",
821
822 "var x = 0; var y = 1;\n"
823 "do {\n"
824 " y = y * 10;\n"
825 " if (x == 5) break;\n"
826 " x = x + 1;\n"
827 " if (x == 6) continue;\n"
828 "} while (true);\n"
829 "return y;",
830
831 "var x = 0;\n"
832 "for (;;) {\n"
833 " if (x == 1) break;\n"
834 " if (x == 2) continue;\n"
835 " x = x + 1;\n"
836 "}",
837
838 "for (var x = 0;;) {\n"
839 " if (x == 1) break;\n"
840 " if (x == 2) continue;\n"
841 " x = x + 1;\n"
842 "}",
843
844 "var x = 0;\n"
845 "for (;; x = x + 1) {\n"
846 " if (x == 1) break;\n"
847 " if (x == 2) continue;\n"
848 "}",
849
850 "for (var x = 0;; x = x + 1) {\n"
851 " if (x == 1) break;\n"
852 " if (x == 2) continue;\n"
853 "}",
854
855 "var u = 0;\n"
856 "for (var i = 0; i < 100; i = i + 1) {\n"
857 " u = u + 1;\n"
858 " continue;\n"
859 "}",
860
861 "var y = 1;\n"
862 "for (var x = 10; x; --x) {\n"
863 " y = y * 12;\n"
864 "}\n"
865 "return y;",
866
867 "var x = 0;\n"
868 "for (var i = 0; false; i++) {\n"
869 " x = x + 1;\n"
870 "};\n"
871 "return x;",
872
873 "var x = 0;\n"
874 "for (var i = 0; true; ++i) {\n"
875 " x = x + 1;\n"
876 " if (x == 20) break;\n"
877 "};\n"
878 "return x;",
879
880 "var a = 0;\n"
881 "while (a) {\n"
882 " { \n"
883 " let z = 1;\n"
884 " function f() { z = 2; }\n"
885 " if (z) continue;\n"
886 " z++;\n"
887 " }\n"
888 "}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000889 };
890
Ben Murdochda12d292016-06-02 14:46:10 +0100891 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("BasicLoops.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000892}
893
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000894TEST(JumpsRequiringConstantWideOperands) {
Ben Murdochda12d292016-06-02 14:46:10 +0100895 InitializedIgnitionHandleScope scope;
896 BytecodeExpectationsPrinter printer(CcTest::isolate(),
897 ConstantPoolType::kNumber);
898 const char* snippets[] = {
899 REPEAT_256("var x = 0.1;\n")
900 REPEAT_32("var x = 0.2;\n")
901 REPEAT_16("var x = 0.3;\n")
902 REPEAT_8("var x = 0.4;\n")
903 "for (var i = 0; i < 3; i++) {\n"
904 " if (i == 1) continue;\n"
905 " if (i == 2) break;\n"
906 "}\n"
907 "return 3;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100908 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000909
Ben Murdochda12d292016-06-02 14:46:10 +0100910 CHECK_EQ(BuildActual(printer, snippets),
911 LoadGolden("JumpsRequiringConstantWideOperands.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000912}
913
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000914TEST(UnaryOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +0100915 InitializedIgnitionHandleScope scope;
916 BytecodeExpectationsPrinter printer(CcTest::isolate(),
917 ConstantPoolType::kNumber);
918 const char* snippets[] = {
919 "var x = 0;\n"
920 "while (x != 10) {\n"
921 " x = x + 10;\n"
922 "}\n"
923 "return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000924
Ben Murdochda12d292016-06-02 14:46:10 +0100925 "var x = false;\n"
926 "do {\n"
927 " x = !x;\n"
928 "} while(x == false);\n"
929 "return x;",
930
931 "var x = 101;\n"
932 "return void(x * 3);",
933
934 "var x = 1234;\n"
935 "var y = void (x * x - 1);\n"
936 "return y;",
937
938 "var x = 13;\n"
939 "return ~x;",
940
941 "var x = 13;\n"
942 "return +x;",
943
944 "var x = 13;\n"
945 "return -x;",
Ben Murdoch097c5b22016-05-18 11:27:45 +0100946 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000947
Ben Murdochda12d292016-06-02 14:46:10 +0100948 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("UnaryOperators.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000949}
950
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000951TEST(Typeof) {
Ben Murdochda12d292016-06-02 14:46:10 +0100952 InitializedIgnitionHandleScope scope;
953 BytecodeExpectationsPrinter printer(CcTest::isolate(),
954 ConstantPoolType::kString);
955 printer.set_wrap(false);
956 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000957
Ben Murdochda12d292016-06-02 14:46:10 +0100958 const char* snippets[] = {
959 "function f() {\n"
960 " var x = 13;\n"
961 " return typeof(x);\n"
962 "};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000963
Ben Murdochda12d292016-06-02 14:46:10 +0100964 "var x = 13;\n"
965 "function f() {\n"
966 " return typeof(x);\n"
967 "};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000968 };
969
Ben Murdochda12d292016-06-02 14:46:10 +0100970 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
971 LoadGolden("Typeof.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000972}
973
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000974TEST(Delete) {
Ben Murdochda12d292016-06-02 14:46:10 +0100975 InitializedIgnitionHandleScope scope;
976 BytecodeExpectationsPrinter printer(CcTest::isolate(),
977 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000978
Ben Murdochda12d292016-06-02 14:46:10 +0100979 const char* snippets[] = {
980 "var a = {x:13, y:14}; return delete a.x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000981
Ben Murdochda12d292016-06-02 14:46:10 +0100982 "'use strict'; var a = {x:13, y:14}; return delete a.x;",
983
984 "var a = {1:13, 2:14}; return delete a[2];",
985
986 "var a = 10; return delete a;",
987
988 "'use strict';\n"
989 "var a = {1:10};\n"
990 "(function f1() {return a;});\n"
991 "return delete a[1];",
992
993 "return delete 'test';",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000994 };
995
Ben Murdochda12d292016-06-02 14:46:10 +0100996 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Delete.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000997}
998
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000999TEST(GlobalDelete) {
Ben Murdochda12d292016-06-02 14:46:10 +01001000 InitializedIgnitionHandleScope scope;
1001 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1002 ConstantPoolType::kMixed);
1003 printer.set_wrap(false);
1004 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001005
Ben Murdochda12d292016-06-02 14:46:10 +01001006 const char* snippets[] = {
1007 "var a = {x:13, y:14};\n"
1008 "function f() {\n"
1009 " return delete a.x;\n"
1010 "};\n"
1011 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001012
Ben Murdochda12d292016-06-02 14:46:10 +01001013 "a = {1:13, 2:14};\n"
1014 "function f() {\n"
1015 " 'use strict';\n"
1016 " return delete a[1];\n"
1017 "};\n"
1018 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001019
Ben Murdochda12d292016-06-02 14:46:10 +01001020 "var a = {x:13, y:14};\n"
1021 "function f() {\n"
1022 " return delete a;\n"
1023 "};\n"
1024 "f();",
1025
1026 "b = 30;\n"
1027 "function f() {\n"
1028 " return delete b;\n"
1029 "};\n"
1030 "f();",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001031 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001032
Ben Murdochda12d292016-06-02 14:46:10 +01001033 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("GlobalDelete.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001034}
1035
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001036TEST(FunctionLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001037 InitializedIgnitionHandleScope scope;
1038 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1039 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001040
Ben Murdochda12d292016-06-02 14:46:10 +01001041 const char* snippets[] = {
1042 "return function(){ }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001043
Ben Murdochda12d292016-06-02 14:46:10 +01001044 "return (function(){ })()",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001045
Ben Murdochda12d292016-06-02 14:46:10 +01001046 "return (function(x){ return x; })(1)",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001047 };
1048
Ben Murdochda12d292016-06-02 14:46:10 +01001049 CHECK_EQ(BuildActual(printer, snippets),
1050 LoadGolden("FunctionLiterals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001051}
1052
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001053TEST(RegExpLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001054 InitializedIgnitionHandleScope scope;
1055 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1056 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001057
Ben Murdochda12d292016-06-02 14:46:10 +01001058 const char* snippets[] = {
1059 "return /ab+d/;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001060
Ben Murdochda12d292016-06-02 14:46:10 +01001061 "return /(\\w+)\\s(\\w+)/i;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001062
Ben Murdochda12d292016-06-02 14:46:10 +01001063 "return /ab+d/.exec('abdd');",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001064 };
1065
Ben Murdochda12d292016-06-02 14:46:10 +01001066 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("RegExpLiterals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001067}
1068
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001069TEST(RegExpLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001070 InitializedIgnitionHandleScope scope;
1071 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1072 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001073
Ben Murdochda12d292016-06-02 14:46:10 +01001074 const char* snippets[] = {
1075 "var a;" //
1076 REPEAT_256("\na = 1.23;") //
1077 "\nreturn /ab+d/;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001078 };
1079
Ben Murdochda12d292016-06-02 14:46:10 +01001080 CHECK_EQ(BuildActual(printer, snippets),
1081 LoadGolden("RegExpLiteralsWide.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001082}
1083
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001084TEST(ArrayLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001085 InitializedIgnitionHandleScope scope;
1086 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1087 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001088
Ben Murdochda12d292016-06-02 14:46:10 +01001089 const char* snippets[] = {
1090 "return [ 1, 2 ];",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001091
Ben Murdochda12d292016-06-02 14:46:10 +01001092 "var a = 1; return [ a, a + 1 ];",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001093
Ben Murdochda12d292016-06-02 14:46:10 +01001094 "return [ [ 1, 2 ], [ 3 ] ];",
1095
1096 "var a = 1; return [ [ a, 2 ], [ a + 2 ] ];",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001097 };
1098
Ben Murdochda12d292016-06-02 14:46:10 +01001099 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ArrayLiterals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001100}
1101
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001102TEST(ArrayLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001103 InitializedIgnitionHandleScope scope;
1104 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1105 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001106
Ben Murdochda12d292016-06-02 14:46:10 +01001107 const char* snippets[] = {
1108 "var a;" //
1109 REPEAT_256("\na = 1.23;") //
1110 "\nreturn [ 1 , 2 ];",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001111 };
1112
Ben Murdochda12d292016-06-02 14:46:10 +01001113 CHECK_EQ(BuildActual(printer, snippets),
1114 LoadGolden("ArrayLiteralsWide.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001115}
1116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001117TEST(ObjectLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001118 InitializedIgnitionHandleScope scope;
1119 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1120 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001121
Ben Murdochda12d292016-06-02 14:46:10 +01001122 const char* snippets[] = {
1123 "return { };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001124
Ben Murdochda12d292016-06-02 14:46:10 +01001125 "return { name: 'string', val: 9.2 };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001126
Ben Murdochda12d292016-06-02 14:46:10 +01001127 "var a = 1; return { name: 'string', val: a };",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001128
Ben Murdochda12d292016-06-02 14:46:10 +01001129 "var a = 1; return { val: a, val: a + 1 };",
1130
1131 "return { func: function() { } };",
1132
1133 "return { func(a) { return a; } };",
1134
1135 "return { get a() { return 2; } };",
1136
1137 "return { get a() { return this.x; }, set a(val) { this.x = val } };",
1138
1139 "return { set b(val) { this.y = val } };",
1140
1141 "var a = 1; return { 1: a };",
1142
1143 "return { __proto__: null };",
1144
1145 "var a = 'test'; return { [a]: 1 };",
1146
1147 "var a = 'test'; return { val: a, [a]: 1 };",
1148
1149 "var a = 'test'; return { [a]: 1, __proto__: {} };",
1150
1151 "var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001152 };
1153
Ben Murdochda12d292016-06-02 14:46:10 +01001154 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ObjectLiterals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001155}
1156
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001157TEST(ObjectLiteralsWide) {
Ben Murdochda12d292016-06-02 14:46:10 +01001158 InitializedIgnitionHandleScope scope;
1159 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1160 ConstantPoolType::kMixed);
1161 const char* snippets[] = {
1162 "var a;" //
1163 REPEAT_256("\na = 1.23;") //
1164 "\nreturn { name: 'string', val: 9.2 };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001165 };
1166
Ben Murdochda12d292016-06-02 14:46:10 +01001167 CHECK_EQ(BuildActual(printer, snippets),
1168 LoadGolden("ObjectLiteralsWide.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001169}
1170
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001171TEST(TopLevelObjectLiterals) {
Ben Murdochda12d292016-06-02 14:46:10 +01001172 InitializedIgnitionHandleScope scope;
1173 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1174 ConstantPoolType::kMixed);
1175 printer.set_wrap(false);
1176 printer.set_test_function_name("f");
1177 printer.set_execute(false);
1178 printer.set_top_level(true);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001179
Ben Murdochda12d292016-06-02 14:46:10 +01001180 const char* snippets[] = {
1181 "var a = { func: function() { } };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001182 };
1183
Ben Murdochda12d292016-06-02 14:46:10 +01001184 CHECK_EQ(BuildActual(printer, snippets),
1185 LoadGolden("TopLevelObjectLiterals.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001186}
1187
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001188TEST(TryCatch) {
Ben Murdochda12d292016-06-02 14:46:10 +01001189 InitializedIgnitionHandleScope scope;
1190 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1191 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001192
Ben Murdochda12d292016-06-02 14:46:10 +01001193 const char* snippets[] = {
1194 "try { return 1; } catch(e) { return 2; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001195
Ben Murdochda12d292016-06-02 14:46:10 +01001196 "var a;\n"
1197 "try { a = 1 } catch(e1) {};\n"
1198 "try { a = 2 } catch(e2) { a = 3 }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001199 };
1200
Ben Murdochda12d292016-06-02 14:46:10 +01001201 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("TryCatch.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001202}
1203
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001204TEST(TryFinally) {
Ben Murdochda12d292016-06-02 14:46:10 +01001205 InitializedIgnitionHandleScope scope;
1206 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1207 ConstantPoolType::kString);
1208 const char* snippets[] = {
1209 "var a = 1;\n"
1210 "try { a = 2; } finally { a = 3; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001211
Ben Murdochda12d292016-06-02 14:46:10 +01001212 "var a = 1;\n"
1213 "try { a = 2; } catch(e) { a = 20 } finally { a = 3; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001214
Ben Murdochda12d292016-06-02 14:46:10 +01001215 "var a; try {\n"
1216 " try { a = 1 } catch(e) { a = 2 }\n"
1217 "} catch(e) { a = 20 } finally { a = 3; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001218 };
1219
Ben Murdochda12d292016-06-02 14:46:10 +01001220 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("TryFinally.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001221}
1222
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001223TEST(Throw) {
Ben Murdochda12d292016-06-02 14:46:10 +01001224 InitializedIgnitionHandleScope scope;
1225 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1226 ConstantPoolType::kString);
1227 const char* snippets[] = {
1228 "throw 1;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001229
Ben Murdochda12d292016-06-02 14:46:10 +01001230 "throw 'Error';",
1231
1232 "var a = 1; if (a) { throw 'Error'; };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001233 };
1234
Ben Murdochda12d292016-06-02 14:46:10 +01001235 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Throw.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001236}
1237
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001238TEST(CallNew) {
Ben Murdochda12d292016-06-02 14:46:10 +01001239 InitializedIgnitionHandleScope scope;
1240 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1241 ConstantPoolType::kMixed);
1242 printer.set_wrap(false);
1243 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001244
Ben Murdochda12d292016-06-02 14:46:10 +01001245 const char* snippets[] = {
1246 "function bar() { this.value = 0; }\n"
1247 "function f() { return new bar(); }\n"
1248 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001249
Ben Murdochda12d292016-06-02 14:46:10 +01001250 "function bar(x) { this.value = 18; this.x = x;}\n"
1251 "function f() { return new bar(3); }\n"
1252 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001253
Ben Murdochda12d292016-06-02 14:46:10 +01001254 "function bar(w, x, y, z) {\n"
1255 " this.value = 18;\n"
1256 " this.x = x;\n"
1257 " this.y = y;\n"
1258 " this.z = z;\n"
1259 "}\n"
1260 "function f() { return new bar(3, 4, 5); }\n"
1261 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001262 };
1263
Ben Murdochda12d292016-06-02 14:46:10 +01001264 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallNew.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001265}
1266
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001267TEST(ContextVariables) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001268 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this
1269 // ever changes, the REPEAT_XXX should be changed to output the correct number
1270 // of unique variables to trigger the wide slot load / store.
1271 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001272
Ben Murdochda12d292016-06-02 14:46:10 +01001273 InitializedIgnitionHandleScope scope;
1274 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1275 ConstantPoolType::kMixed);
1276 const char* snippets[] = {
1277 "var a; return function() { a = 1; };",
1278
1279 "var a = 1; return function() { a = 2; };",
1280
1281 "var a = 1; var b = 2; return function() { a = 2; b = 3 };",
1282
1283 "var a; (function() { a = 2; })(); return a;",
1284
1285 "'use strict';\n"
1286 "let a = 1;\n"
1287 "{ let b = 2; return function() { a + b; }; }",
1288
1289 "'use strict';\n"
1290 REPEAT_249_UNIQUE_VARS()
1291 "eval();\n"
1292 "var b = 100;\n"
1293 "return b",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001294 };
1295
Ben Murdochda12d292016-06-02 14:46:10 +01001296 CHECK_EQ(BuildActual(printer, snippets),
1297 LoadGolden("ContextVariables.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001298}
1299
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001300TEST(ContextParameters) {
Ben Murdochda12d292016-06-02 14:46:10 +01001301 InitializedIgnitionHandleScope scope;
1302 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1303 ConstantPoolType::kMixed);
1304 printer.set_wrap(false);
1305 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001306
Ben Murdochda12d292016-06-02 14:46:10 +01001307 const char* snippets[] = {
1308 "function f(arg1) { return function() { arg1 = 2; }; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001309
Ben Murdochda12d292016-06-02 14:46:10 +01001310 "function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }",
1311
1312 "function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }",
1313
1314 "function f() { var self = this; return function() { self = 2; }; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001315 };
1316
Ben Murdochda12d292016-06-02 14:46:10 +01001317 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
1318 LoadGolden("ContextParameters.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001319}
1320
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001321TEST(OuterContextVariables) {
Ben Murdochda12d292016-06-02 14:46:10 +01001322 InitializedIgnitionHandleScope scope;
1323 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1324 ConstantPoolType::kMixed);
1325 printer.set_wrap(false);
1326 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001327
Ben Murdochda12d292016-06-02 14:46:10 +01001328 const char* snippets[] = {
1329 "function Outer() {\n"
1330 " var outerVar = 1;\n"
1331 " function Inner(innerArg) {\n"
1332 " this.innerFunc = function() { return outerVar * innerArg; }\n"
1333 " }\n"
1334 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
1335 "}\n"
1336 "var f = new Outer().getInnerFunc();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001337
Ben Murdochda12d292016-06-02 14:46:10 +01001338 "function Outer() {\n"
1339 " var outerVar = 1;\n"
1340 " function Inner(innerArg) {\n"
1341 " this.innerFunc = function() { outerVar = innerArg; }\n"
1342 " }\n"
1343 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
1344 "}\n"
1345 "var f = new Outer().getInnerFunc();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001346 };
1347
Ben Murdochda12d292016-06-02 14:46:10 +01001348 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
1349 LoadGolden("OuterContextVariables.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001350}
1351
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001352TEST(CountOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +01001353 InitializedIgnitionHandleScope scope;
1354 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1355 ConstantPoolType::kMixed);
1356 const char* snippets[] = {
1357 "var a = 1; return ++a;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001358
Ben Murdochda12d292016-06-02 14:46:10 +01001359 "var a = 1; return a++;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001360
Ben Murdochda12d292016-06-02 14:46:10 +01001361 "var a = 1; return --a;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001362
Ben Murdochda12d292016-06-02 14:46:10 +01001363 "var a = 1; return a--;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001364
Ben Murdochda12d292016-06-02 14:46:10 +01001365 "var a = { val: 1 }; return a.val++;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001366
Ben Murdochda12d292016-06-02 14:46:10 +01001367 "var a = { val: 1 }; return --a.val;",
1368
1369 "var name = 'var'; var a = { val: 1 }; return a[name]--;",
1370
1371 "var name = 'var'; var a = { val: 1 }; return ++a[name];",
1372
1373 "var a = 1; var b = function() { return a }; return ++a;",
1374
1375 "var a = 1; var b = function() { return a }; return a--;",
1376
1377 "var idx = 1; var a = [1, 2]; return a[idx++] = 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001378 };
1379
Ben Murdochda12d292016-06-02 14:46:10 +01001380 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CountOperators.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001381}
1382
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001383TEST(GlobalCountOperators) {
Ben Murdochda12d292016-06-02 14:46:10 +01001384 InitializedIgnitionHandleScope scope;
1385 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1386 ConstantPoolType::kString);
1387 printer.set_wrap(false);
1388 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001389
Ben Murdochda12d292016-06-02 14:46:10 +01001390 const char* snippets[] = {
1391 "var global = 1;\n"
1392 "function f() { return ++global; }\n"
1393 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001394
Ben Murdochda12d292016-06-02 14:46:10 +01001395 "var global = 1;\n"
1396 "function f() { return global--; }\n"
1397 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001398
Ben Murdochda12d292016-06-02 14:46:10 +01001399 "unallocated = 1;\n"
1400 "function f() { 'use strict'; return --unallocated; }\n"
1401 "f();",
1402
1403 "unallocated = 1;\n"
1404 "function f() { return unallocated++; }\n"
1405 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001406 };
1407
Ben Murdochda12d292016-06-02 14:46:10 +01001408 CHECK_EQ(BuildActual(printer, snippets),
1409 LoadGolden("GlobalCountOperators.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001410}
1411
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001412TEST(CompoundExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +01001413 InitializedIgnitionHandleScope scope;
1414 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1415 ConstantPoolType::kMixed);
1416 const char* snippets[] = {
1417 "var a = 1; a += 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001418
Ben Murdochda12d292016-06-02 14:46:10 +01001419 "var a = 1; a /= 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001420
Ben Murdochda12d292016-06-02 14:46:10 +01001421 "var a = { val: 2 }; a.name *= 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001422
Ben Murdochda12d292016-06-02 14:46:10 +01001423 "var a = { 1: 2 }; a[1] ^= 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001424
Ben Murdochda12d292016-06-02 14:46:10 +01001425 "var a = 1; (function f() { return a; }); a |= 24;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001426 };
1427
Ben Murdochda12d292016-06-02 14:46:10 +01001428 CHECK_EQ(BuildActual(printer, snippets),
1429 LoadGolden("CompoundExpressions.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001430}
1431
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001432TEST(GlobalCompoundExpressions) {
Ben Murdochda12d292016-06-02 14:46:10 +01001433 InitializedIgnitionHandleScope scope;
1434 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1435 ConstantPoolType::kString);
1436 printer.set_wrap(false);
1437 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001438
Ben Murdochda12d292016-06-02 14:46:10 +01001439 const char* snippets[] = {
1440 "var global = 1;\n"
1441 "function f() { return global &= 1; }\n"
1442 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001443
Ben Murdochda12d292016-06-02 14:46:10 +01001444 "unallocated = 1;\n"
1445 "function f() { return unallocated += 1; }\n"
1446 "f();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001447 };
1448
Ben Murdochda12d292016-06-02 14:46:10 +01001449 CHECK_EQ(BuildActual(printer, snippets),
1450 LoadGolden("GlobalCompoundExpressions.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001451}
1452
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001453TEST(CreateArguments) {
Ben Murdochda12d292016-06-02 14:46:10 +01001454 InitializedIgnitionHandleScope scope;
1455 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1456 ConstantPoolType::kString);
1457 printer.set_wrap(false);
1458 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001459
Ben Murdochda12d292016-06-02 14:46:10 +01001460 const char* snippets[] = {
1461 "function f() { return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001462
Ben Murdochda12d292016-06-02 14:46:10 +01001463 "function f() { return arguments[0]; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001464
Ben Murdochda12d292016-06-02 14:46:10 +01001465 "function f() { 'use strict'; return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001466
Ben Murdochda12d292016-06-02 14:46:10 +01001467 "function f(a) { return arguments[0]; }",
1468
1469 "function f(a, b, c) { return arguments; }",
1470
1471 "function f(a, b, c) { 'use strict'; return arguments; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001472 };
1473
Ben Murdochda12d292016-06-02 14:46:10 +01001474 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
1475 LoadGolden("CreateArguments.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001476}
1477
Ben Murdoch097c5b22016-05-18 11:27:45 +01001478TEST(CreateRestParameter) {
Ben Murdochda12d292016-06-02 14:46:10 +01001479 InitializedIgnitionHandleScope scope;
1480 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1481 ConstantPoolType::kNumber);
1482 printer.set_wrap(false);
1483 printer.set_test_function_name("f");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001484
Ben Murdochda12d292016-06-02 14:46:10 +01001485 const char* snippets[] = {
1486 "function f(...restArgs) { return restArgs; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001487
Ben Murdochda12d292016-06-02 14:46:10 +01001488 "function f(a, ...restArgs) { return restArgs; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001489
Ben Murdochda12d292016-06-02 14:46:10 +01001490 "function f(a, ...restArgs) { return restArgs[0]; }",
1491
1492 "function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001493 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001494
Ben Murdochda12d292016-06-02 14:46:10 +01001495 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
1496 LoadGolden("CreateRestParameter.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001497}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001498
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001499TEST(ForIn) {
Ben Murdochda12d292016-06-02 14:46:10 +01001500 InitializedIgnitionHandleScope scope;
1501 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1502 ConstantPoolType::kMixed);
1503 const char* snippets[] = {
1504 "for (var p in null) {}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001505
Ben Murdochda12d292016-06-02 14:46:10 +01001506 "for (var p in undefined) {}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001507
Ben Murdochda12d292016-06-02 14:46:10 +01001508 "for (var p in undefined) {}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001509
Ben Murdochda12d292016-06-02 14:46:10 +01001510 "var x = 'potatoes';\n"
1511 "for (var p in x) { return p; }",
1512
1513 "var x = 0;\n"
1514 "for (var p in [1,2,3]) { x += p; }",
1515
1516 "var x = { 'a': 1, 'b': 2 };\n"
1517 "for (x['a'] in [10, 20, 30]) {\n"
1518 " if (x['a'] == 10) continue;\n"
1519 " if (x['a'] == 20) break;\n"
1520 "}",
1521
1522 "var x = [ 10, 11, 12 ] ;\n"
1523 "for (x[0] in [1,2,3]) { return x[3]; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001524 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001525
Ben Murdochda12d292016-06-02 14:46:10 +01001526 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ForIn.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001527}
1528
Ben Murdochda12d292016-06-02 14:46:10 +01001529TEST(ForOf) {
1530 InitializedIgnitionHandleScope scope;
1531 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1532 ConstantPoolType::kMixed);
1533 const char* snippets[] = {
1534 "for (var p of [0, 1, 2]) {}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001535
Ben Murdochda12d292016-06-02 14:46:10 +01001536 "var x = 'potatoes';\n"
1537 "for (var p of x) { return p; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001538
Ben Murdochda12d292016-06-02 14:46:10 +01001539 "for (var x of [10, 20, 30]) {\n"
1540 " if (x == 10) continue;\n"
1541 " if (x == 20) break;\n"
1542 "}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001543
Ben Murdochda12d292016-06-02 14:46:10 +01001544 "var x = { 'a': 1, 'b': 2 };\n"
1545 "for (x['a'] of [1,2,3]) { return x['a']; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001546 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001547
Ben Murdochda12d292016-06-02 14:46:10 +01001548 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ForOf.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001549}
1550
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001551TEST(Conditional) {
Ben Murdochda12d292016-06-02 14:46:10 +01001552 InitializedIgnitionHandleScope scope;
1553 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1554 ConstantPoolType::kNumber);
1555 const char* snippets[] = {
1556 "return 1 ? 2 : 3;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001557
Ben Murdochda12d292016-06-02 14:46:10 +01001558 "return 1 ? 2 ? 3 : 4 : 5;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001559 };
1560
Ben Murdochda12d292016-06-02 14:46:10 +01001561 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Conditional.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001562}
1563
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001564TEST(Switch) {
Ben Murdochda12d292016-06-02 14:46:10 +01001565 InitializedIgnitionHandleScope scope;
1566 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1567 ConstantPoolType::kNumber);
1568 const char* snippets[] = {
1569 "var a = 1;\n"
1570 "switch(a) {\n"
1571 " case 1: return 2;\n"
1572 " case 2: return 3;\n"
1573 "}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001574
Ben Murdochda12d292016-06-02 14:46:10 +01001575 "var a = 1;\n"
1576 "switch(a) {\n"
1577 " case 1: a = 2; break;\n"
1578 " case 2: a = 3; break;\n"
1579 "}",
1580
1581 "var a = 1;\n"
1582 "switch(a) {\n"
1583 " case 1: a = 2; // fall-through\n"
1584 " case 2: a = 3; break;\n"
1585 "}",
1586
1587 "var a = 1;\n"
1588 "switch(a) {\n"
1589 " case 2: break;\n"
1590 " case 3: break;\n"
1591 " default: a = 1; break;\n"
1592 "}",
1593
1594 "var a = 1;\n"
1595 "switch(typeof(a)) {\n"
1596 " case 2: a = 1; break;\n"
1597 " case 3: a = 2; break;\n"
1598 " default: a = 3; break;\n"
1599 "}",
1600
1601 "var a = 1;\n"
1602 "switch(a) {\n"
1603 " case typeof(a): a = 1; break;\n"
1604 " default: a = 2; break;\n"
1605 "}",
1606
1607 "var a = 1;\n"
1608 "switch(a) {\n"
1609 " case 1:\n"
1610 REPEAT_64(" a = 2;\n")
1611 " break;\n"
1612 " case 2:\n"
1613 " a = 3;\n"
1614 " break;\n"
1615 "}",
1616
1617 "var a = 1;\n"
1618 "switch(a) {\n"
1619 " case 1: \n"
1620 " switch(a + 1) {\n"
1621 " case 2 : a = 1; break;\n"
1622 " default : a = 2; break;\n"
1623 " } // fall-through\n"
1624 " case 2: a = 3;\n"
1625 "}",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001626 };
1627
Ben Murdochda12d292016-06-02 14:46:10 +01001628 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Switch.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001629}
1630
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001631TEST(BasicBlockToBoolean) {
Ben Murdochda12d292016-06-02 14:46:10 +01001632 InitializedIgnitionHandleScope scope;
1633 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1634 ConstantPoolType::kNumber);
1635 const char* snippets[] = {
1636 "var a = 1; if (a || a < 0) { return 1; }",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001637
Ben Murdochda12d292016-06-02 14:46:10 +01001638 "var a = 1; if (a && a < 0) { return 1; }",
1639
1640 "var a = 1; a = (a || a < 0) ? 2 : 3;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001641 };
1642
Ben Murdochda12d292016-06-02 14:46:10 +01001643 CHECK_EQ(BuildActual(printer, snippets),
1644 LoadGolden("BasicBlockToBoolean.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001645}
1646
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001647TEST(DeadCodeRemoval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001648 InitializedIgnitionHandleScope scope;
1649 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1650 ConstantPoolType::kNumber);
1651 const char* snippets[] = {
1652 "return; var a = 1; a();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001653
Ben Murdochda12d292016-06-02 14:46:10 +01001654 "if (false) { return; }; var a = 1;",
1655
1656 "if (true) { return 1; } else { return 2; };",
1657
1658 "var a = 1; if (a) { return 1; }; return 2;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001659 };
1660
Ben Murdochda12d292016-06-02 14:46:10 +01001661 CHECK_EQ(BuildActual(printer, snippets),
1662 LoadGolden("DeadCodeRemoval.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001663}
1664
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001665TEST(ThisFunction) {
Ben Murdochda12d292016-06-02 14:46:10 +01001666 InitializedIgnitionHandleScope scope;
1667 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1668 ConstantPoolType::kNumber);
1669 printer.set_wrap(false);
1670 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001671
Ben Murdochda12d292016-06-02 14:46:10 +01001672 const char* snippets[] = {
1673 "var f;\n"
1674 "f = function f() {};",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001675
Ben Murdochda12d292016-06-02 14:46:10 +01001676 "var f;\n"
1677 "f = function f() { return f; };",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001678 };
1679
Ben Murdochda12d292016-06-02 14:46:10 +01001680 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"),
1681 LoadGolden("ThisFunction.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001682}
1683
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001684TEST(NewTarget) {
Ben Murdochda12d292016-06-02 14:46:10 +01001685 InitializedIgnitionHandleScope scope;
1686 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1687 ConstantPoolType::kMixed);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001688
Ben Murdochda12d292016-06-02 14:46:10 +01001689 const char* snippets[] = {
1690 "return new.target;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001691
Ben Murdochda12d292016-06-02 14:46:10 +01001692 "new.target;",
1693 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001694
Ben Murdochda12d292016-06-02 14:46:10 +01001695 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("NewTarget.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001696}
1697
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001698TEST(RemoveRedundantLdar) {
Ben Murdochda12d292016-06-02 14:46:10 +01001699 InitializedIgnitionHandleScope scope;
1700 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1701 ConstantPoolType::kNumber);
1702 const char* snippets[] = {
1703 "var ld_a = 1;\n" // This test is to check Ldar does not
1704 "while(true) {\n" // get removed if the preceding Star is
1705 " ld_a = ld_a + ld_a;\n" // in a different basicblock.
1706 " if (ld_a > 10) break;\n"
1707 "}\n"
1708 "return ld_a;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001709
Ben Murdochda12d292016-06-02 14:46:10 +01001710 "var ld_a = 1;\n"
1711 "do {\n"
1712 " ld_a = ld_a + ld_a;\n"
1713 " if (ld_a > 10) continue;\n"
1714 "} while(false);\n"
1715 "return ld_a;",
1716
1717 "var ld_a = 1;\n"
1718 " ld_a = ld_a + ld_a;\n"
1719 " return ld_a;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001720 };
1721
Ben Murdochda12d292016-06-02 14:46:10 +01001722 CHECK_EQ(BuildActual(printer, snippets),
1723 LoadGolden("RemoveRedundantLdar.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001724}
1725
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001726TEST(AssignmentsInBinaryExpression) {
Ben Murdochda12d292016-06-02 14:46:10 +01001727 InitializedIgnitionHandleScope scope;
1728 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1729 ConstantPoolType::kString);
1730 const char* snippets[] = {
1731 "var x = 0, y = 1;\n"
1732 "return (x = 2, y = 3, x = 4, y = 5);",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001733
Ben Murdochda12d292016-06-02 14:46:10 +01001734 "var x = 55;\n"
1735 "var y = (x = 100);\n"
1736 "return y;",
1737
1738 "var x = 55;\n"
1739 "x = x + (x = 100) + (x = 101);\n"
1740 "return x;",
1741
1742 "var x = 55;\n"
1743 "x = (x = 56) - x + (x = 57);\n"
1744 "x++;\n"
1745 "return x;",
1746
1747 "var x = 55;\n"
1748 "var y = x + (x = 1) + (x = 2) + (x = 3);\n"
1749 "return y;",
1750
1751 "var x = 55;\n"
1752 "var x = x + (x = 1) + (x = 2) + (x = 3);\n"
1753 "return x;",
1754
1755 "var x = 10, y = 20;\n"
1756 "return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + "
1757 "y;\n",
1758
1759 "var x = 17;\n"
1760 "return 1 + x + (x++) + (++x);\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001761 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001762
Ben Murdochda12d292016-06-02 14:46:10 +01001763 CHECK_EQ(BuildActual(printer, snippets),
1764 LoadGolden("AssignmentsInBinaryExpression.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001765}
1766
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001767TEST(Eval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001768 InitializedIgnitionHandleScope scope;
1769 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1770 ConstantPoolType::kString);
1771 const char* snippets[] = {
1772 "return eval('1;');",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001773 };
1774
Ben Murdochda12d292016-06-02 14:46:10 +01001775 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Eval.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001776}
1777
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001778TEST(LookupSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01001779 InitializedIgnitionHandleScope scope;
1780 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1781 ConstantPoolType::kString);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001782
Ben Murdochda12d292016-06-02 14:46:10 +01001783 const char* snippets[] = {
1784 "eval('var x = 10;'); return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001785
Ben Murdochda12d292016-06-02 14:46:10 +01001786 "eval('var x = 10;'); return typeof x;",
1787
1788 "x = 20; return eval('');",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001789 };
1790
Ben Murdochda12d292016-06-02 14:46:10 +01001791 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LookupSlot.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001792}
1793
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001794TEST(CallLookupSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01001795 InitializedIgnitionHandleScope scope;
1796 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1797 ConstantPoolType::kMixed);
1798 const char* snippets[] = {
1799 "g = function(){}; eval(''); return g();",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001800 };
1801
Ben Murdochda12d292016-06-02 14:46:10 +01001802 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallLookupSlot.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001803}
1804
Ben Murdoch097c5b22016-05-18 11:27:45 +01001805// TODO(mythria): tests for variable/function declaration in lookup slots.
1806
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001807TEST(LookupSlotInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001808 InitializedIgnitionHandleScope scope;
1809 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1810 ConstantPoolType::kString);
1811 printer.set_wrap(false);
1812 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001813
Ben Murdochda12d292016-06-02 14:46:10 +01001814 const char* snippets[] = {
1815 "return x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001816
Ben Murdochda12d292016-06-02 14:46:10 +01001817 "x = 10;",
1818
1819 "'use strict'; x = 10;",
1820
1821 "return typeof x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001822 };
1823
Ben Murdochda12d292016-06-02 14:46:10 +01001824 std::string actual = BuildActual(printer, snippets,
1825 "var f;\n"
1826 "var x = 1;\n"
1827 "function f1() {\n"
1828 " eval(\"function t() { ",
1829
1830 " }; f = t; f();\");\n"
1831 "}\n"
1832 "f1();");
1833
1834 CHECK_EQ(actual, LoadGolden("LookupSlotInEval.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001835}
1836
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001837TEST(LookupSlotWideInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001838 InitializedIgnitionHandleScope scope;
1839 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1840 ConstantPoolType::kMixed);
1841 printer.set_wrap(false);
1842 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001843
Ben Murdochda12d292016-06-02 14:46:10 +01001844 const char* snippets[] = {
1845 REPEAT_256(" \"var y = 2.3;\" +\n") //
1846 " \"return x;\" +\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001847
Ben Murdochda12d292016-06-02 14:46:10 +01001848 REPEAT_256(" \"var y = 2.3;\" +\n") //
1849 " \"return typeof x;\" +\n",
1850
1851 REPEAT_256(" \"var y = 2.3;\" +\n") //
1852 " \"x = 10;\" +\n",
1853
1854 " \"'use strict';\" +\n" //
1855 REPEAT_256(" \"var y = 2.3;\" +\n") //
1856 " \"x = 10;\" +\n",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001857 };
1858
Ben Murdochda12d292016-06-02 14:46:10 +01001859 std::string actual = BuildActual(printer, snippets,
1860 "var f;\n"
1861 "var x = 1;\n"
1862 "function f1() {\n"
1863 " eval(\"function t() {\" +\n",
1864
1865 " \"};\" +\n"
1866 " \"f = t; f();\"\n);\n"
1867 "}\n"
1868 "f1();");
1869
1870 CHECK_EQ(actual, LoadGolden("LookupSlotWideInEval.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001871}
1872
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001873TEST(DeleteLookupSlotInEval) {
Ben Murdochda12d292016-06-02 14:46:10 +01001874 InitializedIgnitionHandleScope scope;
1875 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1876 ConstantPoolType::kString);
1877 printer.set_wrap(false);
1878 printer.set_test_function_name("f");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001879
Ben Murdochda12d292016-06-02 14:46:10 +01001880 const char* snippets[] = {
1881 "delete x;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001882
Ben Murdochda12d292016-06-02 14:46:10 +01001883 "return delete y;",
1884
1885 "return delete z;",
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001886 };
1887
Ben Murdochda12d292016-06-02 14:46:10 +01001888 std::string actual = BuildActual(printer, snippets,
1889 "var f;\n"
1890 "var x = 1;\n"
1891 "z = 10;\n"
1892 "function f1() {\n"
1893 " var y;\n"
1894 " eval(\"function t() { ",
1895
1896 " }; f = t; f();\");\n"
1897 "}\n"
1898 "f1();");
1899
1900 CHECK_EQ(actual, LoadGolden("DeleteLookupSlotInEval.golden"));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001901}
1902
Ben Murdoch097c5b22016-05-18 11:27:45 +01001903TEST(WideRegisters) {
1904 // Prepare prologue that creates frame for lots of registers.
1905 std::ostringstream os;
1906 for (size_t i = 0; i < 157; ++i) {
1907 os << "var x" << i << ";\n";
1908 }
1909 std::string prologue(os.str());
1910
Ben Murdochda12d292016-06-02 14:46:10 +01001911 InitializedIgnitionHandleScope scope;
1912 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1913 ConstantPoolType::kNumber);
1914 const char* snippets[] = {
1915 "x0 = x127;\n"
1916 "return x0;",
1917
1918 "x127 = x126;\n"
1919 "return x127;",
1920
1921 "if (x2 > 3) { return x129; }\n"
1922 "return x128;",
1923
1924 "var x0 = 0;\n"
1925 "if (x129 == 3) { var x129 = x0; }\n"
1926 "if (x2 > 3) { return x0; }\n"
1927 "return x129;",
1928
1929 "var x0 = 0;\n"
1930 "var x1 = 0;\n"
1931 "for (x128 = 0; x128 < 64; x128++) {"
1932 " x1 += x128;"
1933 "}"
1934 "return x128;",
1935
1936 "var x0 = 1234;\n"
1937 "var x1 = 0;\n"
1938 "for (x128 in x0) {"
1939 " x1 += x128;"
1940 "}"
1941 "return x1;",
1942
1943 "x0 = %Add(x64, x63);\n"
1944 "x1 = %Add(x27, x143);\n"
1945 "%TheHole();\n"
1946 "return x1;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001947 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001948
Ben Murdochda12d292016-06-02 14:46:10 +01001949 CHECK_EQ(BuildActual(printer, snippets, prologue.c_str()),
1950 LoadGolden("WideRegisters.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001951}
1952
1953TEST(ConstVariable) {
Ben Murdochda12d292016-06-02 14:46:10 +01001954 InitializedIgnitionHandleScope scope;
1955 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1956 ConstantPoolType::kString);
1957 const char* snippets[] = {
1958 "const x = 10;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001959
Ben Murdochda12d292016-06-02 14:46:10 +01001960 "const x = 10; return x;",
1961
1962 "const x = ( x = 20);",
1963
1964 "const x = 10; x = 20;",
1965 };
1966
1967 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ConstVariable.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001968}
1969
1970TEST(LetVariable) {
Ben Murdochda12d292016-06-02 14:46:10 +01001971 InitializedIgnitionHandleScope scope;
1972 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1973 ConstantPoolType::kString);
1974 const char* snippets[] = {
1975 "let x = 10;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001976
Ben Murdochda12d292016-06-02 14:46:10 +01001977 "let x = 10; return x;",
1978
1979 "let x = (x = 20);",
1980
1981 "let x = 10; x = 20;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001982 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001983
Ben Murdochda12d292016-06-02 14:46:10 +01001984 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LetVariable.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001985}
1986
1987TEST(ConstVariableContextSlot) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001988 // TODO(mythria): Add tests for initialization of this via super calls.
1989 // TODO(mythria): Add tests that walk the context chain.
Ben Murdochda12d292016-06-02 14:46:10 +01001990 InitializedIgnitionHandleScope scope;
1991 BytecodeExpectationsPrinter printer(CcTest::isolate(),
1992 ConstantPoolType::kMixed);
1993 const char* snippets[] = {
1994 "const x = 10; function f1() {return x;}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01001995
Ben Murdochda12d292016-06-02 14:46:10 +01001996 "const x = 10; function f1() {return x;} return x;",
1997
1998 "const x = (x = 20); function f1() {return x;}",
1999
2000 "const x = 10; x = 20; function f1() {return x;}",
2001 };
2002
2003 CHECK_EQ(BuildActual(printer, snippets),
2004 LoadGolden("ConstVariableContextSlot.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002005}
2006
2007TEST(LetVariableContextSlot) {
Ben Murdochda12d292016-06-02 14:46:10 +01002008 InitializedIgnitionHandleScope scope;
2009 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2010 ConstantPoolType::kMixed);
2011 const char* snippets[] = {
2012 "let x = 10; function f1() {return x;}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002013
Ben Murdochda12d292016-06-02 14:46:10 +01002014 "let x = 10; function f1() {return x;} return x;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002015
Ben Murdochda12d292016-06-02 14:46:10 +01002016 "let x = (x = 20); function f1() {return x;}",
2017
2018 "let x = 10; x = 20; function f1() {return x;}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002019 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002020
Ben Murdochda12d292016-06-02 14:46:10 +01002021 CHECK_EQ(BuildActual(printer, snippets),
2022 LoadGolden("LetVariableContextSlot.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002023}
2024
2025TEST(DoExpression) {
2026 bool old_flag = FLAG_harmony_do_expressions;
2027 FLAG_harmony_do_expressions = true;
2028
Ben Murdochda12d292016-06-02 14:46:10 +01002029 InitializedIgnitionHandleScope scope;
2030 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2031 ConstantPoolType::kString);
2032 const char* snippets[] = {
2033 "var a = do { }; return a;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002034
Ben Murdochda12d292016-06-02 14:46:10 +01002035 "var a = do { var x = 100; }; return a;",
2036
2037 "while(true) { var a = 10; a = do { ++a; break; }; a = 20; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002038 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002039
Ben Murdochda12d292016-06-02 14:46:10 +01002040 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DoExpression.golden"));
2041
Ben Murdoch097c5b22016-05-18 11:27:45 +01002042 FLAG_harmony_do_expressions = old_flag;
2043}
2044
2045TEST(WithStatement) {
Ben Murdochda12d292016-06-02 14:46:10 +01002046 InitializedIgnitionHandleScope scope;
2047 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2048 ConstantPoolType::kMixed);
2049 const char* snippets[] = {
2050 "with ({x:42}) { return x; }",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002051 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002052
Ben Murdochda12d292016-06-02 14:46:10 +01002053 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("WithStatement.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002054}
2055
2056TEST(DoDebugger) {
Ben Murdochda12d292016-06-02 14:46:10 +01002057 InitializedIgnitionHandleScope scope;
2058 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2059 ConstantPoolType::kString);
2060 const char* snippets[] = {
Ben Murdoch097c5b22016-05-18 11:27:45 +01002061 "debugger;",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002062 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002063
Ben Murdochda12d292016-06-02 14:46:10 +01002064 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DoDebugger.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002065}
2066
Ben Murdoch097c5b22016-05-18 11:27:45 +01002067TEST(ClassDeclarations) {
Ben Murdochda12d292016-06-02 14:46:10 +01002068 InitializedIgnitionHandleScope scope;
2069 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2070 ConstantPoolType::kMixed);
2071 const char* snippets[] = {
2072 "class Person {\n"
2073 " constructor(name) { this.name = name; }\n"
2074 " speak() { console.log(this.name + ' is speaking.'); }\n"
2075 "}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002076
Ben Murdochda12d292016-06-02 14:46:10 +01002077 "class person {\n"
2078 " constructor(name) { this.name = name; }\n"
2079 " speak() { console.log(this.name + ' is speaking.'); }\n"
2080 "}",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002081
Ben Murdochda12d292016-06-02 14:46:10 +01002082 "var n0 = 'a';\n"
2083 "var n1 = 'b';\n"
2084 "class N {\n"
2085 " [n0]() { return n0; }\n"
2086 " static [n1]() { return n1; }\n"
2087 "}",
2088
2089 "var count = 0;\n"
2090 "class C { constructor() { count++; }}\n"
2091 "return new C();\n",
Ben Murdoch097c5b22016-05-18 11:27:45 +01002092 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01002093
Ben Murdochda12d292016-06-02 14:46:10 +01002094 CHECK_EQ(BuildActual(printer, snippets),
2095 LoadGolden("ClassDeclarations.golden"));
Ben Murdoch097c5b22016-05-18 11:27:45 +01002096}
2097
Ben Murdochda12d292016-06-02 14:46:10 +01002098TEST(ClassAndSuperClass) {
2099 InitializedIgnitionHandleScope scope;
2100 BytecodeExpectationsPrinter printer(CcTest::isolate(),
2101 ConstantPoolType::kMixed);
2102 printer.set_wrap(false);
2103 printer.set_test_function_name("test");
2104 const char* snippets[] = {
2105 "var test;\n"
2106 "(function() {\n"
2107 " class A {\n"
2108 " method() { return 2; }\n"
2109 " }\n"
2110 " class B extends A {\n"
2111 " method() { return super.method() + 1; }\n"
2112 " }\n"
2113 " test = new B().method;\n"
2114 " test();\n"
2115 "})();\n",
2116
2117 "var test;\n"
2118 "(function() {\n"
2119 " class A {\n"
2120 " get x() { return 1; }\n"
2121 " set x(val) { return; }\n"
2122 " }\n"
2123 " class B extends A {\n"
2124 " method() { super.x = 2; return super.x; }\n"
2125 " }\n"
2126 " test = new B().method;\n"
2127 " test();\n"
2128 "})();\n",
2129
2130 "var test;\n"
2131 "(function() {\n"
2132 " class A {\n"
2133 " constructor(x) { this.x_ = x; }\n"
2134 " }\n"
2135 " class B extends A {\n"
2136 " constructor() { super(1); this.y_ = 2; }\n"
2137 " }\n"
2138 " test = new B().constructor;\n"
2139 "})();\n",
2140
2141 "var test;\n"
2142 "(function() {\n"
2143 " class A {\n"
2144 " constructor() { this.x_ = 1; }\n"
2145 " }\n"
2146 " class B extends A {\n"
2147 " constructor() { super(); this.y_ = 2; }\n"
2148 " }\n"
2149 " test = new B().constructor;\n"
2150 "})();\n",
2151 };
2152
2153 CHECK_EQ(BuildActual(printer, snippets),
2154 LoadGolden("ClassAndSuperClass.golden"));
2155}
Ben Murdoch097c5b22016-05-18 11:27:45 +01002156
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002157} // namespace interpreter
2158} // namespace internal
2159} // namespace v8