| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 10105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10116 UpdateNormalTypeCache(code_cache, name, code); | 10116 UpdateNormalTypeCache(code_cache, name, code); |
| 10117 } else { | 10117 } else { |
| 10118 DCHECK(code_cache->default_cache()->IsFixedArray()); | 10118 DCHECK(code_cache->default_cache()->IsFixedArray()); |
| 10119 UpdateDefaultCache(code_cache, name, code); | 10119 UpdateDefaultCache(code_cache, name, code); |
| 10120 } | 10120 } |
| 10121 } | 10121 } |
| 10122 | 10122 |
| 10123 | 10123 |
| 10124 void CodeCache::UpdateDefaultCache( | 10124 void CodeCache::UpdateDefaultCache( |
| 10125 Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code) { | 10125 Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code) { |
| 10126 Isolate* isolate = code_cache->GetIsolate(); |
| 10126 // When updating the default code cache we disregard the type encoded in the | 10127 // When updating the default code cache we disregard the type encoded in the |
| 10127 // flags. This allows call constant stubs to overwrite call field | 10128 // flags. This allows call constant stubs to overwrite call field |
| 10128 // stubs, etc. | 10129 // stubs, etc. |
| 10129 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); | 10130 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); |
| 10130 | 10131 |
| 10131 // First check whether we can update existing code cache without | 10132 // First check whether we can update existing code cache without |
| 10132 // extending it. | 10133 // extending it. |
| 10133 Handle<FixedArray> cache = handle(code_cache->default_cache()); | 10134 Handle<FixedArray> cache = handle(code_cache->default_cache()); |
| 10134 int length = cache->length(); | 10135 int length = cache->length(); |
| 10135 { | 10136 { |
| 10136 DisallowHeapAllocation no_alloc; | 10137 DisallowHeapAllocation no_alloc; |
| 10137 int deleted_index = -1; | 10138 int deleted_index = -1; |
| 10139 Object* null = isolate->heap()->null_value(); |
| 10140 Object* undefined = isolate->heap()->undefined_value(); |
| 10141 DCHECK(name->IsUniqueName()); |
| 10138 for (int i = 0; i < length; i += kCodeCacheEntrySize) { | 10142 for (int i = 0; i < length; i += kCodeCacheEntrySize) { |
| 10139 Object* key = cache->get(i); | 10143 Object* key = cache->get(i); |
| 10140 if (key->IsNull()) { | 10144 if (key == null) { |
| 10141 if (deleted_index < 0) deleted_index = i; | 10145 if (deleted_index < 0) deleted_index = i; |
| 10142 continue; | 10146 continue; |
| 10143 } | 10147 } |
| 10144 if (key->IsUndefined()) { | 10148 if (key == undefined) { |
| 10145 if (deleted_index >= 0) i = deleted_index; | 10149 if (deleted_index >= 0) i = deleted_index; |
| 10146 cache->set(i + kCodeCacheEntryNameOffset, *name); | 10150 cache->set(i + kCodeCacheEntryNameOffset, *name); |
| 10147 cache->set(i + kCodeCacheEntryCodeOffset, *code); | 10151 cache->set(i + kCodeCacheEntryCodeOffset, *code); |
| 10148 return; | 10152 return; |
| 10149 } | 10153 } |
| 10150 if (name->Equals(Name::cast(key))) { | 10154 DCHECK(key->IsUniqueName()); |
| 10155 if (*name == key) { |
| 10151 Code::Flags found = | 10156 Code::Flags found = |
| 10152 Code::cast(cache->get(i + kCodeCacheEntryCodeOffset))->flags(); | 10157 Code::cast(cache->get(i + kCodeCacheEntryCodeOffset))->flags(); |
| 10153 if (Code::RemoveTypeFromFlags(found) == flags) { | 10158 if (Code::RemoveTypeFromFlags(found) == flags) { |
| 10154 cache->set(i + kCodeCacheEntryCodeOffset, *code); | 10159 cache->set(i + kCodeCacheEntryCodeOffset, *code); |
| 10155 return; | 10160 return; |
| 10156 } | 10161 } |
| 10157 } | 10162 } |
| 10158 } | 10163 } |
| 10159 | 10164 |
| 10160 // Reached the end of the code cache. If there were deleted | 10165 // Reached the end of the code cache. If there were deleted |
| 10161 // elements, reuse the space for the first of them. | 10166 // elements, reuse the space for the first of them. |
| 10162 if (deleted_index >= 0) { | 10167 if (deleted_index >= 0) { |
| 10163 cache->set(deleted_index + kCodeCacheEntryNameOffset, *name); | 10168 cache->set(deleted_index + kCodeCacheEntryNameOffset, *name); |
| 10164 cache->set(deleted_index + kCodeCacheEntryCodeOffset, *code); | 10169 cache->set(deleted_index + kCodeCacheEntryCodeOffset, *code); |
| 10165 return; | 10170 return; |
| 10166 } | 10171 } |
| 10167 } | 10172 } |
| 10168 | 10173 |
| 10169 // Extend the code cache with some new entries (at least one). Must be a | 10174 // Extend the code cache with some new entries (at least one). Must be a |
| 10170 // multiple of the entry size. | 10175 // multiple of the entry size. |
| 10171 Isolate* isolate = cache->GetIsolate(); | |
| 10172 int new_length = length + (length >> 1) + kCodeCacheEntrySize; | 10176 int new_length = length + (length >> 1) + kCodeCacheEntrySize; |
| 10173 new_length = new_length - new_length % kCodeCacheEntrySize; | 10177 new_length = new_length - new_length % kCodeCacheEntrySize; |
| 10174 DCHECK((new_length % kCodeCacheEntrySize) == 0); | 10178 DCHECK((new_length % kCodeCacheEntrySize) == 0); |
| 10175 cache = isolate->factory()->CopyFixedArrayAndGrow(cache, new_length - length); | 10179 cache = isolate->factory()->CopyFixedArrayAndGrow(cache, new_length - length); |
| 10176 | 10180 |
| 10177 // Add the (name, code) pair to the new cache. | 10181 // Add the (name, code) pair to the new cache. |
| 10178 cache->set(length + kCodeCacheEntryNameOffset, *name); | 10182 cache->set(length + kCodeCacheEntryNameOffset, *name); |
| 10179 cache->set(length + kCodeCacheEntryCodeOffset, *code); | 10183 cache->set(length + kCodeCacheEntryCodeOffset, *code); |
| 10180 code_cache->set_default_cache(*cache); | 10184 code_cache->set_default_cache(*cache); |
| 10181 } | 10185 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 10196 if (result->IsCode()) { | 10200 if (result->IsCode()) { |
| 10197 if (Code::cast(result)->flags() == flags) return result; | 10201 if (Code::cast(result)->flags() == flags) return result; |
| 10198 return GetHeap()->undefined_value(); | 10202 return GetHeap()->undefined_value(); |
| 10199 } | 10203 } |
| 10200 return LookupNormalTypeCache(name, flags); | 10204 return LookupNormalTypeCache(name, flags); |
| 10201 } | 10205 } |
| 10202 | 10206 |
| 10203 | 10207 |
| 10204 Object* CodeCache::LookupDefaultCache(Name* name, Code::Flags flags) { | 10208 Object* CodeCache::LookupDefaultCache(Name* name, Code::Flags flags) { |
| 10205 FixedArray* cache = default_cache(); | 10209 FixedArray* cache = default_cache(); |
| 10210 Heap* heap = GetHeap(); |
| 10211 Object* null = heap->null_value(); |
| 10212 Object* undefined = heap->undefined_value(); |
| 10206 int length = cache->length(); | 10213 int length = cache->length(); |
| 10214 DCHECK(name->IsUniqueName()); |
| 10207 for (int i = 0; i < length; i += kCodeCacheEntrySize) { | 10215 for (int i = 0; i < length; i += kCodeCacheEntrySize) { |
| 10208 Object* key = cache->get(i + kCodeCacheEntryNameOffset); | 10216 Object* key = cache->get(i + kCodeCacheEntryNameOffset); |
| 10209 // Skip deleted elements. | 10217 // Skip deleted elements. |
| 10210 if (key->IsNull()) continue; | 10218 if (key == null) continue; |
| 10211 if (key->IsUndefined()) return key; | 10219 if (key == undefined) return key; |
| 10212 if (name->Equals(Name::cast(key))) { | 10220 DCHECK(key->IsUniqueName()); |
| 10221 if (name == key) { |
| 10213 Code* code = Code::cast(cache->get(i + kCodeCacheEntryCodeOffset)); | 10222 Code* code = Code::cast(cache->get(i + kCodeCacheEntryCodeOffset)); |
| 10214 if (Code::RemoveTypeFromFlags(code->flags()) == flags) { | 10223 if (Code::RemoveTypeFromFlags(code->flags()) == flags) { |
| 10215 return code; | 10224 return code; |
| 10216 } | 10225 } |
| 10217 } | 10226 } |
| 10218 } | 10227 } |
| 10219 return GetHeap()->undefined_value(); | 10228 return GetHeap()->undefined_value(); |
| 10220 } | 10229 } |
| 10221 | 10230 |
| 10222 | 10231 |
| (...skipping 9537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19760 if (cell->value() != *new_value) { | 19769 if (cell->value() != *new_value) { |
| 19761 cell->set_value(*new_value); | 19770 cell->set_value(*new_value); |
| 19762 Isolate* isolate = cell->GetIsolate(); | 19771 Isolate* isolate = cell->GetIsolate(); |
| 19763 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19772 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19764 isolate, DependentCode::kPropertyCellChangedGroup); | 19773 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19765 } | 19774 } |
| 19766 } | 19775 } |
| 19767 | 19776 |
| 19768 } // namespace internal | 19777 } // namespace internal |
| 19769 } // namespace v8 | 19778 } // namespace v8 |
| OLD | NEW |