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

Side by Side Diff: test/cctest/test-parsing.cc

Issue 2507063004: [ast] Fix typo in {Scope::set_asm_function} method. (Closed)
Patch Set: Created 4 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 unified diff | Download patch
« no previous file with comments | « src/ast/scopes.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3199 matching lines...) Expand 10 before | Expand all | Expand 10 after
3210 // TODO(sigurds) Figure out if is_used should survive context serialization. 3210 // TODO(sigurds) Figure out if is_used should survive context serialization.
3211 } 3211 }
3212 3212
3213 3213
3214 TEST(IfArgumentsArrayAccessedThenParametersMaybeAssigned) { 3214 TEST(IfArgumentsArrayAccessedThenParametersMaybeAssigned) {
3215 i::Isolate* isolate = CcTest::i_isolate(); 3215 i::Isolate* isolate = CcTest::i_isolate();
3216 i::Factory* factory = isolate->factory(); 3216 i::Factory* factory = isolate->factory();
3217 i::HandleScope scope(isolate); 3217 i::HandleScope scope(isolate);
3218 LocalContext env; 3218 LocalContext env;
3219 3219
3220
3221 const char* src = 3220 const char* src =
3222 "function f(x) {" 3221 "function f(x) {"
3223 " var a = arguments;" 3222 " var a = arguments;"
3224 " function g(i) {" 3223 " function g(i) {"
3225 " ++a[0];" 3224 " ++a[0];"
3226 " };" 3225 " };"
3227 " return g;" 3226 " return g;"
3228 " }" 3227 " }"
3229 "f(0);"; 3228 "f(0);";
3230 3229
3231 i::ScopedVector<char> program(Utf8LengthHelper(src) + 1); 3230 i::ScopedVector<char> program(Utf8LengthHelper(src) + 1);
3232 i::SNPrintF(program, "%s", src); 3231 i::SNPrintF(program, "%s", src);
3233 i::Handle<i::String> source = factory->InternalizeUtf8String(program.start()); 3232 i::Handle<i::String> source = factory->InternalizeUtf8String(program.start());
3234 source->PrintOn(stdout); 3233 source->PrintOn(stdout);
3235 printf("\n"); 3234 printf("\n");
3236 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 3235 i::Zone zone(isolate->allocator(), ZONE_NAME);
3237 v8::Local<v8::Value> v = CompileRun(src); 3236 v8::Local<v8::Value> v = CompileRun(src);
3238 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); 3237 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3239 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); 3238 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
3240 i::Context* context = f->context(); 3239 i::Context* context = f->context();
3241 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed()); 3240 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed());
3242 const i::AstRawString* name_x = avf.GetOneByteString("x"); 3241 const i::AstRawString* name_x = avf.GetOneByteString("x");
3243 avf.Internalize(isolate); 3242 avf.Internalize(isolate);
3244 3243
3245 i::DeclarationScope* script_scope = 3244 i::DeclarationScope* script_scope =
3246 new (&zone) i::DeclarationScope(&zone, &avf); 3245 new (&zone) i::DeclarationScope(&zone, &avf);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3355 if (outers[i].strict && inners[j].with) continue; 3354 if (outers[i].strict && inners[j].with) continue;
3356 const char* inner = inners[j].source; 3355 const char* inner = inners[j].source;
3357 int inner_len = Utf8LengthHelper(inner); 3356 int inner_len = Utf8LengthHelper(inner);
3358 3357
3359 int len = prefix_len + outer_len + midfix_len + inner_len + suffix_len; 3358 int len = prefix_len + outer_len + midfix_len + inner_len + suffix_len;
3360 i::ScopedVector<char> program(len + 1); 3359 i::ScopedVector<char> program(len + 1);
3361 3360
3362 i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner, 3361 i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner,
3363 suffix); 3362 suffix);
3364 3363
3365 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 3364 i::Zone zone(isolate->allocator(), ZONE_NAME);
3366 std::unique_ptr<i::ParseInfo> info; 3365 std::unique_ptr<i::ParseInfo> info;
3367 if (lazy) { 3366 if (lazy) {
3368 printf("%s\n", program.start()); 3367 printf("%s\n", program.start());
3369 v8::Local<v8::Value> v = CompileRun(program.start()); 3368 v8::Local<v8::Value> v = CompileRun(program.start());
3370 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); 3369 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3371 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); 3370 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
3372 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared()); 3371 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared());
3373 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared)); 3372 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared));
3374 } else { 3373 } else {
3375 i::Handle<i::String> source = 3374 i::Handle<i::String> source =
(...skipping 29 matching lines...) Expand all
3405 } else { 3404 } else {
3406 CHECK(is_maybe_assigned == expected); 3405 CHECK(is_maybe_assigned == expected);
3407 } 3406 }
3408 } 3407 }
3409 } 3408 }
3410 } 3409 }
3411 } 3410 }
3412 3411
3413 namespace { 3412 namespace {
3414 3413
3414 i::Scope* DeserializeFunctionScope(i::Isolate* isolate, i::Zone* zone,
3415 i::Handle<i::JSObject> m, const char* name) {
3416 i::AstValueFactory avf(zone, isolate->heap()->HashSeed());
3417 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(
3418 i::JSReceiver::GetProperty(isolate, m, name).ToHandleChecked());
3419 i::DeclarationScope* script_scope =
3420 new (zone) i::DeclarationScope(zone, &avf);
3421 i::Scope* s = i::Scope::DeserializeScopeChain(
3422 isolate, zone, f->context()->scope_info(), script_scope, &avf,
3423 i::Scope::DeserializationMode::kIncludingVariables);
3424 return s;
3425 }
3426
3427 } // namespace
3428
3429 TEST(AsmModuleFlag) {
3430 i::Isolate* isolate = CcTest::i_isolate();
3431 i::HandleScope scope(isolate);
3432 LocalContext env;
3433
3434 const char* src =
3435 "function m() {"
3436 " 'use asm';"
3437 " var x = 0;"
3438 " function f() { return x };"
3439 " return { f:f };"
3440 "}"
3441 "m();";
3442
3443 i::Zone zone(isolate->allocator(), ZONE_NAME);
3444 v8::Local<v8::Value> v = CompileRun(src);
3445 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3446 i::Handle<i::JSObject> m = i::Handle<i::JSObject>::cast(o);
3447
3448 // The asm.js module should be marked as such.
3449 i::Scope* s = DeserializeFunctionScope(isolate, &zone, m, "f");
3450 CHECK(s->IsAsmModule() && s->AsDeclarationScope()->asm_module());
3451 CHECK(!s->IsAsmFunction() && !s->AsDeclarationScope()->asm_function());
3452 }
3453
3454 TEST(AsmFunctionFlag) {
3455 i::Isolate* isolate = CcTest::i_isolate();
3456 i::HandleScope scope(isolate);
3457 LocalContext env;
3458
3459 const char* src =
3460 "function m() {"
3461 " 'use asm';"
3462 " var x = 0;"
3463 " function f1(a) {"
3464 " var y = 0; return () => x + y;"
3465 " };"
3466 " do { function f2() {"
3467 " var y = 0; return () => x + y;"
3468 " } } while(false);"
3469 " var f3 = (function() {"
3470 " var y = 0; return () => x + y;"
3471 " });"
3472 " var f4 = (function() { return (function() {"
3473 " var y = 0; return () => x + y;"
3474 " }) })();"
3475 " return { f1:f1(), f2:f2(), f3:f3(), f4:f4() };"
3476 "}"
3477 "m();";
3478
3479 i::Zone zone(isolate->allocator(), ZONE_NAME);
3480 v8::Local<v8::Value> v = CompileRun(src);
3481 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3482 i::Handle<i::JSObject> m = i::Handle<i::JSObject>::cast(o);
3483
3484 // The asm.js function {f1} should be marked as such.
3485 i::Scope* s1 = DeserializeFunctionScope(isolate, &zone, m, "f1");
3486 CHECK(!s1->IsAsmModule() && !s1->AsDeclarationScope()->asm_module());
3487 CHECK(s1->IsAsmFunction() && s1->AsDeclarationScope()->asm_function());
3488
3489 // The asm.js function {f2} should be marked as such.
3490 // TODO(5653): If the block surrounding {f2} where to allocate a context we
3491 // would actually determine {f2} not to be an asm.js function. That decision
3492 // is fine but we should be consistent independent of whether a context is
3493 // allocated for the surrounding block scope!
3494 i::Scope* s2 = DeserializeFunctionScope(isolate, &zone, m, "f2");
3495 CHECK(!s2->IsAsmModule() && !s2->AsDeclarationScope()->asm_module());
3496 CHECK(s2->IsAsmFunction() && s2->AsDeclarationScope()->asm_function());
3497
3498 // The asm.js function {f3} should be marked as such.
3499 i::Scope* s3 = DeserializeFunctionScope(isolate, &zone, m, "f3");
3500 CHECK(!s3->IsAsmModule() && !s3->AsDeclarationScope()->asm_module());
3501 CHECK(s3->IsAsmFunction() && s3->AsDeclarationScope()->asm_function());
3502
3503 // The nested function {f4} is not an asm.js function.
3504 i::Scope* s4 = DeserializeFunctionScope(isolate, &zone, m, "f4");
3505 CHECK(!s4->IsAsmModule() && !s4->AsDeclarationScope()->asm_module());
3506 CHECK(!s4->IsAsmFunction() && !s4->AsDeclarationScope()->asm_function());
3507 }
3508
3509 namespace {
3510
3415 int* global_use_counts = NULL; 3511 int* global_use_counts = NULL;
3416 3512
3417 void MockUseCounterCallback(v8::Isolate* isolate, 3513 void MockUseCounterCallback(v8::Isolate* isolate,
3418 v8::Isolate::UseCounterFeature feature) { 3514 v8::Isolate::UseCounterFeature feature) {
3419 ++global_use_counts[feature]; 3515 ++global_use_counts[feature];
3420 } 3516 }
3421 3517
3422 } 3518 } // namespace
3423
3424 3519
3425 TEST(UseAsmUseCount) { 3520 TEST(UseAsmUseCount) {
3426 i::Isolate* isolate = CcTest::i_isolate(); 3521 i::Isolate* isolate = CcTest::i_isolate();
3427 i::HandleScope scope(isolate); 3522 i::HandleScope scope(isolate);
3428 LocalContext env; 3523 LocalContext env;
3429 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {}; 3524 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
3430 global_use_counts = use_counts; 3525 global_use_counts = use_counts;
3431 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback); 3526 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
3432 CompileRun("\"use asm\";\n" 3527 CompileRun("\"use asm\";\n"
3433 "var foo = 1;\n" 3528 "var foo = 1;\n"
(...skipping 4871 matching lines...) Expand 10 before | Expand all | Expand 10 after
8305 const char* data[] = { 8400 const char* data[] = {
8306 "const arguments = 1", 8401 "const arguments = 1",
8307 "let arguments", 8402 "let arguments",
8308 "var arguments", 8403 "var arguments",
8309 NULL 8404 NULL
8310 }; 8405 };
8311 // clang-format on 8406 // clang-format on
8312 RunParserSyncTest(context_data, data, kSuccess); 8407 RunParserSyncTest(context_data, data, kSuccess);
8313 } 8408 }
8314 } 8409 }
OLDNEW
« no previous file with comments | « src/ast/scopes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698