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

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

Issue 1135243004: [es6] Support super.property in eval and arrow functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git rebase Created 5 years, 6 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 unified diff | Download patch
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 3304 matching lines...) Expand 10 before | Expand all | Expand 10 after
3315 CcTest::global()->Set(v8_str("fun2"), fun2); 3315 CcTest::global()->Set(v8_str("fun2"), fun2);
3316 CompileRun("function f(a, b) { a(); b(); } f(fun1, fun2);"); 3316 CompileRun("function f(a, b) { a(); b(); } f(fun1, fun2);");
3317 3317
3318 Handle<JSFunction> f = 3318 Handle<JSFunction> f =
3319 v8::Utils::OpenHandle( 3319 v8::Utils::OpenHandle(
3320 *v8::Handle<v8::Function>::Cast( 3320 *v8::Handle<v8::Function>::Cast(
3321 CcTest::global()->Get(v8_str("f")))); 3321 CcTest::global()->Get(v8_str("f"))));
3322 3322
3323 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); 3323 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
3324 3324
3325 int expected_slots = 2; 3325 int expected_slots = 3;
3326 CHECK_EQ(expected_slots, feedback_vector->ICSlots()); 3326 CHECK_EQ(expected_slots, feedback_vector->ICSlots());
3327 int slot1 = 0; 3327 int slot1 = 1;
3328 int slot2 = 1; 3328 int slot2 = 2;
3329 CHECK(feedback_vector->Get(FeedbackVectorICSlot(slot1))->IsWeakCell()); 3329 CHECK(feedback_vector->Get(FeedbackVectorICSlot(slot1))->IsWeakCell());
3330 CHECK(feedback_vector->Get(FeedbackVectorICSlot(slot2))->IsWeakCell()); 3330 CHECK(feedback_vector->Get(FeedbackVectorICSlot(slot2))->IsWeakCell());
3331 3331
3332 SimulateIncrementalMarking(CcTest::heap()); 3332 SimulateIncrementalMarking(CcTest::heap());
3333 CcTest::heap()->CollectAllGarbage(); 3333 CcTest::heap()->CollectAllGarbage();
3334 3334
3335 CHECK(!WeakCell::cast(feedback_vector->Get(FeedbackVectorICSlot(slot1))) 3335 CHECK(!WeakCell::cast(feedback_vector->Get(FeedbackVectorICSlot(slot1)))
3336 ->cleared()); 3336 ->cleared());
3337 CHECK(!WeakCell::cast(feedback_vector->Get(FeedbackVectorICSlot(slot2))) 3337 CHECK(!WeakCell::cast(feedback_vector->Get(FeedbackVectorICSlot(slot2)))
3338 ->cleared()); 3338 ->cleared());
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3441 // Prepare function f that contains a monomorphic IC for object 3441 // Prepare function f that contains a monomorphic IC for object
3442 // originating from the same native context. 3442 // originating from the same native context.
3443 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" 3443 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
3444 "function f(o) { return o.x; } f(obj); f(obj);"); 3444 "function f(o) { return o.x; } f(obj); f(obj);");
3445 Handle<JSFunction> f = 3445 Handle<JSFunction> f =
3446 v8::Utils::OpenHandle( 3446 v8::Utils::OpenHandle(
3447 *v8::Handle<v8::Function>::Cast( 3447 *v8::Handle<v8::Function>::Cast(
3448 CcTest::global()->Get(v8_str("f")))); 3448 CcTest::global()->Get(v8_str("f"))));
3449 3449
3450 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3450 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3451 CheckVectorIC(f, 0, MONOMORPHIC); 3451 CheckVectorIC(f, 1, MONOMORPHIC);
3452 CHECK(ic_before->ic_state() == DEFAULT); 3452 CHECK(ic_before->ic_state() == DEFAULT);
3453 3453
3454 SimulateIncrementalMarking(CcTest::heap()); 3454 SimulateIncrementalMarking(CcTest::heap());
3455 CcTest::heap()->CollectAllGarbage(); 3455 CcTest::heap()->CollectAllGarbage();
3456 3456
3457 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3457 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3458 CheckVectorIC(f, 0, MONOMORPHIC); 3458 CheckVectorIC(f, 1, MONOMORPHIC);
3459 CHECK(ic_after->ic_state() == DEFAULT); 3459 CHECK(ic_after->ic_state() == DEFAULT);
3460 } 3460 }
3461 3461
3462 3462
3463 TEST(IncrementalMarkingClearsMonomorphicIC) { 3463 TEST(IncrementalMarkingClearsMonomorphicIC) {
3464 if (i::FLAG_always_opt) return; 3464 if (i::FLAG_always_opt) return;
3465 CcTest::InitializeVM(); 3465 CcTest::InitializeVM();
3466 v8::HandleScope scope(CcTest::isolate()); 3466 v8::HandleScope scope(CcTest::isolate());
3467 v8::Local<v8::Value> obj1; 3467 v8::Local<v8::Value> obj1;
3468 3468
3469 { 3469 {
3470 LocalContext env; 3470 LocalContext env;
3471 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3471 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3472 obj1 = env->Global()->Get(v8_str("obj")); 3472 obj1 = env->Global()->Get(v8_str("obj"));
3473 } 3473 }
3474 3474
3475 // Prepare function f that contains a monomorphic IC for object 3475 // Prepare function f that contains a monomorphic IC for object
3476 // originating from a different native context. 3476 // originating from a different native context.
3477 CcTest::global()->Set(v8_str("obj1"), obj1); 3477 CcTest::global()->Set(v8_str("obj1"), obj1);
3478 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);"); 3478 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);");
3479 Handle<JSFunction> f = v8::Utils::OpenHandle( 3479 Handle<JSFunction> f = v8::Utils::OpenHandle(
3480 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 3480 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
3481 3481
3482 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3482 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3483 CheckVectorIC(f, 0, MONOMORPHIC); 3483 CheckVectorIC(f, 1, MONOMORPHIC);
3484 CHECK(ic_before->ic_state() == DEFAULT); 3484 CHECK(ic_before->ic_state() == DEFAULT);
3485 3485
3486 // Fire context dispose notification. 3486 // Fire context dispose notification.
3487 CcTest::isolate()->ContextDisposedNotification(); 3487 CcTest::isolate()->ContextDisposedNotification();
3488 SimulateIncrementalMarking(CcTest::heap()); 3488 SimulateIncrementalMarking(CcTest::heap());
3489 CcTest::heap()->CollectAllGarbage(); 3489 CcTest::heap()->CollectAllGarbage();
3490 3490
3491 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3491 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3492 CheckVectorICCleared(f, 0); 3492 CheckVectorICCleared(f, 1);
3493 CHECK(ic_after->ic_state() == DEFAULT); 3493 CHECK(ic_after->ic_state() == DEFAULT);
3494 } 3494 }
3495 3495
3496 3496
3497 TEST(IncrementalMarkingPreservesPolymorphicIC) { 3497 TEST(IncrementalMarkingPreservesPolymorphicIC) {
3498 if (i::FLAG_always_opt) return; 3498 if (i::FLAG_always_opt) return;
3499 CcTest::InitializeVM(); 3499 CcTest::InitializeVM();
3500 v8::HandleScope scope(CcTest::isolate()); 3500 v8::HandleScope scope(CcTest::isolate());
3501 v8::Local<v8::Value> obj1, obj2; 3501 v8::Local<v8::Value> obj1, obj2;
3502 3502
(...skipping 11 matching lines...) Expand all
3514 3514
3515 // Prepare function f that contains a polymorphic IC for objects 3515 // Prepare function f that contains a polymorphic IC for objects
3516 // originating from two different native contexts. 3516 // originating from two different native contexts.
3517 CcTest::global()->Set(v8_str("obj1"), obj1); 3517 CcTest::global()->Set(v8_str("obj1"), obj1);
3518 CcTest::global()->Set(v8_str("obj2"), obj2); 3518 CcTest::global()->Set(v8_str("obj2"), obj2);
3519 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); 3519 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
3520 Handle<JSFunction> f = v8::Utils::OpenHandle( 3520 Handle<JSFunction> f = v8::Utils::OpenHandle(
3521 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 3521 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
3522 3522
3523 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3523 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3524 CheckVectorIC(f, 0, POLYMORPHIC); 3524 CheckVectorIC(f, 1, POLYMORPHIC);
3525 CHECK(ic_before->ic_state() == DEFAULT); 3525 CHECK(ic_before->ic_state() == DEFAULT);
3526 3526
3527 // Fire context dispose notification. 3527 // Fire context dispose notification.
3528 SimulateIncrementalMarking(CcTest::heap()); 3528 SimulateIncrementalMarking(CcTest::heap());
3529 CcTest::heap()->CollectAllGarbage(); 3529 CcTest::heap()->CollectAllGarbage();
3530 3530
3531 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3531 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3532 CheckVectorIC(f, 0, POLYMORPHIC); 3532 CheckVectorIC(f, 1, POLYMORPHIC);
3533 CHECK(ic_after->ic_state() == DEFAULT); 3533 CHECK(ic_after->ic_state() == DEFAULT);
3534 } 3534 }
3535 3535
3536 3536
3537 TEST(IncrementalMarkingClearsPolymorphicIC) { 3537 TEST(IncrementalMarkingClearsPolymorphicIC) {
3538 if (i::FLAG_always_opt) return; 3538 if (i::FLAG_always_opt) return;
3539 CcTest::InitializeVM(); 3539 CcTest::InitializeVM();
3540 v8::HandleScope scope(CcTest::isolate()); 3540 v8::HandleScope scope(CcTest::isolate());
3541 v8::Local<v8::Value> obj1, obj2; 3541 v8::Local<v8::Value> obj1, obj2;
3542 3542
(...skipping 11 matching lines...) Expand all
3554 3554
3555 // Prepare function f that contains a polymorphic IC for objects 3555 // Prepare function f that contains a polymorphic IC for objects
3556 // originating from two different native contexts. 3556 // originating from two different native contexts.
3557 CcTest::global()->Set(v8_str("obj1"), obj1); 3557 CcTest::global()->Set(v8_str("obj1"), obj1);
3558 CcTest::global()->Set(v8_str("obj2"), obj2); 3558 CcTest::global()->Set(v8_str("obj2"), obj2);
3559 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); 3559 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
3560 Handle<JSFunction> f = v8::Utils::OpenHandle( 3560 Handle<JSFunction> f = v8::Utils::OpenHandle(
3561 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 3561 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
3562 3562
3563 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 3563 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3564 CheckVectorIC(f, 0, POLYMORPHIC); 3564 CheckVectorIC(f, 1, POLYMORPHIC);
3565 CHECK(ic_before->ic_state() == DEFAULT); 3565 CHECK(ic_before->ic_state() == DEFAULT);
3566 3566
3567 // Fire context dispose notification. 3567 // Fire context dispose notification.
3568 CcTest::isolate()->ContextDisposedNotification(); 3568 CcTest::isolate()->ContextDisposedNotification();
3569 SimulateIncrementalMarking(CcTest::heap()); 3569 SimulateIncrementalMarking(CcTest::heap());
3570 CcTest::heap()->CollectAllGarbage(); 3570 CcTest::heap()->CollectAllGarbage();
3571 3571
3572 CheckVectorICCleared(f, 0); 3572 CheckVectorICCleared(f, 1);
3573 CHECK(ic_before->ic_state() == DEFAULT); 3573 CHECK(ic_before->ic_state() == DEFAULT);
3574 } 3574 }
3575 3575
3576 3576
3577 class SourceResource : public v8::String::ExternalOneByteStringResource { 3577 class SourceResource : public v8::String::ExternalOneByteStringResource {
3578 public: 3578 public:
3579 explicit SourceResource(const char* data) 3579 explicit SourceResource(const char* data)
3580 : data_(data), length_(strlen(data)) { } 3580 : data_(data), length_(strlen(data)) { }
3581 3581
3582 virtual void Dispose() { 3582 virtual void Dispose() {
(...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after
4712 " loadIC(obj);" 4712 " loadIC(obj);"
4713 " loadIC(obj);" 4713 " loadIC(obj);"
4714 " return proto;" 4714 " return proto;"
4715 "};"); 4715 "};");
4716 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); 4716 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC");
4717 { 4717 {
4718 v8::HandleScope scope(CcTest::isolate()); 4718 v8::HandleScope scope(CcTest::isolate());
4719 CompileRun("(testIC())"); 4719 CompileRun("(testIC())");
4720 } 4720 }
4721 heap->CollectAllGarbage(); 4721 heap->CollectAllGarbage();
4722 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, MONOMORPHIC); 4722 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 1, MONOMORPHIC);
4723 { 4723 {
4724 v8::HandleScope scope(CcTest::isolate()); 4724 v8::HandleScope scope(CcTest::isolate());
4725 CompileRun("(testIC())"); 4725 CompileRun("(testIC())");
4726 } 4726 }
4727 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, MONOMORPHIC); 4727 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 1, MONOMORPHIC);
4728 } 4728 }
4729 4729
4730 4730
4731 TEST(PolymorphicStaysPolymorphicAfterGC) { 4731 TEST(PolymorphicStaysPolymorphicAfterGC) {
4732 if (FLAG_always_opt) return; 4732 if (FLAG_always_opt) return;
4733 CcTest::InitializeVM(); 4733 CcTest::InitializeVM();
4734 Isolate* isolate = CcTest::i_isolate(); 4734 Isolate* isolate = CcTest::i_isolate();
4735 Heap* heap = isolate->heap(); 4735 Heap* heap = isolate->heap();
4736 v8::HandleScope scope(CcTest::isolate()); 4736 v8::HandleScope scope(CcTest::isolate());
4737 CompileRun( 4737 CompileRun(
(...skipping 10 matching lines...) Expand all
4748 " poly.x = true;" 4748 " poly.x = true;"
4749 " loadIC(poly);" 4749 " loadIC(poly);"
4750 " return proto;" 4750 " return proto;"
4751 "};"); 4751 "};");
4752 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); 4752 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC");
4753 { 4753 {
4754 v8::HandleScope scope(CcTest::isolate()); 4754 v8::HandleScope scope(CcTest::isolate());
4755 CompileRun("(testIC())"); 4755 CompileRun("(testIC())");
4756 } 4756 }
4757 heap->CollectAllGarbage(); 4757 heap->CollectAllGarbage();
4758 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, POLYMORPHIC); 4758 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 1, POLYMORPHIC);
4759 { 4759 {
4760 v8::HandleScope scope(CcTest::isolate()); 4760 v8::HandleScope scope(CcTest::isolate());
4761 CompileRun("(testIC())"); 4761 CompileRun("(testIC())");
4762 } 4762 }
4763 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, POLYMORPHIC); 4763 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 1, POLYMORPHIC);
4764 } 4764 }
4765 4765
4766 4766
4767 TEST(WeakCell) { 4767 TEST(WeakCell) {
4768 CcTest::InitializeVM(); 4768 CcTest::InitializeVM();
4769 Isolate* isolate = CcTest::i_isolate(); 4769 Isolate* isolate = CcTest::i_isolate();
4770 v8::internal::Heap* heap = CcTest::heap(); 4770 v8::internal::Heap* heap = CcTest::heap();
4771 v8::internal::Factory* factory = isolate->factory(); 4771 v8::internal::Factory* factory = isolate->factory();
4772 4772
4773 HandleScope outer_scope(isolate); 4773 HandleScope outer_scope(isolate);
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
5634 size_t counter2 = 2000; 5634 size_t counter2 = 2000;
5635 tracer->SampleAllocation(time2, counter2, counter2); 5635 tracer->SampleAllocation(time2, counter2, counter2);
5636 size_t throughput = tracer->AllocationThroughputInBytesPerMillisecond(100); 5636 size_t throughput = tracer->AllocationThroughputInBytesPerMillisecond(100);
5637 CHECK_EQ(2 * (counter2 - counter1) / (time2 - time1), throughput); 5637 CHECK_EQ(2 * (counter2 - counter1) / (time2 - time1), throughput);
5638 int time3 = 1000; 5638 int time3 = 1000;
5639 size_t counter3 = 30000; 5639 size_t counter3 = 30000;
5640 tracer->SampleAllocation(time3, counter3, counter3); 5640 tracer->SampleAllocation(time3, counter3, counter3);
5641 throughput = tracer->AllocationThroughputInBytesPerMillisecond(100); 5641 throughput = tracer->AllocationThroughputInBytesPerMillisecond(100);
5642 CHECK_EQ(2 * (counter3 - counter1) / (time3 - time1), throughput); 5642 CHECK_EQ(2 * (counter3 - counter1) / (time3 - time1), throughput);
5643 } 5643 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698