OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |