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>
|
|
|
|
|
2015-08-18 13:46:43 +00:00
|
|
|
#include "src/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"
|
2017-01-09 13:43:28 +00:00
|
|
|
#include "src/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 {
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#define XSTR(A) #A
|
|
|
|
#define STR(A) XSTR(A)
|
2016-02-04 17:47:08 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#define UNIQUE_VAR() "var a" STR(__COUNTER__) " = 0;\n"
|
2015-08-18 13:46:43 +00:00
|
|
|
|
2018-05-11 08:52:00 +00:00
|
|
|
#define LOAD_UNIQUE_PROPERTY() " b.name" STR(__COUNTER__) ";\n"
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#define REPEAT_2(...) __VA_ARGS__ __VA_ARGS__
|
|
|
|
#define REPEAT_4(...) REPEAT_2(__VA_ARGS__) REPEAT_2(__VA_ARGS__)
|
|
|
|
#define REPEAT_8(...) REPEAT_4(__VA_ARGS__) REPEAT_4(__VA_ARGS__)
|
|
|
|
#define REPEAT_16(...) REPEAT_8(__VA_ARGS__) REPEAT_8(__VA_ARGS__)
|
|
|
|
#define REPEAT_32(...) REPEAT_16(__VA_ARGS__) REPEAT_16(__VA_ARGS__)
|
|
|
|
#define REPEAT_64(...) REPEAT_32(__VA_ARGS__) REPEAT_32(__VA_ARGS__)
|
|
|
|
#define REPEAT_128(...) REPEAT_64(__VA_ARGS__) REPEAT_64(__VA_ARGS__)
|
|
|
|
#define REPEAT_256(...) REPEAT_128(__VA_ARGS__) REPEAT_128(__VA_ARGS__)
|
|
|
|
|
|
|
|
#define REPEAT_127(...) \
|
|
|
|
REPEAT_64(__VA_ARGS__) \
|
|
|
|
REPEAT_32(__VA_ARGS__) \
|
|
|
|
REPEAT_16(__VA_ARGS__) \
|
|
|
|
REPEAT_8(__VA_ARGS__) \
|
|
|
|
REPEAT_4(__VA_ARGS__) \
|
|
|
|
REPEAT_2(__VA_ARGS__) \
|
|
|
|
__VA_ARGS__
|
2015-09-02 13:03:06 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
#define REPEAT_249(...) \
|
|
|
|
REPEAT_127(__VA_ARGS__) \
|
|
|
|
REPEAT_64(__VA_ARGS__) \
|
|
|
|
REPEAT_32(__VA_ARGS__) \
|
|
|
|
REPEAT_16(__VA_ARGS__) \
|
|
|
|
REPEAT_8(__VA_ARGS__) \
|
|
|
|
REPEAT_2(__VA_ARGS__)
|
|
|
|
|
|
|
|
#define REPEAT_2_UNIQUE_VARS() UNIQUE_VAR() UNIQUE_VAR()
|
|
|
|
#define REPEAT_4_UNIQUE_VARS() REPEAT_2_UNIQUE_VARS() REPEAT_2_UNIQUE_VARS()
|
|
|
|
#define REPEAT_8_UNIQUE_VARS() REPEAT_4_UNIQUE_VARS() REPEAT_4_UNIQUE_VARS()
|
|
|
|
#define REPEAT_16_UNIQUE_VARS() REPEAT_8_UNIQUE_VARS() REPEAT_8_UNIQUE_VARS()
|
|
|
|
#define REPEAT_32_UNIQUE_VARS() REPEAT_16_UNIQUE_VARS() REPEAT_16_UNIQUE_VARS()
|
|
|
|
#define REPEAT_64_UNIQUE_VARS() REPEAT_32_UNIQUE_VARS() REPEAT_32_UNIQUE_VARS()
|
|
|
|
#define REPEAT_128_UNIQUE_VARS() REPEAT_64_UNIQUE_VARS() REPEAT_64_UNIQUE_VARS()
|
|
|
|
|
2016-09-07 06:54:36 +00:00
|
|
|
#define REPEAT_250_UNIQUE_VARS() \
|
2016-02-25 12:07:07 +00:00
|
|
|
REPEAT_128_UNIQUE_VARS() \
|
|
|
|
REPEAT_64_UNIQUE_VARS() \
|
|
|
|
REPEAT_32_UNIQUE_VARS() \
|
|
|
|
REPEAT_16_UNIQUE_VARS() \
|
|
|
|
REPEAT_8_UNIQUE_VARS() \
|
2016-09-07 06:54:36 +00:00
|
|
|
UNIQUE_VAR() \
|
2016-02-25 12:07:07 +00:00
|
|
|
UNIQUE_VAR()
|
|
|
|
|
2018-05-11 08:52:00 +00:00
|
|
|
#define REPEAT_2_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
LOAD_UNIQUE_PROPERTY() LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_4_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_2_LOAD_UNIQUE_PROPERTY() REPEAT_2_LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_8_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_4_LOAD_UNIQUE_PROPERTY() REPEAT_4_LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_16_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_8_LOAD_UNIQUE_PROPERTY() REPEAT_8_LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_32_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_16_LOAD_UNIQUE_PROPERTY() REPEAT_16_LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_64_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_32_LOAD_UNIQUE_PROPERTY() REPEAT_32_LOAD_UNIQUE_PROPERTY()
|
|
|
|
#define REPEAT_128_LOAD_UNIQUE_PROPERTY() \
|
|
|
|
REPEAT_64_LOAD_UNIQUE_PROPERTY() REPEAT_64_LOAD_UNIQUE_PROPERTY()
|
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
static const char* kGoldenFileDirectory =
|
|
|
|
"test/cctest/interpreter/bytecode_expectations/";
|
|
|
|
|
|
|
|
class InitializedIgnitionHandleScope : public InitializedHandleScope {
|
|
|
|
public:
|
|
|
|
InitializedIgnitionHandleScope() {
|
2015-09-10 16:21:34 +00:00
|
|
|
i::FLAG_always_opt = 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
void SkipGoldenFileHeader(std::istream& stream) { // NOLINT
|
|
|
|
std::string line;
|
|
|
|
int separators_seen = 0;
|
|
|
|
while (std::getline(stream, line)) {
|
|
|
|
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());
|
|
|
|
SkipGoldenFileHeader(expected_file);
|
|
|
|
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,
|
|
|
|
const char* (&snippet_list)[N],
|
|
|
|
const char* prologue = nullptr,
|
|
|
|
const char* epilogue = nullptr) {
|
|
|
|
std::ostringstream actual_stream;
|
|
|
|
for (const char* snippet : snippet_list) {
|
|
|
|
std::string source_code;
|
|
|
|
if (prologue) source_code += prologue;
|
|
|
|
source_code += snippet;
|
|
|
|
if (epilogue) source_code += epilogue;
|
|
|
|
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
|
|
|
|
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); }));
|
|
|
|
}
|
|
|
|
|
|
|
|
// inplace right trim
|
|
|
|
static inline void rtrim(std::string& str) {
|
2018-08-10 12:41:06 +00:00
|
|
|
str.erase(std::find_if(str.rbegin(), str.rend(),
|
|
|
|
[](unsigned char ch) { return !std::isspace(ch); })
|
|
|
|
.base(),
|
2018-08-07 13:14:23 +00:00
|
|
|
str.end());
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline std::string trim(std::string& str) {
|
|
|
|
ltrim(str);
|
|
|
|
rtrim(str);
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2018-08-07 13:14:23 +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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"",
|
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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 1; var a = 2, b = 3; return x || (" //
|
|
|
|
REPEAT_32("\n a = 1, b = 2, ") //
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2015-08-27 10:32:26 +00:00
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
"var x = 0; var a = 2, b = 3; return x && (" //
|
|
|
|
REPEAT_32("\n a = 1, b = 2, ") //
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 1; var a = 2, b = 3; return (x > 3) || (" //
|
|
|
|
REPEAT_32("\n a = 1, b = 2, ") //
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
2016-02-25 12:07:07 +00:00
|
|
|
|
|
|
|
"var x = 0; var a = 2, b = 3; return (x < 5) && (" //
|
|
|
|
REPEAT_32("\n a = 1, b = 2, ") //
|
2016-05-11 12:21:56 +00:00
|
|
|
"3);\n",
|
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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
2018-05-11 08:52:00 +00:00
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
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"
|
|
|
|
" c = a[b];\n"
|
|
|
|
REPEAT_127(" c = a[b];\n")
|
|
|
|
" return a[b];\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"}, \"name\")\n",
|
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
|
|
|
}
|
|
|
|
|
2018-08-07 13:14:23 +00:00
|
|
|
TEST(PropertyLoadStoreOneShot) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
2018-08-10 12:41:06 +00:00
|
|
|
printer.set_oneshot_opt(true);
|
|
|
|
|
2018-08-07 13:14:23 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'a': 1,
|
|
|
|
'b': 2
|
|
|
|
};
|
|
|
|
|
|
|
|
v = l['a'] + l['b'];
|
|
|
|
l['b'] = 7;
|
|
|
|
l['a'] = l['b'];
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'a': 1.1,
|
|
|
|
'b': 2.2
|
|
|
|
};
|
|
|
|
for (i = 0; i < 5; ++i) {
|
|
|
|
l['a'] = l['a'] + l['b'];
|
|
|
|
l['b'] = l['a'] + l['b'];
|
|
|
|
}
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'a': 1.1,
|
|
|
|
'b': 2.2
|
|
|
|
};
|
|
|
|
while (s > 0) {
|
|
|
|
l['a'] = l['a'] - l['b'];
|
|
|
|
l['b'] = l['b'] - l['a'];
|
|
|
|
}
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'a': 1.1,
|
|
|
|
'b': 2.2
|
|
|
|
};
|
|
|
|
s = 10;
|
|
|
|
do {
|
|
|
|
l['a'] = l['b'] - l['a'];
|
|
|
|
} while (s < 10);
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
l = {
|
|
|
|
'c': 1.1,
|
|
|
|
'd': 2.2
|
|
|
|
};
|
|
|
|
if (l['c'] < 3) {
|
|
|
|
l['c'] = 3;
|
|
|
|
} else {
|
|
|
|
l['d'] = 3;
|
|
|
|
}
|
|
|
|
)",
|
2018-08-23 09:50:54 +00:00
|
|
|
|
|
|
|
R"(
|
|
|
|
a = [1.1, [2.2, 4.5]];
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
b = [];
|
|
|
|
)",
|
2018-08-07 13:14:23 +00:00
|
|
|
};
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("PropertyLoadStoreOneShot.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PropertyLoadStoreWithoutOneShot) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
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),
|
|
|
|
LoadGolden("PropertyLoadStoreWithoutOneShot.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(IIFEWithOneshotOpt) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
v8::Isolate* isolate = CcTest::isolate();
|
|
|
|
BytecodeExpectationsPrinter printer(isolate);
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
printer.set_print_callee(true);
|
2018-08-10 12:41:06 +00:00
|
|
|
printer.set_oneshot_opt(true);
|
2018-08-07 13:14:23 +00:00
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
// No feedback vectors for top-level loads/store named property in an IIFE
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {};
|
|
|
|
l.aa = 2;
|
|
|
|
l.bb = l.aa;
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
// Normal load/store within loops of an IIFE
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {};
|
|
|
|
for (i = 0; i < 5; ++i) {
|
|
|
|
l.aa = 2;
|
|
|
|
l.bb = l.aa;
|
|
|
|
}
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {};
|
|
|
|
c = 4;
|
|
|
|
while(c > 4) {
|
|
|
|
l.aa = 2;
|
|
|
|
l.bb = l.aa;
|
|
|
|
c--;
|
|
|
|
}
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {};
|
|
|
|
c = 4;
|
|
|
|
do {
|
|
|
|
l.aa = 2;
|
|
|
|
l.bb = l.aa;
|
|
|
|
c--;
|
|
|
|
} while(c > 4)
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
// No feedback vectors for loads/stores in conditionals
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
l = {
|
|
|
|
'aa': 3.3,
|
|
|
|
'bb': 4.4
|
|
|
|
};
|
|
|
|
if (l.aa < 3) {
|
|
|
|
l.aa = 3;
|
|
|
|
} else {
|
|
|
|
l.aa = l.bb;
|
|
|
|
}
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
2018-08-23 09:50:54 +00:00
|
|
|
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
a = [0, [1, 1,2,], 3];
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
|
|
|
|
R"(
|
|
|
|
(function() {
|
|
|
|
a = [];
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
)",
|
2018-09-17 08:44:19 +00:00
|
|
|
// CallNoFeedback instead of CallProperty
|
|
|
|
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;
|
|
|
|
})();
|
|
|
|
)",
|
|
|
|
// CallNoFeedback instead of CallUndefinedReceiver
|
|
|
|
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;
|
|
|
|
})();
|
|
|
|
)",
|
2019-01-21 10:13:52 +00:00
|
|
|
// TODO(rmcilroy): Make this function produce one-shot code.
|
2018-09-19 09:30:52 +00:00
|
|
|
R"(
|
|
|
|
var t = 0;
|
|
|
|
function f2() {};
|
|
|
|
if (t == 0) {
|
|
|
|
(function(){
|
|
|
|
l = {};
|
|
|
|
l.a = 3;
|
|
|
|
l.b = 4;
|
|
|
|
f2();
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
}
|
|
|
|
)",
|
|
|
|
// No one-shot opt for IIFE`s within a function
|
|
|
|
R"(
|
|
|
|
function f2() {};
|
|
|
|
function f() {
|
|
|
|
return (function(){
|
|
|
|
l = {};
|
|
|
|
l.a = 3;
|
|
|
|
l.b = 4;
|
|
|
|
f2();
|
|
|
|
return arguments.callee;
|
|
|
|
})();
|
|
|
|
}
|
|
|
|
f();
|
|
|
|
)",
|
2018-10-02 15:02:21 +00:00
|
|
|
R"(
|
|
|
|
var f = function(l) { l.a = 3; return l; };
|
|
|
|
f({});
|
|
|
|
f;
|
|
|
|
)",
|
|
|
|
// No one-shot opt for top-level functions enclosed in parentheses
|
|
|
|
R"(
|
|
|
|
var f = (function(l) { l.a = 3; return l; });
|
|
|
|
f;
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
var f = (function foo(l) { l.a = 3; return l; });
|
|
|
|
f;
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
var f = function foo(l) { l.a = 3; return l; };
|
|
|
|
f({});
|
|
|
|
f;
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
l = {};
|
|
|
|
var f = (function foo(l) { l.a = 3; return arguments.callee; })(l);
|
|
|
|
f;
|
|
|
|
)",
|
|
|
|
R"(
|
|
|
|
var f = (function foo(l) { l.a = 3; return arguments.callee; })({});
|
|
|
|
f;
|
|
|
|
)",
|
2018-08-07 13:14:23 +00:00
|
|
|
};
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("IIFEWithOneshotOpt.golden")));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(IIFEWithoutOneshotOpt) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
v8::Isolate* isolate = CcTest::isolate();
|
|
|
|
BytecodeExpectationsPrinter printer(isolate);
|
|
|
|
printer.set_wrap(false);
|
|
|
|
printer.set_top_level(true);
|
|
|
|
printer.set_print_callee(true);
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
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
|
|
|
};
|
|
|
|
CHECK(CompareTexts(BuildActual(printer, snippets),
|
|
|
|
LoadGolden("IIFEWithoutOneshotOpt.golden")));
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
2018-05-11 08:52:00 +00:00
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
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"
|
2018-05-11 08:52:00 +00:00
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
2016-02-25 12:07:07 +00:00
|
|
|
" a.name = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" a[b] = 1;\n"
|
|
|
|
REPEAT_127(" a[b] = 1;\n")
|
|
|
|
" a[b] = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
|
|
|
|
|
|
|
"function f(a, b) {\n"
|
|
|
|
" 'use strict';\n"
|
|
|
|
" a[b] = 1;\n"
|
|
|
|
REPEAT_127(" a[b] = 1;\n")
|
|
|
|
" a[b] = 2;\n"
|
|
|
|
"}\n"
|
|
|
|
"f({name : \"test\"})\n",
|
2015-11-17 12:18:25 +00:00
|
|
|
};
|
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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
2018-05-11 08:52:00 +00:00
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
|
|
|
" a.func;\n" //
|
|
|
|
" 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
|
|
|
};
|
|
|
|
|
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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
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
|
|
|
};
|
|
|
|
|
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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
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"
|
2018-05-11 08:52:00 +00:00
|
|
|
" var b = {};\n"
|
|
|
|
REPEAT_128_LOAD_UNIQUE_PROPERTY()
|
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
|
|
|
};
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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
|
|
|
|
|
|
|
"function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n"
|
|
|
|
REPEAT_64(" b = a; a = b;\n")
|
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"
|
|
|
|
" if (a) {\n"
|
|
|
|
REPEAT_64(" b = a; a = b;\n")
|
|
|
|
" 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
|
|
|
};
|
|
|
|
|
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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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")));
|
|
|
|
}
|
|
|
|
|
2017-04-03 14:17:16 +00:00
|
|
|
TEST(CompareNil) {
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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) {
|
2016-01-11 16:37:53 +00:00
|
|
|
// The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this
|
|
|
|
// ever changes, the REPEAT_XXX should be changed to output the correct number
|
|
|
|
// of unique variables to trigger the wide slot load / store.
|
|
|
|
STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256);
|
2015-10-16 15:29:07 +00:00
|
|
|
|
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
|
|
|
const char* 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
|
|
|
|
|
|
|
"'use strict';\n"
|
2016-09-07 06:54:36 +00:00
|
|
|
REPEAT_250_UNIQUE_VARS()
|
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
|
|
|
};
|
|
|
|
|
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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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"
|
|
|
|
" case 1:\n"
|
|
|
|
REPEAT_64(" a = 2;\n")
|
|
|
|
" 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
|
|
|
};
|
|
|
|
|
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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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
|
|
|
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* 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());
|
2016-02-25 12:07:07 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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-28 09:42:57 +00:00
|
|
|
bool old_flag = i::FLAG_harmony_public_fields;
|
|
|
|
i::FLAG_harmony_public_fields = true;
|
2017-11-27 09:56:36 +00:00
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2017-12-21 17:58:28 +00:00
|
|
|
const char* snippets[] = {
|
|
|
|
"{\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
|
|
|
i::FLAG_harmony_public_fields = old_flag;
|
|
|
|
}
|
|
|
|
|
2018-02-22 07:39:27 +00:00
|
|
|
TEST(PrivateClassFields) {
|
|
|
|
bool old_flag = i::FLAG_harmony_private_fields;
|
|
|
|
i::FLAG_harmony_private_fields = true;
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"{\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")));
|
|
|
|
i::FLAG_harmony_private_fields = old_flag;
|
|
|
|
}
|
|
|
|
|
2017-12-21 17:58:28 +00:00
|
|
|
TEST(StaticClassFields) {
|
|
|
|
bool old_flag = i::FLAG_harmony_public_fields;
|
|
|
|
bool old_static_flag = i::FLAG_harmony_static_fields;
|
|
|
|
i::FLAG_harmony_public_fields = true;
|
|
|
|
i::FLAG_harmony_static_fields = true;
|
|
|
|
InitializedIgnitionHandleScope scope;
|
|
|
|
BytecodeExpectationsPrinter printer(CcTest::isolate());
|
|
|
|
|
2017-11-27 09:56:36 +00:00
|
|
|
const char* 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-28 09:42:57 +00:00
|
|
|
i::FLAG_harmony_public_fields = old_flag;
|
2017-12-21 17:58:28 +00:00
|
|
|
i::FLAG_harmony_static_fields = old_static_flag;
|
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");
|
|
|
|
|
|
|
|
const char* 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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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);
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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")));
|
|
|
|
}
|
|
|
|
|
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");
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
const char* snippets[] = {"Math.max(...[1, 2, 3]);\n",
|
|
|
|
"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());
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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");
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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());
|
|
|
|
|
|
|
|
const char* snippets[] = {
|
|
|
|
"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")));
|
|
|
|
}
|
|
|
|
|
2017-09-24 20:42:56 +00:00
|
|
|
#undef XSTR
|
|
|
|
#undef STR
|
|
|
|
#undef UNIQUE_VAR
|
|
|
|
#undef REPEAT_2
|
|
|
|
#undef REPEAT_4
|
|
|
|
#undef REPEAT_8
|
|
|
|
#undef REPEAT_16
|
|
|
|
#undef REPEAT_32
|
|
|
|
#undef REPEAT_64
|
|
|
|
#undef REPEAT_128
|
|
|
|
#undef REPEAT_256
|
|
|
|
#undef REPEAT_127
|
|
|
|
#undef REPEAT_249
|
|
|
|
#undef REPEAT_2_UNIQUE_VARS
|
|
|
|
#undef REPEAT_4_UNIQUE_VARS
|
|
|
|
#undef REPEAT_8_UNIQUE_VARS
|
|
|
|
#undef REPEAT_16_UNIQUE_VARS
|
|
|
|
#undef REPEAT_32_UNIQUE_VARS
|
|
|
|
#undef REPEAT_64_UNIQUE_VARS
|
|
|
|
#undef REPEAT_128_UNIQUE_VARS
|
|
|
|
#undef REPEAT_250_UNIQUE_VARS
|
2018-05-11 08:52:00 +00:00
|
|
|
#undef LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_2_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_4_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_8_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_16_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_32_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_64_LOAD_UNIQUE_PROPERTY
|
|
|
|
#undef REPEAT_128_LOAD_UNIQUE_PROPERTY
|
2017-09-24 20:42:56 +00:00
|
|
|
#undef FUNC_ARG
|
|
|
|
|
2015-08-18 13:46:43 +00:00
|
|
|
} // namespace interpreter
|
|
|
|
} // namespace internal
|
2015-09-30 13:46:56 +00:00
|
|
|
} // namespace v8
|