Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Unified Diff: test/unittests/compiler/bytecode-graph-builder-unittest.cc

Issue 1441643002: [Interpreter] Add support for global loads / stores / calls to BytecodeGraphBuilder. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_tf_call
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698