| OLD | NEW |
| 1 // Copyright 2007-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2010 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 return encoder.Encode(AddressOf(id)); | 92 return encoder.Encode(AddressOf(id)); |
| 93 } | 93 } |
| 94 | 94 |
| 95 | 95 |
| 96 static int make_code(TypeCode type, int id) { | 96 static int make_code(TypeCode type, int id) { |
| 97 return static_cast<uint32_t>(type) << kReferenceTypeShift | id; | 97 return static_cast<uint32_t>(type) << kReferenceTypeShift | id; |
| 98 } | 98 } |
| 99 | 99 |
| 100 | 100 |
| 101 TEST(ExternalReferenceEncoder) { | 101 TEST(ExternalReferenceEncoder) { |
| 102 StatsTable::SetCounterFunction(counter_function); | 102 OS::Setup(); |
| 103 Heap::Setup(false); | 103 i::Isolate::Current()->stats_table()->SetCounterFunction(counter_function); |
| 104 HEAP->Setup(false); |
| 104 ExternalReferenceEncoder encoder; | 105 ExternalReferenceEncoder encoder; |
| 105 CHECK_EQ(make_code(BUILTIN, Builtins::ArrayCode), | 106 CHECK_EQ(make_code(BUILTIN, Builtins::ArrayCode), |
| 106 Encode(encoder, Builtins::ArrayCode)); | 107 Encode(encoder, Builtins::ArrayCode)); |
| 107 CHECK_EQ(make_code(v8::internal::RUNTIME_FUNCTION, Runtime::kAbort), | 108 CHECK_EQ(make_code(v8::internal::RUNTIME_FUNCTION, Runtime::kAbort), |
| 108 Encode(encoder, Runtime::kAbort)); | 109 Encode(encoder, Runtime::kAbort)); |
| 109 CHECK_EQ(make_code(IC_UTILITY, IC::kLoadCallbackProperty), | 110 CHECK_EQ(make_code(IC_UTILITY, IC::kLoadCallbackProperty), |
| 110 Encode(encoder, IC_Utility(IC::kLoadCallbackProperty))); | 111 Encode(encoder, IC_Utility(IC::kLoadCallbackProperty))); |
| 111 ExternalReference keyed_load_function_prototype = | 112 ExternalReference keyed_load_function_prototype = |
| 112 ExternalReference(&Counters::keyed_load_function_prototype); | 113 ExternalReference(COUNTERS->keyed_load_function_prototype()); |
| 113 CHECK_EQ(make_code(STATS_COUNTER, Counters::k_keyed_load_function_prototype), | 114 CHECK_EQ(make_code(STATS_COUNTER, Counters::k_keyed_load_function_prototype), |
| 114 encoder.Encode(keyed_load_function_prototype.address())); | 115 encoder.Encode(keyed_load_function_prototype.address())); |
| 115 ExternalReference the_hole_value_location = | 116 ExternalReference the_hole_value_location = |
| 116 ExternalReference::the_hole_value_location(); | 117 ExternalReference::the_hole_value_location(); |
| 117 CHECK_EQ(make_code(UNCLASSIFIED, 2), | 118 CHECK_EQ(make_code(UNCLASSIFIED, 2), |
| 118 encoder.Encode(the_hole_value_location.address())); | 119 encoder.Encode(the_hole_value_location.address())); |
| 119 ExternalReference stack_limit_address = | 120 ExternalReference stack_limit_address = |
| 120 ExternalReference::address_of_stack_limit(); | 121 ExternalReference::address_of_stack_limit(); |
| 121 CHECK_EQ(make_code(UNCLASSIFIED, 4), | 122 CHECK_EQ(make_code(UNCLASSIFIED, 4), |
| 122 encoder.Encode(stack_limit_address.address())); | 123 encoder.Encode(stack_limit_address.address())); |
| 123 ExternalReference real_stack_limit_address = | 124 ExternalReference real_stack_limit_address = |
| 124 ExternalReference::address_of_real_stack_limit(); | 125 ExternalReference::address_of_real_stack_limit(); |
| 125 CHECK_EQ(make_code(UNCLASSIFIED, 5), | 126 CHECK_EQ(make_code(UNCLASSIFIED, 5), |
| 126 encoder.Encode(real_stack_limit_address.address())); | 127 encoder.Encode(real_stack_limit_address.address())); |
| 127 #ifdef ENABLE_DEBUGGER_SUPPORT | 128 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 128 CHECK_EQ(make_code(UNCLASSIFIED, 15), | 129 CHECK_EQ(make_code(UNCLASSIFIED, 15), |
| 129 encoder.Encode(ExternalReference::debug_break().address())); | 130 encoder.Encode(ExternalReference::debug_break().address())); |
| 130 #endif // ENABLE_DEBUGGER_SUPPORT | 131 #endif // ENABLE_DEBUGGER_SUPPORT |
| 131 CHECK_EQ(make_code(UNCLASSIFIED, 10), | 132 CHECK_EQ(make_code(UNCLASSIFIED, 10), |
| 132 encoder.Encode(ExternalReference::new_space_start().address())); | 133 encoder.Encode(ExternalReference::new_space_start().address())); |
| 133 CHECK_EQ(make_code(UNCLASSIFIED, 3), | 134 CHECK_EQ(make_code(UNCLASSIFIED, 3), |
| 134 encoder.Encode(ExternalReference::roots_address().address())); | 135 encoder.Encode(ExternalReference::roots_address().address())); |
| 135 } | 136 } |
| 136 | 137 |
| 137 | 138 |
| 138 TEST(ExternalReferenceDecoder) { | 139 TEST(ExternalReferenceDecoder) { |
| 139 StatsTable::SetCounterFunction(counter_function); | 140 OS::Setup(); |
| 140 Heap::Setup(false); | 141 i::Isolate::Current()->stats_table()->SetCounterFunction(counter_function); |
| 142 HEAP->Setup(false); |
| 141 ExternalReferenceDecoder decoder; | 143 ExternalReferenceDecoder decoder; |
| 142 CHECK_EQ(AddressOf(Builtins::ArrayCode), | 144 CHECK_EQ(AddressOf(Builtins::ArrayCode), |
| 143 decoder.Decode(make_code(BUILTIN, Builtins::ArrayCode))); | 145 decoder.Decode(make_code(BUILTIN, Builtins::ArrayCode))); |
| 144 CHECK_EQ(AddressOf(Runtime::kAbort), | 146 CHECK_EQ(AddressOf(Runtime::kAbort), |
| 145 decoder.Decode(make_code(v8::internal::RUNTIME_FUNCTION, | 147 decoder.Decode(make_code(v8::internal::RUNTIME_FUNCTION, |
| 146 Runtime::kAbort))); | 148 Runtime::kAbort))); |
| 147 CHECK_EQ(AddressOf(IC_Utility(IC::kLoadCallbackProperty)), | 149 CHECK_EQ(AddressOf(IC_Utility(IC::kLoadCallbackProperty)), |
| 148 decoder.Decode(make_code(IC_UTILITY, IC::kLoadCallbackProperty))); | 150 decoder.Decode(make_code(IC_UTILITY, IC::kLoadCallbackProperty))); |
| 149 ExternalReference keyed_load_function = | 151 ExternalReference keyed_load_function = |
| 150 ExternalReference(&Counters::keyed_load_function_prototype); | 152 ExternalReference(COUNTERS->keyed_load_function_prototype()); |
| 151 CHECK_EQ(keyed_load_function.address(), | 153 CHECK_EQ(keyed_load_function.address(), |
| 152 decoder.Decode( | 154 decoder.Decode( |
| 153 make_code(STATS_COUNTER, | 155 make_code(STATS_COUNTER, |
| 154 Counters::k_keyed_load_function_prototype))); | 156 Counters::k_keyed_load_function_prototype))); |
| 155 CHECK_EQ(ExternalReference::the_hole_value_location().address(), | 157 CHECK_EQ(ExternalReference::the_hole_value_location().address(), |
| 156 decoder.Decode(make_code(UNCLASSIFIED, 2))); | 158 decoder.Decode(make_code(UNCLASSIFIED, 2))); |
| 157 CHECK_EQ(ExternalReference::address_of_stack_limit().address(), | 159 CHECK_EQ(ExternalReference::address_of_stack_limit().address(), |
| 158 decoder.Decode(make_code(UNCLASSIFIED, 4))); | 160 decoder.Decode(make_code(UNCLASSIFIED, 4))); |
| 159 CHECK_EQ(ExternalReference::address_of_real_stack_limit().address(), | 161 CHECK_EQ(ExternalReference::address_of_real_stack_limit().address(), |
| 160 decoder.Decode(make_code(UNCLASSIFIED, 5))); | 162 decoder.Decode(make_code(UNCLASSIFIED, 5))); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // Tests that the heap can be deserialized. | 271 // Tests that the heap can be deserialized. |
| 270 | 272 |
| 271 static void Deserialize() { | 273 static void Deserialize() { |
| 272 CHECK(Snapshot::Initialize(FLAG_testing_serialization_file)); | 274 CHECK(Snapshot::Initialize(FLAG_testing_serialization_file)); |
| 273 } | 275 } |
| 274 | 276 |
| 275 | 277 |
| 276 static void SanityCheck() { | 278 static void SanityCheck() { |
| 277 v8::HandleScope scope; | 279 v8::HandleScope scope; |
| 278 #ifdef DEBUG | 280 #ifdef DEBUG |
| 279 Heap::Verify(); | 281 HEAP->Verify(); |
| 280 #endif | 282 #endif |
| 281 CHECK(Top::global()->IsJSObject()); | 283 CHECK(Isolate::Current()->global()->IsJSObject()); |
| 282 CHECK(Top::global_context()->IsContext()); | 284 CHECK(Isolate::Current()->global_context()->IsContext()); |
| 283 CHECK(Heap::symbol_table()->IsSymbolTable()); | 285 CHECK(HEAP->symbol_table()->IsSymbolTable()); |
| 284 CHECK(!Factory::LookupAsciiSymbol("Empty")->IsFailure()); | 286 CHECK(!FACTORY->LookupAsciiSymbol("Empty")->IsFailure()); |
| 285 } | 287 } |
| 286 | 288 |
| 287 | 289 |
| 288 DEPENDENT_TEST(Deserialize, Serialize) { | 290 DEPENDENT_TEST(Deserialize, Serialize) { |
| 289 // The serialize-deserialize tests only work if the VM is built without | 291 // The serialize-deserialize tests only work if the VM is built without |
| 290 // serialization. That doesn't matter. We don't need to be able to | 292 // serialization. That doesn't matter. We don't need to be able to |
| 291 // serialize a snapshot in a VM that is booted from a snapshot. | 293 // serialize a snapshot in a VM that is booted from a snapshot. |
| 292 if (!Snapshot::IsEnabled()) { | 294 if (!Snapshot::IsEnabled()) { |
| 293 v8::HandleScope scope; | 295 v8::HandleScope scope; |
| 294 | |
| 295 Deserialize(); | 296 Deserialize(); |
| 296 | 297 |
| 297 v8::Persistent<v8::Context> env = v8::Context::New(); | 298 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 298 env->Enter(); | 299 env->Enter(); |
| 299 | 300 |
| 300 SanityCheck(); | 301 SanityCheck(); |
| 301 } | 302 } |
| 302 } | 303 } |
| 303 | 304 |
| 304 | 305 |
| 305 DEPENDENT_TEST(DeserializeFromSecondSerialization, SerializeTwice) { | 306 DEPENDENT_TEST(DeserializeFromSecondSerialization, SerializeTwice) { |
| 306 if (!Snapshot::IsEnabled()) { | 307 if (!Snapshot::IsEnabled()) { |
| 307 v8::HandleScope scope; | 308 v8::HandleScope scope; |
| 308 | |
| 309 Deserialize(); | 309 Deserialize(); |
| 310 | 310 |
| 311 v8::Persistent<v8::Context> env = v8::Context::New(); | 311 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 312 env->Enter(); | 312 env->Enter(); |
| 313 | 313 |
| 314 SanityCheck(); | 314 SanityCheck(); |
| 315 } | 315 } |
| 316 } | 316 } |
| 317 | 317 |
| 318 | 318 |
| 319 DEPENDENT_TEST(DeserializeAndRunScript2, Serialize) { | 319 DEPENDENT_TEST(DeserializeAndRunScript2, Serialize) { |
| 320 if (!Snapshot::IsEnabled()) { | 320 if (!Snapshot::IsEnabled()) { |
| 321 v8::HandleScope scope; | 321 v8::HandleScope scope; |
| 322 | |
| 323 Deserialize(); | 322 Deserialize(); |
| 324 | 323 |
| 325 v8::Persistent<v8::Context> env = v8::Context::New(); | 324 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 326 env->Enter(); | 325 env->Enter(); |
| 327 | 326 |
| 328 const char* c_source = "\"1234\".length"; | 327 const char* c_source = "\"1234\".length"; |
| 329 v8::Local<v8::String> source = v8::String::New(c_source); | 328 v8::Local<v8::String> source = v8::String::New(c_source); |
| 330 v8::Local<v8::Script> script = v8::Script::Compile(source); | 329 v8::Local<v8::Script> script = v8::Script::Compile(source); |
| 331 CHECK_EQ(4, script->Run()->Int32Value()); | 330 CHECK_EQ(4, script->Run()->Int32Value()); |
| 332 } | 331 } |
| 333 } | 332 } |
| 334 | 333 |
| 335 | 334 |
| 336 DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, | 335 DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, |
| 337 SerializeTwice) { | 336 SerializeTwice) { |
| 338 if (!Snapshot::IsEnabled()) { | 337 if (!Snapshot::IsEnabled()) { |
| 339 v8::HandleScope scope; | 338 v8::HandleScope scope; |
| 340 | |
| 341 Deserialize(); | 339 Deserialize(); |
| 342 | 340 |
| 343 v8::Persistent<v8::Context> env = v8::Context::New(); | 341 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 344 env->Enter(); | 342 env->Enter(); |
| 345 | 343 |
| 346 const char* c_source = "\"1234\".length"; | 344 const char* c_source = "\"1234\".length"; |
| 347 v8::Local<v8::String> source = v8::String::New(c_source); | 345 v8::Local<v8::String> source = v8::String::New(c_source); |
| 348 v8::Local<v8::Script> script = v8::Script::Compile(source); | 346 v8::Local<v8::Script> script = v8::Script::Compile(source); |
| 349 CHECK_EQ(4, script->Run()->Int32Value()); | 347 CHECK_EQ(4, script->Run()->Int32Value()); |
| 350 } | 348 } |
| 351 } | 349 } |
| 352 | 350 |
| 353 | 351 |
| 354 TEST(PartialSerialization) { | 352 TEST(PartialSerialization) { |
| 355 Serializer::Enable(); | 353 Serializer::Enable(); |
| 356 v8::V8::Initialize(); | 354 v8::V8::Initialize(); |
| 357 | 355 |
| 358 v8::Persistent<v8::Context> env = v8::Context::New(); | 356 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 359 ASSERT(!env.IsEmpty()); | 357 ASSERT(!env.IsEmpty()); |
| 360 env->Enter(); | 358 env->Enter(); |
| 361 // Make sure all builtin scripts are cached. | 359 // Make sure all builtin scripts are cached. |
| 362 { HandleScope scope; | 360 { HandleScope scope; |
| 363 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 361 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
| 364 Bootstrapper::NativesSourceLookup(i); | 362 Isolate::Current()->bootstrapper()->NativesSourceLookup(i); |
| 365 } | 363 } |
| 366 } | 364 } |
| 367 Heap::CollectAllGarbage(true); | 365 HEAP->CollectAllGarbage(true); |
| 368 Heap::CollectAllGarbage(true); | 366 HEAP->CollectAllGarbage(true); |
| 369 | 367 |
| 370 Object* raw_foo; | 368 Object* raw_foo; |
| 371 { | 369 { |
| 372 v8::HandleScope handle_scope; | 370 v8::HandleScope handle_scope; |
| 373 v8::Local<v8::String> foo = v8::String::New("foo"); | 371 v8::Local<v8::String> foo = v8::String::New("foo"); |
| 374 ASSERT(!foo.IsEmpty()); | 372 ASSERT(!foo.IsEmpty()); |
| 375 raw_foo = *(v8::Utils::OpenHandle(*foo)); | 373 raw_foo = *(v8::Utils::OpenHandle(*foo)); |
| 376 } | 374 } |
| 377 | 375 |
| 378 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 376 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size)); | 416 CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size)); |
| 419 CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size)); | 417 CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size)); |
| 420 CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size)); | 418 CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size)); |
| 421 CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size)); | 419 CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size)); |
| 422 CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size)); | 420 CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size)); |
| 423 CHECK_EQ(1, fscanf(fp, "large %d\n", &large_size)); | 421 CHECK_EQ(1, fscanf(fp, "large %d\n", &large_size)); |
| 424 #ifdef _MSC_VER | 422 #ifdef _MSC_VER |
| 425 #undef fscanf | 423 #undef fscanf |
| 426 #endif | 424 #endif |
| 427 fclose(fp); | 425 fclose(fp); |
| 428 Heap::ReserveSpace(new_size, | 426 HEAP->ReserveSpace(new_size, |
| 429 pointer_size, | 427 pointer_size, |
| 430 data_size, | 428 data_size, |
| 431 code_size, | 429 code_size, |
| 432 map_size, | 430 map_size, |
| 433 cell_size, | 431 cell_size, |
| 434 large_size); | 432 large_size); |
| 435 } | 433 } |
| 436 | 434 |
| 437 | 435 |
| 438 DEPENDENT_TEST(PartialDeserialization, PartialSerialization) { | 436 DEPENDENT_TEST(PartialDeserialization, PartialSerialization) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 TEST(ContextSerialization) { | 473 TEST(ContextSerialization) { |
| 476 Serializer::Enable(); | 474 Serializer::Enable(); |
| 477 v8::V8::Initialize(); | 475 v8::V8::Initialize(); |
| 478 | 476 |
| 479 v8::Persistent<v8::Context> env = v8::Context::New(); | 477 v8::Persistent<v8::Context> env = v8::Context::New(); |
| 480 ASSERT(!env.IsEmpty()); | 478 ASSERT(!env.IsEmpty()); |
| 481 env->Enter(); | 479 env->Enter(); |
| 482 // Make sure all builtin scripts are cached. | 480 // Make sure all builtin scripts are cached. |
| 483 { HandleScope scope; | 481 { HandleScope scope; |
| 484 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 482 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
| 485 Bootstrapper::NativesSourceLookup(i); | 483 Isolate::Current()->bootstrapper()->NativesSourceLookup(i); |
| 486 } | 484 } |
| 487 } | 485 } |
| 488 // If we don't do this then we end up with a stray root pointing at the | 486 // If we don't do this then we end up with a stray root pointing at the |
| 489 // context even after we have disposed of env. | 487 // context even after we have disposed of env. |
| 490 Heap::CollectAllGarbage(true); | 488 HEAP->CollectAllGarbage(true); |
| 491 | 489 |
| 492 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 490 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
| 493 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 491 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
| 494 OS::SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 492 OS::SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
| 495 | 493 |
| 496 env->Exit(); | 494 env->Exit(); |
| 497 | 495 |
| 498 Object* raw_context = *(v8::Utils::OpenHandle(*env)); | 496 Object* raw_context = *(v8::Utils::OpenHandle(*env)); |
| 499 | 497 |
| 500 env.Dispose(); | 498 env.Dispose(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 } | 552 } |
| 555 } | 553 } |
| 556 | 554 |
| 557 | 555 |
| 558 TEST(LinearAllocation) { | 556 TEST(LinearAllocation) { |
| 559 v8::V8::Initialize(); | 557 v8::V8::Initialize(); |
| 560 int new_space_max = 512 * KB; | 558 int new_space_max = 512 * KB; |
| 561 | 559 |
| 562 for (int size = 1000; size < 5 * MB; size += size >> 1) { | 560 for (int size = 1000; size < 5 * MB; size += size >> 1) { |
| 563 int new_space_size = (size < new_space_max) ? size : new_space_max; | 561 int new_space_size = (size < new_space_max) ? size : new_space_max; |
| 564 Heap::ReserveSpace( | 562 HEAP->ReserveSpace( |
| 565 new_space_size, | 563 new_space_size, |
| 566 size, // Old pointer space. | 564 size, // Old pointer space. |
| 567 size, // Old data space. | 565 size, // Old data space. |
| 568 size, // Code space. | 566 size, // Code space. |
| 569 size, // Map space. | 567 size, // Map space. |
| 570 size, // Cell space. | 568 size, // Cell space. |
| 571 size); // Large object space. | 569 size); // Large object space. |
| 572 LinearAllocationScope linear_allocation_scope; | 570 LinearAllocationScope linear_allocation_scope; |
| 573 const int kSmallFixedArrayLength = 4; | 571 const int kSmallFixedArrayLength = 4; |
| 574 const int kSmallFixedArraySize = | 572 const int kSmallFixedArraySize = |
| 575 FixedArray::kHeaderSize + kSmallFixedArrayLength * kPointerSize; | 573 FixedArray::kHeaderSize + kSmallFixedArrayLength * kPointerSize; |
| 576 const int kSmallStringLength = 16; | 574 const int kSmallStringLength = 16; |
| 577 const int kSmallStringSize = | 575 const int kSmallStringSize = |
| 578 (SeqAsciiString::kHeaderSize + kSmallStringLength + | 576 (SeqAsciiString::kHeaderSize + kSmallStringLength + |
| 579 kObjectAlignmentMask) & ~kObjectAlignmentMask; | 577 kObjectAlignmentMask) & ~kObjectAlignmentMask; |
| 580 const int kMapSize = Map::kSize; | 578 const int kMapSize = Map::kSize; |
| 581 | 579 |
| 582 Object* new_last = NULL; | 580 Object* new_last = NULL; |
| 583 for (int i = 0; | 581 for (int i = 0; |
| 584 i + kSmallFixedArraySize <= new_space_size; | 582 i + kSmallFixedArraySize <= new_space_size; |
| 585 i += kSmallFixedArraySize) { | 583 i += kSmallFixedArraySize) { |
| 586 Object* obj = | 584 Object* obj = |
| 587 Heap::AllocateFixedArray(kSmallFixedArrayLength)->ToObjectChecked(); | 585 HEAP->AllocateFixedArray(kSmallFixedArrayLength)->ToObjectChecked(); |
| 588 if (new_last != NULL) { | 586 if (new_last != NULL) { |
| 589 CHECK(reinterpret_cast<char*>(obj) == | 587 CHECK(reinterpret_cast<char*>(obj) == |
| 590 reinterpret_cast<char*>(new_last) + kSmallFixedArraySize); | 588 reinterpret_cast<char*>(new_last) + kSmallFixedArraySize); |
| 591 } | 589 } |
| 592 new_last = obj; | 590 new_last = obj; |
| 593 } | 591 } |
| 594 | 592 |
| 595 Object* pointer_last = NULL; | 593 Object* pointer_last = NULL; |
| 596 for (int i = 0; | 594 for (int i = 0; |
| 597 i + kSmallFixedArraySize <= size; | 595 i + kSmallFixedArraySize <= size; |
| 598 i += kSmallFixedArraySize) { | 596 i += kSmallFixedArraySize) { |
| 599 Object* obj = Heap::AllocateFixedArray(kSmallFixedArrayLength, | 597 Object* obj = HEAP->AllocateFixedArray(kSmallFixedArrayLength, |
| 600 TENURED)->ToObjectChecked(); | 598 TENURED)->ToObjectChecked(); |
| 601 int old_page_fullness = i % Page::kPageSize; | 599 int old_page_fullness = i % Page::kPageSize; |
| 602 int page_fullness = (i + kSmallFixedArraySize) % Page::kPageSize; | 600 int page_fullness = (i + kSmallFixedArraySize) % Page::kPageSize; |
| 603 if (page_fullness < old_page_fullness || | 601 if (page_fullness < old_page_fullness || |
| 604 page_fullness > Page::kObjectAreaSize) { | 602 page_fullness > Page::kObjectAreaSize) { |
| 605 i = RoundUp(i, Page::kPageSize); | 603 i = RoundUp(i, Page::kPageSize); |
| 606 pointer_last = NULL; | 604 pointer_last = NULL; |
| 607 } | 605 } |
| 608 if (pointer_last != NULL) { | 606 if (pointer_last != NULL) { |
| 609 CHECK(reinterpret_cast<char*>(obj) == | 607 CHECK(reinterpret_cast<char*>(obj) == |
| 610 reinterpret_cast<char*>(pointer_last) + kSmallFixedArraySize); | 608 reinterpret_cast<char*>(pointer_last) + kSmallFixedArraySize); |
| 611 } | 609 } |
| 612 pointer_last = obj; | 610 pointer_last = obj; |
| 613 } | 611 } |
| 614 | 612 |
| 615 Object* data_last = NULL; | 613 Object* data_last = NULL; |
| 616 for (int i = 0; i + kSmallStringSize <= size; i += kSmallStringSize) { | 614 for (int i = 0; i + kSmallStringSize <= size; i += kSmallStringSize) { |
| 617 Object* obj = Heap::AllocateRawAsciiString(kSmallStringLength, | 615 Object* obj = HEAP->AllocateRawAsciiString(kSmallStringLength, |
| 618 TENURED)->ToObjectChecked(); | 616 TENURED)->ToObjectChecked(); |
| 619 int old_page_fullness = i % Page::kPageSize; | 617 int old_page_fullness = i % Page::kPageSize; |
| 620 int page_fullness = (i + kSmallStringSize) % Page::kPageSize; | 618 int page_fullness = (i + kSmallStringSize) % Page::kPageSize; |
| 621 if (page_fullness < old_page_fullness || | 619 if (page_fullness < old_page_fullness || |
| 622 page_fullness > Page::kObjectAreaSize) { | 620 page_fullness > Page::kObjectAreaSize) { |
| 623 i = RoundUp(i, Page::kPageSize); | 621 i = RoundUp(i, Page::kPageSize); |
| 624 data_last = NULL; | 622 data_last = NULL; |
| 625 } | 623 } |
| 626 if (data_last != NULL) { | 624 if (data_last != NULL) { |
| 627 CHECK(reinterpret_cast<char*>(obj) == | 625 CHECK(reinterpret_cast<char*>(obj) == |
| 628 reinterpret_cast<char*>(data_last) + kSmallStringSize); | 626 reinterpret_cast<char*>(data_last) + kSmallStringSize); |
| 629 } | 627 } |
| 630 data_last = obj; | 628 data_last = obj; |
| 631 } | 629 } |
| 632 | 630 |
| 633 Object* map_last = NULL; | 631 Object* map_last = NULL; |
| 634 for (int i = 0; i + kMapSize <= size; i += kMapSize) { | 632 for (int i = 0; i + kMapSize <= size; i += kMapSize) { |
| 635 Object* obj = Heap::AllocateMap(JS_OBJECT_TYPE, | 633 Object* obj = HEAP->AllocateMap(JS_OBJECT_TYPE, |
| 636 42 * kPointerSize)->ToObjectChecked(); | 634 42 * kPointerSize)->ToObjectChecked(); |
| 637 int old_page_fullness = i % Page::kPageSize; | 635 int old_page_fullness = i % Page::kPageSize; |
| 638 int page_fullness = (i + kMapSize) % Page::kPageSize; | 636 int page_fullness = (i + kMapSize) % Page::kPageSize; |
| 639 if (page_fullness < old_page_fullness || | 637 if (page_fullness < old_page_fullness || |
| 640 page_fullness > Page::kObjectAreaSize) { | 638 page_fullness > Page::kObjectAreaSize) { |
| 641 i = RoundUp(i, Page::kPageSize); | 639 i = RoundUp(i, Page::kPageSize); |
| 642 map_last = NULL; | 640 map_last = NULL; |
| 643 } | 641 } |
| 644 if (map_last != NULL) { | 642 if (map_last != NULL) { |
| 645 CHECK(reinterpret_cast<char*>(obj) == | 643 CHECK(reinterpret_cast<char*>(obj) == |
| 646 reinterpret_cast<char*>(map_last) + kMapSize); | 644 reinterpret_cast<char*>(map_last) + kMapSize); |
| 647 } | 645 } |
| 648 map_last = obj; | 646 map_last = obj; |
| 649 } | 647 } |
| 650 | 648 |
| 651 if (size > Page::kObjectAreaSize) { | 649 if (size > Page::kObjectAreaSize) { |
| 652 // Support for reserving space in large object space is not there yet, | 650 // Support for reserving space in large object space is not there yet, |
| 653 // but using an always-allocate scope is fine for now. | 651 // but using an always-allocate scope is fine for now. |
| 654 AlwaysAllocateScope always; | 652 AlwaysAllocateScope always; |
| 655 int large_object_array_length = | 653 int large_object_array_length = |
| 656 (size - FixedArray::kHeaderSize) / kPointerSize; | 654 (size - FixedArray::kHeaderSize) / kPointerSize; |
| 657 Object* obj = Heap::AllocateFixedArray(large_object_array_length, | 655 Object* obj = HEAP->AllocateFixedArray(large_object_array_length, |
| 658 TENURED)->ToObjectChecked(); | 656 TENURED)->ToObjectChecked(); |
| 659 CHECK(!obj->IsFailure()); | 657 CHECK(!obj->IsFailure()); |
| 660 } | 658 } |
| 661 } | 659 } |
| 662 } | 660 } |
| 663 | 661 |
| 664 | 662 |
| 665 TEST(TestThatAlwaysSucceeds) { | 663 TEST(TestThatAlwaysSucceeds) { |
| 666 } | 664 } |
| 667 | 665 |
| 668 | 666 |
| 669 TEST(TestThatAlwaysFails) { | 667 TEST(TestThatAlwaysFails) { |
| 670 bool ArtificialFailure = false; | 668 bool ArtificialFailure = false; |
| 671 CHECK(ArtificialFailure); | 669 CHECK(ArtificialFailure); |
| 672 } | 670 } |
| 673 | 671 |
| 674 | 672 |
| 675 DEPENDENT_TEST(DependentTestThatAlwaysFails, TestThatAlwaysSucceeds) { | 673 DEPENDENT_TEST(DependentTestThatAlwaysFails, TestThatAlwaysSucceeds) { |
| 676 bool ArtificialFailure2 = false; | 674 bool ArtificialFailure2 = false; |
| 677 CHECK(ArtificialFailure2); | 675 CHECK(ArtificialFailure2); |
| 678 } | 676 } |
| OLD | NEW |