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

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

Issue 10836189: Flush monomorphic ICs on context disposal instead of context exit. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments Created 8 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-api.cc ('k') | test/mjsunit/debug-script.js » ('j') | 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 2
3 #include <stdlib.h> 3 #include <stdlib.h>
4 4
5 #include "v8.h" 5 #include "v8.h"
6 6
7 #include "compilation-cache.h"
7 #include "execution.h" 8 #include "execution.h"
8 #include "factory.h" 9 #include "factory.h"
9 #include "macro-assembler.h" 10 #include "macro-assembler.h"
10 #include "global-handles.h" 11 #include "global-handles.h"
11 #include "cctest.h" 12 #include "cctest.h"
12 13
13 using namespace v8::internal; 14 using namespace v8::internal;
14 15
15 static v8::Persistent<v8::Context> env; 16 static v8::Persistent<v8::Context> env;
16 17
(...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 // Remove function f1, and 1056 // Remove function f1, and
1056 CompileRun("f1=null"); 1057 CompileRun("f1=null");
1057 1058
1058 // Scavenge treats these references as strong. 1059 // Scavenge treats these references as strong.
1059 for (int j = 0; j < 10; j++) { 1060 for (int j = 0; j < 10; j++) {
1060 HEAP->PerformScavenge(); 1061 HEAP->PerformScavenge();
1061 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i])); 1062 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1062 } 1063 }
1063 1064
1064 // Mark compact handles the weak references. 1065 // Mark compact handles the weak references.
1066 ISOLATE->compilation_cache()->Clear();
1065 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1067 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1066 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i])); 1068 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1067 1069
1068 // Get rid of f3 and f5 in the same way. 1070 // Get rid of f3 and f5 in the same way.
1069 CompileRun("f3=null"); 1071 CompileRun("f3=null");
1070 for (int j = 0; j < 10; j++) { 1072 for (int j = 0; j < 10; j++) {
1071 HEAP->PerformScavenge(); 1073 HEAP->PerformScavenge();
1072 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i])); 1074 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1073 } 1075 }
1074 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1076 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 v8::Local<v8::Value> res = CompileRun( 1387 v8::Local<v8::Value> res = CompileRun(
1386 "function f() { return o.x; }" 1388 "function f() { return o.x; }"
1387 "for (var i = 0; i < 10; ++i) f();" 1389 "for (var i = 0; i < 10; ++i) f();"
1388 "%OptimizeFunctionOnNextCall(f);" 1390 "%OptimizeFunctionOnNextCall(f);"
1389 "f();"); 1391 "f();");
1390 CHECK_EQ(42, res->Int32Value()); 1392 CHECK_EQ(42, res->Int32Value());
1391 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); 1393 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1392 ctx2->Exit(); 1394 ctx2->Exit();
1393 ctx1->Exit(); 1395 ctx1->Exit();
1394 ctx1.Dispose(); 1396 ctx1.Dispose();
1397 v8::V8::ContextDisposedNotification();
1395 } 1398 }
1396 HEAP->CollectAllAvailableGarbage(); 1399 HEAP->CollectAllAvailableGarbage();
1397 CHECK_EQ(2, NumberOfGlobalObjects()); 1400 CHECK_EQ(2, NumberOfGlobalObjects());
1398 ctx2.Dispose(); 1401 ctx2.Dispose();
1399 HEAP->CollectAllAvailableGarbage(); 1402 HEAP->CollectAllAvailableGarbage();
1400 CHECK_EQ(0, NumberOfGlobalObjects()); 1403 CHECK_EQ(0, NumberOfGlobalObjects());
1401 } 1404 }
1402 1405
1403 1406
1404 // Test that we don't embed functions from foreign contexts into 1407 // Test that we don't embed functions from foreign contexts into
(...skipping 17 matching lines...) Expand all
1422 v8::Local<v8::Value> res = CompileRun( 1425 v8::Local<v8::Value> res = CompileRun(
1423 "function f(x) { return x(); }" 1426 "function f(x) { return x(); }"
1424 "for (var i = 0; i < 10; ++i) f(o);" 1427 "for (var i = 0; i < 10; ++i) f(o);"
1425 "%OptimizeFunctionOnNextCall(f);" 1428 "%OptimizeFunctionOnNextCall(f);"
1426 "f(o);"); 1429 "f(o);");
1427 CHECK_EQ(42, res->Int32Value()); 1430 CHECK_EQ(42, res->Int32Value());
1428 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); 1431 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1429 ctx2->Exit(); 1432 ctx2->Exit();
1430 ctx1->Exit(); 1433 ctx1->Exit();
1431 ctx1.Dispose(); 1434 ctx1.Dispose();
1435 v8::V8::ContextDisposedNotification();
1432 } 1436 }
1433 HEAP->CollectAllAvailableGarbage(); 1437 HEAP->CollectAllAvailableGarbage();
1434 CHECK_EQ(2, NumberOfGlobalObjects()); 1438 CHECK_EQ(2, NumberOfGlobalObjects());
1435 ctx2.Dispose(); 1439 ctx2.Dispose();
1436 HEAP->CollectAllAvailableGarbage(); 1440 HEAP->CollectAllAvailableGarbage();
1437 CHECK_EQ(0, NumberOfGlobalObjects()); 1441 CHECK_EQ(0, NumberOfGlobalObjects());
1438 } 1442 }
1439 1443
1440 1444
1441 TEST(LeakGlobalContextViaMapKeyed) { 1445 TEST(LeakGlobalContextViaMapKeyed) {
(...skipping 15 matching lines...) Expand all
1457 v8::Local<v8::Value> res = CompileRun( 1461 v8::Local<v8::Value> res = CompileRun(
1458 "function f() { return o[0]; }" 1462 "function f() { return o[0]; }"
1459 "for (var i = 0; i < 10; ++i) f();" 1463 "for (var i = 0; i < 10; ++i) f();"
1460 "%OptimizeFunctionOnNextCall(f);" 1464 "%OptimizeFunctionOnNextCall(f);"
1461 "f();"); 1465 "f();");
1462 CHECK_EQ(42, res->Int32Value()); 1466 CHECK_EQ(42, res->Int32Value());
1463 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); 1467 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1464 ctx2->Exit(); 1468 ctx2->Exit();
1465 ctx1->Exit(); 1469 ctx1->Exit();
1466 ctx1.Dispose(); 1470 ctx1.Dispose();
1471 v8::V8::ContextDisposedNotification();
1467 } 1472 }
1468 HEAP->CollectAllAvailableGarbage(); 1473 HEAP->CollectAllAvailableGarbage();
1469 CHECK_EQ(2, NumberOfGlobalObjects()); 1474 CHECK_EQ(2, NumberOfGlobalObjects());
1470 ctx2.Dispose(); 1475 ctx2.Dispose();
1471 HEAP->CollectAllAvailableGarbage(); 1476 HEAP->CollectAllAvailableGarbage();
1472 CHECK_EQ(0, NumberOfGlobalObjects()); 1477 CHECK_EQ(0, NumberOfGlobalObjects());
1473 } 1478 }
1474 1479
1475 1480
1476 TEST(LeakGlobalContextViaMapProto) { 1481 TEST(LeakGlobalContextViaMapProto) {
(...skipping 19 matching lines...) Expand all
1496 " return p.x;" 1501 " return p.x;"
1497 "}" 1502 "}"
1498 "for (var i = 0; i < 10; ++i) f();" 1503 "for (var i = 0; i < 10; ++i) f();"
1499 "%OptimizeFunctionOnNextCall(f);" 1504 "%OptimizeFunctionOnNextCall(f);"
1500 "f();"); 1505 "f();");
1501 CHECK_EQ(42, res->Int32Value()); 1506 CHECK_EQ(42, res->Int32Value());
1502 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0)); 1507 ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1503 ctx2->Exit(); 1508 ctx2->Exit();
1504 ctx1->Exit(); 1509 ctx1->Exit();
1505 ctx1.Dispose(); 1510 ctx1.Dispose();
1511 v8::V8::ContextDisposedNotification();
1506 } 1512 }
1507 HEAP->CollectAllAvailableGarbage(); 1513 HEAP->CollectAllAvailableGarbage();
1508 CHECK_EQ(2, NumberOfGlobalObjects()); 1514 CHECK_EQ(2, NumberOfGlobalObjects());
1509 ctx2.Dispose(); 1515 ctx2.Dispose();
1510 HEAP->CollectAllAvailableGarbage(); 1516 HEAP->CollectAllAvailableGarbage();
1511 CHECK_EQ(0, NumberOfGlobalObjects()); 1517 CHECK_EQ(0, NumberOfGlobalObjects());
1512 } 1518 }
1513 1519
1514 1520
1515 TEST(InstanceOfStubWriteBarrier) { 1521 TEST(InstanceOfStubWriteBarrier) {
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" 2096 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
2091 "function f(o) { return o.x; } f(obj); f(obj);"); 2097 "function f(o) { return o.x; } f(obj); f(obj);");
2092 Handle<JSFunction> f = 2098 Handle<JSFunction> f =
2093 v8::Utils::OpenHandle( 2099 v8::Utils::OpenHandle(
2094 *v8::Handle<v8::Function>::Cast( 2100 *v8::Handle<v8::Function>::Cast(
2095 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); 2101 v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2096 2102
2097 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2103 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2098 CHECK(ic_before->ic_state() == MONOMORPHIC); 2104 CHECK(ic_before->ic_state() == MONOMORPHIC);
2099 2105
2100 // Fire context dispose notification.
2101 v8::V8::ContextDisposedNotification();
2102 SimulateIncrementalMarking(); 2106 SimulateIncrementalMarking();
2103 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 2107 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2104 2108
2105 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2109 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2106 CHECK(ic_after->ic_state() == MONOMORPHIC); 2110 CHECK(ic_after->ic_state() == MONOMORPHIC);
2107 } 2111 }
2108 2112
2109 2113
2110 TEST(IncrementalMarkingClearsMonomorhpicIC) { 2114 TEST(IncrementalMarkingClearsMonomorhpicIC) {
2111 if (i::FLAG_always_opt) return; 2115 if (i::FLAG_always_opt) return;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2173 CHECK(ic_before->ic_state() == MEGAMORPHIC); 2177 CHECK(ic_before->ic_state() == MEGAMORPHIC);
2174 2178
2175 // Fire context dispose notification. 2179 // Fire context dispose notification.
2176 v8::V8::ContextDisposedNotification(); 2180 v8::V8::ContextDisposedNotification();
2177 SimulateIncrementalMarking(); 2181 SimulateIncrementalMarking();
2178 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 2182 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2179 2183
2180 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2184 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2181 CHECK(ic_after->ic_state() == UNINITIALIZED); 2185 CHECK(ic_after->ic_state() == UNINITIALIZED);
2182 } 2186 }
OLDNEW
« no previous file with comments | « test/cctest/test-api.cc ('k') | test/mjsunit/debug-script.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698