| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 5a1db2d6a1dad57fbbb24f02d195bbf856cf6711..12a5590961598ca737cd5d43a7554e8e00fb6c1d 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -3281,7 +3281,7 @@ TEST(InnerAssignment) {
|
|
|
| const char* prefix = "function f() {";
|
| const char* midfix = " function g() {";
|
| - const char* suffix = "}}";
|
| + const char* suffix = "}}; f";
|
| struct { const char* source; bool assigned; bool strict; } outers[] = {
|
| // Actual assignments.
|
| { "var x; var x = 5;", true, false },
|
| @@ -3361,10 +3361,6 @@ TEST(InnerAssignment) {
|
| { "(function(x) { eval(''); })", true, false },
|
| };
|
|
|
| - // Used to trigger lazy parsing of the outer function.
|
| - int comment_len = 2048;
|
| - i::ScopedVector<char> comment(comment_len + 1);
|
| - i::SNPrintF(comment, "/*%0*d*/", comment_len - 4, 0);
|
| int prefix_len = Utf8LengthHelper(prefix);
|
| int midfix_len = Utf8LengthHelper(midfix);
|
| int suffix_len = Utf8LengthHelper(suffix);
|
| @@ -3377,33 +3373,43 @@ TEST(InnerAssignment) {
|
| const char* inner = inners[j].source;
|
| int inner_len = Utf8LengthHelper(inner);
|
|
|
| - const char* comment_chars = lazy ? comment.start() : "";
|
| - int len = prefix_len + (lazy ? comment_len : 0) + outer_len +
|
| - midfix_len + inner_len + suffix_len;
|
| + int len = prefix_len + outer_len + midfix_len + inner_len + suffix_len;
|
| i::ScopedVector<char> program(len + 1);
|
|
|
| - i::SNPrintF(program, "%s%s%s%s%s%s", comment_chars, prefix, outer,
|
| - midfix, inner, suffix);
|
| - i::Handle<i::String> source =
|
| - factory->InternalizeUtf8String(program.start());
|
| - source->PrintOn(stdout);
|
| - printf("\n");
|
| + i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner,
|
| + suffix);
|
|
|
| - i::Handle<i::Script> script = factory->NewScript(source);
|
| i::Zone zone(CcTest::i_isolate()->allocator());
|
| - i::ParseInfo info(&zone, script);
|
| - i::Parser parser(&info);
|
| - CHECK(parser.Parse(&info));
|
| - CHECK(i::Compiler::Analyze(&info));
|
| - CHECK(info.literal() != NULL);
|
| -
|
| - i::Scope* scope = info.literal()->scope();
|
| - i::Scope* inner_scope = scope->inner_scope();
|
| - DCHECK_NOT_NULL(inner_scope);
|
| - DCHECK_NULL(inner_scope->sibling());
|
| + std::unique_ptr<i::ParseInfo> info;
|
| + if (lazy) {
|
| + printf("%s\n", program.start());
|
| + v8::Local<v8::Value> v = CompileRun(program.start());
|
| + i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
|
| + i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
|
| + info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, f));
|
| + } else {
|
| + i::Handle<i::String> source =
|
| + factory->InternalizeUtf8String(program.start());
|
| + source->PrintOn(stdout);
|
| + printf("\n");
|
| + i::Handle<i::Script> script = factory->NewScript(source);
|
| + info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, script));
|
| + }
|
| + i::Parser parser(info.get());
|
| + CHECK(parser.Parse(info.get()));
|
| + CHECK(i::Compiler::Analyze(info.get()));
|
| + CHECK(info->literal() != NULL);
|
| +
|
| + i::Scope* scope = info->literal()->scope();
|
| + if (!lazy) {
|
| + scope = scope->inner_scope();
|
| + }
|
| + DCHECK_NOT_NULL(scope);
|
| + DCHECK_NULL(scope->sibling());
|
| + DCHECK(scope->is_function_scope());
|
| const i::AstRawString* var_name =
|
| - info.ast_value_factory()->GetOneByteString("x");
|
| - i::Variable* var = inner_scope->Lookup(var_name);
|
| + info->ast_value_factory()->GetOneByteString("x");
|
| + i::Variable* var = scope->Lookup(var_name);
|
| bool expected = outers[i].assigned || inners[j].assigned;
|
| CHECK(var != NULL);
|
| CHECK(var->is_used() || !expected);
|
|
|