| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 066b5dee0104f2525a3175f7e8aff7792cbe1b7d..00ddf6cbfb3f7e7d4d6c212e9650f51e5d5ac226 100644
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -3217,7 +3217,6 @@ TEST(IfArgumentsArrayAccessedThenParametersMaybeAssigned) {
|
| i::HandleScope scope(isolate);
|
| LocalContext env;
|
|
|
| -
|
| const char* src =
|
| "function f(x) {"
|
| " var a = arguments;"
|
| @@ -3233,7 +3232,7 @@ TEST(IfArgumentsArrayAccessedThenParametersMaybeAssigned) {
|
| i::Handle<i::String> source = factory->InternalizeUtf8String(program.start());
|
| source->PrintOn(stdout);
|
| printf("\n");
|
| - i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME);
|
| + i::Zone zone(isolate->allocator(), ZONE_NAME);
|
| v8::Local<v8::Value> v = CompileRun(src);
|
| i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
|
| i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
|
| @@ -3362,7 +3361,7 @@ TEST(InnerAssignment) {
|
| i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner,
|
| suffix);
|
|
|
| - i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME);
|
| + i::Zone zone(isolate->allocator(), ZONE_NAME);
|
| std::unique_ptr<i::ParseInfo> info;
|
| if (lazy) {
|
| printf("%s\n", program.start());
|
| @@ -3412,6 +3411,103 @@ TEST(InnerAssignment) {
|
|
|
| namespace {
|
|
|
| +i::Scope* DeserializeFunctionScope(i::Isolate* isolate, i::Zone* zone,
|
| + i::Handle<i::JSObject> m, const char* name) {
|
| + i::AstValueFactory avf(zone, isolate->heap()->HashSeed());
|
| + i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(
|
| + i::JSReceiver::GetProperty(isolate, m, name).ToHandleChecked());
|
| + i::DeclarationScope* script_scope =
|
| + new (zone) i::DeclarationScope(zone, &avf);
|
| + i::Scope* s = i::Scope::DeserializeScopeChain(
|
| + isolate, zone, f->context()->scope_info(), script_scope, &avf,
|
| + i::Scope::DeserializationMode::kIncludingVariables);
|
| + return s;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +TEST(AsmModuleFlag) {
|
| + i::Isolate* isolate = CcTest::i_isolate();
|
| + i::HandleScope scope(isolate);
|
| + LocalContext env;
|
| +
|
| + const char* src =
|
| + "function m() {"
|
| + " 'use asm';"
|
| + " var x = 0;"
|
| + " function f() { return x };"
|
| + " return { f:f };"
|
| + "}"
|
| + "m();";
|
| +
|
| + i::Zone zone(isolate->allocator(), ZONE_NAME);
|
| + v8::Local<v8::Value> v = CompileRun(src);
|
| + i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
|
| + i::Handle<i::JSObject> m = i::Handle<i::JSObject>::cast(o);
|
| +
|
| + // The asm.js module should be marked as such.
|
| + i::Scope* s = DeserializeFunctionScope(isolate, &zone, m, "f");
|
| + CHECK(s->IsAsmModule() && s->AsDeclarationScope()->asm_module());
|
| + CHECK(!s->IsAsmFunction() && !s->AsDeclarationScope()->asm_function());
|
| +}
|
| +
|
| +TEST(AsmFunctionFlag) {
|
| + i::Isolate* isolate = CcTest::i_isolate();
|
| + i::HandleScope scope(isolate);
|
| + LocalContext env;
|
| +
|
| + const char* src =
|
| + "function m() {"
|
| + " 'use asm';"
|
| + " var x = 0;"
|
| + " function f1(a) {"
|
| + " var y = 0; return () => x + y;"
|
| + " };"
|
| + " do { function f2() {"
|
| + " var y = 0; return () => x + y;"
|
| + " } } while(false);"
|
| + " var f3 = (function() {"
|
| + " var y = 0; return () => x + y;"
|
| + " });"
|
| + " var f4 = (function() { return (function() {"
|
| + " var y = 0; return () => x + y;"
|
| + " }) })();"
|
| + " return { f1:f1(), f2:f2(), f3:f3(), f4:f4() };"
|
| + "}"
|
| + "m();";
|
| +
|
| + i::Zone zone(isolate->allocator(), ZONE_NAME);
|
| + v8::Local<v8::Value> v = CompileRun(src);
|
| + i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
|
| + i::Handle<i::JSObject> m = i::Handle<i::JSObject>::cast(o);
|
| +
|
| + // The asm.js function {f1} should be marked as such.
|
| + i::Scope* s1 = DeserializeFunctionScope(isolate, &zone, m, "f1");
|
| + CHECK(!s1->IsAsmModule() && !s1->AsDeclarationScope()->asm_module());
|
| + CHECK(s1->IsAsmFunction() && s1->AsDeclarationScope()->asm_function());
|
| +
|
| + // The asm.js function {f2} should be marked as such.
|
| + // TODO(5653): If the block surrounding {f2} where to allocate a context we
|
| + // would actually determine {f2} not to be an asm.js function. That decision
|
| + // is fine but we should be consistent independent of whether a context is
|
| + // allocated for the surrounding block scope!
|
| + i::Scope* s2 = DeserializeFunctionScope(isolate, &zone, m, "f2");
|
| + CHECK(!s2->IsAsmModule() && !s2->AsDeclarationScope()->asm_module());
|
| + CHECK(s2->IsAsmFunction() && s2->AsDeclarationScope()->asm_function());
|
| +
|
| + // The asm.js function {f3} should be marked as such.
|
| + i::Scope* s3 = DeserializeFunctionScope(isolate, &zone, m, "f3");
|
| + CHECK(!s3->IsAsmModule() && !s3->AsDeclarationScope()->asm_module());
|
| + CHECK(s3->IsAsmFunction() && s3->AsDeclarationScope()->asm_function());
|
| +
|
| + // The nested function {f4} is not an asm.js function.
|
| + i::Scope* s4 = DeserializeFunctionScope(isolate, &zone, m, "f4");
|
| + CHECK(!s4->IsAsmModule() && !s4->AsDeclarationScope()->asm_module());
|
| + CHECK(!s4->IsAsmFunction() && !s4->AsDeclarationScope()->asm_function());
|
| +}
|
| +
|
| +namespace {
|
| +
|
| int* global_use_counts = NULL;
|
|
|
| void MockUseCounterCallback(v8::Isolate* isolate,
|
| @@ -3419,8 +3515,7 @@ void MockUseCounterCallback(v8::Isolate* isolate,
|
| ++global_use_counts[feature];
|
| }
|
|
|
| -}
|
| -
|
| +} // namespace
|
|
|
| TEST(UseAsmUseCount) {
|
| i::Isolate* isolate = CcTest::i_isolate();
|
|
|