Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index 9308eb752ed9874adafb0ab5200c263f375ab63c..a00944816562b67bb2c0267c743d3a4d7e92bf1a 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -58,62 +58,65 @@ TEST(HeapMaps) { |
} |
-static void CheckOddball(Object* obj, const char* string) { |
+static void CheckOddball(Isolate* isolate, Object* obj, const char* string) { |
CHECK(obj->IsOddball()); |
bool exc; |
- Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc); |
+ Object* print_string = |
+ *Execution::ToString(Handle<Object>(obj, isolate), &exc); |
CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string))); |
} |
-static void CheckSmi(int value, const char* string) { |
+static void CheckSmi(Isolate* isolate, int value, const char* string) { |
bool exc; |
Object* print_string = |
- *Execution::ToString(Handle<Object>(Smi::FromInt(value)), &exc); |
+ *Execution::ToString(Handle<Object>(Smi::FromInt(value), isolate), &exc); |
CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string))); |
} |
-static void CheckNumber(double value, const char* string) { |
+static void CheckNumber(Isolate* isolate, double value, const char* string) { |
Object* obj = HEAP->NumberFromDouble(value)->ToObjectChecked(); |
CHECK(obj->IsNumber()); |
bool exc; |
- Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc); |
+ Object* print_string = |
+ *Execution::ToString(Handle<Object>(obj, isolate), &exc); |
CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string))); |
} |
-static void CheckFindCodeObject() { |
+static void CheckFindCodeObject(Isolate* isolate) { |
// Test FindCodeObject |
#define __ assm. |
- Assembler assm(Isolate::Current(), NULL, 0); |
+ Assembler assm(isolate, NULL, 0); |
__ nop(); // supported on all architectures |
CodeDesc desc; |
assm.GetCode(&desc); |
- Object* code = HEAP->CreateCode( |
+ Heap* heap = isolate->heap(); |
+ Object* code = heap->CreateCode( |
desc, |
Code::ComputeFlags(Code::STUB), |
- Handle<Object>(HEAP->undefined_value()))->ToObjectChecked(); |
+ Handle<Code>())->ToObjectChecked(); |
CHECK(code->IsCode()); |
HeapObject* obj = HeapObject::cast(code); |
Address obj_addr = obj->address(); |
for (int i = 0; i < obj->Size(); i += kPointerSize) { |
- Object* found = HEAP->FindCodeObject(obj_addr + i); |
+ Object* found = heap->FindCodeObject(obj_addr + i); |
CHECK_EQ(code, found); |
} |
- Object* copy = HEAP->CreateCode( |
+ Object* copy = heap->CreateCode( |
desc, |
Code::ComputeFlags(Code::STUB), |
- Handle<Object>(HEAP->undefined_value()))->ToObjectChecked(); |
+ Handle<Code>())->ToObjectChecked(); |
CHECK(copy->IsCode()); |
HeapObject* obj_copy = HeapObject::cast(copy); |
- Object* not_right = HEAP->FindCodeObject(obj_copy->address() + |
+ Object* not_right = heap->FindCodeObject(obj_copy->address() + |
obj_copy->Size() / 2); |
CHECK(not_right != code); |
} |
@@ -121,50 +124,52 @@ static void CheckFindCodeObject() { |
TEST(HeapObjects) { |
InitializeVM(); |
+ Isolate* isolate = Isolate::Current(); |
+ Heap* heap = isolate->heap(); |
v8::HandleScope sc; |
- Object* value = HEAP->NumberFromDouble(1.000123)->ToObjectChecked(); |
+ Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); |
CHECK(value->IsHeapNumber()); |
CHECK(value->IsNumber()); |
CHECK_EQ(1.000123, value->Number()); |
- value = HEAP->NumberFromDouble(1.0)->ToObjectChecked(); |
+ value = heap->NumberFromDouble(1.0)->ToObjectChecked(); |
CHECK(value->IsSmi()); |
CHECK(value->IsNumber()); |
CHECK_EQ(1.0, value->Number()); |
- value = HEAP->NumberFromInt32(1024)->ToObjectChecked(); |
+ value = heap->NumberFromInt32(1024)->ToObjectChecked(); |
CHECK(value->IsSmi()); |
CHECK(value->IsNumber()); |
CHECK_EQ(1024.0, value->Number()); |
- value = HEAP->NumberFromInt32(Smi::kMinValue)->ToObjectChecked(); |
+ value = heap->NumberFromInt32(Smi::kMinValue)->ToObjectChecked(); |
CHECK(value->IsSmi()); |
CHECK(value->IsNumber()); |
CHECK_EQ(Smi::kMinValue, Smi::cast(value)->value()); |
- value = HEAP->NumberFromInt32(Smi::kMaxValue)->ToObjectChecked(); |
+ value = heap->NumberFromInt32(Smi::kMaxValue)->ToObjectChecked(); |
CHECK(value->IsSmi()); |
CHECK(value->IsNumber()); |
CHECK_EQ(Smi::kMaxValue, Smi::cast(value)->value()); |
#ifndef V8_TARGET_ARCH_X64 |
// TODO(lrn): We need a NumberFromIntptr function in order to test this. |
- value = HEAP->NumberFromInt32(Smi::kMinValue - 1)->ToObjectChecked(); |
+ value = heap->NumberFromInt32(Smi::kMinValue - 1)->ToObjectChecked(); |
CHECK(value->IsHeapNumber()); |
CHECK(value->IsNumber()); |
CHECK_EQ(static_cast<double>(Smi::kMinValue - 1), value->Number()); |
#endif |
MaybeObject* maybe_value = |
- HEAP->NumberFromUint32(static_cast<uint32_t>(Smi::kMaxValue) + 1); |
+ heap->NumberFromUint32(static_cast<uint32_t>(Smi::kMaxValue) + 1); |
value = maybe_value->ToObjectChecked(); |
CHECK(value->IsHeapNumber()); |
CHECK(value->IsNumber()); |
CHECK_EQ(static_cast<double>(static_cast<uint32_t>(Smi::kMaxValue) + 1), |
value->Number()); |
- maybe_value = HEAP->NumberFromUint32(static_cast<uint32_t>(1) << 31); |
+ maybe_value = heap->NumberFromUint32(static_cast<uint32_t>(1) << 31); |
value = maybe_value->ToObjectChecked(); |
CHECK(value->IsHeapNumber()); |
CHECK(value->IsNumber()); |
@@ -172,33 +177,33 @@ TEST(HeapObjects) { |
value->Number()); |
// nan oddball checks |
- CHECK(HEAP->nan_value()->IsNumber()); |
- CHECK(isnan(HEAP->nan_value()->Number())); |
+ CHECK(heap->nan_value()->IsNumber()); |
+ CHECK(isnan(heap->nan_value()->Number())); |
Handle<String> s = FACTORY->NewStringFromAscii(CStrVector("fisk hest ")); |
CHECK(s->IsString()); |
CHECK_EQ(10, s->length()); |
- String* object_symbol = String::cast(HEAP->Object_symbol()); |
+ String* object_symbol = String::cast(heap->Object_symbol()); |
CHECK( |
Isolate::Current()->context()->global_object()->HasLocalProperty( |
object_symbol)); |
// Check ToString for oddballs |
- CheckOddball(HEAP->true_value(), "true"); |
- CheckOddball(HEAP->false_value(), "false"); |
- CheckOddball(HEAP->null_value(), "null"); |
- CheckOddball(HEAP->undefined_value(), "undefined"); |
+ CheckOddball(isolate, heap->true_value(), "true"); |
+ CheckOddball(isolate, heap->false_value(), "false"); |
+ CheckOddball(isolate, heap->null_value(), "null"); |
+ CheckOddball(isolate, heap->undefined_value(), "undefined"); |
// Check ToString for Smis |
- CheckSmi(0, "0"); |
- CheckSmi(42, "42"); |
- CheckSmi(-42, "-42"); |
+ CheckSmi(isolate, 0, "0"); |
+ CheckSmi(isolate, 42, "42"); |
+ CheckSmi(isolate, -42, "-42"); |
// Check ToString for Numbers |
- CheckNumber(1.1, "1.1"); |
+ CheckNumber(isolate, 1.1, "1.1"); |
- CheckFindCodeObject(); |
+ CheckFindCodeObject(isolate); |
} |
@@ -1210,7 +1215,7 @@ TEST(TestCodeFlushingIncrementalAbort) { |
// is running so that incremental marking aborts and code flushing is |
// disabled. |
int position = 0; |
- Handle<Object> breakpoint_object(Smi::FromInt(0)); |
+ Handle<Object> breakpoint_object(Smi::FromInt(0), isolate); |
isolate->debug()->SetBreakPoint(function, breakpoint_object, &position); |
isolate->debug()->ClearAllBreakPoints(); |
@@ -1357,14 +1362,16 @@ TEST(TestInternalWeakLists) { |
// Count the number of native contexts in the weak list of native contexts |
// causing a GC after the specified number of elements. |
-static int CountNativeContextsWithGC(int n) { |
+static int CountNativeContextsWithGC(Isolate* isolate, int n) { |
+ Heap* heap = isolate->heap(); |
int count = 0; |
- Handle<Object> object(HEAP->native_contexts_list()); |
+ Handle<Object> object(heap->native_contexts_list(), isolate); |
while (!object->IsUndefined()) { |
count++; |
- if (count == n) HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+ if (count == n) heap->CollectAllGarbage(Heap::kNoGCFlags); |
object = |
- Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK)); |
+ Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK), |
+ isolate); |
} |
return count; |
} |
@@ -1377,13 +1384,16 @@ static int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context, |
int n) { |
int count = 0; |
Handle<Context> icontext = v8::Utils::OpenHandle(*context); |
- Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST)); |
+ Isolate* isolate = icontext->GetIsolate(); |
+ Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST), |
+ isolate); |
while (object->IsJSFunction() && |
!Handle<JSFunction>::cast(object)->IsBuiltin()) { |
count++; |
- if (count == n) HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+ if (count == n) isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
object = Handle<Object>( |
- Object::cast(JSFunction::cast(*object)->next_function_link())); |
+ Object::cast(JSFunction::cast(*object)->next_function_link()), |
+ isolate); |
} |
return count; |
} |
@@ -1391,6 +1401,7 @@ static int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context, |
TEST(TestInternalWeakListsTraverseWithGC) { |
v8::V8::Initialize(); |
+ Isolate* isolate = Isolate::Current(); |
static const int kNumTestContexts = 10; |
@@ -1404,7 +1415,7 @@ TEST(TestInternalWeakListsTraverseWithGC) { |
for (int i = 0; i < kNumTestContexts; i++) { |
ctx[i] = v8::Context::New(); |
CHECK_EQ(i + 1, CountNativeContexts()); |
- CHECK_EQ(i + 1, CountNativeContextsWithGC(i / 2 + 1)); |
+ CHECK_EQ(i + 1, CountNativeContextsWithGC(isolate, i / 2 + 1)); |
} |
bool opt = (FLAG_always_opt && i::V8::UseCrankshaft()); |
@@ -2487,6 +2498,7 @@ TEST(ReleaseStackTraceData) { |
TEST(Regression144230) { |
InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
+ Heap* heap = isolate->heap(); |
v8::HandleScope scope; |
// First make sure that the uninitialized CallIC stub is on a single page |
@@ -2494,7 +2506,7 @@ TEST(Regression144230) { |
{ |
v8::HandleScope inner_scope; |
AlwaysAllocateScope always_allocate; |
- SimulateFullSpace(HEAP->code_space()); |
+ SimulateFullSpace(heap->code_space()); |
isolate->stub_cache()->ComputeCallInitialize(9, RelocInfo::CODE_TARGET); |
} |
@@ -2503,7 +2515,7 @@ TEST(Regression144230) { |
{ |
v8::HandleScope inner_scope; |
AlwaysAllocateScope always_allocate; |
- SimulateFullSpace(HEAP->code_space()); |
+ SimulateFullSpace(heap->code_space()); |
CompileRun("var o = { f:function(a,b,c,d,e,f,g,h,i) {}};" |
"function call() { o.f(1,2,3,4,5,6,7,8,9); };" |
"call();"); |
@@ -2519,7 +2531,7 @@ TEST(Regression144230) { |
" 'f' + i + '();');" |
"}"); |
} |
- HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
+ heap->CollectAllGarbage(Heap::kNoGCFlags); |
// Fourth is the tricky part. Make sure the code containing the CallIC is |
// visited first without clearing the IC. The shared function info is then |
@@ -2530,12 +2542,12 @@ TEST(Regression144230) { |
JSFunction* call = JSFunction::cast(maybe_call->ToObjectChecked()); |
USE(global->SetProperty(*name, Smi::FromInt(0), NONE, kNonStrictMode)); |
isolate->compilation_cache()->Clear(); |
- call->shared()->set_ic_age(HEAP->global_ic_age() + 1); |
- Handle<Object> call_code(call->code()); |
- Handle<Object> call_function(call); |
+ call->shared()->set_ic_age(heap->global_ic_age() + 1); |
+ Handle<Object> call_code(call->code(), isolate); |
+ Handle<Object> call_function(call, isolate); |
// Now we are ready to mess up the heap. |
- HEAP->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
+ heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
// Either heap verification caught the problem already or we go kaboom once |
// the CallIC is executed the next time. |