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 |