| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 6941)
|
| +++ src/heap.cc (working copy)
|
| @@ -1997,6 +1997,13 @@
|
| }
|
| set_the_hole_value(obj);
|
|
|
| + { MaybeObject* maybe_obj = CreateOddball("arguments_marker",
|
| + Smi::FromInt(-4),
|
| + Oddball::kArgumentMarker);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_arguments_marker(obj);
|
| +
|
| { MaybeObject* maybe_obj = CreateOddball("no_interceptor_result_sentinel",
|
| Smi::FromInt(-2),
|
| Oddball::kOther);
|
| @@ -2540,20 +2547,10 @@
|
| }
|
|
|
| // For small strings we check whether the resource contains only
|
| - // ascii characters. If yes, we use a different string map.
|
| - bool is_ascii = true;
|
| - if (length >= static_cast<size_t>(String::kMinNonFlatLength)) {
|
| - is_ascii = false;
|
| - } else {
|
| - const uc16* data = resource->data();
|
| - for (size_t i = 0; i < length; i++) {
|
| - if (data[i] > String::kMaxAsciiCharCode) {
|
| - is_ascii = false;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| + // ASCII characters. If yes, we use a different string map.
|
| + static const size_t kAsciiCheckLengthLimit = 32;
|
| + bool is_ascii = length <= kAsciiCheckLengthLimit &&
|
| + String::IsAscii(resource->data(), static_cast<int>(length));
|
| Map* map = is_ascii ?
|
| external_string_with_ascii_data_map() : external_string_map();
|
| Object* result;
|
| @@ -2720,6 +2717,9 @@
|
| code->set_instruction_size(desc.instr_size);
|
| code->set_relocation_info(ByteArray::cast(reloc_info));
|
| code->set_flags(flags);
|
| + if (code->is_call_stub() || code->is_keyed_call_stub()) {
|
| + code->set_check_type(RECEIVER_MAP_CHECK);
|
| + }
|
| code->set_deoptimization_data(empty_fixed_array());
|
| // Allow self references to created code object by patching the handle to
|
| // point to the newly allocated Code object.
|
| @@ -3335,11 +3335,8 @@
|
| MaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string,
|
| PretenureFlag pretenure) {
|
| // Check if the string is an ASCII string.
|
| - int i = 0;
|
| - while (i < string.length() && string[i] <= String::kMaxAsciiCharCode) i++;
|
| -
|
| MaybeObject* maybe_result;
|
| - if (i == string.length()) { // It's an ASCII string.
|
| + if (String::IsAscii(string.start(), string.length())) {
|
| maybe_result = AllocateRawAsciiString(string.length(), pretenure);
|
| } else { // It's not an ASCII string.
|
| maybe_result = AllocateRawTwoByteString(string.length(), pretenure);
|
| @@ -4042,6 +4039,36 @@
|
| }
|
|
|
|
|
| +MaybeObject* Heap::LookupAsciiSymbol(Vector<const char> string) {
|
| + Object* symbol = NULL;
|
| + Object* new_table;
|
| + { MaybeObject* maybe_new_table =
|
| + symbol_table()->LookupAsciiSymbol(string, &symbol);
|
| + if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| + }
|
| + // Can't use set_symbol_table because SymbolTable::cast knows that
|
| + // SymbolTable is a singleton and checks for identity.
|
| + roots_[kSymbolTableRootIndex] = new_table;
|
| + ASSERT(symbol != NULL);
|
| + return symbol;
|
| +}
|
| +
|
| +
|
| +MaybeObject* Heap::LookupTwoByteSymbol(Vector<const uc16> string) {
|
| + Object* symbol = NULL;
|
| + Object* new_table;
|
| + { MaybeObject* maybe_new_table =
|
| + symbol_table()->LookupTwoByteSymbol(string, &symbol);
|
| + if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| + }
|
| + // Can't use set_symbol_table because SymbolTable::cast knows that
|
| + // SymbolTable is a singleton and checks for identity.
|
| + roots_[kSymbolTableRootIndex] = new_table;
|
| + ASSERT(symbol != NULL);
|
| + return symbol;
|
| +}
|
| +
|
| +
|
| MaybeObject* Heap::LookupSymbol(String* string) {
|
| if (string->IsSymbol()) return string;
|
| Object* symbol = NULL;
|
| @@ -5220,7 +5247,7 @@
|
| obj->SetMark();
|
| }
|
| UnmarkingVisitor visitor;
|
| - HEAP->IterateRoots(&visitor, VISIT_ONLY_STRONG);
|
| + HEAP->IterateRoots(&visitor, VISIT_ALL);
|
| while (visitor.can_process())
|
| visitor.ProcessNext();
|
| }
|
|
|