OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 return false; | 1038 return false; |
1039 } | 1039 } |
1040 | 1040 |
1041 | 1041 |
1042 MaybeObject* String::SlowTryFlatten(PretenureFlag pretenure) { | 1042 MaybeObject* String::SlowTryFlatten(PretenureFlag pretenure) { |
1043 #ifdef DEBUG | 1043 #ifdef DEBUG |
1044 // Do not attempt to flatten in debug mode when allocation is not | 1044 // Do not attempt to flatten in debug mode when allocation is not |
1045 // allowed. This is to avoid an assertion failure when allocating. | 1045 // allowed. This is to avoid an assertion failure when allocating. |
1046 // Flattening strings is the only case where we always allow | 1046 // Flattening strings is the only case where we always allow |
1047 // allocation because no GC is performed if the allocation fails. | 1047 // allocation because no GC is performed if the allocation fails. |
1048 if (!HEAP->IsAllocationAllowed()) return this; | 1048 if (!AllowHeapAllocation::IsAllowed()) return this; |
1049 #endif | 1049 #endif |
1050 | 1050 |
1051 Heap* heap = GetHeap(); | 1051 Heap* heap = GetHeap(); |
1052 switch (StringShape(this).representation_tag()) { | 1052 switch (StringShape(this).representation_tag()) { |
1053 case kConsStringTag: { | 1053 case kConsStringTag: { |
1054 ConsString* cs = ConsString::cast(this); | 1054 ConsString* cs = ConsString::cast(this); |
1055 if (cs->second()->length() == 0) { | 1055 if (cs->second()->length() == 0) { |
1056 return cs->first(); | 1056 return cs->first(); |
1057 } | 1057 } |
1058 // There's little point in putting the flat string in new space if the | 1058 // There's little point in putting the flat string in new space if the |
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2621 return maybe_map; | 2621 return maybe_map; |
2622 } | 2622 } |
2623 } | 2623 } |
2624 | 2624 |
2625 new_map->set_owns_descriptors(true); | 2625 new_map->set_owns_descriptors(true); |
2626 return new_map; | 2626 return new_map; |
2627 } | 2627 } |
2628 | 2628 |
2629 | 2629 |
2630 Map* Map::CurrentMapForDeprecated() { | 2630 Map* Map::CurrentMapForDeprecated() { |
2631 AssertNoAllocation no_allocation; | 2631 DisallowHeapAllocation no_allocation; |
2632 if (!is_deprecated()) return this; | 2632 if (!is_deprecated()) return this; |
2633 | 2633 |
2634 DescriptorArray* old_descriptors = instance_descriptors(); | 2634 DescriptorArray* old_descriptors = instance_descriptors(); |
2635 | 2635 |
2636 int descriptors = NumberOfOwnDescriptors(); | 2636 int descriptors = NumberOfOwnDescriptors(); |
2637 Map* root_map = FindRootMap(); | 2637 Map* root_map = FindRootMap(); |
2638 | 2638 |
2639 // Check the state of the root map. | 2639 // Check the state of the root map. |
2640 if (!EquivalentToForTransition(root_map)) return NULL; | 2640 if (!EquivalentToForTransition(root_map)) return NULL; |
2641 int verbatim = root_map->NumberOfOwnDescriptors(); | 2641 int verbatim = root_map->NumberOfOwnDescriptors(); |
(...skipping 2552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5194 if (!key->IsUndefined()) return true; | 5194 if (!key->IsUndefined()) return true; |
5195 } | 5195 } |
5196 return false; | 5196 return false; |
5197 } | 5197 } |
5198 | 5198 |
5199 | 5199 |
5200 // Check whether this object references another object. | 5200 // Check whether this object references another object. |
5201 bool JSObject::ReferencesObject(Object* obj) { | 5201 bool JSObject::ReferencesObject(Object* obj) { |
5202 Map* map_of_this = map(); | 5202 Map* map_of_this = map(); |
5203 Heap* heap = GetHeap(); | 5203 Heap* heap = GetHeap(); |
5204 AssertNoAllocation no_alloc; | 5204 DisallowHeapAllocation no_allocation; |
5205 | 5205 |
5206 // Is the object the constructor for this object? | 5206 // Is the object the constructor for this object? |
5207 if (map_of_this->constructor() == obj) { | 5207 if (map_of_this->constructor() == obj) { |
5208 return true; | 5208 return true; |
5209 } | 5209 } |
5210 | 5210 |
5211 // Is the object the prototype for this object? | 5211 // Is the object the prototype for this object? |
5212 if (map_of_this->prototype() == obj) { | 5212 if (map_of_this->prototype() == obj) { |
5213 return true; | 5213 return true; |
5214 } | 5214 } |
(...skipping 2323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7538 | 7538 |
7539 MaybeObject* FixedArray::CopySize(int new_length) { | 7539 MaybeObject* FixedArray::CopySize(int new_length) { |
7540 Heap* heap = GetHeap(); | 7540 Heap* heap = GetHeap(); |
7541 if (new_length == 0) return heap->empty_fixed_array(); | 7541 if (new_length == 0) return heap->empty_fixed_array(); |
7542 Object* obj; | 7542 Object* obj; |
7543 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); | 7543 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); |
7544 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 7544 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
7545 } | 7545 } |
7546 FixedArray* result = FixedArray::cast(obj); | 7546 FixedArray* result = FixedArray::cast(obj); |
7547 // Copy the content | 7547 // Copy the content |
7548 AssertNoAllocation no_gc; | 7548 DisallowHeapAllocation no_gc; |
7549 int len = length(); | 7549 int len = length(); |
7550 if (new_length < len) len = new_length; | 7550 if (new_length < len) len = new_length; |
7551 // We are taking the map from the old fixed array so the map is sure to | 7551 // We are taking the map from the old fixed array so the map is sure to |
7552 // be an immortal immutable object. | 7552 // be an immortal immutable object. |
7553 result->set_map_no_write_barrier(map()); | 7553 result->set_map_no_write_barrier(map()); |
7554 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | 7554 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
7555 for (int i = 0; i < len; i++) { | 7555 for (int i = 0; i < len; i++) { |
7556 result->set(i, get(i), mode); | 7556 result->set(i, get(i), mode); |
7557 } | 7557 } |
7558 return result; | 7558 return result; |
7559 } | 7559 } |
7560 | 7560 |
7561 | 7561 |
7562 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) { | 7562 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) { |
7563 AssertNoAllocation no_gc; | 7563 DisallowHeapAllocation no_gc; |
7564 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc); | 7564 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc); |
7565 for (int index = 0; index < len; index++) { | 7565 for (int index = 0; index < len; index++) { |
7566 dest->set(dest_pos+index, get(pos+index), mode); | 7566 dest->set(dest_pos+index, get(pos+index), mode); |
7567 } | 7567 } |
7568 } | 7568 } |
7569 | 7569 |
7570 | 7570 |
7571 #ifdef DEBUG | 7571 #ifdef DEBUG |
7572 bool FixedArray::IsEqualTo(FixedArray* other) { | 7572 bool FixedArray::IsEqualTo(FixedArray* other) { |
7573 if (length() != other->length()) return false; | 7573 if (length() != other->length()) return false; |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7837 #endif | 7837 #endif |
7838 | 7838 |
7839 | 7839 |
7840 bool String::LooksValid() { | 7840 bool String::LooksValid() { |
7841 if (!Isolate::Current()->heap()->Contains(this)) return false; | 7841 if (!Isolate::Current()->heap()->Contains(this)) return false; |
7842 return true; | 7842 return true; |
7843 } | 7843 } |
7844 | 7844 |
7845 | 7845 |
7846 String::FlatContent String::GetFlatContent() { | 7846 String::FlatContent String::GetFlatContent() { |
7847 ASSERT(!GetHeap()->allow_allocation(false)); | 7847 ASSERT(!AllowHeapAllocation::IsAllowed()); |
7848 int length = this->length(); | 7848 int length = this->length(); |
7849 StringShape shape(this); | 7849 StringShape shape(this); |
7850 String* string = this; | 7850 String* string = this; |
7851 int offset = 0; | 7851 int offset = 0; |
7852 if (shape.representation_tag() == kConsStringTag) { | 7852 if (shape.representation_tag() == kConsStringTag) { |
7853 ConsString* cons = ConsString::cast(string); | 7853 ConsString* cons = ConsString::cast(string); |
7854 if (cons->second()->length() != 0) { | 7854 if (cons->second()->length() != 0) { |
7855 return FlatContent(); | 7855 return FlatContent(); |
7856 } | 7856 } |
7857 string = cons->first(); | 7857 string = cons->first(); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8064 str_(0), | 8064 str_(0), |
8065 is_ascii_(true), | 8065 is_ascii_(true), |
8066 length_(input.length()), | 8066 length_(input.length()), |
8067 start_(input.start()) { } | 8067 start_(input.start()) { } |
8068 | 8068 |
8069 | 8069 |
8070 void FlatStringReader::PostGarbageCollection() { | 8070 void FlatStringReader::PostGarbageCollection() { |
8071 if (str_ == NULL) return; | 8071 if (str_ == NULL) return; |
8072 Handle<String> str(str_); | 8072 Handle<String> str(str_); |
8073 ASSERT(str->IsFlat()); | 8073 ASSERT(str->IsFlat()); |
8074 AssertNoAllocation no_gc; | 8074 DisallowHeapAllocation no_gc; |
8075 // This does not actually prevent the vector from being relocated later. | 8075 // This does not actually prevent the vector from being relocated later. |
8076 String::FlatContent content = str->GetFlatContent(); | 8076 String::FlatContent content = str->GetFlatContent(); |
8077 ASSERT(content.IsFlat()); | 8077 ASSERT(content.IsFlat()); |
8078 is_ascii_ = content.IsAscii(); | 8078 is_ascii_ = content.IsAscii(); |
8079 if (is_ascii_) { | 8079 if (is_ascii_) { |
8080 start_ = content.ToOneByteVector().start(); | 8080 start_ = content.ToOneByteVector().start(); |
8081 } else { | 8081 } else { |
8082 start_ = content.ToUC16Vector().start(); | 8082 start_ = content.ToUC16Vector().start(); |
8083 } | 8083 } |
8084 } | 8084 } |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8617 utf8_data += cursor; | 8617 utf8_data += cursor; |
8618 remaining_in_str -= cursor; | 8618 remaining_in_str -= cursor; |
8619 } | 8619 } |
8620 return (allow_prefix_match || i == slen) && remaining_in_str == 0; | 8620 return (allow_prefix_match || i == slen) && remaining_in_str == 0; |
8621 } | 8621 } |
8622 | 8622 |
8623 | 8623 |
8624 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) { | 8624 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) { |
8625 int slen = length(); | 8625 int slen = length(); |
8626 if (str.length() != slen) return false; | 8626 if (str.length() != slen) return false; |
8627 AssertNoAllocation no_gc; | 8627 DisallowHeapAllocation no_gc; |
8628 FlatContent content = GetFlatContent(); | 8628 FlatContent content = GetFlatContent(); |
8629 if (content.IsAscii()) { | 8629 if (content.IsAscii()) { |
8630 return CompareChars(content.ToOneByteVector().start(), | 8630 return CompareChars(content.ToOneByteVector().start(), |
8631 str.start(), slen) == 0; | 8631 str.start(), slen) == 0; |
8632 } | 8632 } |
8633 for (int i = 0; i < slen; i++) { | 8633 for (int i = 0; i < slen; i++) { |
8634 if (Get(i) != static_cast<uint16_t>(str[i])) return false; | 8634 if (Get(i) != static_cast<uint16_t>(str[i])) return false; |
8635 } | 8635 } |
8636 return true; | 8636 return true; |
8637 } | 8637 } |
8638 | 8638 |
8639 | 8639 |
8640 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { | 8640 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { |
8641 int slen = length(); | 8641 int slen = length(); |
8642 if (str.length() != slen) return false; | 8642 if (str.length() != slen) return false; |
8643 AssertNoAllocation no_gc; | 8643 DisallowHeapAllocation no_gc; |
8644 FlatContent content = GetFlatContent(); | 8644 FlatContent content = GetFlatContent(); |
8645 if (content.IsTwoByte()) { | 8645 if (content.IsTwoByte()) { |
8646 return CompareChars(content.ToUC16Vector().start(), str.start(), slen) == 0; | 8646 return CompareChars(content.ToUC16Vector().start(), str.start(), slen) == 0; |
8647 } | 8647 } |
8648 for (int i = 0; i < slen; i++) { | 8648 for (int i = 0; i < slen; i++) { |
8649 if (Get(i) != str[i]) return false; | 8649 if (Get(i) != str[i]) return false; |
8650 } | 8650 } |
8651 return true; | 8651 return true; |
8652 } | 8652 } |
8653 | 8653 |
(...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9764 if (length != recompiled_relocation->length()) return false; | 9764 if (length != recompiled_relocation->length()) return false; |
9765 int compare = memcmp(code_relocation->GetDataStartAddress(), | 9765 int compare = memcmp(code_relocation->GetDataStartAddress(), |
9766 recompiled_relocation->GetDataStartAddress(), | 9766 recompiled_relocation->GetDataStartAddress(), |
9767 length); | 9767 length); |
9768 return compare == 0; | 9768 return compare == 0; |
9769 } | 9769 } |
9770 | 9770 |
9771 | 9771 |
9772 void SharedFunctionInfo::EnableDeoptimizationSupport(Code* recompiled) { | 9772 void SharedFunctionInfo::EnableDeoptimizationSupport(Code* recompiled) { |
9773 ASSERT(!has_deoptimization_support()); | 9773 ASSERT(!has_deoptimization_support()); |
9774 AssertNoAllocation no_allocation; | 9774 DisallowHeapAllocation no_allocation; |
9775 Code* code = this->code(); | 9775 Code* code = this->code(); |
9776 if (IsCodeEquivalent(code, recompiled)) { | 9776 if (IsCodeEquivalent(code, recompiled)) { |
9777 // Copy the deoptimization data from the recompiled code. | 9777 // Copy the deoptimization data from the recompiled code. |
9778 code->set_deoptimization_data(recompiled->deoptimization_data()); | 9778 code->set_deoptimization_data(recompiled->deoptimization_data()); |
9779 code->set_has_deoptimization_support(true); | 9779 code->set_has_deoptimization_support(true); |
9780 } else { | 9780 } else { |
9781 // TODO(3025757): In case the recompiled isn't equivalent to the | 9781 // TODO(3025757): In case the recompiled isn't equivalent to the |
9782 // old code, we have to replace it. We should try to avoid this | 9782 // old code, we have to replace it. We should try to avoid this |
9783 // altogether because it flushes valuable type feedback by | 9783 // altogether because it flushes valuable type feedback by |
9784 // effectively resetting all IC state. | 9784 // effectively resetting all IC state. |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10081 | 10081 |
10082 // unbox handles and relocate | 10082 // unbox handles and relocate |
10083 intptr_t delta = instruction_start() - desc.buffer; | 10083 intptr_t delta = instruction_start() - desc.buffer; |
10084 int mode_mask = RelocInfo::kCodeTargetMask | | 10084 int mode_mask = RelocInfo::kCodeTargetMask | |
10085 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | | 10085 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | |
10086 RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | | 10086 RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | |
10087 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | | 10087 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | |
10088 RelocInfo::kApplyMask; | 10088 RelocInfo::kApplyMask; |
10089 // Needed to find target_object and runtime_entry on X64 | 10089 // Needed to find target_object and runtime_entry on X64 |
10090 Assembler* origin = desc.origin; | 10090 Assembler* origin = desc.origin; |
10091 ALLOW_HANDLE_DEREF(GetIsolate(), "embedding raw addresses into code"); | 10091 ALLOW_DEFERRED_HANDLE_DEREF(GetIsolate(), |
| 10092 "embedding raw addresses into code"); |
10092 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { | 10093 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { |
10093 RelocInfo::Mode mode = it.rinfo()->rmode(); | 10094 RelocInfo::Mode mode = it.rinfo()->rmode(); |
10094 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 10095 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
10095 Handle<Object> p = it.rinfo()->target_object_handle(origin); | 10096 Handle<Object> p = it.rinfo()->target_object_handle(origin); |
10096 it.rinfo()->set_target_object(*p, SKIP_WRITE_BARRIER); | 10097 it.rinfo()->set_target_object(*p, SKIP_WRITE_BARRIER); |
10097 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { | 10098 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { |
10098 Handle<JSGlobalPropertyCell> cell = it.rinfo()->target_cell_handle(); | 10099 Handle<JSGlobalPropertyCell> cell = it.rinfo()->target_cell_handle(); |
10099 it.rinfo()->set_target_cell(*cell, SKIP_WRITE_BARRIER); | 10100 it.rinfo()->set_target_cell(*cell, SKIP_WRITE_BARRIER); |
10100 } else if (RelocInfo::IsCodeTarget(mode)) { | 10101 } else if (RelocInfo::IsCodeTarget(mode)) { |
10101 // rewrite code handles in inline cache targets to direct | 10102 // rewrite code handles in inline cache targets to direct |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10172 | 10173 |
10173 | 10174 |
10174 SafepointEntry Code::GetSafepointEntry(Address pc) { | 10175 SafepointEntry Code::GetSafepointEntry(Address pc) { |
10175 SafepointTable table(this); | 10176 SafepointTable table(this); |
10176 return table.FindEntry(pc); | 10177 return table.FindEntry(pc); |
10177 } | 10178 } |
10178 | 10179 |
10179 | 10180 |
10180 Map* Code::FindFirstMap() { | 10181 Map* Code::FindFirstMap() { |
10181 ASSERT(is_inline_cache_stub()); | 10182 ASSERT(is_inline_cache_stub()); |
10182 AssertNoAllocation no_allocation; | 10183 DisallowHeapAllocation no_allocation; |
10183 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10184 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10184 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10185 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10185 RelocInfo* info = it.rinfo(); | 10186 RelocInfo* info = it.rinfo(); |
10186 Object* object = info->target_object(); | 10187 Object* object = info->target_object(); |
10187 if (object->IsMap()) return Map::cast(object); | 10188 if (object->IsMap()) return Map::cast(object); |
10188 } | 10189 } |
10189 return NULL; | 10190 return NULL; |
10190 } | 10191 } |
10191 | 10192 |
10192 | 10193 |
10193 void Code::ReplaceFirstMap(Map* replace_with) { | 10194 void Code::ReplaceFirstMap(Map* replace_with) { |
10194 ASSERT(is_inline_cache_stub()); | 10195 ASSERT(is_inline_cache_stub()); |
10195 AssertNoAllocation no_allocation; | 10196 DisallowHeapAllocation no_allocation; |
10196 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10197 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10197 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10198 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10198 RelocInfo* info = it.rinfo(); | 10199 RelocInfo* info = it.rinfo(); |
10199 Object* object = info->target_object(); | 10200 Object* object = info->target_object(); |
10200 if (object->IsMap()) { | 10201 if (object->IsMap()) { |
10201 info->set_target_object(replace_with); | 10202 info->set_target_object(replace_with); |
10202 return; | 10203 return; |
10203 } | 10204 } |
10204 } | 10205 } |
10205 UNREACHABLE(); | 10206 UNREACHABLE(); |
10206 } | 10207 } |
10207 | 10208 |
10208 | 10209 |
10209 void Code::FindAllMaps(MapHandleList* maps) { | 10210 void Code::FindAllMaps(MapHandleList* maps) { |
10210 ASSERT(is_inline_cache_stub()); | 10211 ASSERT(is_inline_cache_stub()); |
10211 AssertNoAllocation no_allocation; | 10212 DisallowHeapAllocation no_allocation; |
10212 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10213 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10213 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10214 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10214 RelocInfo* info = it.rinfo(); | 10215 RelocInfo* info = it.rinfo(); |
10215 Object* object = info->target_object(); | 10216 Object* object = info->target_object(); |
10216 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object))); | 10217 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object))); |
10217 } | 10218 } |
10218 } | 10219 } |
10219 | 10220 |
10220 | 10221 |
10221 Code* Code::FindFirstCode() { | 10222 Code* Code::FindFirstCode() { |
10222 ASSERT(is_inline_cache_stub()); | 10223 ASSERT(is_inline_cache_stub()); |
10223 AssertNoAllocation no_allocation; | 10224 DisallowHeapAllocation no_allocation; |
10224 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); | 10225 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); |
10225 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10226 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10226 RelocInfo* info = it.rinfo(); | 10227 RelocInfo* info = it.rinfo(); |
10227 return Code::GetCodeFromTargetAddress(info->target_address()); | 10228 return Code::GetCodeFromTargetAddress(info->target_address()); |
10228 } | 10229 } |
10229 return NULL; | 10230 return NULL; |
10230 } | 10231 } |
10231 | 10232 |
10232 | 10233 |
10233 void Code::FindAllCode(CodeHandleList* code_list, int length) { | 10234 void Code::FindAllCode(CodeHandleList* code_list, int length) { |
10234 ASSERT(is_inline_cache_stub()); | 10235 ASSERT(is_inline_cache_stub()); |
10235 AssertNoAllocation no_allocation; | 10236 DisallowHeapAllocation no_allocation; |
10236 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); | 10237 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); |
10237 int i = 0; | 10238 int i = 0; |
10238 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10239 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10239 if (i++ == length) return; | 10240 if (i++ == length) return; |
10240 RelocInfo* info = it.rinfo(); | 10241 RelocInfo* info = it.rinfo(); |
10241 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); | 10242 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); |
10242 ASSERT(code->kind() == Code::STUB); | 10243 ASSERT(code->kind() == Code::STUB); |
10243 code_list->Add(Handle<Code>(code)); | 10244 code_list->Add(Handle<Code>(code)); |
10244 } | 10245 } |
10245 UNREACHABLE(); | 10246 UNREACHABLE(); |
10246 } | 10247 } |
10247 | 10248 |
10248 | 10249 |
10249 Name* Code::FindFirstName() { | 10250 Name* Code::FindFirstName() { |
10250 ASSERT(is_inline_cache_stub()); | 10251 ASSERT(is_inline_cache_stub()); |
10251 AssertNoAllocation no_allocation; | 10252 DisallowHeapAllocation no_allocation; |
10252 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10253 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10253 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10254 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10254 RelocInfo* info = it.rinfo(); | 10255 RelocInfo* info = it.rinfo(); |
10255 Object* object = info->target_object(); | 10256 Object* object = info->target_object(); |
10256 if (object->IsName()) return Name::cast(object); | 10257 if (object->IsName()) return Name::cast(object); |
10257 } | 10258 } |
10258 return NULL; | 10259 return NULL; |
10259 } | 10260 } |
10260 | 10261 |
10261 | 10262 |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11128 public: | 11129 public: |
11129 virtual bool TakeFunction(JSFunction* function) { | 11130 virtual bool TakeFunction(JSFunction* function) { |
11130 return function->code()->marked_for_deoptimization(); | 11131 return function->code()->marked_for_deoptimization(); |
11131 } | 11132 } |
11132 }; | 11133 }; |
11133 | 11134 |
11134 | 11135 |
11135 void DependentCode::DeoptimizeDependentCodeGroup( | 11136 void DependentCode::DeoptimizeDependentCodeGroup( |
11136 Isolate* isolate, | 11137 Isolate* isolate, |
11137 DependentCode::DependencyGroup group) { | 11138 DependentCode::DependencyGroup group) { |
11138 AssertNoAllocation no_allocation_scope; | 11139 DisallowHeapAllocation no_allocation_scope; |
11139 DependentCode::GroupStartIndexes starts(this); | 11140 DependentCode::GroupStartIndexes starts(this); |
11140 int start = starts.at(group); | 11141 int start = starts.at(group); |
11141 int end = starts.at(group + 1); | 11142 int end = starts.at(group + 1); |
11142 int number_of_entries = starts.at(DependentCode::kGroupCount); | 11143 int number_of_entries = starts.at(DependentCode::kGroupCount); |
11143 if (start == end) return; | 11144 if (start == end) return; |
11144 for (int i = start; i < end; i++) { | 11145 for (int i = start; i < end; i++) { |
11145 Code* code = code_at(i); | 11146 Code* code = code_at(i); |
11146 code->set_marked_for_deoptimization(true); | 11147 code->set_marked_for_deoptimization(true); |
11147 } | 11148 } |
11148 // Compact the array by moving all subsequent groups to fill in the new holes. | 11149 // Compact the array by moving all subsequent groups to fill in the new holes. |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12547 } | 12548 } |
12548 } | 12549 } |
12549 } | 12550 } |
12550 #endif | 12551 #endif |
12551 | 12552 |
12552 | 12553 |
12553 template<typename Shape, typename Key> | 12554 template<typename Shape, typename Key> |
12554 void Dictionary<Shape, Key>::CopyValuesTo(FixedArray* elements) { | 12555 void Dictionary<Shape, Key>::CopyValuesTo(FixedArray* elements) { |
12555 int pos = 0; | 12556 int pos = 0; |
12556 int capacity = HashTable<Shape, Key>::Capacity(); | 12557 int capacity = HashTable<Shape, Key>::Capacity(); |
12557 AssertNoAllocation no_gc; | 12558 DisallowHeapAllocation no_gc; |
12558 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); | 12559 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); |
12559 for (int i = 0; i < capacity; i++) { | 12560 for (int i = 0; i < capacity; i++) { |
12560 Object* k = Dictionary<Shape, Key>::KeyAt(i); | 12561 Object* k = Dictionary<Shape, Key>::KeyAt(i); |
12561 if (Dictionary<Shape, Key>::IsKey(k)) { | 12562 if (Dictionary<Shape, Key>::IsKey(k)) { |
12562 elements->set(pos++, ValueAt(i), mode); | 12563 elements->set(pos++, ValueAt(i), mode); |
12563 } | 12564 } |
12564 } | 12565 } |
12565 ASSERT(pos == elements->length()); | 12566 ASSERT(pos == elements->length()); |
12566 } | 12567 } |
12567 | 12568 |
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13428 entry = NextProbe(entry, count++, capacity); | 13429 entry = NextProbe(entry, count++, capacity); |
13429 } | 13430 } |
13430 return kNotFound; | 13431 return kNotFound; |
13431 } | 13432 } |
13432 | 13433 |
13433 | 13434 |
13434 template<typename Shape, typename Key> | 13435 template<typename Shape, typename Key> |
13435 MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { | 13436 MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { |
13436 ASSERT(NumberOfElements() < new_table->Capacity()); | 13437 ASSERT(NumberOfElements() < new_table->Capacity()); |
13437 | 13438 |
13438 AssertNoAllocation no_gc; | 13439 DisallowHeapAllocation no_gc; |
13439 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc); | 13440 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc); |
13440 | 13441 |
13441 // Copy prefix to new array. | 13442 // Copy prefix to new array. |
13442 for (int i = kPrefixStartIndex; | 13443 for (int i = kPrefixStartIndex; |
13443 i < kPrefixStartIndex + Shape::kPrefixSize; | 13444 i < kPrefixStartIndex + Shape::kPrefixSize; |
13444 i++) { | 13445 i++) { |
13445 new_table->set(i, get(i), mode); | 13446 new_table->set(i, get(i), mode); |
13446 } | 13447 } |
13447 | 13448 |
13448 // Rehash the elements. | 13449 // Rehash the elements. |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13671 result_double = HeapNumber::cast(new_double); | 13672 result_double = HeapNumber::cast(new_double); |
13672 } | 13673 } |
13673 | 13674 |
13674 Object* obj; | 13675 Object* obj; |
13675 { MaybeObject* maybe_obj = | 13676 { MaybeObject* maybe_obj = |
13676 SeededNumberDictionary::Allocate(GetHeap(), dict->NumberOfElements()); | 13677 SeededNumberDictionary::Allocate(GetHeap(), dict->NumberOfElements()); |
13677 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 13678 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
13678 } | 13679 } |
13679 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj); | 13680 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj); |
13680 | 13681 |
13681 AssertNoAllocation no_alloc; | 13682 DisallowHeapAllocation no_alloc; |
13682 | 13683 |
13683 uint32_t pos = 0; | 13684 uint32_t pos = 0; |
13684 uint32_t undefs = 0; | 13685 uint32_t undefs = 0; |
13685 int capacity = dict->Capacity(); | 13686 int capacity = dict->Capacity(); |
13686 for (int i = 0; i < capacity; i++) { | 13687 for (int i = 0; i < capacity; i++) { |
13687 Object* k = dict->KeyAt(i); | 13688 Object* k = dict->KeyAt(i); |
13688 if (dict->IsKey(k)) { | 13689 if (dict->IsKey(k)) { |
13689 ASSERT(k->IsNumber()); | 13690 ASSERT(k->IsNumber()); |
13690 ASSERT(!k->IsSmi() || Smi::cast(k)->value() >= 0); | 13691 ASSERT(!k->IsSmi() || Smi::cast(k)->value() >= 0); |
13691 ASSERT(!k->IsHeapNumber() || HeapNumber::cast(k)->value() >= 0); | 13692 ASSERT(!k->IsHeapNumber() || HeapNumber::cast(k)->value() >= 0); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13843 } | 13844 } |
13844 } | 13845 } |
13845 } | 13846 } |
13846 result = holes; | 13847 result = holes; |
13847 while (holes < limit) { | 13848 while (holes < limit) { |
13848 elements->set_the_hole(holes); | 13849 elements->set_the_hole(holes); |
13849 holes++; | 13850 holes++; |
13850 } | 13851 } |
13851 } else { | 13852 } else { |
13852 FixedArray* elements = FixedArray::cast(elements_base); | 13853 FixedArray* elements = FixedArray::cast(elements_base); |
13853 AssertNoAllocation no_alloc; | 13854 DisallowHeapAllocation no_gc; |
13854 | 13855 |
13855 // Split elements into defined, undefined and the_hole, in that order. Only | 13856 // Split elements into defined, undefined and the_hole, in that order. Only |
13856 // count locations for undefined and the hole, and fill them afterwards. | 13857 // count locations for undefined and the hole, and fill them afterwards. |
13857 WriteBarrierMode write_barrier = elements->GetWriteBarrierMode(no_alloc); | 13858 WriteBarrierMode write_barrier = elements->GetWriteBarrierMode(no_gc); |
13858 unsigned int undefs = limit; | 13859 unsigned int undefs = limit; |
13859 unsigned int holes = limit; | 13860 unsigned int holes = limit; |
13860 // Assume most arrays contain no holes and undefined values, so minimize the | 13861 // Assume most arrays contain no holes and undefined values, so minimize the |
13861 // number of stores of non-undefined, non-the-hole values. | 13862 // number of stores of non-undefined, non-the-hole values. |
13862 for (unsigned int i = 0; i < undefs; i++) { | 13863 for (unsigned int i = 0; i < undefs; i++) { |
13863 Object* current = elements->get(i); | 13864 Object* current = elements->get(i); |
13864 if (current->IsTheHole()) { | 13865 if (current->IsTheHole()) { |
13865 holes--; | 13866 holes--; |
13866 undefs--; | 13867 undefs--; |
13867 } else if (current->IsUndefined()) { | 13868 } else if (current->IsUndefined()) { |
(...skipping 1367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15235 int previous_length = | 15236 int previous_length = |
15236 previous.is_null() ? 0 : previous->serialized_data()->length(); | 15237 previous.is_null() ? 0 : previous->serialized_data()->length(); |
15237 int length = sizeof(descriptor) + previous_length; | 15238 int length = sizeof(descriptor) + previous_length; |
15238 Handle<ByteArray> serialized_descriptor = | 15239 Handle<ByteArray> serialized_descriptor = |
15239 isolate->factory()->NewByteArray(length); | 15240 isolate->factory()->NewByteArray(length); |
15240 Handle<DeclaredAccessorDescriptor> value = | 15241 Handle<DeclaredAccessorDescriptor> value = |
15241 isolate->factory()->NewDeclaredAccessorDescriptor(); | 15242 isolate->factory()->NewDeclaredAccessorDescriptor(); |
15242 value->set_serialized_data(*serialized_descriptor); | 15243 value->set_serialized_data(*serialized_descriptor); |
15243 // Copy in the data. | 15244 // Copy in the data. |
15244 { | 15245 { |
15245 AssertNoAllocation no_allocation; | 15246 DisallowHeapAllocation no_allocation; |
15246 uint8_t* array = serialized_descriptor->GetDataStartAddress(); | 15247 uint8_t* array = serialized_descriptor->GetDataStartAddress(); |
15247 if (previous_length != 0) { | 15248 if (previous_length != 0) { |
15248 uint8_t* previous_array = | 15249 uint8_t* previous_array = |
15249 previous->serialized_data()->GetDataStartAddress(); | 15250 previous->serialized_data()->GetDataStartAddress(); |
15250 OS::MemCopy(array, previous_array, previous_length); | 15251 OS::MemCopy(array, previous_array, previous_length); |
15251 array += previous_length; | 15252 array += previous_length; |
15252 } | 15253 } |
15253 ASSERT(reinterpret_cast<uintptr_t>(array) % sizeof(uintptr_t) == 0); | 15254 ASSERT(reinterpret_cast<uintptr_t>(array) % sizeof(uintptr_t) == 0); |
15254 DeclaredAccessorDescriptorData* data = | 15255 DeclaredAccessorDescriptorData* data = |
15255 reinterpret_cast<DeclaredAccessorDescriptorData*>(array); | 15256 reinterpret_cast<DeclaredAccessorDescriptorData*>(array); |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15637 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 15638 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
15638 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 15639 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
15639 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 15640 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
15640 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 15641 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
15641 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 15642 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
15642 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 15643 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
15643 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 15644 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
15644 } | 15645 } |
15645 | 15646 |
15646 } } // namespace v8::internal | 15647 } } // namespace v8::internal |
OLD | NEW |