Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: src/heap.cc

Issue 8143018: Revert "Added ability to lock strings to prevent their representation or encoding from changing." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/heap.h ('k') | src/json-parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2322 matching lines...) Expand 10 before | Expand all | Expand 10 after
2333 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions); 2333 { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions);
2334 if (!maybe_obj->ToObject(&obj)) return false; 2334 if (!maybe_obj->ToObject(&obj)) return false;
2335 } 2335 }
2336 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this, 2336 { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this,
2337 obj); 2337 obj);
2338 if (!maybe_obj->ToObject(&obj)) return false; 2338 if (!maybe_obj->ToObject(&obj)) return false;
2339 } 2339 }
2340 set_intrinsic_function_names(StringDictionary::cast(obj)); 2340 set_intrinsic_function_names(StringDictionary::cast(obj));
2341 2341
2342 if (InitializeNumberStringCache()->IsFailure()) return false; 2342 if (InitializeNumberStringCache()->IsFailure()) return false;
2343 if (InitializeStringLocks()->IsFailure()) return false;
2344 2343
2345 // Allocate cache for single character ASCII strings. 2344 // Allocate cache for single character ASCII strings.
2346 { MaybeObject* maybe_obj = 2345 { MaybeObject* maybe_obj =
2347 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); 2346 AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED);
2348 if (!maybe_obj->ToObject(&obj)) return false; 2347 if (!maybe_obj->ToObject(&obj)) return false;
2349 } 2348 }
2350 set_single_character_string_cache(FixedArray::cast(obj)); 2349 set_single_character_string_cache(FixedArray::cast(obj));
2351 2350
2352 // Allocate cache for string split. 2351 // Allocate cache for string split.
2353 { MaybeObject* maybe_obj = 2352 { MaybeObject* maybe_obj =
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 2549
2551 MaybeObject* Heap::Uint32ToString(uint32_t value, 2550 MaybeObject* Heap::Uint32ToString(uint32_t value,
2552 bool check_number_string_cache) { 2551 bool check_number_string_cache) {
2553 Object* number; 2552 Object* number;
2554 MaybeObject* maybe = NumberFromUint32(value); 2553 MaybeObject* maybe = NumberFromUint32(value);
2555 if (!maybe->To<Object>(&number)) return maybe; 2554 if (!maybe->To<Object>(&number)) return maybe;
2556 return NumberToString(number, check_number_string_cache); 2555 return NumberToString(number, check_number_string_cache);
2557 } 2556 }
2558 2557
2559 2558
2560 MaybeObject* Heap::LockString(String* string) {
2561 ASSERT(!string->IsConsString());
2562 FixedArray* locks = string_locks();
2563 ASSERT(locks->length() > 1);
2564 int length = locks->length();
2565 int element_count = Smi::cast(locks->get(0))->value();
2566 int element_index = element_count + 1;
2567 if (element_index >= length) {
2568 int new_length = length * 2;
2569 MaybeObject* allocation = AllocateFixedArray(new_length);
2570 FixedArray* new_locks = NULL; // Initialized to please compiler.
2571 if (!allocation->To<FixedArray>(&new_locks)) return allocation;
2572 for (int i = 1; i < length; i++) {
2573 new_locks->set(i, locks->get(i));
2574 }
2575 set_string_locks(new_locks);
2576 locks = new_locks;
2577 }
2578 locks->set(element_index, string);
2579 locks->set(0, Smi::FromInt(element_index));
2580 return string;
2581 }
2582
2583
2584 void Heap::UnlockString(String* string) {
2585 FixedArray* locks = string_locks();
2586 ASSERT(locks->length() > 1);
2587 int element_count = Smi::cast(locks->get(0))->value();
2588 ASSERT(element_count > 0);
2589 ASSERT(element_count < locks->length());
2590 for (int i = 1; i <= element_count; i++) {
2591 String* element = String::cast(locks->get(i));
2592 if (element == string) {
2593 if (i < element_count) {
2594 locks->set(i, locks->get(element_count));
2595 }
2596 locks->set_undefined(element_count);
2597 locks->set(0, Smi::FromInt(element_count - 1));
2598 return;
2599 }
2600 }
2601 // We should have found the string. It's an error to try to unlock
2602 // a string that hasn't been locked.
2603 UNREACHABLE();
2604 }
2605
2606
2607 bool Heap::IsStringLocked(String* string) {
2608 if (string->IsConsString()) return false;
2609 FixedArray* locks = string_locks();
2610 ASSERT(locks->length() > 1);
2611 int element_count = Smi::cast(locks->get(0))->value();
2612 for (int i = 1; i <= element_count; i++) {
2613 if (locks->get(i) == string) return true;
2614 }
2615 return false;
2616 }
2617
2618
2619 MaybeObject* Heap::InitializeStringLocks() {
2620 const int kInitialSize = 6;
2621 MaybeObject* allocation = AllocateFixedArray(kInitialSize);
2622 if (allocation->IsFailure()) return allocation;
2623 FixedArray* new_array = FixedArray::cast(allocation->ToObjectUnchecked());
2624 new_array->set(0, Smi::FromInt(0));
2625 set_string_locks(new_array);
2626 return new_array;
2627 }
2628
2629
2630 Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) { 2559 Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) {
2631 return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); 2560 return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]);
2632 } 2561 }
2633 2562
2634 2563
2635 Heap::RootListIndex Heap::RootIndexForExternalArrayType( 2564 Heap::RootListIndex Heap::RootIndexForExternalArrayType(
2636 ExternalArrayType array_type) { 2565 ExternalArrayType array_type) {
2637 switch (array_type) { 2566 switch (array_type) {
2638 case kExternalByteArray: 2567 case kExternalByteArray:
2639 return kExternalByteArrayMapRootIndex; 2568 return kExternalByteArrayMapRootIndex;
(...skipping 3830 matching lines...) Expand 10 before | Expand all | Expand 10 after
6470 isolate_->heap()->store_buffer()->Compact(); 6399 isolate_->heap()->store_buffer()->Compact();
6471 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); 6400 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED);
6472 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 6401 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) {
6473 next = chunk->next_chunk(); 6402 next = chunk->next_chunk();
6474 isolate_->memory_allocator()->Free(chunk); 6403 isolate_->memory_allocator()->Free(chunk);
6475 } 6404 }
6476 chunks_queued_for_free_ = NULL; 6405 chunks_queued_for_free_ = NULL;
6477 } 6406 }
6478 6407
6479 } } // namespace v8::internal 6408 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.h ('k') | src/json-parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698