| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/base/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 Address address = Deoptimizer::GetDeoptimizationEntry( | 331 Address address = Deoptimizer::GetDeoptimizationEntry( |
| 332 isolate, | 332 isolate, |
| 333 entry, | 333 entry, |
| 334 Deoptimizer::LAZY, | 334 Deoptimizer::LAZY, |
| 335 Deoptimizer::CALCULATE_ENTRY_ADDRESS); | 335 Deoptimizer::CALCULATE_ENTRY_ADDRESS); |
| 336 Add(address, "lazy_deopt"); | 336 Add(address, "lazy_deopt"); |
| 337 } | 337 } |
| 338 } | 338 } |
| 339 | 339 |
| 340 | 340 |
| 341 ExternalReferenceEncoder::ExternalReferenceEncoder(Isolate* isolate) | 341 ExternalReferenceEncoder::ExternalReferenceEncoder(Isolate* isolate) { |
| 342 : map_(HashMap::PointersMatch) { | 342 map_ = isolate->external_reference_map(); |
| 343 if (map_ != NULL) return; |
| 344 map_ = new HashMap(HashMap::PointersMatch); |
| 343 ExternalReferenceTable* table = ExternalReferenceTable::instance(isolate); | 345 ExternalReferenceTable* table = ExternalReferenceTable::instance(isolate); |
| 344 for (int i = 0; i < table->size(); ++i) { | 346 for (int i = 0; i < table->size(); ++i) { |
| 345 Address addr = table->address(i); | 347 Address addr = table->address(i); |
| 346 if (addr == ExternalReferenceTable::NotAvailable()) continue; | 348 if (addr == ExternalReferenceTable::NotAvailable()) continue; |
| 347 // We expect no duplicate external references entries in the table. | 349 // We expect no duplicate external references entries in the table. |
| 348 DCHECK_NULL(map_.Lookup(addr, Hash(addr), false)); | 350 DCHECK_NULL(map_->Lookup(addr, Hash(addr), false)); |
| 349 map_.Lookup(addr, Hash(addr), true)->value = reinterpret_cast<void*>(i); | 351 map_->Lookup(addr, Hash(addr), true)->value = reinterpret_cast<void*>(i); |
| 350 } | 352 } |
| 353 isolate->set_external_reference_map(map_); |
| 351 } | 354 } |
| 352 | 355 |
| 353 | 356 |
| 354 uint32_t ExternalReferenceEncoder::Encode(Address address) const { | 357 uint32_t ExternalReferenceEncoder::Encode(Address address) const { |
| 355 DCHECK_NOT_NULL(address); | 358 DCHECK_NOT_NULL(address); |
| 356 HashMap::Entry* entry = | 359 HashMap::Entry* entry = |
| 357 const_cast<HashMap&>(map_).Lookup(address, Hash(address), false); | 360 const_cast<HashMap*>(map_)->Lookup(address, Hash(address), false); |
| 358 DCHECK_NOT_NULL(entry); | 361 DCHECK_NOT_NULL(entry); |
| 359 return static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); | 362 return static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); |
| 360 } | 363 } |
| 361 | 364 |
| 362 | 365 |
| 363 const char* ExternalReferenceEncoder::NameOfAddress(Isolate* isolate, | 366 const char* ExternalReferenceEncoder::NameOfAddress(Isolate* isolate, |
| 364 Address address) const { | 367 Address address) const { |
| 365 HashMap::Entry* entry = | 368 HashMap::Entry* entry = |
| 366 const_cast<HashMap&>(map_).Lookup(address, Hash(address), false); | 369 const_cast<HashMap*>(map_)->Lookup(address, Hash(address), false); |
| 367 if (entry == NULL) return "<unknown>"; | 370 if (entry == NULL) return "<unknown>"; |
| 368 uint32_t i = static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); | 371 uint32_t i = static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); |
| 369 return ExternalReferenceTable::instance(isolate)->name(i); | 372 return ExternalReferenceTable::instance(isolate)->name(i); |
| 370 } | 373 } |
| 371 | 374 |
| 372 | 375 |
| 373 RootIndexMap::RootIndexMap(Isolate* isolate) : map_(HashMap::PointersMatch) { | 376 RootIndexMap::RootIndexMap(Isolate* isolate) { |
| 377 map_ = isolate->root_index_map(); |
| 378 if (map_ != NULL) return; |
| 379 map_ = new HashMap(HashMap::PointersMatch); |
| 374 Object** root_array = isolate->heap()->roots_array_start(); | 380 Object** root_array = isolate->heap()->roots_array_start(); |
| 375 for (uint32_t i = 0; i < Heap::kStrongRootListLength; i++) { | 381 for (uint32_t i = 0; i < Heap::kStrongRootListLength; i++) { |
| 376 Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i); | 382 Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i); |
| 377 Object* root = root_array[root_index]; | 383 Object* root = root_array[root_index]; |
| 378 // Omit root entries that can be written after initialization. They must | 384 // Omit root entries that can be written after initialization. They must |
| 379 // not be referenced through the root list in the snapshot. | 385 // not be referenced through the root list in the snapshot. |
| 380 if (root->IsHeapObject() && | 386 if (root->IsHeapObject() && |
| 381 isolate->heap()->RootCanBeTreatedAsConstant(root_index)) { | 387 isolate->heap()->RootCanBeTreatedAsConstant(root_index)) { |
| 382 HeapObject* heap_object = HeapObject::cast(root); | 388 HeapObject* heap_object = HeapObject::cast(root); |
| 383 HashMap::Entry* entry = LookupEntry(&map_, heap_object, false); | 389 HashMap::Entry* entry = LookupEntry(map_, heap_object, false); |
| 384 if (entry != NULL) { | 390 if (entry != NULL) { |
| 385 // Some are initialized to a previous value in the root list. | 391 // Some are initialized to a previous value in the root list. |
| 386 DCHECK_LT(GetValue(entry), i); | 392 DCHECK_LT(GetValue(entry), i); |
| 387 } else { | 393 } else { |
| 388 SetValue(LookupEntry(&map_, heap_object, true), i); | 394 SetValue(LookupEntry(map_, heap_object, true), i); |
| 389 } | 395 } |
| 390 } | 396 } |
| 391 } | 397 } |
| 398 isolate->set_root_index_map(map_); |
| 392 } | 399 } |
| 393 | 400 |
| 394 | 401 |
| 395 class CodeAddressMap: public CodeEventLogger { | 402 class CodeAddressMap: public CodeEventLogger { |
| 396 public: | 403 public: |
| 397 explicit CodeAddressMap(Isolate* isolate) | 404 explicit CodeAddressMap(Isolate* isolate) |
| 398 : isolate_(isolate) { | 405 : isolate_(isolate) { |
| 399 isolate->logger()->addCodeEventListener(this); | 406 isolate->logger()->addCodeEventListener(this); |
| 400 } | 407 } |
| 401 | 408 |
| (...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 CHECK(false); | 1202 CHECK(false); |
| 1196 } | 1203 } |
| 1197 } | 1204 } |
| 1198 CHECK_EQ(limit, current); | 1205 CHECK_EQ(limit, current); |
| 1199 } | 1206 } |
| 1200 | 1207 |
| 1201 | 1208 |
| 1202 Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink) | 1209 Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink) |
| 1203 : isolate_(isolate), | 1210 : isolate_(isolate), |
| 1204 sink_(sink), | 1211 sink_(sink), |
| 1205 external_reference_encoder_(new ExternalReferenceEncoder(isolate)), | 1212 external_reference_encoder_(isolate), |
| 1206 root_index_map_(isolate), | 1213 root_index_map_(isolate), |
| 1207 code_address_map_(NULL), | 1214 code_address_map_(NULL), |
| 1208 large_objects_total_size_(0), | 1215 large_objects_total_size_(0), |
| 1209 seen_large_objects_index_(0) { | 1216 seen_large_objects_index_(0) { |
| 1210 // The serializer is meant to be used only to generate initial heap images | 1217 // The serializer is meant to be used only to generate initial heap images |
| 1211 // from a context in which there is only one isolate. | 1218 // from a context in which there is only one isolate. |
| 1212 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { | 1219 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { |
| 1213 pending_chunk_[i] = 0; | 1220 pending_chunk_[i] = 0; |
| 1214 max_chunk_size_[i] = static_cast<uint32_t>( | 1221 max_chunk_size_[i] = static_cast<uint32_t>( |
| 1215 MemoryAllocator::PageAreaSize(static_cast<AllocationSpace>(i))); | 1222 MemoryAllocator::PageAreaSize(static_cast<AllocationSpace>(i))); |
| 1216 } | 1223 } |
| 1217 } | 1224 } |
| 1218 | 1225 |
| 1219 | 1226 |
| 1220 Serializer::~Serializer() { | 1227 Serializer::~Serializer() { |
| 1221 delete external_reference_encoder_; | |
| 1222 if (code_address_map_ != NULL) delete code_address_map_; | 1228 if (code_address_map_ != NULL) delete code_address_map_; |
| 1223 } | 1229 } |
| 1224 | 1230 |
| 1225 | 1231 |
| 1226 void StartupSerializer::SerializeStrongReferences() { | 1232 void StartupSerializer::SerializeStrongReferences() { |
| 1227 Isolate* isolate = this->isolate(); | 1233 Isolate* isolate = this->isolate(); |
| 1228 // No active threads. | 1234 // No active threads. |
| 1229 CHECK_NULL(isolate->thread_manager()->FirstThreadStateInUse()); | 1235 CHECK_NULL(isolate->thread_manager()->FirstThreadStateInUse()); |
| 1230 // No active or weak handles. | 1236 // No active or weak handles. |
| 1231 CHECK(isolate->handle_scope_implementer()->blocks()->is_empty()); | 1237 CHECK(isolate->handle_scope_implementer()->blocks()->is_empty()); |
| (...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2518 DisallowHeapAllocation no_gc; | 2524 DisallowHeapAllocation no_gc; |
| 2519 SerializedCodeData* scd = new SerializedCodeData(cached_data); | 2525 SerializedCodeData* scd = new SerializedCodeData(cached_data); |
| 2520 SanityCheckResult r = scd->SanityCheck(isolate, source); | 2526 SanityCheckResult r = scd->SanityCheck(isolate, source); |
| 2521 if (r == CHECK_SUCCESS) return scd; | 2527 if (r == CHECK_SUCCESS) return scd; |
| 2522 cached_data->Reject(); | 2528 cached_data->Reject(); |
| 2523 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); | 2529 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); |
| 2524 delete scd; | 2530 delete scd; |
| 2525 return NULL; | 2531 return NULL; |
| 2526 } | 2532 } |
| 2527 } } // namespace v8::internal | 2533 } } // namespace v8::internal |
| OLD | NEW |