2015-08-18 13:46:43 +00:00
|
|
|
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#include <fstream>
|
|
|
|
|
2019-05-24 13:51:59 +00:00
|
|
|
#include "src/init/v8.h"
|
2015-09-24 11:48:22 +00:00
|
|
|
#include "src/interpreter/bytecode-array-iterator.h"
|
2015-08-18 13:46:43 +00:00
|
|
|
#include "src/interpreter/bytecode-generator.h"
|
|
|
|
#include "src/interpreter/interpreter.h"
|
2019-05-23 08:51:46 +00:00
|
|
|
#include "src/objects/objects-inl.h"
|
2015-08-18 13:46:43 +00:00
|
|
|
#include "test/cctest/cctest.h"
|
2016-02-25 12:07:07 +00:00
|
|
|
#include "test/cctest/interpreter/bytecode-expectations-printer.h"
|
2015-10-01 13:48:05 +00:00
|
|
|
#include "test/cctest/test-feedback-vector.h"
|
2015-08-18 13:46:43 +00:00
|
|
|
|
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
|
|
|
namespace interpreter {
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
int global_counter = 0; // For unique variable/property names.
|
|
|
|
|
|
|
|
std::string LoadUniqueProperties(int n) {
|
|
|
|
// Don't take any fancy recursive shortcuts here because
|
|
|
|
// {LoadUniqueProperty} must actually be called {n} times.
|
|
|
|
std::string result;
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
result += " b.name" + std::to_string(global_counter++) + ";\n";
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string UniqueVars(int n) {
|
|
|
|
std::string result;
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
result += "var a" + std::to_string(global_counter++) + " = 0;\n";
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string Repeat(std::string s, int n) {
|
|
|
|
if (n == 1) return s;
|
|
|
|
std::string half = Repeat(s, n >> 1);
|
|
|
|
std::string result = half + half;
|
|
|
|
if (n & 1) result += s;
|
|
|
|
return result;
|
|
|
|
}
|
2018-05-11 08:52:00 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
static const char* kGoldenFileDirectory =
|
|
|
|
"test/cctest/interpreter/bytecode_expectations/";
|
|
|
|
|
2020-11-26 10:08:27 +00:00
|
|
|
class V8_NODISCARD InitializedIgnitionHandleScope
|
|
|
|
: public InitializedHandleScope {
|
2016-02-25 12:07:07 +00:00
|
|
|
public:
|
|
|
|
InitializedIgnitionHandleScope() {
|
2022-04-28 14:22:23 +00:00
|
|
|
i::FLAG_always_turbofan = false;
|
2015-10-02 18:13:41 +00:00
|
|
|
i::FLAG_allow_natives_syntax = true;
|
2019-02-14 10:29:28 +00:00
|
|
|
i::FLAG_enable_lazy_source_positions = false;
|
2015-08-18 13:46:43 +00:00
|
|
|
}
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2019-09-10 01:19:59 +00:00
|
|
|
void SkipGoldenFileHeader(std::istream* stream) {
|
2016-02-25 12:07:07 +00:00
|
|
|
std::string line;
|
|
|
|
int separators_seen = 0;
|
2019-09-10 01:19:59 +00:00
|
|
|
while (std::getline(*stream, line)) {
|
2016-02-25 12:07:07 +00:00
|
|
|
if (line == "---") separators_seen += 1;
|
|
|
|
if (separators_seen == 2) return;
|
2015-10-07 21:18:58 +00:00
|
|
|
}
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-10-07 21:18:58 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
std::string LoadGolden(const std::string& golden_filename) {
|
|
|
|
std::ifstream expected_file((kGoldenFileDirectory + golden_filename).c_str());
|
|
|
|
CHECK(expected_file.is_open());
|
2019-09-10 01:19:59 +00:00
|
|
|
SkipGoldenFileHeader(&expected_file);
|
2016-02-25 12:07:07 +00:00
|
|
|
std::ostringstream expected_stream;
|
|
|
|
// Restore the first separator, which was consumed by SkipGoldenFileHeader
|
|
|
|
expected_stream << "---\n" << expected_file.rdbuf();
|
|
|
|
return expected_stream.str();
|
|
|
|
}
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
template <size_t N>
|
|
|
|
std::string BuildActual(const BytecodeExpectationsPrinter& printer,
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string (&snippet_list)[N],
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* prologue = nullptr,
|
|
|
|
const char* epilogue = nullptr) {
|
|
|
|
std::ostringstream actual_stream;
|
2021-09-27 18:45:12 +00:00
|
|
|
for (std::string snippet : snippet_list) {
|
2016-02-25 12:07:07 +00:00
|
|
|
std::string source_code;
|
|
|
|
if (prologue) source_code += prologue;
|
|
|
|
source_code += snippet;
|
|
|
|
if (epilogue) source_code += epilogue;
|
2019-09-10 01:19:59 +00:00
|
|
|
printer.PrintExpectation(&actual_stream, source_code);
|
2015-12-16 17:24:20 +00:00
|
|
|
}
|
2016-02-25 12:07:07 +00:00
|
|
|
return actual_stream.str();
|
|
|
|
}
|
2015-12-16 17:24:20 +00:00
|
|
|
|
2018-08-07 13:14:23 +00:00
|
|
|
// inplace left trim
|
2019-09-10 01:19:59 +00:00
|
|
|
static inline void ltrim(std::string* str) {
|
|
|
|
str->erase(str->begin(),
|
|
|
|
std::find_if(str->begin(), str->end(),
|
|
|
|
[](unsigned char ch) { return !std::isspace(ch); }));
|
2018-08-07 13:14:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// inplace right trim
|
2019-09-10 01:19:59 +00:00
|
|
|
static inline void rtrim(std::string* str) {
|
|
|
|
str->erase(std::find_if(str->rbegin(), str->rend(),
|
|
|
|
[](unsigned char ch) { return !std::isspace(ch); })
|
|
|
|
.base(),
|
|
|
|
str->end());
|
2018-08-07 13:14:23 +00:00
|
|
|
}
|
|
|
|
|
2019-09-10 01:19:59 +00:00
|
|
|
static inline std::string trim(std::string* str) {
|
2018-08-07 13:14:23 +00:00
|
|
|
ltrim(str);
|
|
|
|
rtrim(str);
|
2019-09-10 01:19:59 +00:00
|
|
|
return *str;
|
2018-08-07 13:14:23 +00:00
|
|
|
}
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
bool CompareTexts(const std::string& generated, const std::string& expected) {
|
|
|
|
std::istringstream generated_stream(generated);
|
|
|
|
std::istringstream expected_stream(expected);
|
|
|
|
std::string generated_line;
|
|
|
|
std::string expected_line;
|
|
|
|
// Line number does not include golden file header.
|
|
|
|
int line_number = 0;
|
2019-01-08 12:18:34 +00:00
|
|
|
bool strings_match = true;
|
2016-05-11 12:21:56 +00:00
|
|
|
|
|
|
|
do {
|
|
|
|
std::getline(generated_stream, generated_line);
|
|
|
|
std::getline(expected_stream, expected_line);
|
|
|
|
|
|
|
|
if (!generated_stream.good() && !expected_stream.good()) {
|
2019-01-08 12:18:34 +00:00
|
|
|
return strings_match;
|
2016-05-11 12:21:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!generated_stream.good()) {
|
|
|
|
std::cerr << "Expected has extra lines after line " << line_number
|
|
|
|
<< "\n";
|
|
|
|
std::cerr << " Expected: '" << expected_line << "'\n";
|
|
|
|
return false;
|
|
|
|
} else if (!expected_stream.good()) {
|
|
|
|
std::cerr << "Generated has extra lines after line " << line_number
|
|
|
|
<< "\n";
|
|
|
|
std::cerr << " Generated: '" << generated_line << "'\n";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-09-10 01:19:59 +00:00
|
|
|
if (trim(&generated_line) != trim(&expected_line)) {
|
2016-05-11 12:21:56 +00:00
|
|
|
std::cerr << "Inputs differ at line " << line_number << "\n";
|
|
|
|
std::cerr << " Generated: '" << generated_line << "'\n";
|
|
|
|
std::cerr << " Expected: '" << expected_line << "'\n";
|
2019-01-08 12:18:34 +00:00
|
|
|
strings_match = false;
|
2016-05-11 12:21:56 +00:00
|
|
|
}
|
|
|
|
line_number++;
|
|
|
|
} while (true);
|
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(PrimitiveReturnStatements) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"",
|
2015-10-26 18:11:23 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return null;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return true;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return false;\n",
|
2016-01-11 16:37:53 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 0;\n",
|
2015-10-30 11:17:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return +1;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return -1;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return +127;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return -128;\n",
|
2016-07-21 09:18:47 +00:00
|
|
|
|
|
|
|
"return 2.0;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrimitiveReturnStatements.golden")));
|
2015-09-24 11:48:22 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(PrimitiveExpressions) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x + 3;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 0; return 3 + x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x - 3;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 0; return 3 - x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 4; return x * 3;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 4; return 3 * x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 4; return x / 3;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 4; return 3 / x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 4; return x % 3;\n",
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 4; return 3 % x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 1; return x | 2;\n",
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 1; return 2 | x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 1; return x ^ 2;\n",
|
2015-10-13 09:39:55 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 1; return 2 ^ x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 1; return x & 2;\n",
|
2015-10-13 09:39:55 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 1; return 2 & x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 10; return x << 3;\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 10; return 3 << x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 10; return x >> 3;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 10; return 3 >> x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 10; return x >>> 3;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2017-04-10 09:30:51 +00:00
|
|
|
"var x = 10; return 3 >>> x;\n",
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return (x, 3);\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrimitiveExpressions.golden")));
|
2015-08-18 13:46:43 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(LogicalExpressions) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x || 3;\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return (x == 1) || 3;\n",
|
2015-10-15 09:11:40 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x && 3;\n",
|
2015-10-15 09:11:40 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return (x == 0) && 3;\n",
|
2015-10-15 09:11:40 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 0; return x || (1, 2, 3);\n",
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);\n",
|
2015-08-27 10:32:26 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format off
|
|
|
|
"var x = 1; var a = 2, b = 3; return x || (" +
|
|
|
|
Repeat("\n a = 1, b = 2, ", 32) +
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2015-08-27 10:32:26 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
"var x = 0; var a = 2, b = 3; return x && (" +
|
|
|
|
Repeat("\n a = 1, b = 2, ", 32) +
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
"var x = 1; var a = 2, b = 3; return (x > 3) || (" +
|
|
|
|
Repeat("\n a = 1, b = 2, ", 32) +
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
"var x = 0; var a = 2, b = 3; return (x < 5) && (" +
|
|
|
|
Repeat("\n a = 1, b = 2, ", 32) +
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 0 && 3;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 1 || 3;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var x = 1; return x && 3 || 0, 1;\n",
|
2015-08-27 10:32:26 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("LogicalExpressions.golden")));
|
2015-08-18 13:46:43 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Parameters) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f() { return this; }",
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(arg1) { return arg1; }",
|
|
|
|
|
|
|
|
"function f(arg1) { return this; }",
|
|
|
|
|
|
|
|
"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }",
|
|
|
|
|
|
|
|
"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }",
|
|
|
|
|
|
|
|
"function f(arg1) { arg1 = 1; }",
|
|
|
|
|
|
|
|
"function f(arg1, arg2, arg3, arg4) { arg2 = 1; }",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("Parameters.golden")));
|
2015-09-24 15:20:47 +00:00
|
|
|
}
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(IntegerConstants) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 12345678;\n",
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1234; return 5678;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1234; return 1234;\n",
|
2015-10-30 11:17:07 +00:00
|
|
|
};
|
2016-02-04 12:33:13 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("IntegerConstants.golden")));
|
2015-09-24 15:20:47 +00:00
|
|
|
}
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(HeapNumberConstants) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 1.2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1.2; return 2.6;\n",
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 3.14; return 3.14;\n",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("HeapNumberConstants.golden")));
|
2015-08-28 15:40:52 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(StringConstants) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return \"This is a string\";\n",
|
2015-08-28 15:40:52 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = \"First string\"; return \"Second string\";\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = \"Same string\"; return \"Same string\";\n",
|
2015-12-09 08:32:56 +00:00
|
|
|
};
|
2016-02-04 12:33:13 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StringConstants.golden")));
|
2015-09-02 13:03:06 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(PropertyLoads) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-09-09 15:46:04 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(a) { return a.name; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({name : \"test\"});\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a) { return a[\"key\"]; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({key : \"test\"});\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a) { return a[100]; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({100 : \"test\"});\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a, b) { return a[b]; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({arg : \"test\"}, \"arg\");\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a) { var b = a.name; return a[-124]; }\n"
|
|
|
|
"f({\"-124\" : \"test\", name : 123 })",
|
|
|
|
|
|
|
|
"function f(a) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" return a.name;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" var c;\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" c = a[b];\n" +
|
|
|
|
Repeat(" c = a[b];\n", 127) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" return a[b];\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"}, \"name\")\n",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2016-02-04 12:33:13 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PropertyLoads.golden")));
|
2015-09-09 15:46:04 +00:00
|
|
|
}
|
|
|
|
|
2021-05-19 15:13:43 +00:00
|
|
|
TEST(PropertyLoadStore) {
|
2018-08-07 13:14:23 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2018-08-07 13:14:23 +00:00
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'aa': 1.1,
|
|
|
|
'bb': 2.2
|
|
|
|
};
|
|
|
|
|
|
|
|
v = l['aa'] + l['bb'];
|
|
|
|
l['bb'] = 7;
|
|
|
|
l['aa'] = l['bb'];
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'cc': 3.1,
|
|
|
|
'dd': 4.2
|
|
|
|
};
|
|
|
|
if (l['cc'] < 3) {
|
|
|
|
l['cc'] = 3;
|
|
|
|
} else {
|
|
|
|
l['dd'] = 3;
|
|
|
|
}
|
|
|
|
)",
|
|
|
|
};
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
2021-05-19 15:13:43 +00:00
|
|
|
LoadGolden("PropertyLoadStore.golden")));
|
2018-08-07 13:14:23 +00:00
|
|
|
}
|
|
|
|
|
2021-05-19 15:13:43 +00:00
|
|
|
TEST(IIFE) {
|
2018-08-07 13:14:23 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
v8::Isolate* isolate = CcTest::isolate();
|
|
|
|
BytecodeExpectationsPrinter printer(isolate);
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
printer.set_print_callee(true);
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2018-08-07 13:14:23 +00:00
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {};
|
|
|
|
l.a = 2;
|
|
|
|
l.b = l.a;
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {
|
|
|
|
'a': 4.3,
|
|
|
|
'b': 3.4
|
|
|
|
};
|
|
|
|
if (l.a < 3) {
|
|
|
|
l.a = 3;
|
|
|
|
} else {
|
|
|
|
l.a = l.b;
|
|
|
|
}
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
2018-09-17 08:44:19 +00:00
|
|
|
R"(
|
|
|
|
this.f0 = function() {};
|
|
|
|
this.f1 = function(a) {};
|
|
|
|
this.f2 = function(a, b) {};
|
|
|
|
this.f3 = function(a, b, c) {};
|
|
|
|
this.f4 = function(a, b, c, d) {};
|
|
|
|
this.f5 = function(a, b, c, d, e) {};
|
|
|
|
(function() {
|
|
|
|
this.f0();
|
|
|
|
this.f1(1);
|
|
|
|
this.f2(1, 2);
|
|
|
|
this.f3(1, 2, 3);
|
|
|
|
this.f4(1, 2, 3, 4);
|
|
|
|
this.f5(1, 2, 3, 4, 5);
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
function f0() {}
|
|
|
|
function f1(a) {}
|
|
|
|
function f2(a, b) {}
|
|
|
|
function f3(a, b, c) {}
|
|
|
|
function f4(a, b, c, d) {}
|
|
|
|
function f5(a, b, c, d, e) {}
|
|
|
|
(function() {
|
|
|
|
f0();
|
|
|
|
f1(1);
|
|
|
|
f2(1, 2);
|
|
|
|
f3(1, 2, 3);
|
|
|
|
f4(1, 2, 3, 4);
|
|
|
|
f5(1, 2, 3, 4, 5);
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
2018-08-07 13:14:23 +00:00
|
|
|
};
|
2021-05-19 15:13:43 +00:00
|
|
|
CHECK(
|
|
|
|
CompareTexts(BuildActual(printer, snippets), LoadGolden("IIFE.golden")));
|
2018-08-07 13:14:23 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(PropertyStores) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-09-14 10:05:18 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// For historical reasons, this test expects the first unique identifier
|
|
|
|
// to be 128.
|
|
|
|
global_counter = 128;
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(a) { a.name = \"val\"; }\n"
|
|
|
|
"f({name : \"test\"})",
|
2015-09-14 10:05:18 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(a) { a[\"key\"] = \"val\"; }\n"
|
|
|
|
"f({key : \"test\"})",
|
2015-09-14 10:05:18 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(a) { a[100] = \"val\"; }\n"
|
|
|
|
"f({100 : \"test\"})",
|
|
|
|
|
|
|
|
"function f(a, b) { a[b] = \"val\"; }\n"
|
|
|
|
"f({arg : \"test\"}, \"arg\")",
|
|
|
|
|
|
|
|
"function f(a) { a.name = a[-124]; }\n"
|
|
|
|
"f({\"-124\" : \"test\", name : 123 })",
|
|
|
|
|
|
|
|
"function f(a) { \"use strict\"; a.name = \"val\"; }\n"
|
|
|
|
"f({name : \"test\"})",
|
|
|
|
|
|
|
|
"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n"
|
|
|
|
"f({arg : \"test\"}, \"arg\")",
|
|
|
|
|
|
|
|
"function f(a) {\n"
|
|
|
|
" a.name = 1;\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a.name = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a) {\n"
|
|
|
|
" 'use strict';\n"
|
|
|
|
" a.name = 1;\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a.name = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" a[b] = 1;\n" +
|
|
|
|
Repeat(" a[b] = 1;\n", 127) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a[b] = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" 'use strict';\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" a[b] = 1;\n" +
|
|
|
|
Repeat(" a[b] = 1;\n", 127) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a[b] = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
2015-11-17 12:18:25 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2016-02-04 12:33:13 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PropertyStores.golden")));
|
2015-09-24 11:48:22 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()"
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(PropertyCall) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// For historical reasons, this test expects the first unique identifier
|
|
|
|
// to be 384.
|
|
|
|
global_counter = 384;
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(a) { return a.func(); }\n"
|
|
|
|
"f(" FUNC_ARG ")",
|
|
|
|
|
|
|
|
"function f(a, b, c) { return a.func(b, c); }\n"
|
|
|
|
"f(" FUNC_ARG ", 1, 2)",
|
|
|
|
|
|
|
|
"function f(a, b) { return a.func(b + b, b); }\n"
|
|
|
|
"f(" FUNC_ARG ", 1)",
|
|
|
|
|
|
|
|
"function f(a) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
|
|
|
" a.func;\n"
|
2018-05-11 08:52:00 +00:00
|
|
|
" return a.func(); }\n"
|
2016-02-25 12:07:07 +00:00
|
|
|
"f(" FUNC_ARG ")",
|
2016-12-15 10:59:57 +00:00
|
|
|
|
|
|
|
"function f(a) { return a.func(1).func(2).func(3); }\n"
|
|
|
|
"f(new (function Obj() { this.func = function(a) { return this; }})())",
|
2015-09-24 11:48:22 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PropertyCall.golden")));
|
2015-09-24 11:48:22 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(LoadGlobal) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-09-24 11:48:22 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// For historical reasons, this test expects the first unique identifier
|
|
|
|
// to be 512.
|
|
|
|
global_counter = 512;
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"function f() { return a; }\n"
|
|
|
|
"f()",
|
|
|
|
|
|
|
|
"function t() { }\n"
|
|
|
|
"function f() { return t; }\n"
|
|
|
|
"f()",
|
|
|
|
|
|
|
|
"a = 1;\n"
|
|
|
|
"function f() { return a; }\n"
|
|
|
|
"f()",
|
|
|
|
|
|
|
|
"a = 1;\n"
|
2018-05-11 08:52:00 +00:00
|
|
|
"function f(c) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" return a;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({name: 1});\n",
|
2015-10-07 21:18:58 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2015-10-07 21:18:58 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("LoadGlobal.golden")));
|
2015-10-07 21:18:58 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(StoreGlobal) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-10-07 21:18:58 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// For historical reasons, this test expects the first unique identifier
|
|
|
|
// to be 640.
|
|
|
|
global_counter = 640;
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"function f() { a = 2; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = \"test\"; function f(b) { a = b; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f(\"global\");\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"'use strict'; var a = 1;\n"
|
|
|
|
"function f() { a = 2; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"a = 1;\n"
|
|
|
|
"function f() { a = 2; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"a = 1;\n"
|
2018-05-11 08:52:00 +00:00
|
|
|
"function f(c) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a = 2;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({name: 1});\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"a = 1;\n"
|
2018-05-11 08:52:00 +00:00
|
|
|
"function f(c) {\n"
|
2016-02-25 12:07:07 +00:00
|
|
|
" 'use strict';\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" var b = {};\n" +
|
|
|
|
LoadUniqueProperties(128) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" a = 2;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f({name: 1});\n",
|
2015-10-07 21:18:58 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2015-10-07 21:18:58 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StoreGlobal.golden")));
|
2015-10-07 21:18:58 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(CallGlobal) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function t() { }\n"
|
|
|
|
"function f() { return t(); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-10-07 21:18:58 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function t(a, b, c) { }\n"
|
|
|
|
"function f() { return t(1, 2, 3); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-09-24 11:48:22 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CallGlobal.golden")));
|
2015-09-14 10:05:18 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(CallRuntime) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f() { %TheHole() }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a) { return %IsArray(a) }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f(undefined);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() { return %Add(1, 2) }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CallRuntime.golden")));
|
2015-09-24 15:20:47 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(IfConditions) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f() {\n"
|
|
|
|
" if (0) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -1;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" if ('lucky') {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -1;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" if (false) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -1;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" if (false) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" var a = 1;\n"
|
|
|
|
" if (a) {\n"
|
|
|
|
" a += 1;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return 2;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a) {\n"
|
|
|
|
" if (a <= 0) {\n"
|
|
|
|
" return 200;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -200;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f(99);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a, b) { if (a in b) { return 200; } }"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f('prop', { prop: 'yes'});\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
"function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n" +
|
|
|
|
Repeat(" b = a; a = b;\n", 64) +
|
2016-05-11 12:21:56 +00:00
|
|
|
" return 200; } else { return -200; } } f(0.001);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" var a = 0; var b = 0;\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" if (a) {\n" +
|
|
|
|
Repeat(" b = a; a = b;\n", 64) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" return 200; } else { return -200; }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" if (a == b) { return 1; }\n"
|
|
|
|
" if (a === b) { return 1; }\n"
|
|
|
|
" if (a < b) { return 1; }\n"
|
|
|
|
" if (a > b) { return 1; }\n"
|
|
|
|
" if (a <= b) { return 1; }\n"
|
|
|
|
" if (a >= b) { return 1; }\n"
|
|
|
|
" if (a in b) { return 1; }\n"
|
|
|
|
" if (a instanceof b) { return 1; }\n"
|
|
|
|
" return 0;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f(1, 1);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" var a = 0;\n"
|
|
|
|
" if (a) {\n"
|
|
|
|
" return 20;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -20;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-08-15 13:10:41 +00:00
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" if (a == b || a < 0) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
" } else if (a > 0 && b > 0) {\n"
|
|
|
|
" return 0;\n"
|
|
|
|
" } else {\n"
|
|
|
|
" return -1;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
|
|
|
"f(-1, 1);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("IfConditions.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-09-24 15:20:47 +00:00
|
|
|
|
2015-10-07 21:18:58 +00:00
|
|
|
TEST(DeclareGlobals) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
printer.set_top_level(true);
|
2015-10-21 13:00:31 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1;\n",
|
2015-10-21 13:00:31 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"function f() {}\n",
|
2015-10-21 13:00:31 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"a=2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"function f() {}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-12-16 17:06:05 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("DeclareGlobals.golden")));
|
2015-12-16 17:06:05 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(BreakableBlocks) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 0;\n"
|
|
|
|
"label: {\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
" break label;\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var sum = 0;\n"
|
|
|
|
"outer: {\n"
|
|
|
|
" for (var x = 0; x < 10; ++x) {\n"
|
|
|
|
" for (var y = 0; y < 3; ++y) {\n"
|
|
|
|
" ++sum;\n"
|
|
|
|
" if (x + y == 12) { break outer; }\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return sum;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"outer: {\n"
|
|
|
|
" let y = 10;\n"
|
|
|
|
" function f() { return y; }\n"
|
|
|
|
" break outer;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"let x = 1;\n"
|
|
|
|
"outer: {\n"
|
|
|
|
" inner: {\n"
|
|
|
|
" let y = 2;\n"
|
|
|
|
" function f() { return x + y; }\n"
|
|
|
|
" if (y) break outer;\n"
|
|
|
|
" y = 3;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"x = 4;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("BreakableBlocks.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-12-16 17:06:05 +00:00
|
|
|
|
2015-10-01 15:04:09 +00:00
|
|
|
TEST(BasicLoops) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 0;\n"
|
|
|
|
"while (false) { x = 99; break; continue; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"while (false) {\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"var y = 1;\n"
|
|
|
|
"while (x < 10) {\n"
|
|
|
|
" y = y * 12;\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
" if (x == 3) continue;\n"
|
|
|
|
" if (x == 4) break;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var i = 0;\n"
|
|
|
|
"while (true) {\n"
|
|
|
|
" if (i < 0) continue;\n"
|
|
|
|
" if (i == 3) break;\n"
|
|
|
|
" if (i == 4) break;\n"
|
|
|
|
" if (i == 10) continue;\n"
|
|
|
|
" if (i == 5) break;\n"
|
|
|
|
" i = i + 1;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return i;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var i = 0;\n"
|
|
|
|
"while (true) {\n"
|
|
|
|
" while (i < 3) {\n"
|
|
|
|
" if (i == 2) break;\n"
|
|
|
|
" i = i + 1;\n"
|
|
|
|
" }\n"
|
|
|
|
" i = i + 1;\n"
|
|
|
|
" break;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return i;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 10;\n"
|
|
|
|
"var y = 1;\n"
|
|
|
|
"while (x) {\n"
|
|
|
|
" y = y * 12;\n"
|
|
|
|
" x = x - 1;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0; var y = 1;\n"
|
|
|
|
"do {\n"
|
|
|
|
" y = y * 10;\n"
|
|
|
|
" if (x == 5) break;\n"
|
|
|
|
" if (x == 6) continue;\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
"} while (x < 10);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 10;\n"
|
|
|
|
"var y = 1;\n"
|
|
|
|
"do {\n"
|
|
|
|
" y = y * 12;\n"
|
|
|
|
" x = x - 1;\n"
|
|
|
|
"} while (x);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0; var y = 1;\n"
|
|
|
|
"do {\n"
|
|
|
|
" y = y * 10;\n"
|
|
|
|
" if (x == 5) break;\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
" if (x == 6) continue;\n"
|
|
|
|
"} while (false);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0; var y = 1;\n"
|
|
|
|
"do {\n"
|
|
|
|
" y = y * 10;\n"
|
|
|
|
" if (x == 5) break;\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
" if (x == 6) continue;\n"
|
|
|
|
"} while (true);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"for (;;) {\n"
|
|
|
|
" if (x == 1) break;\n"
|
|
|
|
" if (x == 2) continue;\n"
|
|
|
|
" x = x + 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"for (var x = 0;;) {\n"
|
|
|
|
" if (x == 1) break;\n"
|
|
|
|
" if (x == 2) continue;\n"
|
|
|
|
" x = x + 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"for (;; x = x + 1) {\n"
|
|
|
|
" if (x == 1) break;\n"
|
|
|
|
" if (x == 2) continue;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"for (var x = 0;; x = x + 1) {\n"
|
|
|
|
" if (x == 1) break;\n"
|
|
|
|
" if (x == 2) continue;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var u = 0;\n"
|
|
|
|
"for (var i = 0; i < 100; i = i + 1) {\n"
|
|
|
|
" u = u + 1;\n"
|
|
|
|
" continue;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var y = 1;\n"
|
|
|
|
"for (var x = 10; x; --x) {\n"
|
|
|
|
" y = y * 12;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"for (var i = 0; false; i++) {\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"for (var i = 0; true; ++i) {\n"
|
|
|
|
" x = x + 1;\n"
|
|
|
|
" if (x == 20) break;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"while (a) {\n"
|
|
|
|
" { \n"
|
|
|
|
" let z = 1;\n"
|
|
|
|
" function f() { z = 2; }\n"
|
|
|
|
" if (z) continue;\n"
|
|
|
|
" z++;\n"
|
|
|
|
" }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("BasicLoops.golden")));
|
2015-10-01 15:04:09 +00:00
|
|
|
}
|
|
|
|
|
2015-10-06 14:15:09 +00:00
|
|
|
TEST(UnaryOperators) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 0;\n"
|
|
|
|
"while (x != 10) {\n"
|
|
|
|
" x = x + 10;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2015-10-28 09:49:20 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = false;\n"
|
|
|
|
"do {\n"
|
|
|
|
" x = !x;\n"
|
|
|
|
"} while(x == false);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2015-10-28 09:49:20 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 101;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return void(x * 3);\n",
|
2015-10-28 09:49:20 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 1234;\n"
|
|
|
|
"var y = void (x * x - 1);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 13;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return ~x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 13;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return +x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 13;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return -x;\n",
|
2015-11-03 17:03:27 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("UnaryOperators.golden")));
|
2015-11-03 17:03:27 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Typeof) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f() {\n"
|
|
|
|
" var x = 13;\n"
|
|
|
|
" return typeof(x);\n"
|
|
|
|
"};",
|
2015-11-03 17:03:27 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 13;\n"
|
|
|
|
"function f() {\n"
|
|
|
|
" return typeof(x);\n"
|
|
|
|
"};",
|
2015-10-06 14:15:09 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("Typeof.golden")));
|
2015-10-06 14:15:09 +00:00
|
|
|
}
|
|
|
|
|
2017-03-15 11:29:12 +00:00
|
|
|
TEST(CompareTypeOf) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-03-15 11:29:12 +00:00
|
|
|
"return typeof(1) === 'number';\n",
|
|
|
|
|
|
|
|
"return 'string' === typeof('foo');\n",
|
|
|
|
|
|
|
|
"return typeof(true) == 'boolean';\n",
|
|
|
|
|
|
|
|
"return 'string' === typeof(undefined);\n",
|
|
|
|
|
|
|
|
"return 'unknown' === typeof(undefined);\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CompareTypeOf.golden")));
|
|
|
|
}
|
|
|
|
|
2022-04-24 08:46:49 +00:00
|
|
|
TEST(CompareBoolean) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
|
|
|
std::string snippets[] = {
|
|
|
|
"var a = 1;\n"
|
|
|
|
"return a === true;\n",
|
|
|
|
|
|
|
|
"var a = true;\n"
|
|
|
|
"return true === a;\n",
|
|
|
|
|
|
|
|
"var a = false;\n"
|
|
|
|
"return true !== a;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"return true === a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = true;\n"
|
|
|
|
"return false === a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"return true !== a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = false;\n"
|
|
|
|
"return false !== null ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"if (a !== true) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"var a = true;\n"
|
|
|
|
"var b = 0;\n"
|
|
|
|
"while (a !== true) {\n"
|
|
|
|
" b++;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"(0 === true) ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"(0 !== true) ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"(false === 0) ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"(0 === true || 0 === false) ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"if (0 === true || 0 === false) return 1;\n",
|
|
|
|
|
|
|
|
"if (!('false' === false)) return 1;\n",
|
|
|
|
|
|
|
|
"if (!('false' !== false)) return 1;\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CompareBoolean.golden")));
|
|
|
|
}
|
|
|
|
|
2017-04-03 14:17:16 +00:00
|
|
|
TEST(CompareNil) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-04-03 14:17:16 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"return a === null;\n",
|
|
|
|
|
|
|
|
"var a = undefined;\n"
|
|
|
|
"return undefined === a;\n",
|
|
|
|
|
|
|
|
"var a = undefined;\n"
|
|
|
|
"return undefined !== a;\n",
|
|
|
|
|
|
|
|
"var a = 2;\n"
|
|
|
|
"return a != null;\n",
|
|
|
|
|
|
|
|
"var a = undefined;\n"
|
|
|
|
"return undefined == a;\n",
|
|
|
|
|
|
|
|
"var a = undefined;\n"
|
|
|
|
"return undefined === a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"return null == a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"return undefined !== a ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"return a === null ? 1 : 2;\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"if (a === null) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
"} else {\n"
|
|
|
|
" return 2;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"var a = 0;\n"
|
|
|
|
"if (a != undefined) {\n"
|
|
|
|
" return 1;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"var a = undefined;\n"
|
|
|
|
"var b = 0;\n"
|
|
|
|
"while (a !== undefined) {\n"
|
|
|
|
" b++;\n"
|
|
|
|
"}\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CompareNil.golden")));
|
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Delete) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-06 14:15:09 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = {x:13, y:14}; return delete a.x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"'use strict'; var a = {x:13, y:14}; return delete a.x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = {1:13, 2:14}; return delete a[2];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 10; return delete a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"'use strict';\n"
|
|
|
|
"var a = {1:10};\n"
|
|
|
|
"(function f1() {return a;});\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return delete a[1];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return delete 'test';\n",
|
2019-01-18 23:47:54 +00:00
|
|
|
|
|
|
|
"return delete this;\n",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2015-10-28 09:49:20 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("Delete.golden")));
|
2015-10-28 09:49:20 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(GlobalDelete) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = {x:13, y:14};\n"
|
|
|
|
"function f() {\n"
|
|
|
|
" return delete a.x;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"a = {1:13, 2:14};\n"
|
|
|
|
"function f() {\n"
|
|
|
|
" 'use strict';\n"
|
|
|
|
" return delete a[1];\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = {x:13, y:14};\n"
|
|
|
|
"function f() {\n"
|
|
|
|
" return delete a;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"b = 30;\n"
|
|
|
|
"function f() {\n"
|
|
|
|
" return delete b;\n"
|
|
|
|
"};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("GlobalDelete.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-10-28 09:49:20 +00:00
|
|
|
|
2015-10-13 09:39:55 +00:00
|
|
|
TEST(FunctionLiterals) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-13 09:39:55 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return function(){ }\n",
|
2015-10-13 09:39:55 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return (function(){ })()\n",
|
2015-10-13 14:00:40 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return (function(x){ return x; })(1)\n",
|
2015-10-16 16:14:23 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("FunctionLiterals.golden")));
|
2015-10-16 16:14:23 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(RegExpLiterals) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-16 16:14:23 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return /ab+d/;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return /(\\w+)\\s(\\w+)/i;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return /ab+d/.exec('abdd');\n",
|
2015-12-09 11:53:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("RegExpLiterals.golden")));
|
2015-12-09 11:53:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(ArrayLiterals) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-14 10:10:01 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return [ 1, 2 ];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return [ a, a + 1 ];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return [ [ 1, 2 ], [ 3 ] ];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return [ [ a, 2 ], [ a + 2 ] ];\n",
|
2018-08-21 10:05:08 +00:00
|
|
|
|
|
|
|
"var a = [ 1, 2 ]; return [ ...a ];\n",
|
|
|
|
|
|
|
|
"var a = [ 1, 2 ]; return [ 0, ...a ];\n",
|
|
|
|
|
|
|
|
"var a = [ 1, 2 ]; return [ ...a, 3 ];\n",
|
2015-12-09 11:53:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ArrayLiterals.golden")));
|
2015-12-09 11:53:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(ObjectLiterals) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-14 10:10:01 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { name: 'string', val: 9.2 };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return { name: 'string', val: a };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return { val: a, val: a + 1 };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { func: function() { } };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { func(a) { return a; } };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { get a() { return 2; } };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { get a() { return this.x; }, set a(val) { this.x = val } };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { set b(val) { this.y = val } };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return { 1: a };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return { __proto__: null };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 'test'; return { [a]: 1 };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 'test'; return { val: a, [a]: 1 };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 'test'; return { [a]: 1, __proto__: {} };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };\n",
|
2015-12-09 11:53:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ObjectLiterals.golden")));
|
2015-12-09 11:53:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(TopLevelObjectLiterals) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
printer.set_top_level(true);
|
2015-10-21 13:00:31 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = { func: function() { } };\n",
|
2015-10-15 10:35:18 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("TopLevelObjectLiterals.golden")));
|
2015-10-15 10:35:18 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(TryCatch) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-10-15 10:35:18 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"try { return 1; } catch(e) { return 2; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a;\n"
|
|
|
|
"try { a = 1 } catch(e1) {};\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"try { a = 2 } catch(e2) { a = 3 }\n",
|
2015-10-15 10:35:18 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("TryCatch.golden")));
|
2015-10-15 10:35:18 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(TryFinally) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"try { a = 2; } finally { a = 3; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"try { a = 2; } catch(e) { a = 20 } finally { a = 3; }\n",
|
2015-10-15 16:46:16 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a; try {\n"
|
|
|
|
" try { a = 1 } catch(e) { a = 2 }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"} catch(e) { a = 20 } finally { a = 3; }\n",
|
2015-10-19 10:59:00 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("TryFinally.golden")));
|
2015-10-19 10:59:00 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Throw) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"throw 1;\n",
|
2015-10-19 10:59:00 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"throw 'Error';\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; if (a) { throw 'Error'; };\n",
|
2015-10-21 13:00:31 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(
|
|
|
|
CompareTexts(BuildActual(printer, snippets), LoadGolden("Throw.golden")));
|
2015-10-21 13:00:31 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(CallNew) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-10-21 13:00:31 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function bar() { this.value = 0; }\n"
|
|
|
|
"function f() { return new bar(); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-11-17 12:18:25 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function bar(x) { this.value = 18; this.x = x;}\n"
|
|
|
|
"function f() { return new bar(3); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-11-17 12:18:25 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"function bar(w, x, y, z) {\n"
|
|
|
|
" this.value = 18;\n"
|
|
|
|
" this.x = x;\n"
|
|
|
|
" this.y = y;\n"
|
|
|
|
" this.z = z;\n"
|
|
|
|
"}\n"
|
|
|
|
"function f() { return new bar(3, 4, 5); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
2015-10-16 15:29:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CallNew.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2016-01-11 16:37:53 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(ContextVariables) {
|
2019-10-17 15:58:38 +00:00
|
|
|
// The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 250 == 256, if this
|
2016-01-11 16:37:53 +00:00
|
|
|
// ever changes, the REPEAT_XXX should be changed to output the correct number
|
|
|
|
// of unique variables to trigger the wide slot load / store.
|
2022-05-13 09:19:09 +00:00
|
|
|
static_assert(Context::MIN_CONTEXT_EXTENDED_SLOTS + 3 + 250 == 256);
|
2015-10-16 15:29:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
// For historical reasons, this test expects the first unique identifier
|
|
|
|
// to be 896.
|
|
|
|
global_counter = 896;
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a; return function() { a = 1; };\n",
|
2015-10-16 15:29:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return function() { a = 2; };\n",
|
2015-10-16 15:29:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; var b = 2; return function() { a = 2; b = 3 };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a; (function() { a = 2; })(); return a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"'use strict';\n"
|
|
|
|
"let a = 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"{ let b = 2; return function() { a + b; }; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
"'use strict';\n" +
|
|
|
|
UniqueVars(252) +
|
2016-02-25 12:07:07 +00:00
|
|
|
"eval();\n"
|
|
|
|
"var b = 100;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return b\n",
|
2015-10-16 15:29:07 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2015-10-16 15:29:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ContextVariables.golden")));
|
2015-10-16 15:29:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(ContextParameters) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
2015-10-22 20:40:20 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(arg1) { return function() { arg1 = 2; }; }",
|
|
|
|
|
|
|
|
"function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }",
|
|
|
|
|
|
|
|
"function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }",
|
|
|
|
|
|
|
|
"function f() { var self = this; return function() { self = 2; }; }",
|
2015-10-26 18:11:23 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("ContextParameters.golden")));
|
2015-10-26 18:11:23 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(OuterContextVariables) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function Outer() {\n"
|
|
|
|
" var outerVar = 1;\n"
|
|
|
|
" function Inner(innerArg) {\n"
|
|
|
|
" this.innerFunc = function() { return outerVar * innerArg; }\n"
|
|
|
|
" }\n"
|
|
|
|
" this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var f = new Outer().getInnerFunc();",
|
|
|
|
|
|
|
|
"function Outer() {\n"
|
|
|
|
" var outerVar = 1;\n"
|
|
|
|
" function Inner(innerArg) {\n"
|
|
|
|
" this.innerFunc = function() { outerVar = innerArg; }\n"
|
|
|
|
" }\n"
|
|
|
|
" this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var f = new Outer().getInnerFunc();",
|
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("OuterContextVariables.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-10-26 18:11:23 +00:00
|
|
|
|
2015-10-22 20:40:20 +00:00
|
|
|
TEST(CountOperators) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return ++a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return a++;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return --a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; return a--;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = { val: 1 }; return a.val++;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = { val: 1 }; return --a.val;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var name = 'var'; var a = { val: 1 }; return a[name]--;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var name = 'var'; var a = { val: 1 }; return ++a[name];\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; var b = function() { return a }; return ++a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; var b = function() { return a }; return a--;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var idx = 1; var a = [1, 2]; return a[idx++] = 2;\n",
|
2015-10-22 20:40:20 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CountOperators.golden")));
|
2015-10-22 20:40:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(GlobalCountOperators) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var global = 1;\n"
|
|
|
|
"function f() { return ++global; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var global = 1;\n"
|
|
|
|
"function f() { return global--; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"unallocated = 1;\n"
|
|
|
|
"function f() { 'use strict'; return --unallocated; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"unallocated = 1;\n"
|
|
|
|
"function f() { return unallocated++; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-10-22 20:40:20 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("GlobalCountOperators.golden")));
|
2015-10-22 20:42:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(CompoundExpressions) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; a += 2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; a /= 2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = { val: 2 }; a.name *= 2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = { 1: 2 }; a[1] ^= 2;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; (function f() { return a; }); a |= 24;\n",
|
2015-10-22 20:42:22 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CompoundExpressions.golden")));
|
2015-10-22 20:42:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(GlobalCompoundExpressions) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var global = 1;\n"
|
|
|
|
"function f() { return global &= 1; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"unallocated = 1;\n"
|
|
|
|
"function f() { return unallocated += 1; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"f();\n",
|
2015-10-22 20:42:22 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("GlobalCompoundExpressions.golden")));
|
2015-10-22 20:40:20 +00:00
|
|
|
}
|
|
|
|
|
2015-10-22 21:41:47 +00:00
|
|
|
TEST(CreateArguments) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f() { return arguments; }",
|
|
|
|
|
|
|
|
"function f() { return arguments[0]; }",
|
|
|
|
|
|
|
|
"function f() { 'use strict'; return arguments; }",
|
|
|
|
|
|
|
|
"function f(a) { return arguments[0]; }",
|
|
|
|
|
|
|
|
"function f(a, b, c) { return arguments; }",
|
|
|
|
|
|
|
|
"function f(a, b, c) { 'use strict'; return arguments; }",
|
2015-10-22 21:41:47 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("CreateArguments.golden")));
|
2015-10-22 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
[runtime] Optimize and unify rest parameters.
Replace the somewhat awkward RestParamAccessStub, which would always
call into the runtime anyway with a proper FastNewRestParameterStub,
which is basically based on the code that was already there for strict
arguments object materialization. But for rest parameters we could
optimize even further (leading to 8-10x improvements for functions with
rest parameters), by fixing the internal formal parameter count:
Every SharedFunctionInfo has a formal_parameter_count field, which
specifies the number of formal parameters, and is used to decide whether
we need to create an arguments adaptor frame when calling a function
(i.e. if there's a mismatch between the actual and expected parameters).
Previously the formal_parameter_count included the rest parameter, which
was sort of unfortunate, as that meant that calling a function with only
the non-rest parameters still required an arguments adaptor (plus some
other oddities). Now with this CL we fix, so that we do no longer
include the rest parameter in that count. Thereby checking for rest
parameters is very efficient, as we only need to check whether there is
an arguments adaptor frame, and if not create an empty array, otherwise
check whether the arguments adaptor frame has more parameters than
specified by the formal_parameter_count.
The FastNewRestParameterStub is written in a way that it can be directly
used by Ignition as well, and with some tweaks to the TurboFan backends
and the CodeStubAssembler, we should be able to rewrite it as
TurboFanCodeStub in the near future.
Drive-by-fix: Refactor and unify the CreateArgumentsType which was
different in TurboFan and Ignition; now we have a single enum class
which is used in both TurboFan and Ignition.
R=jarin@chromium.org, rmcilroy@chromium.org
TBR=rossberg@chromium.org
BUG=v8:2159
LOG=n
Review URL: https://codereview.chromium.org/1676883002
Cr-Commit-Position: refs/heads/master@{#33809}
2016-02-08 10:08:21 +00:00
|
|
|
TEST(CreateRestParameter) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"function f(...restArgs) { return restArgs; }",
|
|
|
|
|
|
|
|
"function f(a, ...restArgs) { return restArgs; }",
|
|
|
|
|
|
|
|
"function f(a, ...restArgs) { return restArgs[0]; }",
|
|
|
|
|
|
|
|
"function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }",
|
2016-02-04 10:02:34 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("CreateRestParameter.golden")));
|
2016-02-04 10:02:34 +00:00
|
|
|
}
|
2015-10-22 21:41:47 +00:00
|
|
|
|
2015-10-29 12:06:00 +00:00
|
|
|
TEST(ForIn) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p in null) {}\n",
|
2015-10-29 12:06:00 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p in undefined) {}\n",
|
2015-10-29 12:06:00 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p in undefined) {}\n",
|
2015-10-29 12:06:00 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 'potatoes';\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p in x) { return p; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p in [1,2,3]) { x += p; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = { 'a': 1, 'b': 2 };\n"
|
|
|
|
"for (x['a'] in [10, 20, 30]) {\n"
|
|
|
|
" if (x['a'] == 10) continue;\n"
|
|
|
|
" if (x['a'] == 20) break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = [ 10, 11, 12 ] ;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (x[0] in [1,2,3]) { return x[3]; }\n",
|
2016-01-22 15:54:24 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(
|
|
|
|
CompareTexts(BuildActual(printer, snippets), LoadGolden("ForIn.golden")));
|
2016-01-22 15:54:24 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(ForOf) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p of [0, 1, 2]) {}\n",
|
2016-01-22 15:54:24 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 'potatoes';\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (var p of x) { return p; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"for (var x of [10, 20, 30]) {\n"
|
|
|
|
" if (x == 10) continue;\n"
|
|
|
|
" if (x == 20) break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = { 'a': 1, 'b': 2 };\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"for (x['a'] of [1,2,3]) { return x['a']; }\n",
|
2015-10-26 15:31:05 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(
|
|
|
|
CompareTexts(BuildActual(printer, snippets), LoadGolden("ForOf.golden")));
|
2015-10-26 15:31:05 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Conditional) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 1 ? 2 : 3;\n",
|
2015-10-30 12:55:05 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"return 1 ? 2 ? 3 : 4 : 5;\n",
|
2016-08-15 13:10:41 +00:00
|
|
|
|
|
|
|
"return 0 < 1 ? 2 : 3;\n",
|
|
|
|
|
|
|
|
"var x = 0;\n"
|
|
|
|
"return x ? 2 : 3;\n",
|
2015-10-30 12:55:05 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("Conditional.golden")));
|
2015-10-30 12:55:05 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Switch) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format off
|
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case 1: return 2;\n"
|
|
|
|
" case 2: return 3;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case 1: a = 2; break;\n"
|
|
|
|
" case 2: a = 3; break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case 1: a = 2; // fall-through\n"
|
|
|
|
" case 2: a = 3; break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case 2: break;\n"
|
|
|
|
" case 3: break;\n"
|
|
|
|
" default: a = 1; break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(typeof(a)) {\n"
|
|
|
|
" case 2: a = 1; break;\n"
|
|
|
|
" case 3: a = 2; break;\n"
|
|
|
|
" default: a = 3; break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case typeof(a): a = 1; break;\n"
|
|
|
|
" default: a = 2; break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
2021-09-27 18:45:12 +00:00
|
|
|
" case 1:\n" +
|
|
|
|
Repeat(" a = 2;\n", 64) +
|
2016-02-25 12:07:07 +00:00
|
|
|
" break;\n"
|
|
|
|
" case 2:\n"
|
|
|
|
" a = 3;\n"
|
|
|
|
" break;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"switch(a) {\n"
|
|
|
|
" case 1: \n"
|
|
|
|
" switch(a + 1) {\n"
|
|
|
|
" case 2 : a = 1; break;\n"
|
|
|
|
" default : a = 2; break;\n"
|
|
|
|
" } // fall-through\n"
|
|
|
|
" case 2: a = 3;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
2021-09-27 18:45:12 +00:00
|
|
|
// clang-format on
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("Switch.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2015-11-03 11:27:54 +00:00
|
|
|
|
|
|
|
TEST(BasicBlockToBoolean) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; if (a || a < 0) { return 1; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; if (a && a < 0) { return 1; }\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; a = (a || a < 0) ? 2 : 3;\n",
|
2015-11-03 11:27:54 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("BasicBlockToBoolean.golden")));
|
2015-11-03 11:27:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(DeadCodeRemoval) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return; var a = 1; a();\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"if (false) { return; }; var a = 1;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"if (true) { return 1; } else { return 2; };\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"var a = 1; if (a) { return 1; }; return 2;\n",
|
2015-11-03 11:27:54 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("DeadCodeRemoval.golden")));
|
2015-11-03 11:27:54 +00:00
|
|
|
}
|
|
|
|
|
2015-11-06 15:00:26 +00:00
|
|
|
TEST(ThisFunction) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var f;\n"
|
|
|
|
"f = function f() {};",
|
|
|
|
|
|
|
|
"var f;\n"
|
|
|
|
"f = function f() { return f; };",
|
2015-11-06 15:00:26 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"),
|
|
|
|
LoadGolden("ThisFunction.golden")));
|
2015-11-06 15:00:26 +00:00
|
|
|
}
|
|
|
|
|
2015-11-06 15:45:54 +00:00
|
|
|
TEST(NewTarget) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2015-11-13 14:14:57 +00:00
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return new.target;\n",
|
2015-11-13 14:14:57 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"new.target;\n",
|
2015-11-06 15:45:54 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("NewTarget.golden")));
|
2015-11-06 15:45:54 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(RemoveRedundantLdar) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var ld_a = 1;\n" // This test is to check Ldar does not
|
|
|
|
"while(true) {\n" // get removed if the preceding Star is
|
|
|
|
" ld_a = ld_a + ld_a;\n" // in a different basicblock.
|
|
|
|
" if (ld_a > 10) break;\n"
|
|
|
|
"}\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return ld_a;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var ld_a = 1;\n"
|
|
|
|
"do {\n"
|
|
|
|
" ld_a = ld_a + ld_a;\n"
|
|
|
|
" if (ld_a > 10) continue;\n"
|
|
|
|
"} while(false);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return ld_a;\n",
|
2015-11-20 11:17:10 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var ld_a = 1;\n"
|
|
|
|
" ld_a = ld_a + ld_a;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
" return ld_a;\n",
|
2016-02-04 12:33:13 +00:00
|
|
|
};
|
2015-11-20 11:17:10 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("RemoveRedundantLdar.golden")));
|
2015-11-20 11:17:10 +00:00
|
|
|
}
|
|
|
|
|
2016-12-06 11:32:09 +00:00
|
|
|
TEST(GenerateTestUndetectable) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-12-06 11:32:09 +00:00
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a == null) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
2016-12-16 15:01:08 +00:00
|
|
|
|
2016-12-06 11:32:09 +00:00
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a == undefined) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
2016-12-16 15:01:08 +00:00
|
|
|
|
2016-12-06 11:32:09 +00:00
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a != null) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
2016-12-16 15:01:08 +00:00
|
|
|
|
2016-12-06 11:32:09 +00:00
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a != undefined) { b = 20;}\n"
|
2016-12-16 15:01:08 +00:00
|
|
|
"return b;\n",
|
|
|
|
|
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a === null) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
|
|
|
|
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a === undefined) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
|
|
|
|
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a !== null) { b = 20;}\n"
|
|
|
|
"return b;\n",
|
|
|
|
|
|
|
|
"var obj_a = {val:1};\n"
|
|
|
|
"var b = 10;\n"
|
|
|
|
"if (obj_a !== undefined) { b = 20;}\n"
|
2016-12-06 11:32:09 +00:00
|
|
|
"return b;\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("GenerateTestUndetectable.golden")));
|
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(AssignmentsInBinaryExpression) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 0, y = 1;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return (x = 2, y = 3, x = 4, y = 5);\n",
|
2015-12-16 17:24:20 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 55;\n"
|
|
|
|
"var y = (x = 100);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 55;\n"
|
|
|
|
"x = x + (x = 100) + (x = 101);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 55;\n"
|
|
|
|
"x = (x = 56) - x + (x = 57);\n"
|
|
|
|
"x++;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 55;\n"
|
|
|
|
"var y = x + (x = 1) + (x = 2) + (x = 3);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return y;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 55;\n"
|
|
|
|
"var x = x + (x = 1) + (x = 2) + (x = 3);\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 10, y = 20;\n"
|
|
|
|
"return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + "
|
|
|
|
"y;\n",
|
|
|
|
|
|
|
|
"var x = 17;\n"
|
|
|
|
"return 1 + x + (x++) + (++x);\n",
|
2016-01-08 15:45:59 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("AssignmentsInBinaryExpression.golden")));
|
2016-01-08 15:45:59 +00:00
|
|
|
}
|
|
|
|
|
2018-12-13 11:52:43 +00:00
|
|
|
TEST(DestructuringAssignment) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2018-12-13 11:52:43 +00:00
|
|
|
"var x, a = [0,1,2,3];\n"
|
|
|
|
"[x] = a;\n",
|
|
|
|
|
|
|
|
"var x, y, a = [0,1,2,3];\n"
|
|
|
|
"[,x,...y] = a;\n",
|
|
|
|
|
|
|
|
"var x={}, y, a = [0];\n"
|
|
|
|
"[x.foo,y=4] = a;\n",
|
|
|
|
|
|
|
|
"var x, a = {x:1};\n"
|
|
|
|
"({x} = a);\n",
|
|
|
|
|
|
|
|
"var x={}, a = {y:1};\n"
|
|
|
|
"({y:x.foo} = a);\n",
|
|
|
|
|
|
|
|
"var x, a = {y:1, w:2, v:3};\n"
|
|
|
|
"({x=0,...y} = a);\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("DestructuringAssignment.golden")));
|
|
|
|
}
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
TEST(Eval) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"return eval('1;');\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(
|
|
|
|
CompareTexts(BuildActual(printer, snippets), LoadGolden("Eval.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2016-01-08 15:45:59 +00:00
|
|
|
|
|
|
|
TEST(LookupSlot) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-09-16 13:26:44 +00:00
|
|
|
printer.set_test_function_name("f");
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-09-16 13:26:44 +00:00
|
|
|
// clang-format off
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"eval('var x = 10;'); return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"eval('var x = 10;'); return typeof x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"x = 20; return eval('');\n",
|
2016-09-16 13:26:44 +00:00
|
|
|
|
|
|
|
"var x = 20;\n"
|
|
|
|
"f = function(){\n"
|
|
|
|
" eval('var x = 10');\n"
|
|
|
|
" return x;\n"
|
|
|
|
"}\n"
|
2016-09-20 10:31:24 +00:00
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"x = 20;\n"
|
|
|
|
"f = function(){\n"
|
|
|
|
" eval('var x = 10');\n"
|
|
|
|
" return x;\n"
|
|
|
|
"}\n"
|
2016-09-16 13:26:44 +00:00
|
|
|
"f();\n"
|
2016-01-08 15:45:59 +00:00
|
|
|
};
|
2016-09-16 13:26:44 +00:00
|
|
|
// clang-format on
|
2016-01-08 15:45:59 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("LookupSlot.golden")));
|
2016-01-12 13:11:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(CallLookupSlot) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"g = function(){}; eval(''); return g();\n",
|
2016-01-12 13:11:27 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CallLookupSlot.golden")));
|
2016-01-08 15:45:59 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 12:00:04 +00:00
|
|
|
// TODO(mythria): tests for variable/function declaration in lookup slots.
|
|
|
|
|
2015-12-16 17:24:20 +00:00
|
|
|
TEST(LookupSlotInEval) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"return x;",
|
|
|
|
|
|
|
|
"x = 10;",
|
|
|
|
|
|
|
|
"'use strict'; x = 10;",
|
|
|
|
|
|
|
|
"return typeof x;",
|
2015-12-16 17:24:20 +00:00
|
|
|
};
|
2016-01-05 11:36:26 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
std::string actual = BuildActual(printer, snippets,
|
|
|
|
"var f;\n"
|
|
|
|
"var x = 1;\n"
|
|
|
|
"function f1() {\n"
|
|
|
|
" eval(\"function t() { ",
|
|
|
|
|
|
|
|
" }; f = t; f();\");\n"
|
|
|
|
"}\n"
|
|
|
|
"f1();");
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(actual, LoadGolden("LookupSlotInEval.golden")));
|
2016-02-25 12:07:07 +00:00
|
|
|
}
|
2016-01-05 11:36:26 +00:00
|
|
|
|
2016-01-08 15:45:59 +00:00
|
|
|
TEST(DeleteLookupSlotInEval) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-02-25 12:07:07 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"delete x;",
|
|
|
|
|
|
|
|
"return delete y;",
|
|
|
|
|
|
|
|
"return delete z;",
|
2015-12-23 09:11:13 +00:00
|
|
|
};
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
std::string actual = BuildActual(printer, snippets,
|
|
|
|
"var f;\n"
|
|
|
|
"var x = 1;\n"
|
|
|
|
"z = 10;\n"
|
|
|
|
"function f1() {\n"
|
|
|
|
" var y;\n"
|
|
|
|
" eval(\"function t() { ",
|
|
|
|
|
|
|
|
" }; f = t; f();\");\n"
|
|
|
|
"}\n"
|
|
|
|
"f1();");
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(actual, LoadGolden("DeleteLookupSlotInEval.golden")));
|
2015-12-23 09:11:13 +00:00
|
|
|
}
|
|
|
|
|
2016-01-26 13:55:28 +00:00
|
|
|
TEST(WideRegisters) {
|
|
|
|
// Prepare prologue that creates frame for lots of registers.
|
|
|
|
std::ostringstream os;
|
|
|
|
for (size_t i = 0; i < 157; ++i) {
|
2019-01-28 14:55:17 +00:00
|
|
|
os << "var x" << i << " = 0;\n";
|
2016-01-26 13:55:28 +00:00
|
|
|
}
|
|
|
|
std::string prologue(os.str());
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"x0 = x127;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x0;\n",
|
2016-01-26 13:55:28 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"x127 = x126;\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x127;\n",
|
2016-02-02 14:31:35 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"if (x2 > 3) { return x129; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x128;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x0 = 0;\n"
|
|
|
|
"if (x129 == 3) { var x129 = x0; }\n"
|
|
|
|
"if (x2 > 3) { return x0; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x129;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x0 = 0;\n"
|
|
|
|
"var x1 = 0;\n"
|
|
|
|
"for (x128 = 0; x128 < 64; x128++) {"
|
|
|
|
" x1 += x128;"
|
|
|
|
"}"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x128;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x0 = 1234;\n"
|
|
|
|
"var x1 = 0;\n"
|
|
|
|
"for (x128 in x0) {"
|
|
|
|
" x1 += x128;"
|
|
|
|
"}"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x1;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"x0 = %Add(x64, x63);\n"
|
|
|
|
"x1 = %Add(x27, x143);\n"
|
|
|
|
"%TheHole();\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"return x1;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets, prologue.c_str()),
|
|
|
|
LoadGolden("WideRegisters.golden")));
|
2016-01-26 13:55:28 +00:00
|
|
|
}
|
|
|
|
|
2016-02-08 14:14:35 +00:00
|
|
|
TEST(ConstVariable) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10; return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = ( x = 20);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10; x = 20;\n",
|
2016-02-08 14:14:35 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ConstVariable.golden")));
|
2016-02-08 14:14:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(LetVariable) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10; return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = (x = 20);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10; x = 20;\n",
|
2016-02-08 14:14:35 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("LetVariable.golden")));
|
2016-02-08 14:14:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(ConstVariableContextSlot) {
|
|
|
|
// TODO(mythria): Add tests for initialization of this via super calls.
|
|
|
|
// TODO(mythria): Add tests that walk the context chain.
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10; function f1() {return x;}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10; function f1() {return x;} return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = (x = 20); function f1() {return x;}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"const x = 10; x = 20; function f1() {return x;}\n",
|
2016-02-08 14:14:35 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ConstVariableContextSlot.golden")));
|
2016-02-08 14:14:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(LetVariableContextSlot) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10; function f1() {return x;}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10; function f1() {return x;} return x;\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = (x = 20); function f1() {return x;}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
"let x = 10; x = 20; function f1() {return x;}\n",
|
2016-02-08 14:14:35 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("LetVariableContextSlot.golden")));
|
2016-02-08 14:14:35 +00:00
|
|
|
}
|
|
|
|
|
2016-02-03 14:41:19 +00:00
|
|
|
TEST(WithStatement) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"with ({x:42}) { return x; }\n",
|
2016-02-03 14:41:19 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("WithStatement.golden")));
|
2016-02-03 14:41:19 +00:00
|
|
|
}
|
|
|
|
|
2016-02-04 15:06:25 +00:00
|
|
|
TEST(DoDebugger) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-11 12:21:56 +00:00
|
|
|
"debugger;\n",
|
2016-02-04 15:06:25 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("DoDebugger.golden")));
|
2016-02-04 15:06:25 +00:00
|
|
|
}
|
|
|
|
|
2016-02-09 11:43:23 +00:00
|
|
|
TEST(ClassDeclarations) {
|
2016-02-25 12:07:07 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-02-25 12:07:07 +00:00
|
|
|
"class Person {\n"
|
|
|
|
" constructor(name) { this.name = name; }\n"
|
|
|
|
" speak() { console.log(this.name + ' is speaking.'); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"class person {\n"
|
|
|
|
" constructor(name) { this.name = name; }\n"
|
|
|
|
" speak() { console.log(this.name + ' is speaking.'); }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var n0 = 'a';\n"
|
|
|
|
"var n1 = 'b';\n"
|
|
|
|
"class N {\n"
|
|
|
|
" [n0]() { return n0; }\n"
|
|
|
|
" static [n1]() { return n1; }\n"
|
2016-05-11 12:21:56 +00:00
|
|
|
"}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var count = 0;\n"
|
|
|
|
"class C { constructor() { count++; }}\n"
|
|
|
|
"return new C();\n",
|
2016-12-07 10:34:15 +00:00
|
|
|
|
|
|
|
"(class {})\n"
|
|
|
|
"class E { static name () {}}\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ClassDeclarations.golden")));
|
2016-02-04 17:47:08 +00:00
|
|
|
}
|
|
|
|
|
2016-03-16 14:41:05 +00:00
|
|
|
TEST(ClassAndSuperClass) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-03-16 14:41:05 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-03-16 14:41:05 +00:00
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" method() { return 2; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" method() { return super.method() + 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B().method;\n"
|
|
|
|
" test();\n"
|
|
|
|
"})();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" get x() { return 1; }\n"
|
|
|
|
" set x(val) { return; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" method() { super.x = 2; return super.x; }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B().method;\n"
|
|
|
|
" test();\n"
|
|
|
|
"})();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" constructor(x) { this.x_ = x; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" constructor() { super(1); this.y_ = 2; }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B().constructor;\n"
|
|
|
|
"})();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" constructor() { this.x_ = 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" constructor() { super(); this.y_ = 2; }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B().constructor;\n"
|
|
|
|
"})();\n",
|
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ClassAndSuperClass.golden")));
|
2016-03-16 14:41:05 +00:00
|
|
|
}
|
2016-02-15 08:18:16 +00:00
|
|
|
|
2018-02-22 07:39:27 +00:00
|
|
|
TEST(PublicClassFields) {
|
2017-11-27 09:56:36 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-12-21 17:58:28 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" a;\n"
|
|
|
|
" ['b'];\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B {\n"
|
|
|
|
" a = 1;\n"
|
|
|
|
" ['b'] = this.a;\n"
|
|
|
|
" }\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A extends class {} {\n"
|
|
|
|
" a;\n"
|
|
|
|
" ['b'];\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B extends class {} {\n"
|
|
|
|
" a = 1;\n"
|
|
|
|
" ['b'] = this.a;\n"
|
|
|
|
" foo() { return 1; }\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" super();\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class C extends B {\n"
|
|
|
|
" a = 1;\n"
|
|
|
|
" ['b'] = this.a;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" (() => super())();\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
" new C;\n"
|
|
|
|
"}\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
2018-02-22 07:39:27 +00:00
|
|
|
LoadGolden("PublicClassFields.golden")));
|
2017-12-21 17:58:28 +00:00
|
|
|
}
|
|
|
|
|
2018-02-22 07:39:27 +00:00
|
|
|
TEST(PrivateClassFields) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2018-02-22 07:39:27 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" #a;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" this.#a = 1;\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B {\n"
|
|
|
|
" #a = 1;\n"
|
|
|
|
" }\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A extends class {} {\n"
|
|
|
|
" #a;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" super();\n"
|
|
|
|
" this.#a = 1;\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B extends class {} {\n"
|
|
|
|
" #a = 1;\n"
|
|
|
|
" #b = this.#a;\n"
|
|
|
|
" foo() { return this.#a; }\n"
|
|
|
|
" bar(v) { this.#b = v; }\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" super();\n"
|
|
|
|
" this.foo();\n"
|
|
|
|
" this.bar(3);\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class C extends B {\n"
|
|
|
|
" #a = 2;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" (() => super())();\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
" new C;\n"
|
|
|
|
"};\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrivateClassFields.golden")));
|
|
|
|
}
|
|
|
|
|
2020-05-08 06:52:01 +00:00
|
|
|
TEST(PrivateClassFieldAccess) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2020-05-08 06:52:01 +00:00
|
|
|
"class A {\n"
|
|
|
|
" #a;\n"
|
|
|
|
" #b;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" this.#a = this.#b;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = A;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class B {\n"
|
|
|
|
" #a;\n"
|
|
|
|
" #b;\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" this.#a = this.#b;\n"
|
|
|
|
" }\n"
|
|
|
|
" force(str) {\n"
|
|
|
|
" eval(str);\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = B;\n"
|
|
|
|
"new test;\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrivateClassFieldAccess.golden")));
|
|
|
|
}
|
|
|
|
|
2019-08-30 01:09:00 +00:00
|
|
|
TEST(PrivateMethodDeclaration) {
|
2019-05-13 19:39:54 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-07-19 09:37:12 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" #a() { return 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
2019-06-19 09:59:28 +00:00
|
|
|
|
2019-07-19 09:37:12 +00:00
|
|
|
"{\n"
|
|
|
|
" class D {\n"
|
|
|
|
" #d() { return 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class E extends D {\n"
|
|
|
|
" #e() { return 2; }\n"
|
|
|
|
" }\n"
|
2019-08-07 05:14:45 +00:00
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A { foo() {} }\n"
|
|
|
|
" class C extends A {\n"
|
|
|
|
" #m() { return super.foo; }\n"
|
|
|
|
" }\n"
|
2019-07-19 09:37:12 +00:00
|
|
|
"}\n"};
|
2019-06-19 09:59:28 +00:00
|
|
|
|
2019-05-13 19:39:54 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
2019-08-30 01:09:00 +00:00
|
|
|
LoadGolden("PrivateMethodDeclaration.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PrivateMethodAccess) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-08-30 01:09:00 +00:00
|
|
|
"class A {\n"
|
|
|
|
" #a() { return 1; }\n"
|
|
|
|
" constructor() { return this.#a(); }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = A;\n"
|
|
|
|
"new A;\n",
|
|
|
|
|
|
|
|
"class B {\n"
|
|
|
|
" #b() { return 1; }\n"
|
|
|
|
" constructor() { this.#b = 1; }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = B;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class C {\n"
|
|
|
|
" #c() { return 1; }\n"
|
|
|
|
" constructor() { this.#c++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = C;\n"
|
2019-12-04 19:02:02 +00:00
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class D {\n"
|
|
|
|
" #d() { return 1; }\n"
|
|
|
|
" constructor() { (() => this)().#d(); }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = D;\n"
|
2022-02-03 16:17:23 +00:00
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"class F extends class {} {\n"
|
|
|
|
" #method() { }\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" (test = () => super())();\n"
|
|
|
|
" this.#method();\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
|
|
|
"new F;\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"class G extends class {} {\n"
|
|
|
|
" #method() { }\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" test = () => super();\n"
|
|
|
|
" test();\n"
|
|
|
|
" this.#method();\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
|
|
|
"new G();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"class H extends class {} {\n"
|
|
|
|
" #method() { }\n"
|
|
|
|
" constructor(str) {\n"
|
|
|
|
" eval(str);\n"
|
|
|
|
" this.#method();\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
|
|
|
"new test('test = () => super(); test()');\n"};
|
2019-08-30 01:09:00 +00:00
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrivateMethodAccess.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PrivateAccessorAccess) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-08-30 01:09:00 +00:00
|
|
|
"class A {\n"
|
|
|
|
" get #a() { return 1; }\n"
|
|
|
|
" set #a(val) { }\n"
|
|
|
|
"\n"
|
|
|
|
" constructor() {\n"
|
|
|
|
" this.#a++;\n"
|
|
|
|
" this.#a = 1;\n"
|
|
|
|
" return this.#a;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = A;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class B {\n"
|
|
|
|
" get #b() { return 1; }\n"
|
|
|
|
" constructor() { this.#b++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = B;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class C {\n"
|
|
|
|
" set #c(val) { }\n"
|
|
|
|
" constructor() { this.#c++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = C;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class D {\n"
|
|
|
|
" get #d() { return 1; }\n"
|
|
|
|
" constructor() { this.#d = 1; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = D;\n"
|
|
|
|
"new test;\n",
|
|
|
|
|
|
|
|
"class E {\n"
|
|
|
|
" set #e(val) { }\n"
|
|
|
|
" constructor() { this.#e; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = E;\n"
|
|
|
|
"new test;\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PrivateAccessorAccess.golden")));
|
2019-05-13 19:39:54 +00:00
|
|
|
}
|
|
|
|
|
2019-09-11 10:56:40 +00:00
|
|
|
TEST(StaticPrivateMethodDeclaration) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-09-11 10:56:40 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" static #a() { return 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" static get #a() { return 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" static set #a(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" static get #a() { return 1; }\n"
|
|
|
|
" static set #a(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" static #a() { }\n"
|
|
|
|
" #b() { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StaticPrivateMethodDeclaration.golden")));
|
|
|
|
}
|
|
|
|
|
2019-10-10 14:33:02 +00:00
|
|
|
TEST(StaticPrivateMethodAccess) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-10-10 14:33:02 +00:00
|
|
|
"class A {\n"
|
|
|
|
" static #a() { return 1; }\n"
|
|
|
|
" static test() { return this.#a(); }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = A.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class B {\n"
|
|
|
|
" static #b() { return 1; }\n"
|
|
|
|
" static test() { this.#b = 1; }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = B.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class C {\n"
|
|
|
|
" static #c() { return 1; }\n"
|
|
|
|
" static test() { this.#c++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = C.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class D {\n"
|
|
|
|
" static get #d() { return 1; }\n"
|
|
|
|
" static set #d(val) { }\n"
|
|
|
|
"\n"
|
|
|
|
" static test() {\n"
|
|
|
|
" this.#d++;\n"
|
|
|
|
" this.#d = 1;\n"
|
|
|
|
" return this.#d;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"var test = D.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class E {\n"
|
|
|
|
" static get #e() { return 1; }\n"
|
|
|
|
" static test() { this.#e++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = E.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class F {\n"
|
|
|
|
" static set #f(val) { }\n"
|
|
|
|
" static test() { this.#f++; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = F.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class G {\n"
|
|
|
|
" static get #d() { return 1; }\n"
|
|
|
|
" static test() { this.#d = 1; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = G.test;\n"
|
|
|
|
"test();\n",
|
|
|
|
|
|
|
|
"class H {\n"
|
|
|
|
" set #h(val) { }\n"
|
|
|
|
" static test() { this.#h; }\n"
|
|
|
|
"}\n"
|
|
|
|
"var test = H.test;\n"
|
|
|
|
"test();\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StaticPrivateMethodAccess.golden")));
|
|
|
|
}
|
|
|
|
|
2019-08-30 01:09:00 +00:00
|
|
|
TEST(PrivateAccessorDeclaration) {
|
2019-08-20 14:48:28 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-08-20 14:48:28 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" get #a() { return 1; }\n"
|
|
|
|
" set #a(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class B {\n"
|
|
|
|
" get #b() { return 1; }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class C {\n"
|
|
|
|
" set #c(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class D {\n"
|
|
|
|
" get #d() { return 1; }\n"
|
|
|
|
" set #d(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class E extends D {\n"
|
|
|
|
" get #e() { return 2; }\n"
|
|
|
|
" set #e(val) { }\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A { foo() {} }\n"
|
|
|
|
" class C extends A {\n"
|
|
|
|
" get #a() { return super.foo; }\n"
|
|
|
|
" }\n"
|
|
|
|
" new C();\n"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"{\n"
|
|
|
|
" class A { foo(val) {} }\n"
|
|
|
|
" class C extends A {\n"
|
|
|
|
" set #a(val) { super.foo(val); }\n"
|
|
|
|
" }\n"
|
|
|
|
" new C();\n"
|
|
|
|
"}\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
2019-08-30 01:09:00 +00:00
|
|
|
LoadGolden("PrivateAccessorDeclaration.golden")));
|
2019-08-20 14:48:28 +00:00
|
|
|
}
|
|
|
|
|
2017-12-21 17:58:28 +00:00
|
|
|
TEST(StaticClassFields) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-11-28 12:27:07 +00:00
|
|
|
"{\n"
|
|
|
|
" class A {\n"
|
|
|
|
" a;\n"
|
|
|
|
" ['b'];\n"
|
|
|
|
" static c;\n"
|
|
|
|
" static ['d'];\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B {\n"
|
|
|
|
" a = 1;\n"
|
|
|
|
" ['b'] = this.a;\n"
|
|
|
|
" static c = 3;\n"
|
|
|
|
" static ['d'] = this.c;\n"
|
|
|
|
" }\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
"}\n",
|
|
|
|
|
2017-11-27 09:56:36 +00:00
|
|
|
"{\n"
|
|
|
|
" class A extends class {} {\n"
|
|
|
|
" a;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" ['b'];\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" static c;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" static ['d'];\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" class B extends class {} {\n"
|
|
|
|
" a = 1;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" ['b'] = this.a;\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" static c = 3;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" static ['d'] = this.c;\n"
|
|
|
|
" foo() { return 1; }\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" constructor() {\n"
|
|
|
|
" super();\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" class C extends B {\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" a = 1;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" ['b'] = this.a;\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" static c = 3;\n"
|
2017-11-28 12:27:07 +00:00
|
|
|
" static ['d'] = super.foo();\n"
|
2017-11-27 09:56:36 +00:00
|
|
|
" constructor() {\n"
|
|
|
|
" (() => super())();\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
"\n"
|
|
|
|
" new A;\n"
|
|
|
|
" new B;\n"
|
|
|
|
" new C;\n"
|
|
|
|
"}\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
2017-12-21 17:58:28 +00:00
|
|
|
LoadGolden("StaticClassFields.golden")));
|
2017-11-27 09:56:36 +00:00
|
|
|
}
|
|
|
|
|
2016-04-18 14:13:04 +00:00
|
|
|
TEST(Generators) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
2016-09-06 16:10:19 +00:00
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2016-04-18 14:13:04 +00:00
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-05-24 12:51:18 +00:00
|
|
|
"function* f() { }\n"
|
|
|
|
"f();\n",
|
2016-04-18 14:13:04 +00:00
|
|
|
|
2016-05-24 12:51:18 +00:00
|
|
|
"function* f() { yield 42 }\n"
|
|
|
|
"f();\n",
|
2016-04-18 14:13:04 +00:00
|
|
|
|
2016-05-24 12:51:18 +00:00
|
|
|
"function* f() { for (let x of [42]) yield x }\n"
|
|
|
|
"f();\n",
|
2017-05-22 14:52:07 +00:00
|
|
|
|
|
|
|
"function* g() { yield 42 }\n"
|
|
|
|
"function* f() { yield* g() }\n"
|
|
|
|
"f();\n",
|
2016-04-18 14:13:04 +00:00
|
|
|
};
|
|
|
|
|
2016-05-11 12:21:56 +00:00
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("Generators.golden")));
|
2016-04-18 14:13:04 +00:00
|
|
|
}
|
|
|
|
|
2017-07-02 20:59:29 +00:00
|
|
|
TEST(AsyncGenerators) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-07-02 20:59:29 +00:00
|
|
|
"async function* f() { }\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function* f() { yield 42 }\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function* f() { for (let x of [42]) yield x }\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function* g() { yield 42 }\n"
|
|
|
|
"async function* f() { yield* g() }\n"
|
|
|
|
"f();\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("AsyncGenerators.golden")));
|
|
|
|
}
|
|
|
|
|
2016-10-04 18:42:13 +00:00
|
|
|
TEST(Modules) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_module(true);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-10-04 18:42:13 +00:00
|
|
|
"import \"bar\";\n",
|
|
|
|
|
|
|
|
"import {foo} from \"bar\";\n",
|
|
|
|
|
|
|
|
"import {foo as goo} from \"bar\";\n"
|
|
|
|
"goo(42);\n"
|
|
|
|
"{ let x; { goo(42) } };\n",
|
|
|
|
|
|
|
|
"export var foo = 42;\n"
|
|
|
|
"foo++;\n"
|
|
|
|
"{ let x; { foo++ } };\n",
|
|
|
|
|
|
|
|
"export let foo = 42;\n"
|
|
|
|
"foo++;\n"
|
|
|
|
"{ let x; { foo++ } };\n",
|
|
|
|
|
|
|
|
"export const foo = 42;\n"
|
|
|
|
"foo++;\n"
|
|
|
|
"{ let x; { foo++ } };\n",
|
|
|
|
|
|
|
|
"export default (function () {});\n",
|
|
|
|
|
|
|
|
"export default (class {});\n",
|
|
|
|
|
|
|
|
"export {foo as goo} from \"bar\"\n",
|
|
|
|
|
|
|
|
"export * from \"bar\"\n",
|
2016-11-02 09:30:24 +00:00
|
|
|
|
|
|
|
"import * as foo from \"bar\"\n"
|
|
|
|
"foo.f(foo, foo.x);\n",
|
2016-10-04 18:42:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("Modules.golden")));
|
|
|
|
}
|
|
|
|
|
2019-09-23 15:42:10 +00:00
|
|
|
TEST(AsyncModules) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_module(true);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2019-09-23 15:42:10 +00:00
|
|
|
"await 42;\n",
|
|
|
|
|
|
|
|
"await import(\"foo\");\n",
|
|
|
|
|
|
|
|
"await 42;\n"
|
|
|
|
"async function foo() {\n"
|
|
|
|
" await 42;\n"
|
|
|
|
"}\n"
|
|
|
|
"foo();\n",
|
|
|
|
|
|
|
|
"import * as foo from \"bar\";\n"
|
|
|
|
"await import(\"goo\");\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("AsyncModules.golden")));
|
|
|
|
}
|
|
|
|
|
2016-12-01 09:42:07 +00:00
|
|
|
TEST(SuperCallAndSpread) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("test");
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2016-12-01 09:42:07 +00:00
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" constructor(...args) { this.baseArgs = args; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {}\n"
|
|
|
|
" test = new B(1, 2, 3).constructor;\n"
|
|
|
|
"})();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" constructor(...args) { this.baseArgs = args; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" constructor(...args) { super(1, ...args); }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B(1, 2, 3).constructor;\n"
|
|
|
|
"})();\n",
|
|
|
|
|
|
|
|
"var test;\n"
|
|
|
|
"(function() {\n"
|
|
|
|
" class A {\n"
|
|
|
|
" constructor(...args) { this.baseArgs = args; }\n"
|
|
|
|
" }\n"
|
|
|
|
" class B extends A {\n"
|
|
|
|
" constructor(...args) { super(1, ...args, 1); }\n"
|
|
|
|
" }\n"
|
|
|
|
" test = new B(1, 2, 3).constructor;\n"
|
|
|
|
"})();\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("SuperCallAndSpread.golden")));
|
|
|
|
}
|
|
|
|
|
2017-01-23 09:03:35 +00:00
|
|
|
TEST(CallAndSpread) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {"Math.max(...[1, 2, 3]);\n",
|
2017-01-23 09:03:35 +00:00
|
|
|
"Math.max(0, ...[1, 2, 3]);\n",
|
|
|
|
"Math.max(0, ...[1, 2, 3], 4);\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("CallAndSpread.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(NewAndSpread) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-01-23 09:03:35 +00:00
|
|
|
"class A { constructor(...args) { this.args = args; } }\n"
|
|
|
|
"new A(...[1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"class A { constructor(...args) { this.args = args; } }\n"
|
|
|
|
"new A(0, ...[1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"class A { constructor(...args) { this.args = args; } }\n"
|
|
|
|
"new A(0, ...[1, 2, 3], 4);\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("NewAndSpread.golden")));
|
|
|
|
}
|
|
|
|
|
2017-02-24 17:48:49 +00:00
|
|
|
TEST(ForAwaitOf) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-02-24 17:48:49 +00:00
|
|
|
"async function f() {\n"
|
|
|
|
" for await (let x of [1, 2, 3]) {}\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function f() {\n"
|
|
|
|
" for await (let x of [1, 2, 3]) { return x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function f() {\n"
|
|
|
|
" for await (let x of [10, 20, 30]) {\n"
|
|
|
|
" if (x == 10) continue;\n"
|
|
|
|
" if (x == 20) break;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function f() {\n"
|
|
|
|
" var x = { 'a': 1, 'b': 2 };\n"
|
|
|
|
" for (x['a'] of [1,2,3]) { return x['a']; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ForAwaitOf.golden")));
|
|
|
|
}
|
|
|
|
|
2017-04-18 14:56:06 +00:00
|
|
|
TEST(StandardForLoop) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-04-18 14:56:06 +00:00
|
|
|
"function f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) { eval('1'); }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) { (function() { return x; })(); }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function f() {\n"
|
|
|
|
" for (let { x, y } = { x: 0, y: 3 }; y > 0; --y) { let z = x + y; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function* f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"function* f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) yield x;\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n",
|
|
|
|
|
|
|
|
"async function f() {\n"
|
|
|
|
" for (let x = 0; x < 10; ++x) await x;\n"
|
|
|
|
"}\n"
|
|
|
|
"f();\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StandardForLoop.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(ForOfLoop) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_test_function_name("f");
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-04-18 14:56:06 +00:00
|
|
|
"function f(arr) {\n"
|
|
|
|
" for (let x of arr) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"function f(arr) {\n"
|
|
|
|
" for (let x of arr) { eval('1'); }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"function f(arr) {\n"
|
|
|
|
" for (let x of arr) { (function() { return x; })(); }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"function f(arr) {\n"
|
|
|
|
" for (let { x, y } of arr) { let z = x + y; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([{ x: 0, y: 3 }, { x: 1, y: 9 }, { x: -12, y: 17 }]);\n",
|
|
|
|
|
|
|
|
"function* f(arr) {\n"
|
|
|
|
" for (let x of arr) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"function* f(arr) {\n"
|
|
|
|
" for (let x of arr) yield x;\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"async function f(arr) {\n"
|
|
|
|
" for (let x of arr) { let y = x; }\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n",
|
|
|
|
|
|
|
|
"async function f(arr) {\n"
|
|
|
|
" for (let x of arr) await x;\n"
|
|
|
|
"}\n"
|
|
|
|
"f([1, 2, 3]);\n"};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("ForOfLoop.golden")));
|
|
|
|
}
|
|
|
|
|
2017-05-22 11:14:02 +00:00
|
|
|
TEST(StringConcat) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2017-05-22 11:14:02 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return a + b + 'string';\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return 'string' + a + b;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return a + 'string' + b;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return 'foo' + a + 'bar' + b + 'baz' + 1;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return (a + 'string') + ('string' + b);\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"function foo(a, b) { };\n"
|
|
|
|
"return 'string' + foo(a, b) + a + b;\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("StringConcat.golden")));
|
|
|
|
}
|
|
|
|
|
2018-03-06 20:23:05 +00:00
|
|
|
TEST(TemplateLiterals) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2021-09-27 18:45:12 +00:00
|
|
|
std::string snippets[] = {
|
2018-03-06 20:23:05 +00:00
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return `${a}${b}string`;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return `string${a}${b}`;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return `${a}string${b}`;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return `foo${a}bar${b}baz${1}`;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"return `${a}string` + `string${b}`;\n",
|
|
|
|
|
|
|
|
"var a = 1;\n"
|
|
|
|
"var b = 2;\n"
|
|
|
|
"function foo(a, b) { };\n"
|
|
|
|
"return `string${foo(a, b)}${a}${b}`;\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("TemplateLiterals.golden")));
|
|
|
|
}
|
|
|
|
|
2015-08-18 13:46:43 +00:00
|
|
|
} // namespace interpreter
|
|
|
|
} // namespace internal
|
2015-09-30 13:46:56 +00:00
|
|
|
} // namespace v8
|