OLD | NEW |
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 3454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3465 // Prepare function f that contains a monomorphic IC for object | 3465 // Prepare function f that contains a monomorphic IC for object |
3466 // originating from the same native context. | 3466 // originating from the same native context. |
3467 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" | 3467 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" |
3468 "function f(o) { return o.x; } f(obj); f(obj);"); | 3468 "function f(o) { return o.x; } f(obj); f(obj);"); |
3469 Handle<JSFunction> f = | 3469 Handle<JSFunction> f = |
3470 v8::Utils::OpenHandle( | 3470 v8::Utils::OpenHandle( |
3471 *v8::Handle<v8::Function>::Cast( | 3471 *v8::Handle<v8::Function>::Cast( |
3472 CcTest::global()->Get(v8_str("f")))); | 3472 CcTest::global()->Get(v8_str("f")))); |
3473 | 3473 |
3474 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3474 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3475 if (FLAG_vector_ics) { | 3475 CheckVectorIC(f, 0, MONOMORPHIC); |
3476 CheckVectorIC(f, 0, MONOMORPHIC); | 3476 CHECK(ic_before->ic_state() == DEFAULT); |
3477 CHECK(ic_before->ic_state() == DEFAULT); | |
3478 } else { | |
3479 CHECK(ic_before->ic_state() == MONOMORPHIC); | |
3480 } | |
3481 | 3477 |
3482 SimulateIncrementalMarking(CcTest::heap()); | 3478 SimulateIncrementalMarking(CcTest::heap()); |
3483 CcTest::heap()->CollectAllGarbage(); | 3479 CcTest::heap()->CollectAllGarbage(); |
3484 | 3480 |
3485 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3481 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3486 if (FLAG_vector_ics) { | 3482 CheckVectorIC(f, 0, MONOMORPHIC); |
3487 CheckVectorIC(f, 0, MONOMORPHIC); | 3483 CHECK(ic_after->ic_state() == DEFAULT); |
3488 CHECK(ic_after->ic_state() == DEFAULT); | |
3489 } else { | |
3490 CHECK(ic_after->ic_state() == MONOMORPHIC); | |
3491 } | |
3492 } | 3484 } |
3493 | 3485 |
3494 | 3486 |
3495 TEST(IncrementalMarkingClearsMonomorphicIC) { | 3487 TEST(IncrementalMarkingClearsMonomorphicIC) { |
3496 if (i::FLAG_always_opt) return; | 3488 if (i::FLAG_always_opt) return; |
3497 CcTest::InitializeVM(); | 3489 CcTest::InitializeVM(); |
3498 v8::HandleScope scope(CcTest::isolate()); | 3490 v8::HandleScope scope(CcTest::isolate()); |
3499 v8::Local<v8::Value> obj1; | 3491 v8::Local<v8::Value> obj1; |
3500 | 3492 |
3501 { | 3493 { |
3502 LocalContext env; | 3494 LocalContext env; |
3503 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 3495 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
3504 obj1 = env->Global()->Get(v8_str("obj")); | 3496 obj1 = env->Global()->Get(v8_str("obj")); |
3505 } | 3497 } |
3506 | 3498 |
3507 // Prepare function f that contains a monomorphic IC for object | 3499 // Prepare function f that contains a monomorphic IC for object |
3508 // originating from a different native context. | 3500 // originating from a different native context. |
3509 CcTest::global()->Set(v8_str("obj1"), obj1); | 3501 CcTest::global()->Set(v8_str("obj1"), obj1); |
3510 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);"); | 3502 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);"); |
3511 Handle<JSFunction> f = v8::Utils::OpenHandle( | 3503 Handle<JSFunction> f = v8::Utils::OpenHandle( |
3512 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); | 3504 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); |
3513 | 3505 |
3514 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3506 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3515 if (FLAG_vector_ics) { | 3507 CheckVectorIC(f, 0, MONOMORPHIC); |
3516 CheckVectorIC(f, 0, MONOMORPHIC); | 3508 CHECK(ic_before->ic_state() == DEFAULT); |
3517 CHECK(ic_before->ic_state() == DEFAULT); | |
3518 } else { | |
3519 CHECK(ic_before->ic_state() == MONOMORPHIC); | |
3520 } | |
3521 | 3509 |
3522 // Fire context dispose notification. | 3510 // Fire context dispose notification. |
3523 CcTest::isolate()->ContextDisposedNotification(); | 3511 CcTest::isolate()->ContextDisposedNotification(); |
3524 SimulateIncrementalMarking(CcTest::heap()); | 3512 SimulateIncrementalMarking(CcTest::heap()); |
3525 CcTest::heap()->CollectAllGarbage(); | 3513 CcTest::heap()->CollectAllGarbage(); |
3526 | 3514 |
3527 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3515 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3528 if (FLAG_vector_ics) { | 3516 CheckVectorICCleared(f, 0); |
3529 CheckVectorICCleared(f, 0); | 3517 CHECK(ic_after->ic_state() == DEFAULT); |
3530 CHECK(ic_after->ic_state() == DEFAULT); | |
3531 } else { | |
3532 CHECK(IC::IsCleared(ic_after)); | |
3533 } | |
3534 } | 3518 } |
3535 | 3519 |
3536 | 3520 |
3537 TEST(IncrementalMarkingPreservesPolymorphicIC) { | 3521 TEST(IncrementalMarkingPreservesPolymorphicIC) { |
3538 if (i::FLAG_always_opt) return; | 3522 if (i::FLAG_always_opt) return; |
3539 CcTest::InitializeVM(); | 3523 CcTest::InitializeVM(); |
3540 v8::HandleScope scope(CcTest::isolate()); | 3524 v8::HandleScope scope(CcTest::isolate()); |
3541 v8::Local<v8::Value> obj1, obj2; | 3525 v8::Local<v8::Value> obj1, obj2; |
3542 | 3526 |
3543 { | 3527 { |
(...skipping 10 matching lines...) Expand all Loading... |
3554 | 3538 |
3555 // Prepare function f that contains a polymorphic IC for objects | 3539 // Prepare function f that contains a polymorphic IC for objects |
3556 // originating from two different native contexts. | 3540 // originating from two different native contexts. |
3557 CcTest::global()->Set(v8_str("obj1"), obj1); | 3541 CcTest::global()->Set(v8_str("obj1"), obj1); |
3558 CcTest::global()->Set(v8_str("obj2"), obj2); | 3542 CcTest::global()->Set(v8_str("obj2"), obj2); |
3559 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); | 3543 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); |
3560 Handle<JSFunction> f = v8::Utils::OpenHandle( | 3544 Handle<JSFunction> f = v8::Utils::OpenHandle( |
3561 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); | 3545 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); |
3562 | 3546 |
3563 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3547 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3564 if (FLAG_vector_ics) { | 3548 CheckVectorIC(f, 0, POLYMORPHIC); |
3565 CheckVectorIC(f, 0, POLYMORPHIC); | 3549 CHECK(ic_before->ic_state() == DEFAULT); |
3566 CHECK(ic_before->ic_state() == DEFAULT); | |
3567 } else { | |
3568 CHECK(ic_before->ic_state() == POLYMORPHIC); | |
3569 } | |
3570 | 3550 |
3571 // Fire context dispose notification. | 3551 // Fire context dispose notification. |
3572 SimulateIncrementalMarking(CcTest::heap()); | 3552 SimulateIncrementalMarking(CcTest::heap()); |
3573 CcTest::heap()->CollectAllGarbage(); | 3553 CcTest::heap()->CollectAllGarbage(); |
3574 | 3554 |
3575 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3555 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3576 if (FLAG_vector_ics) { | 3556 CheckVectorIC(f, 0, POLYMORPHIC); |
3577 CheckVectorIC(f, 0, POLYMORPHIC); | 3557 CHECK(ic_after->ic_state() == DEFAULT); |
3578 CHECK(ic_after->ic_state() == DEFAULT); | |
3579 } else { | |
3580 CHECK(ic_after->ic_state() == POLYMORPHIC); | |
3581 } | |
3582 } | 3558 } |
3583 | 3559 |
3584 | 3560 |
3585 TEST(IncrementalMarkingClearsPolymorphicIC) { | 3561 TEST(IncrementalMarkingClearsPolymorphicIC) { |
3586 if (i::FLAG_always_opt) return; | 3562 if (i::FLAG_always_opt) return; |
3587 CcTest::InitializeVM(); | 3563 CcTest::InitializeVM(); |
3588 v8::HandleScope scope(CcTest::isolate()); | 3564 v8::HandleScope scope(CcTest::isolate()); |
3589 v8::Local<v8::Value> obj1, obj2; | 3565 v8::Local<v8::Value> obj1, obj2; |
3590 | 3566 |
3591 { | 3567 { |
(...skipping 10 matching lines...) Expand all Loading... |
3602 | 3578 |
3603 // Prepare function f that contains a polymorphic IC for objects | 3579 // Prepare function f that contains a polymorphic IC for objects |
3604 // originating from two different native contexts. | 3580 // originating from two different native contexts. |
3605 CcTest::global()->Set(v8_str("obj1"), obj1); | 3581 CcTest::global()->Set(v8_str("obj1"), obj1); |
3606 CcTest::global()->Set(v8_str("obj2"), obj2); | 3582 CcTest::global()->Set(v8_str("obj2"), obj2); |
3607 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); | 3583 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); |
3608 Handle<JSFunction> f = v8::Utils::OpenHandle( | 3584 Handle<JSFunction> f = v8::Utils::OpenHandle( |
3609 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); | 3585 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); |
3610 | 3586 |
3611 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3587 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3612 if (FLAG_vector_ics) { | 3588 CheckVectorIC(f, 0, POLYMORPHIC); |
3613 CheckVectorIC(f, 0, POLYMORPHIC); | 3589 CHECK(ic_before->ic_state() == DEFAULT); |
3614 CHECK(ic_before->ic_state() == DEFAULT); | |
3615 } else { | |
3616 CHECK(ic_before->ic_state() == POLYMORPHIC); | |
3617 } | |
3618 | 3590 |
3619 // Fire context dispose notification. | 3591 // Fire context dispose notification. |
3620 CcTest::isolate()->ContextDisposedNotification(); | 3592 CcTest::isolate()->ContextDisposedNotification(); |
3621 SimulateIncrementalMarking(CcTest::heap()); | 3593 SimulateIncrementalMarking(CcTest::heap()); |
3622 CcTest::heap()->CollectAllGarbage(); | 3594 CcTest::heap()->CollectAllGarbage(); |
3623 | 3595 |
3624 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3596 CheckVectorICCleared(f, 0); |
3625 if (FLAG_vector_ics) { | 3597 CHECK(ic_before->ic_state() == DEFAULT); |
3626 CheckVectorICCleared(f, 0); | |
3627 CHECK(ic_before->ic_state() == DEFAULT); | |
3628 } else { | |
3629 CHECK(IC::IsCleared(ic_after)); | |
3630 } | |
3631 } | 3598 } |
3632 | 3599 |
3633 | 3600 |
3634 class SourceResource : public v8::String::ExternalOneByteStringResource { | 3601 class SourceResource : public v8::String::ExternalOneByteStringResource { |
3635 public: | 3602 public: |
3636 explicit SourceResource(const char* data) | 3603 explicit SourceResource(const char* data) |
3637 : data_(data), length_(strlen(data)) { } | 3604 : data_(data), length_(strlen(data)) { } |
3638 | 3605 |
3639 virtual void Dispose() { | 3606 virtual void Dispose() { |
3640 i::DeleteArray(data_); | 3607 i::DeleteArray(data_); |
(...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4723 Handle<JSFunction> GetFunctionByName(Isolate* isolate, const char* name) { | 4690 Handle<JSFunction> GetFunctionByName(Isolate* isolate, const char* name) { |
4724 Handle<String> str = isolate->factory()->InternalizeUtf8String(name); | 4691 Handle<String> str = isolate->factory()->InternalizeUtf8String(name); |
4725 Handle<Object> obj = | 4692 Handle<Object> obj = |
4726 Object::GetProperty(isolate->global_object(), str).ToHandleChecked(); | 4693 Object::GetProperty(isolate->global_object(), str).ToHandleChecked(); |
4727 return Handle<JSFunction>::cast(obj); | 4694 return Handle<JSFunction>::cast(obj); |
4728 } | 4695 } |
4729 | 4696 |
4730 | 4697 |
4731 void CheckIC(Code* code, Code::Kind kind, SharedFunctionInfo* shared, | 4698 void CheckIC(Code* code, Code::Kind kind, SharedFunctionInfo* shared, |
4732 int ic_slot, InlineCacheState state) { | 4699 int ic_slot, InlineCacheState state) { |
4733 if (FLAG_vector_ics && | 4700 if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC || |
4734 (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC || | 4701 kind == Code::CALL_IC) { |
4735 kind == Code::CALL_IC)) { | |
4736 TypeFeedbackVector* vector = shared->feedback_vector(); | 4702 TypeFeedbackVector* vector = shared->feedback_vector(); |
4737 FeedbackVectorICSlot slot(ic_slot); | 4703 FeedbackVectorICSlot slot(ic_slot); |
4738 if (kind == Code::LOAD_IC) { | 4704 if (kind == Code::LOAD_IC) { |
4739 LoadICNexus nexus(vector, slot); | 4705 LoadICNexus nexus(vector, slot); |
4740 CHECK_EQ(nexus.StateFromFeedback(), state); | 4706 CHECK_EQ(nexus.StateFromFeedback(), state); |
4741 } else if (kind == Code::KEYED_LOAD_IC) { | 4707 } else if (kind == Code::KEYED_LOAD_IC) { |
4742 KeyedLoadICNexus nexus(vector, slot); | 4708 KeyedLoadICNexus nexus(vector, slot); |
4743 CHECK_EQ(nexus.StateFromFeedback(), state); | 4709 CHECK_EQ(nexus.StateFromFeedback(), state); |
4744 } else if (kind == Code::CALL_IC) { | 4710 } else if (kind == Code::CALL_IC) { |
4745 CallICNexus nexus(vector, slot); | 4711 CallICNexus nexus(vector, slot); |
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5476 shared.SetWeak(&shared, SharedHasBeenCollected, | 5442 shared.SetWeak(&shared, SharedHasBeenCollected, |
5477 v8::WeakCallbackType::kParameter); | 5443 v8::WeakCallbackType::kParameter); |
5478 builtin_exports.SetWeak(&builtin_exports, BuiltinExportsHasBeenCollected, | 5444 builtin_exports.SetWeak(&builtin_exports, BuiltinExportsHasBeenCollected, |
5479 v8::WeakCallbackType::kParameter); | 5445 v8::WeakCallbackType::kParameter); |
5480 | 5446 |
5481 CcTest::heap()->CollectAllAvailableGarbage("fire weak callbacks"); | 5447 CcTest::heap()->CollectAllAvailableGarbage("fire weak callbacks"); |
5482 | 5448 |
5483 CHECK(shared_has_been_collected); | 5449 CHECK(shared_has_been_collected); |
5484 CHECK(builtin_exports_has_been_collected); | 5450 CHECK(builtin_exports_has_been_collected); |
5485 } | 5451 } |
OLD | NEW |