| Index: test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| diff --git a/test/unittests/compiler/bytecode-graph-builder-unittest.cc b/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| index 7a815ca0c886f624bbc19e577aeb9f9cba9a707f..822ddb876bd0c614b4e51cc53d2e961c9726e9de 100644
|
| --- a/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| +++ b/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| @@ -56,6 +56,7 @@ namespace compiler {
|
| REPEAT_4(SEP, __VA_ARGS__) SEP() REPEAT_2(SEP, __VA_ARGS__) SEP() __VA_ARGS__
|
|
|
| static const char* kFunctionName = "f";
|
| +static const char* kLanguageModeStatements[] = {"", " 'use strict'; "};
|
|
|
| class GraphGeneratorHelper {
|
| public:
|
| @@ -407,82 +408,47 @@ TEST_F(BytecodeGraphBuilderTest, SimpleExpressionWithRegister) {
|
| }
|
|
|
|
|
| -TEST_F(BytecodeGraphBuilderTest, NamedLoadSloppy) {
|
| - const char* code_snippet = "function f(p1) {return p1.val;}; f({val:10});";
|
| - GraphGeneratorHelper helper(isolate(), zone(), code_snippet);
|
| - Graph* graph = helper.GetCompletedGraph();
|
| -
|
| - Node* ret = graph->end()->InputAt(0);
|
| - Node* start = graph->start();
|
| -
|
| - Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| - Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| - Matcher<Node*> load_named_matcher = IsJSLoadNamed(
|
| - name, IsParameter(1), feedback_vector_matcher, start, start);
|
| -
|
| - EXPECT_THAT(ret, IsReturn(load_named_matcher, _, _));
|
| -}
|
| +TEST_F(BytecodeGraphBuilderTest, LoadNamed) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet = std::string("function f(p1) {") + language_mode +
|
| + " return p1.val;}; f({val:10});";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
|
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
|
|
| -TEST_F(BytecodeGraphBuilderTest, NamedLoadStrict) {
|
| - const char* code_snippet =
|
| - "function f(p1) {'use strict'; return p1.val;}; f({val:10});";
|
| - GraphGeneratorHelper helper(isolate(), zone(), code_snippet);
|
| - Graph* graph = helper.GetCompletedGraph();
|
| + Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> load_named_matcher = IsJSLoadNamed(
|
| + name, IsParameter(1), feedback_vector_matcher, start, start);
|
|
|
| - Node* ret = graph->end()->InputAt(0);
|
| - Node* start = graph->start();
|
| -
|
| - Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| - Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| - Matcher<Node*> load_named_matcher = IsJSLoadNamed(
|
| - name, IsParameter(1), feedback_vector_matcher, start, start);
|
| -
|
| - EXPECT_THAT(ret, IsReturn(load_named_matcher, _, _));
|
| -}
|
| -
|
| -
|
| -TEST_F(BytecodeGraphBuilderTest, NamedLoadSloppyWide) {
|
| - const char code_snippet[] = "function f(p1) {var b; "
|
| - REPEAT_127(SPACE, " b = p1.val_prev; ")
|
| - "return p1.val;}; f({val:10, val_prev:20});";
|
| - GraphGeneratorHelper helper(isolate(), zone(), code_snippet);
|
| - Graph* graph = helper.GetCompletedGraph();
|
| -
|
| - Node* ret = graph->end()->InputAt(0);
|
| - Node* start = graph->start();
|
| -
|
| - Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| - Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| - Matcher<Node*> preceeding_load = IsJSLoadNamed(
|
| - GraphGeneratorHelper::GetName(isolate(), "val_prev"), _, _, _, _);
|
| - Matcher<Node*> load_named_matcher_wide =
|
| - IsJSLoadNamed(name, IsParameter(1), feedback_vector_matcher,
|
| - preceeding_load, IsIfSuccess(_));
|
| -
|
| - EXPECT_THAT(ret, IsReturn(load_named_matcher_wide, _, _));
|
| + EXPECT_THAT(ret, IsReturn(load_named_matcher, _, _));
|
| + }
|
| }
|
|
|
|
|
| -TEST_F(BytecodeGraphBuilderTest, NamedLoadStrictWide) {
|
| - const char code_snippet[] = "function f(p1) {'use strict'; var b;"
|
| - REPEAT_127(SPACE, " b = p1.val_prev; ")
|
| - "return p1.val;}; f({val:10, val_prev:20});";
|
| - GraphGeneratorHelper helper(isolate(), zone(), code_snippet);
|
| - Graph* graph = helper.GetCompletedGraph();
|
| +TEST_F(BytecodeGraphBuilderTest, LoadNamedWide) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet = std::string("function f(p1) {") + language_mode +
|
| + REPEAT_127(SPACE, " var b = p1.val_prev; ")
|
| + " return p1.val;}; f({val:10, val_prev:20});";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
|
|
| - Node* ret = graph->end()->InputAt(0);
|
| - Node* start = graph->start();
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
|
|
| - Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| - Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| - Matcher<Node*> preceeding_load = IsJSLoadNamed(
|
| - GraphGeneratorHelper::GetName(isolate(), "val_prev"), _, _, _, _);
|
| - Matcher<Node*> load_named_matcher_wide =
|
| - IsJSLoadNamed(name, IsParameter(1), feedback_vector_matcher,
|
| - preceeding_load, IsIfSuccess(_));
|
| + Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "val");
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> preceeding_load = IsJSLoadNamed(
|
| + GraphGeneratorHelper::GetName(isolate(), "val_prev"), _, _, _, _);
|
| + Matcher<Node*> load_named_matcher_wide =
|
| + IsJSLoadNamed(name, IsParameter(1), feedback_vector_matcher,
|
| + preceeding_load, IsIfSuccess(_));
|
|
|
| - EXPECT_THAT(ret, IsReturn(load_named_matcher_wide, _, _));
|
| + EXPECT_THAT(ret, IsReturn(load_named_matcher_wide, _, _));
|
| + }
|
| }
|
|
|
|
|
| @@ -533,6 +499,101 @@ TEST_F(BytecodeGraphBuilderTest, CallProperty2) {
|
| EXPECT_THAT(ret, IsReturn(call_matcher, _, _));
|
| }
|
|
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, LoadGlobal) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet = std::string("var global = 123; function f() {") +
|
| + language_mode + " return global; }; f();";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
| +
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
| +
|
| + Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "global");
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> load_global_matcher =
|
| + IsJSLoadGlobal(name, feedback_vector_matcher, start, start);
|
| +
|
| + EXPECT_THAT(ret, IsReturn(load_global_matcher, _, _));
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, LoadGlobalWide) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet =
|
| + std::string("var global = 123; var global_obj = {name:'abc'};") +
|
| + "function f() {" + language_mode +
|
| + REPEAT_127(SPACE, " var b = global_obj.name;\n") +
|
| + " return global;}; f();";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
| +
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
| +
|
| + Handle<Name> global_name =
|
| + GraphGeneratorHelper::GetName(isolate(), "global");
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> preceeding_load = IsJSLoadNamed(
|
| + GraphGeneratorHelper::GetName(isolate(), "name"), _, _, _, _);
|
| + Matcher<Node*> load_global_matcher_wide = IsJSLoadGlobal(
|
| + global_name, feedback_vector_matcher, preceeding_load, IsIfSuccess(_));
|
| +
|
| + EXPECT_THAT(ret, IsReturn(load_global_matcher_wide, _, _));
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, StoreGlobal) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet = std::string("var global = 123; function f() {") +
|
| + language_mode + " global = 321; }; f();";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
| +
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
| +
|
| + Handle<Name> name = GraphGeneratorHelper::GetName(isolate(), "global");
|
| + Matcher<Node*> value_matcher = IsNumberConstant(321);
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> store_global_matcher = IsJSStoreGlobal(
|
| + name, value_matcher, feedback_vector_matcher, start, start);
|
| +
|
| + EXPECT_THAT(ret, IsReturn(_, store_global_matcher, _));
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, StoreGlobalWide) {
|
| + TRACED_FOREACH(const char*, language_mode, kLanguageModeStatements) {
|
| + std::string code_snippet =
|
| + std::string("var global = 123; var global_obj = {name:'abc'};") +
|
| + "function f() {" + language_mode +
|
| + REPEAT_127(SPACE, " var b = global_obj.name;\n") +
|
| + " global = 321;}; f();";
|
| + GraphGeneratorHelper helper(isolate(), zone(), code_snippet.c_str());
|
| + Graph* graph = helper.GetCompletedGraph();
|
| +
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Node* start = graph->start();
|
| +
|
| + Handle<Name> global_name =
|
| + GraphGeneratorHelper::GetName(isolate(), "global");
|
| + Matcher<Node*> value_matcher = IsNumberConstant(321);
|
| + Matcher<Node*> feedback_vector_matcher = IsFeedbackVector(start, start);
|
| + Matcher<Node*> preceeding_load = IsJSLoadNamed(
|
| + GraphGeneratorHelper::GetName(isolate(), "name"), _, _, _, _);
|
| + Matcher<Node*> store_global_matcher_wide =
|
| + IsJSStoreGlobal(global_name, value_matcher, feedback_vector_matcher,
|
| + preceeding_load, IsIfSuccess(_));
|
| +
|
| + EXPECT_THAT(ret, IsReturn(_, store_global_matcher_wide, _));
|
| + }
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|