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

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

Issue 1427803003: Vector ICs: Allow for more IC kinds. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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/objects.cc ('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 3799 matching lines...) Expand 10 before | Expand all | Expand 10 after
3810 CcTest::InitializeVM(); 3810 CcTest::InitializeVM();
3811 v8::HandleScope scope(CcTest::isolate()); 3811 v8::HandleScope scope(CcTest::isolate());
3812 3812
3813 // Prepare function f that contains a monomorphic IC for object 3813 // Prepare function f that contains a monomorphic IC for object
3814 // originating from the same native context. 3814 // originating from the same native context.
3815 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" 3815 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
3816 "function f(o) { return o.x; } f(obj); f(obj);"); 3816 "function f(o) { return o.x; } f(obj); f(obj);");
3817 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 3817 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
3818 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))))); 3818 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))));
3819 3819
3820 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3821 CheckVectorIC(f, 0, MONOMORPHIC); 3820 CheckVectorIC(f, 0, MONOMORPHIC);
3822 CHECK(ic_before->ic_state() == DEFAULT);
3823 3821
3824 SimulateIncrementalMarking(CcTest::heap()); 3822 SimulateIncrementalMarking(CcTest::heap());
3825 CcTest::heap()->CollectAllGarbage(); 3823 CcTest::heap()->CollectAllGarbage();
3826 3824
3827 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3828 CheckVectorIC(f, 0, MONOMORPHIC); 3825 CheckVectorIC(f, 0, MONOMORPHIC);
3829 CHECK(ic_after->ic_state() == DEFAULT);
3830 } 3826 }
3831 3827
3832 3828
3833 TEST(IncrementalMarkingClearsMonomorphicIC) { 3829 TEST(IncrementalMarkingClearsMonomorphicIC) {
3834 if (i::FLAG_always_opt) return; 3830 if (i::FLAG_always_opt) return;
3835 CcTest::InitializeVM(); 3831 CcTest::InitializeVM();
3836 v8::HandleScope scope(CcTest::isolate()); 3832 v8::HandleScope scope(CcTest::isolate());
3837 v8::Local<v8::Value> obj1; 3833 v8::Local<v8::Value> obj1;
3838 3834
3839 { 3835 {
3840 LocalContext env; 3836 LocalContext env;
3841 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3837 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3842 obj1 = env->Global()->Get(v8_str("obj")); 3838 obj1 = env->Global()->Get(v8_str("obj"));
3843 } 3839 }
3844 3840
3845 // Prepare function f that contains a monomorphic IC for object 3841 // Prepare function f that contains a monomorphic IC for object
3846 // originating from a different native context. 3842 // originating from a different native context.
3847 CcTest::global()->Set(v8_str("obj1"), obj1); 3843 CcTest::global()->Set(v8_str("obj1"), obj1);
3848 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);"); 3844 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);");
3849 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 3845 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
3850 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))))); 3846 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))));
3851 3847
3852 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3853 CheckVectorIC(f, 0, MONOMORPHIC); 3848 CheckVectorIC(f, 0, MONOMORPHIC);
3854 CHECK(ic_before->ic_state() == DEFAULT);
3855 3849
3856 // Fire context dispose notification. 3850 // Fire context dispose notification.
3857 CcTest::isolate()->ContextDisposedNotification(); 3851 CcTest::isolate()->ContextDisposedNotification();
3858 SimulateIncrementalMarking(CcTest::heap()); 3852 SimulateIncrementalMarking(CcTest::heap());
3859 CcTest::heap()->CollectAllGarbage(); 3853 CcTest::heap()->CollectAllGarbage();
3860 3854
3861 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3862 CheckVectorICCleared(f, 0); 3855 CheckVectorICCleared(f, 0);
3863 CHECK(ic_after->ic_state() == DEFAULT);
3864 } 3856 }
3865 3857
3866 3858
3867 TEST(IncrementalMarkingPreservesPolymorphicIC) { 3859 TEST(IncrementalMarkingPreservesPolymorphicIC) {
3868 if (i::FLAG_always_opt) return; 3860 if (i::FLAG_always_opt) return;
3869 CcTest::InitializeVM(); 3861 CcTest::InitializeVM();
3870 v8::HandleScope scope(CcTest::isolate()); 3862 v8::HandleScope scope(CcTest::isolate());
3871 v8::Local<v8::Value> obj1, obj2; 3863 v8::Local<v8::Value> obj1, obj2;
3872 3864
3873 { 3865 {
3874 LocalContext env; 3866 LocalContext env;
3875 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3867 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3876 obj1 = env->Global()->Get(v8_str("obj")); 3868 obj1 = env->Global()->Get(v8_str("obj"));
3877 } 3869 }
3878 3870
3879 { 3871 {
3880 LocalContext env; 3872 LocalContext env;
3881 CompileRun("function fun() { this.x = 2; }; var obj = new fun();"); 3873 CompileRun("function fun() { this.x = 2; }; var obj = new fun();");
3882 obj2 = env->Global()->Get(v8_str("obj")); 3874 obj2 = env->Global()->Get(v8_str("obj"));
3883 } 3875 }
3884 3876
3885 // Prepare function f that contains a polymorphic IC for objects 3877 // Prepare function f that contains a polymorphic IC for objects
3886 // originating from two different native contexts. 3878 // originating from two different native contexts.
3887 CcTest::global()->Set(v8_str("obj1"), obj1); 3879 CcTest::global()->Set(v8_str("obj1"), obj1);
3888 CcTest::global()->Set(v8_str("obj2"), obj2); 3880 CcTest::global()->Set(v8_str("obj2"), obj2);
3889 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); 3881 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
3890 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 3882 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
3891 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))))); 3883 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))));
3892 3884
3893 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3894 CheckVectorIC(f, 0, POLYMORPHIC); 3885 CheckVectorIC(f, 0, POLYMORPHIC);
3895 CHECK(ic_before->ic_state() == DEFAULT);
3896 3886
3897 // Fire context dispose notification. 3887 // Fire context dispose notification.
3898 SimulateIncrementalMarking(CcTest::heap()); 3888 SimulateIncrementalMarking(CcTest::heap());
3899 CcTest::heap()->CollectAllGarbage(); 3889 CcTest::heap()->CollectAllGarbage();
3900 3890
3901 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3902 CheckVectorIC(f, 0, POLYMORPHIC); 3891 CheckVectorIC(f, 0, POLYMORPHIC);
3903 CHECK(ic_after->ic_state() == DEFAULT);
3904 } 3892 }
3905 3893
3906 3894
3907 TEST(IncrementalMarkingClearsPolymorphicIC) { 3895 TEST(IncrementalMarkingClearsPolymorphicIC) {
3908 if (i::FLAG_always_opt) return; 3896 if (i::FLAG_always_opt) return;
3909 CcTest::InitializeVM(); 3897 CcTest::InitializeVM();
3910 v8::HandleScope scope(CcTest::isolate()); 3898 v8::HandleScope scope(CcTest::isolate());
3911 v8::Local<v8::Value> obj1, obj2; 3899 v8::Local<v8::Value> obj1, obj2;
3912 3900
3913 { 3901 {
3914 LocalContext env; 3902 LocalContext env;
3915 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 3903 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3916 obj1 = env->Global()->Get(v8_str("obj")); 3904 obj1 = env->Global()->Get(v8_str("obj"));
3917 } 3905 }
3918 3906
3919 { 3907 {
3920 LocalContext env; 3908 LocalContext env;
3921 CompileRun("function fun() { this.x = 2; }; var obj = new fun();"); 3909 CompileRun("function fun() { this.x = 2; }; var obj = new fun();");
3922 obj2 = env->Global()->Get(v8_str("obj")); 3910 obj2 = env->Global()->Get(v8_str("obj"));
3923 } 3911 }
3924 3912
3925 // Prepare function f that contains a polymorphic IC for objects 3913 // Prepare function f that contains a polymorphic IC for objects
3926 // originating from two different native contexts. 3914 // originating from two different native contexts.
3927 CcTest::global()->Set(v8_str("obj1"), obj1); 3915 CcTest::global()->Set(v8_str("obj1"), obj1);
3928 CcTest::global()->Set(v8_str("obj2"), obj2); 3916 CcTest::global()->Set(v8_str("obj2"), obj2);
3929 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); 3917 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
3930 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 3918 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
3931 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))))); 3919 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))));
3932 3920
3933 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3934 CheckVectorIC(f, 0, POLYMORPHIC); 3921 CheckVectorIC(f, 0, POLYMORPHIC);
3935 CHECK(ic_before->ic_state() == DEFAULT);
3936 3922
3937 // Fire context dispose notification. 3923 // Fire context dispose notification.
3938 CcTest::isolate()->ContextDisposedNotification(); 3924 CcTest::isolate()->ContextDisposedNotification();
3939 SimulateIncrementalMarking(CcTest::heap()); 3925 SimulateIncrementalMarking(CcTest::heap());
3940 CcTest::heap()->CollectAllGarbage(); 3926 CcTest::heap()->CollectAllGarbage();
3941 3927
3942 CheckVectorICCleared(f, 0); 3928 CheckVectorICCleared(f, 0);
3943 CHECK(ic_before->ic_state() == DEFAULT);
3944 } 3929 }
3945 3930
3946 3931
3947 class SourceResource : public v8::String::ExternalOneByteStringResource { 3932 class SourceResource : public v8::String::ExternalOneByteStringResource {
3948 public: 3933 public:
3949 explicit SourceResource(const char* data) 3934 explicit SourceResource(const char* data)
3950 : data_(data), length_(strlen(data)) { } 3935 : data_(data), length_(strlen(data)) { }
3951 3936
3952 virtual void Dispose() { 3937 virtual void Dispose() {
3953 i::DeleteArray(data_); 3938 i::DeleteArray(data_);
(...skipping 2315 matching lines...) Expand 10 before | Expand all | Expand 10 after
6269 // The CollectGarbage call above starts sweeper threads. 6254 // The CollectGarbage call above starts sweeper threads.
6270 // The crash will happen if the following two functions 6255 // The crash will happen if the following two functions
6271 // are called before sweeping finishes. 6256 // are called before sweeping finishes.
6272 heap->StartIncrementalMarking(); 6257 heap->StartIncrementalMarking();
6273 heap->FinalizeIncrementalMarkingIfComplete("test"); 6258 heap->FinalizeIncrementalMarkingIfComplete("test");
6274 } 6259 }
6275 6260
6276 6261
6277 } // namespace internal 6262 } // namespace internal
6278 } // namespace v8 6263 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698