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

Unified Diff: test/cctest/test-parsing.cc

Issue 1304923004: When parsing inner functions, try to allocate in a temporary Zone (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: get terminology less wrong in comments Created 5 years, 3 months 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
« no previous file with comments | « src/parser.cc ('k') | test/mjsunit/compiler/lazy-iife-no-parens.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-parsing.cc
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
index a05e0e15d6687d26f0e42b6581882db2a1d5a21d..287969d30898c84673b8bd5b054c19abe91c10c4 100644
--- a/test/cctest/test-parsing.cc
+++ b/test/cctest/test-parsing.cc
@@ -1398,6 +1398,68 @@ TEST(ScopePositions) {
}
+TEST(DiscardFunctionBody) {
+ // Test that inner function bodies are discarded if possible.
+ // See comments in ParseFunctionLiteral in parser.cc.
+ const char* discard_sources[] = {
+ "(function f() { function g() { var a; } })();",
+ /* TODO(conradw): In future it may be possible to apply this optimisation
+ * to these productions.
+ "(function f() { 0, function g() { var a; } })();",
+ "(function f() { 0, { g() { var a; } } })();",
+ "(function f() { 0, class c { g() { var a; } } })();", */
+ NULL
+ };
+
+ i::Isolate* isolate = CcTest::i_isolate();
+ i::Factory* factory = isolate->factory();
+ v8::HandleScope handles(CcTest::isolate());
+ i::FunctionLiteral* function;
+
+ for (int i = 0; discard_sources[i]; i++) {
+ const char* source = discard_sources[i];
+ i::Handle<i::String> source_code =
+ factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked();
+ i::Handle<i::Script> script = factory->NewScript(source_code);
+ i::Zone zone;
+ i::ParseInfo info(&zone, script);
+ info.set_allow_lazy_parsing();
+ i::Parser parser(&info);
+ parser.set_allow_harmony_sloppy(true);
+ parser.Parse(&info);
+ function = info.literal();
+ CHECK_NOT_NULL(function);
+ CHECK_NOT_NULL(function->body());
+ CHECK_EQ(1, function->body()->length());
+ i::FunctionLiteral* inner =
+ function->body()->first()->AsExpressionStatement()->expression()->
+ AsCall()->expression()->AsFunctionLiteral();
+ i::Scope* inner_scope = inner->scope();
+ i::FunctionLiteral* fun = nullptr;
+ if (inner_scope->declarations()->length() > 1) {
+ fun = inner_scope->declarations()->at(1)->AsFunctionDeclaration()->fun();
+ } else {
+ // TODO(conradw): This path won't be hit until the other test cases can be
+ // uncommented.
+ CHECK_NOT_NULL(inner->body());
+ CHECK_GE(2, inner->body()->length());
+ i::Expression* exp = inner->body()->at(1)->AsExpressionStatement()->
+ expression()->AsBinaryOperation()->right();
+ if (exp->IsFunctionLiteral()) {
+ fun = exp->AsFunctionLiteral();
+ } else if (exp->IsObjectLiteral()) {
+ fun = exp->AsObjectLiteral()->properties()->at(0)->value()->
+ AsFunctionLiteral();
+ } else {
+ fun = exp->AsClassLiteral()->properties()->at(0)->value()->
+ AsFunctionLiteral();
+ }
+ }
+ CHECK_NULL(fun->body());
+ }
+}
+
+
const char* ReadString(unsigned* start) {
int length = start[0];
char* result = i::NewArray<char>(length + 1);
« no previous file with comments | « src/parser.cc ('k') | test/mjsunit/compiler/lazy-iife-no-parens.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698