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 3405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3416 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3416 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3417 if (FLAG_vector_ics) { | 3417 if (FLAG_vector_ics) { |
3418 CheckVectorICCleared(f, 0); | 3418 CheckVectorICCleared(f, 0); |
3419 CHECK(ic_after->ic_state() == DEFAULT); | 3419 CHECK(ic_after->ic_state() == DEFAULT); |
3420 } else { | 3420 } else { |
3421 CHECK(IC::IsCleared(ic_after)); | 3421 CHECK(IC::IsCleared(ic_after)); |
3422 } | 3422 } |
3423 } | 3423 } |
3424 | 3424 |
3425 | 3425 |
3426 TEST(IncrementalMarkingPreservesPolymorphicIC) { | |
3427 if (i::FLAG_always_opt) return; | |
3428 CcTest::InitializeVM(); | |
3429 v8::HandleScope scope(CcTest::isolate()); | |
3430 v8::Local<v8::Value> obj1, obj2; | |
3431 | |
3432 { | |
3433 LocalContext env; | |
3434 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | |
3435 obj1 = env->Global()->Get(v8_str("obj")); | |
3436 } | |
3437 | |
3438 { | |
3439 LocalContext env; | |
3440 CompileRun("function fun() { this.x = 2; }; var obj = new fun();"); | |
3441 obj2 = env->Global()->Get(v8_str("obj")); | |
3442 } | |
3443 | |
3444 // Prepare function f that contains a polymorphic IC for objects | |
3445 // originating from two different native contexts. | |
3446 CcTest::global()->Set(v8_str("obj1"), obj1); | |
3447 CcTest::global()->Set(v8_str("obj2"), obj2); | |
3448 CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); | |
3449 Handle<JSFunction> f = v8::Utils::OpenHandle( | |
3450 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); | |
3451 | |
3452 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | |
3453 CHECK(ic_before->ic_state() == POLYMORPHIC); | |
3454 | |
3455 // Fire context dispose notification. | |
3456 SimulateIncrementalMarking(CcTest::heap()); | |
3457 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | |
3458 | |
3459 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | |
3460 CHECK(ic_after->ic_state() == POLYMORPHIC); | |
3461 } | |
3462 | |
3463 | |
3464 TEST(IncrementalMarkingClearsPolymorphicIC) { | 3426 TEST(IncrementalMarkingClearsPolymorphicIC) { |
3465 if (i::FLAG_always_opt) return; | 3427 if (i::FLAG_always_opt) return; |
3466 CcTest::InitializeVM(); | 3428 CcTest::InitializeVM(); |
3467 v8::HandleScope scope(CcTest::isolate()); | 3429 v8::HandleScope scope(CcTest::isolate()); |
3468 v8::Local<v8::Value> obj1, obj2; | 3430 v8::Local<v8::Value> obj1, obj2; |
3469 | 3431 |
3470 { | 3432 { |
3471 LocalContext env; | 3433 LocalContext env; |
3472 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 3434 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
3473 obj1 = env->Global()->Get(v8_str("obj")); | 3435 obj1 = env->Global()->Get(v8_str("obj")); |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4411 " var proto = {'name' : 'weak'};" | 4373 " var proto = {'name' : 'weak'};" |
4412 " var obj = Object.create(proto);" | 4374 " var obj = Object.create(proto);" |
4413 " loadIC(obj);" | 4375 " loadIC(obj);" |
4414 " loadIC(obj);" | 4376 " loadIC(obj);" |
4415 " loadIC(obj);" | 4377 " loadIC(obj);" |
4416 " return proto;" | 4378 " return proto;" |
4417 " })();"); | 4379 " })();"); |
4418 } | 4380 } |
4419 | 4381 |
4420 | 4382 |
4421 TEST(WeakMapInPolymorphicLoadIC) { | |
4422 CheckWeakness( | |
4423 "function loadIC(obj) {" | |
4424 " return obj.name;" | |
4425 "}" | |
4426 " (function() {" | |
4427 " var proto = {'name' : 'weak'};" | |
4428 " var obj = Object.create(proto);" | |
4429 " loadIC(obj);" | |
4430 " loadIC(obj);" | |
4431 " loadIC(obj);" | |
4432 " var poly = Object.create(proto);" | |
4433 " poly.x = true;" | |
4434 " loadIC(poly);" | |
4435 " return proto;" | |
4436 " })();"); | |
4437 } | |
4438 | |
4439 | |
4440 TEST(WeakMapInMonomorphicKeyedLoadIC) { | 4383 TEST(WeakMapInMonomorphicKeyedLoadIC) { |
4441 // TODO(mvstanton): vector ics need weak support! | 4384 // TODO(mvstanton): vector ics need weak support! |
4442 if (FLAG_vector_ics) return; | 4385 if (FLAG_vector_ics) return; |
4443 CheckWeakness("function keyedLoadIC(obj, field) {" | 4386 CheckWeakness("function keyedLoadIC(obj, field) {" |
4444 " return obj[field];" | 4387 " return obj[field];" |
4445 "}" | 4388 "}" |
4446 " (function() {" | 4389 " (function() {" |
4447 " var proto = {'name' : 'weak'};" | 4390 " var proto = {'name' : 'weak'};" |
4448 " var obj = Object.create(proto);" | 4391 " var obj = Object.create(proto);" |
4449 " keyedLoadIC(obj, 'name');" | 4392 " keyedLoadIC(obj, 'name');" |
4450 " keyedLoadIC(obj, 'name');" | 4393 " keyedLoadIC(obj, 'name');" |
4451 " keyedLoadIC(obj, 'name');" | 4394 " keyedLoadIC(obj, 'name');" |
4452 " return proto;" | 4395 " return proto;" |
4453 " })();"); | 4396 " })();"); |
4454 } | 4397 } |
4455 | 4398 |
4456 | 4399 |
4457 TEST(WeakMapInPolymorphicKeyedLoadIC) { | |
4458 CheckWeakness( | |
4459 "function keyedLoadIC(obj, field) {" | |
4460 " return obj[field];" | |
4461 "}" | |
4462 " (function() {" | |
4463 " var proto = {'name' : 'weak'};" | |
4464 " var obj = Object.create(proto);" | |
4465 " keyedLoadIC(obj, 'name');" | |
4466 " keyedLoadIC(obj, 'name');" | |
4467 " keyedLoadIC(obj, 'name');" | |
4468 " var poly = Object.create(proto);" | |
4469 " poly.x = true;" | |
4470 " keyedLoadIC(poly, 'name');" | |
4471 " return proto;" | |
4472 " })();"); | |
4473 } | |
4474 | |
4475 | |
4476 TEST(WeakMapInMonomorphicStoreIC) { | 4400 TEST(WeakMapInMonomorphicStoreIC) { |
4477 CheckWeakness("function storeIC(obj, value) {" | 4401 CheckWeakness("function storeIC(obj, value) {" |
4478 " obj.name = value;" | 4402 " obj.name = value;" |
4479 "}" | 4403 "}" |
4480 " (function() {" | 4404 " (function() {" |
4481 " var proto = {'name' : 'weak'};" | 4405 " var proto = {'name' : 'weak'};" |
4482 " var obj = Object.create(proto);" | 4406 " var obj = Object.create(proto);" |
4483 " storeIC(obj, 'x');" | 4407 " storeIC(obj, 'x');" |
4484 " storeIC(obj, 'x');" | 4408 " storeIC(obj, 'x');" |
4485 " storeIC(obj, 'x');" | 4409 " storeIC(obj, 'x');" |
4486 " return proto;" | 4410 " return proto;" |
4487 " })();"); | 4411 " })();"); |
4488 } | 4412 } |
4489 | 4413 |
4490 | 4414 |
4491 TEST(WeakMapInPolymorphicStoreIC) { | |
4492 CheckWeakness( | |
4493 "function storeIC(obj, value) {" | |
4494 " obj.name = value;" | |
4495 "}" | |
4496 " (function() {" | |
4497 " var proto = {'name' : 'weak'};" | |
4498 " var obj = Object.create(proto);" | |
4499 " storeIC(obj, 'x');" | |
4500 " storeIC(obj, 'x');" | |
4501 " storeIC(obj, 'x');" | |
4502 " var poly = Object.create(proto);" | |
4503 " poly.x = true;" | |
4504 " storeIC(poly, 'x');" | |
4505 " return proto;" | |
4506 " })();"); | |
4507 } | |
4508 | |
4509 | |
4510 TEST(WeakMapInMonomorphicKeyedStoreIC) { | 4415 TEST(WeakMapInMonomorphicKeyedStoreIC) { |
4511 CheckWeakness("function keyedStoreIC(obj, field, value) {" | 4416 CheckWeakness("function keyedStoreIC(obj, field, value) {" |
4512 " obj[field] = value;" | 4417 " obj[field] = value;" |
4513 "}" | 4418 "}" |
4514 " (function() {" | 4419 " (function() {" |
4515 " var proto = {'name' : 'weak'};" | 4420 " var proto = {'name' : 'weak'};" |
4516 " var obj = Object.create(proto);" | 4421 " var obj = Object.create(proto);" |
4517 " keyedStoreIC(obj, 'x');" | 4422 " keyedStoreIC(obj, 'x');" |
4518 " keyedStoreIC(obj, 'x');" | 4423 " keyedStoreIC(obj, 'x');" |
4519 " keyedStoreIC(obj, 'x');" | 4424 " keyedStoreIC(obj, 'x');" |
4520 " return proto;" | 4425 " return proto;" |
4521 " })();"); | 4426 " })();"); |
4522 } | 4427 } |
4523 | 4428 |
4524 | 4429 |
4525 TEST(WeakMapInPolymorphicKeyedStoreIC) { | |
4526 CheckWeakness( | |
4527 "function keyedStoreIC(obj, field, value) {" | |
4528 " obj[field] = value;" | |
4529 "}" | |
4530 " (function() {" | |
4531 " var proto = {'name' : 'weak'};" | |
4532 " var obj = Object.create(proto);" | |
4533 " keyedStoreIC(obj, 'x');" | |
4534 " keyedStoreIC(obj, 'x');" | |
4535 " keyedStoreIC(obj, 'x');" | |
4536 " var poly = Object.create(proto);" | |
4537 " poly.x = true;" | |
4538 " keyedStoreIC(poly, 'x');" | |
4539 " return proto;" | |
4540 " })();"); | |
4541 } | |
4542 | |
4543 | |
4544 TEST(WeakMapInMonomorphicCompareNilIC) { | 4430 TEST(WeakMapInMonomorphicCompareNilIC) { |
4545 CheckWeakness("function compareNilIC(obj) {" | 4431 CheckWeakness("function compareNilIC(obj) {" |
4546 " return obj == null;" | 4432 " return obj == null;" |
4547 "}" | 4433 "}" |
4548 " (function() {" | 4434 " (function() {" |
4549 " var proto = {'name' : 'weak'};" | 4435 " var proto = {'name' : 'weak'};" |
4550 " var obj = Object.create(proto);" | 4436 " var obj = Object.create(proto);" |
4551 " compareNilIC(obj);" | 4437 " compareNilIC(obj);" |
4552 " compareNilIC(obj);" | 4438 " compareNilIC(obj);" |
4553 " compareNilIC(obj);" | 4439 " compareNilIC(obj);" |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4926 #ifdef DEBUG | 4812 #ifdef DEBUG |
4927 TEST(PathTracer) { | 4813 TEST(PathTracer) { |
4928 CcTest::InitializeVM(); | 4814 CcTest::InitializeVM(); |
4929 v8::HandleScope scope(CcTest::isolate()); | 4815 v8::HandleScope scope(CcTest::isolate()); |
4930 | 4816 |
4931 v8::Local<v8::Value> result = CompileRun("'abc'"); | 4817 v8::Local<v8::Value> result = CompileRun("'abc'"); |
4932 Handle<Object> o = v8::Utils::OpenHandle(*result); | 4818 Handle<Object> o = v8::Utils::OpenHandle(*result); |
4933 CcTest::i_isolate()->heap()->TracePathToObject(*o); | 4819 CcTest::i_isolate()->heap()->TracePathToObject(*o); |
4934 } | 4820 } |
4935 #endif // DEBUG | 4821 #endif // DEBUG |
OLD | NEW |