| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/ic/ic.h" | 7 #include "src/ic/ic.h" |
| 8 #include "src/ic/ic-state.h" | 8 #include "src/ic/ic-state.h" |
| 9 #include "src/objects.h" | 9 #include "src/objects.h" |
| 10 #include "src/type-feedback-vector-inl.h" | 10 #include "src/type-feedback-vector-inl.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 if (!feedback->IsFixedArray() || | 200 if (!feedback->IsFixedArray() || |
| 201 FixedArray::cast(*feedback)->length() != length) { | 201 FixedArray::cast(*feedback)->length() != length) { |
| 202 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); | 202 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); |
| 203 SetFeedback(*array); | 203 SetFeedback(*array); |
| 204 return array; | 204 return array; |
| 205 } | 205 } |
| 206 return Handle<FixedArray>::cast(feedback); | 206 return Handle<FixedArray>::cast(feedback); |
| 207 } | 207 } |
| 208 | 208 |
| 209 | 209 |
| 210 void FeedbackNexus::InstallHandlers(int start_index, TypeHandleList* types, | 210 void FeedbackNexus::InstallHandlers(int start_index, MapHandleList* maps, |
| 211 CodeHandleList* handlers) { | 211 CodeHandleList* handlers) { |
| 212 Isolate* isolate = GetIsolate(); | 212 Isolate* isolate = GetIsolate(); |
| 213 Handle<FixedArray> array = handle(FixedArray::cast(GetFeedback()), isolate); | 213 Handle<FixedArray> array = handle(FixedArray::cast(GetFeedback()), isolate); |
| 214 int receiver_count = types->length(); | 214 int receiver_count = maps->length(); |
| 215 for (int current = 0; current < receiver_count; ++current) { | 215 for (int current = 0; current < receiver_count; ++current) { |
| 216 Handle<HeapType> type = types->at(current); | 216 Handle<Map> map = maps->at(current); |
| 217 Handle<Map> map = IC::TypeToMap(*type, isolate); | |
| 218 Handle<WeakCell> cell = Map::WeakCellForMap(map); | 217 Handle<WeakCell> cell = Map::WeakCellForMap(map); |
| 219 array->set(start_index + (current * 2), *cell); | 218 array->set(start_index + (current * 2), *cell); |
| 220 array->set(start_index + (current * 2 + 1), *handlers->at(current)); | 219 array->set(start_index + (current * 2 + 1), *handlers->at(current)); |
| 221 } | 220 } |
| 222 } | 221 } |
| 223 | 222 |
| 224 | 223 |
| 225 InlineCacheState LoadICNexus::StateFromFeedback() const { | 224 InlineCacheState LoadICNexus::StateFromFeedback() const { |
| 226 Isolate* isolate = GetIsolate(); | 225 Isolate* isolate = GetIsolate(); |
| 227 Object* feedback = GetFeedback(); | 226 Object* feedback = GetFeedback(); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 SKIP_WRITE_BARRIER); | 325 SKIP_WRITE_BARRIER); |
| 327 } | 326 } |
| 328 | 327 |
| 329 | 328 |
| 330 void KeyedLoadICNexus::ConfigurePremonomorphic() { | 329 void KeyedLoadICNexus::ConfigurePremonomorphic() { |
| 331 SetFeedback(*vector()->PremonomorphicSentinel(GetIsolate()), | 330 SetFeedback(*vector()->PremonomorphicSentinel(GetIsolate()), |
| 332 SKIP_WRITE_BARRIER); | 331 SKIP_WRITE_BARRIER); |
| 333 } | 332 } |
| 334 | 333 |
| 335 | 334 |
| 336 void LoadICNexus::ConfigureMonomorphic(Handle<HeapType> type, | 335 void LoadICNexus::ConfigureMonomorphic(Handle<Map> receiver_map, |
| 337 Handle<Code> handler) { | 336 Handle<Code> handler) { |
| 338 Handle<FixedArray> array = EnsureArrayOfSize(2); | 337 Handle<FixedArray> array = EnsureArrayOfSize(2); |
| 339 Handle<Map> receiver_map = IC::TypeToMap(*type, GetIsolate()); | |
| 340 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | 338 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
| 341 array->set(0, *cell); | 339 array->set(0, *cell); |
| 342 array->set(1, *handler); | 340 array->set(1, *handler); |
| 343 } | 341 } |
| 344 | 342 |
| 345 | 343 |
| 346 void KeyedLoadICNexus::ConfigureMonomorphic(Handle<Name> name, | 344 void KeyedLoadICNexus::ConfigureMonomorphic(Handle<Name> name, |
| 347 Handle<HeapType> type, | 345 Handle<Map> receiver_map, |
| 348 Handle<Code> handler) { | 346 Handle<Code> handler) { |
| 349 Handle<FixedArray> array = EnsureArrayOfSize(3); | 347 Handle<FixedArray> array = EnsureArrayOfSize(3); |
| 350 Handle<Map> receiver_map = IC::TypeToMap(*type, GetIsolate()); | |
| 351 if (name.is_null()) { | 348 if (name.is_null()) { |
| 352 array->set(0, Smi::FromInt(0)); | 349 array->set(0, Smi::FromInt(0)); |
| 353 } else { | 350 } else { |
| 354 array->set(0, *name); | 351 array->set(0, *name); |
| 355 } | 352 } |
| 356 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | 353 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
| 357 array->set(1, *cell); | 354 array->set(1, *cell); |
| 358 array->set(2, *handler); | 355 array->set(2, *handler); |
| 359 } | 356 } |
| 360 | 357 |
| 361 | 358 |
| 362 void LoadICNexus::ConfigurePolymorphic(TypeHandleList* types, | 359 void LoadICNexus::ConfigurePolymorphic(MapHandleList* maps, |
| 363 CodeHandleList* handlers) { | 360 CodeHandleList* handlers) { |
| 364 int receiver_count = types->length(); | 361 int receiver_count = maps->length(); |
| 365 EnsureArrayOfSize(receiver_count * 2); | 362 EnsureArrayOfSize(receiver_count * 2); |
| 366 InstallHandlers(0, types, handlers); | 363 InstallHandlers(0, maps, handlers); |
| 367 } | 364 } |
| 368 | 365 |
| 369 | 366 |
| 370 void KeyedLoadICNexus::ConfigurePolymorphic(Handle<Name> name, | 367 void KeyedLoadICNexus::ConfigurePolymorphic(Handle<Name> name, |
| 371 TypeHandleList* types, | 368 MapHandleList* maps, |
| 372 CodeHandleList* handlers) { | 369 CodeHandleList* handlers) { |
| 373 int receiver_count = types->length(); | 370 int receiver_count = maps->length(); |
| 374 Handle<FixedArray> array = EnsureArrayOfSize(1 + receiver_count * 2); | 371 Handle<FixedArray> array = EnsureArrayOfSize(1 + receiver_count * 2); |
| 375 if (name.is_null()) { | 372 if (name.is_null()) { |
| 376 array->set(0, Smi::FromInt(0)); | 373 array->set(0, Smi::FromInt(0)); |
| 377 } else { | 374 } else { |
| 378 array->set(0, *name); | 375 array->set(0, *name); |
| 379 } | 376 } |
| 380 InstallHandlers(1, types, handlers); | 377 InstallHandlers(1, maps, handlers); |
| 381 } | 378 } |
| 382 | 379 |
| 383 | 380 |
| 384 int FeedbackNexus::ExtractMaps(int start_index, MapHandleList* maps) const { | 381 int FeedbackNexus::ExtractMaps(int start_index, MapHandleList* maps) const { |
| 385 Isolate* isolate = GetIsolate(); | 382 Isolate* isolate = GetIsolate(); |
| 386 Object* feedback = GetFeedback(); | 383 Object* feedback = GetFeedback(); |
| 387 if (feedback->IsFixedArray()) { | 384 if (feedback->IsFixedArray()) { |
| 388 int found = 0; | 385 int found = 0; |
| 389 FixedArray* array = FixedArray::cast(feedback); | 386 FixedArray* array = FixedArray::cast(feedback); |
| 390 // The array should be of the form [<optional name>], then | 387 // The array should be of the form [<optional name>], then |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 if (feedback->IsFixedArray()) { | 492 if (feedback->IsFixedArray()) { |
| 496 FixedArray* array = FixedArray::cast(feedback); | 493 FixedArray* array = FixedArray::cast(feedback); |
| 497 DCHECK(array->length() >= 3); | 494 DCHECK(array->length() >= 3); |
| 498 Object* name = array->get(0); | 495 Object* name = array->get(0); |
| 499 if (name->IsName()) return Name::cast(name); | 496 if (name->IsName()) return Name::cast(name); |
| 500 } | 497 } |
| 501 return NULL; | 498 return NULL; |
| 502 } | 499 } |
| 503 } | 500 } |
| 504 } // namespace v8::internal | 501 } // namespace v8::internal |
| OLD | NEW |