Chromium Code Reviews| Index: test/cctest/test-mementos.cc |
| diff --git a/test/cctest/test-mementos.cc b/test/cctest/test-mementos.cc |
| index f59eef9485f8257ef158117dc5b6e69a2f82da09..45307168c95ff6c4d3c7af4a0d3e8550eac97548 100644 |
| --- a/test/cctest/test-mementos.cc |
| +++ b/test/cctest/test-mementos.cc |
| @@ -57,3 +57,47 @@ TEST(Regress340063) { |
| // current new space top pointer. |
| heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| } |
| + |
| + |
| +TEST(PretenuringCallNew) { |
| + CcTest::InitializeVM(); |
| + if (!i::FLAG_allocation_site_pretenuring) return; |
| + if (!i::FLAG_pretenuring_call_new) return; |
| + |
| + v8::HandleScope scope(CcTest::isolate()); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + Heap* heap = isolate->heap(); |
| + |
| + // We need to create several instances to get past the slack-tracking |
| + // phase, where mementos aren't emitted. |
| + int call_count = 10; |
| + CHECK_GE(call_count, SharedFunctionInfo::kGenerousAllocationCount); |
| + i::ScopedVector<char> test_buf(1024); |
| + const char* program = |
| + "function f() {" |
| + " this.a = 3;" |
| + " this.b = {};" |
| + " return this;" |
| + "};" |
| + "var a;" |
| + "for(var i = 0; i < %d; i++) {" |
| + " a = new f();" |
| + "}" |
| + "a;"; |
|
Hannes Payer (out of office)
2014/02/18 16:24:26
a == return a; ?
mvstanton
2014/02/19 08:40:26
Done.
|
| + i::OS::SNPrintF(test_buf, program, call_count); |
| + v8::Local<v8::Value> res = CompileRun(test_buf.start()); |
| + Handle<JSObject> o = |
| + v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| + |
| + // The object of class f should have a memento secreted behind it. |
| + Address memento_address = o->address() + o->map()->instance_size(); |
| + AllocationMemento* memento = |
| + reinterpret_cast<AllocationMemento*>(memento_address + kHeapObjectTag); |
| + CHECK_EQ(memento->map(), heap->allocation_memento_map()); |
| + |
| + // Furthermore, how many mementos did we create? The count should match |
| + // call_count - SharedFunctionInfo::kGenerousAllocationCount. |
| + AllocationSite* site = memento->GetAllocationSite(); |
| + CHECK_EQ(call_count - SharedFunctionInfo::kGenerousAllocationCount, |
| + site->pretenure_create_count()->value()); |
| +} |