OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2318 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions); | 2318 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions); |
2319 if (!maybe_obj->ToObject(&obj)) return false; | 2319 if (!maybe_obj->ToObject(&obj)) return false; |
2320 } | 2320 } |
2321 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this, | 2321 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this, |
2322 obj); | 2322 obj); |
2323 if (!maybe_obj->ToObject(&obj)) return false; | 2323 if (!maybe_obj->ToObject(&obj)) return false; |
2324 } | 2324 } |
2325 set_intrinsic_function_names(StringDictionary::cast(obj)); | 2325 set_intrinsic_function_names(StringDictionary::cast(obj)); |
2326 | 2326 |
2327 if (InitializeNumberStringCache()->IsFailure()) return false; | 2327 if (InitializeNumberStringCache()->IsFailure()) return false; |
2328 if (InitializeStringLocks()->IsFailure()) return false; | |
2328 | 2329 |
2329 // Allocate cache for single character ASCII strings. | 2330 // Allocate cache for single character ASCII strings. |
2330 { MaybeObject* maybe_obj = | 2331 { MaybeObject* maybe_obj = |
2331 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); | 2332 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); |
2332 if (!maybe_obj->ToObject(&obj)) return false; | 2333 if (!maybe_obj->ToObject(&obj)) return false; |
2333 } | 2334 } |
2334 set_single_character_string_cache(FixedArray::cast(obj)); | 2335 set_single_character_string_cache(FixedArray::cast(obj)); |
2335 | 2336 |
2336 // Allocate cache for string split. | 2337 // Allocate cache for string split. |
2337 { MaybeObject* maybe_obj = | 2338 { MaybeObject* maybe_obj = |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2524 } | 2525 } |
2525 | 2526 |
2526 Object* js_string; | 2527 Object* js_string; |
2527 MaybeObject* maybe_js_string = AllocateStringFromAscii(CStrVector(str)); | 2528 MaybeObject* maybe_js_string = AllocateStringFromAscii(CStrVector(str)); |
2528 if (maybe_js_string->ToObject(&js_string)) { | 2529 if (maybe_js_string->ToObject(&js_string)) { |
2529 SetNumberStringCache(number, String::cast(js_string)); | 2530 SetNumberStringCache(number, String::cast(js_string)); |
2530 } | 2531 } |
2531 return maybe_js_string; | 2532 return maybe_js_string; |
2532 } | 2533 } |
2533 | 2534 |
2534 | 2535 |
Rico
2011/09/23 07:06:52
Add a note about the layout of the fixed array, e.
Lasse Reichstein
2011/09/23 09:54:39
Done.
| |
2536 MaybeObject* Heap::LockString(String* string) { | |
2537 ASSERT(!string->IsConsString()); | |
2538 FixedArray* locks = string_locks(); | |
2539 ASSERT(locks->length() > 1); | |
2540 int length = locks->length(); | |
2541 int element_count = Smi::cast(locks->get(0))->value(); | |
2542 int element_index = element_count + 1; | |
2543 if (element_index >= length) { | |
2544 int new_length = length * 2; | |
2545 MaybeObject* allocation = AllocateFixedArray(new_length); | |
2546 if (allocation->IsFailure()) return allocation; | |
Rico
2011/09/23 07:06:52
Why not just use our standard way of doing this us
Lasse Reichstein
2011/09/23 09:54:39
I don't particularly like our "standard way" - the
| |
2547 FixedArray* new_locks = FixedArray::cast(allocation->ToObjectUnchecked()); | |
2548 for (int i = 1; i < length; i++) { | |
2549 new_locks->set(i, locks->get(i)); | |
2550 } | |
2551 set_string_locks(new_locks); | |
2552 locks = new_locks; | |
2553 } | |
2554 locks->set(element_index, string); | |
2555 locks->set(0, Smi::FromInt(element_index)); | |
2556 return string; | |
2557 } | |
2558 | |
2559 | |
2560 void Heap::UnlockString(String* string) { | |
2561 FixedArray* locks = string_locks(); | |
2562 ASSERT(locks->length() > 1); | |
2563 int element_count = Smi::cast(locks->get(0))->value(); | |
2564 ASSERT(element_count > 0); | |
2565 ASSERT(element_count < locks->length()); | |
2566 for (int i = 1; i <= element_count; i++) { | |
2567 String* element = String::cast(locks->get(i)); | |
2568 if (element == string) { | |
2569 if (i < element_count) { | |
2570 locks->set(i, locks->get(element_count)); | |
2571 } | |
2572 locks->set_undefined(element_count); | |
2573 locks->set(0, Smi::FromInt(element_count - 1)); | |
2574 return; | |
2575 } | |
2576 } | |
2577 // We should have found the string. It's an error to try to unlock | |
2578 // a string that hasn't been locked. | |
2579 UNREACHABLE(); | |
2580 } | |
2581 | |
2582 | |
2583 bool Heap::IsStringLocked(String* string) { | |
2584 if (string->IsConsString()) return false; | |
2585 FixedArray* locks = string_locks(); | |
2586 ASSERT(locks->length() > 1); | |
2587 int element_count = Smi::cast(locks->get(0))->value(); | |
2588 for (int i = 1; i <= element_count; i++) { | |
2589 if (locks->get(i) == string) return true; | |
2590 } | |
2591 return false; | |
2592 } | |
2593 | |
2594 | |
2595 MaybeObject* Heap::InitializeStringLocks() { | |
2596 const int kInitialSize = 6; | |
2597 MaybeObject* allocation = AllocateFixedArray(kInitialSize); | |
2598 if (allocation->IsFailure()) return allocation; | |
2599 FixedArray* new_array = FixedArray::cast(allocation->ToObjectUnchecked()); | |
2600 new_array->set(0, Smi::FromInt(0)); | |
2601 set_string_locks(new_array); | |
2602 return new_array; | |
2603 } | |
2604 | |
2605 | |
2535 Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) { | 2606 Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) { |
2536 return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); | 2607 return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); |
2537 } | 2608 } |
2538 | 2609 |
2539 | 2610 |
2540 Heap::RootListIndex Heap::RootIndexForExternalArrayType( | 2611 Heap::RootListIndex Heap::RootIndexForExternalArrayType( |
2541 ExternalArrayType array_type) { | 2612 ExternalArrayType array_type) { |
2542 switch (array_type) { | 2613 switch (array_type) { |
2543 case kExternalByteArray: | 2614 case kExternalByteArray: |
2544 return kExternalByteArrayMapRootIndex; | 2615 return kExternalByteArrayMapRootIndex; |
(...skipping 3802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6347 } | 6418 } |
6348 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); | 6419 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); |
6349 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { | 6420 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { |
6350 next = chunk->next_chunk(); | 6421 next = chunk->next_chunk(); |
6351 isolate_->memory_allocator()->Free(chunk); | 6422 isolate_->memory_allocator()->Free(chunk); |
6352 } | 6423 } |
6353 chunks_queued_for_free_ = NULL; | 6424 chunks_queued_for_free_ = NULL; |
6354 } | 6425 } |
6355 | 6426 |
6356 } } // namespace v8::internal | 6427 } } // namespace v8::internal |
OLD | NEW |