| 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/cpu-profiler.h" | 7 #include "src/cpu-profiler.h" | 
| 8 #include "src/ic/call-optimization.h" | 8 #include "src/ic/call-optimization.h" | 
| 9 #include "src/ic/handler-compiler.h" | 9 #include "src/ic/handler-compiler.h" | 
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" | 
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 458   int descriptor = transition->LastAdded(); | 458   int descriptor = transition->LastAdded(); | 
| 459   Handle<DescriptorArray> descriptors(transition->instance_descriptors()); | 459   Handle<DescriptorArray> descriptors(transition->instance_descriptors()); | 
| 460   PropertyDetails details = descriptors->GetDetails(descriptor); | 460   PropertyDetails details = descriptors->GetDetails(descriptor); | 
| 461   Representation representation = details.representation(); | 461   Representation representation = details.representation(); | 
| 462   DCHECK(!representation.IsNone()); | 462   DCHECK(!representation.IsNone()); | 
| 463 | 463 | 
| 464   // Stub is never generated for objects that require access checks. | 464   // Stub is never generated for objects that require access checks. | 
| 465   DCHECK(!transition->is_access_check_needed()); | 465   DCHECK(!transition->is_access_check_needed()); | 
| 466 | 466 | 
| 467   // Call to respective StoreTransitionStub. | 467   // Call to respective StoreTransitionStub. | 
|  | 468   Register transition_map_reg = StoreTransitionDescriptor::MapRegister(); | 
|  | 469   bool push_map_on_stack = transition_map_reg.is(no_reg); | 
|  | 470   Register map_reg = push_map_on_stack ? scratch1() : transition_map_reg; | 
|  | 471 | 
| 468   if (details.type() == DATA_CONSTANT) { | 472   if (details.type() == DATA_CONSTANT) { | 
| 469     GenerateRestoreMap(transition, scratch2(), &miss); |  | 
| 470     DCHECK(descriptors->GetValue(descriptor)->IsJSFunction()); | 473     DCHECK(descriptors->GetValue(descriptor)->IsJSFunction()); | 
| 471     Register map_reg = StoreTransitionDescriptor::MapRegister(); | 474     GenerateRestoreMap(transition, map_reg, scratch2(), &miss); | 
| 472     GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss); | 475     GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss); | 
|  | 476     if (push_map_on_stack) { | 
|  | 477       GeneratePushMap(map_reg, scratch2()); | 
|  | 478     } | 
| 473     GenerateRestoreName(name); | 479     GenerateRestoreName(name); | 
| 474     StoreTransitionStub stub(isolate()); | 480     StoreTransitionStub stub(isolate()); | 
| 475     GenerateTailCall(masm(), stub.GetCode()); | 481     GenerateTailCall(masm(), stub.GetCode()); | 
| 476 | 482 | 
| 477   } else { | 483   } else { | 
| 478     if (representation.IsHeapObject()) { | 484     if (representation.IsHeapObject()) { | 
| 479       GenerateFieldTypeChecks(descriptors->GetFieldType(descriptor), value(), | 485       GenerateFieldTypeChecks(descriptors->GetFieldType(descriptor), value(), | 
| 480                               &miss); | 486                               &miss); | 
| 481     } | 487     } | 
| 482     StoreTransitionStub::StoreMode store_mode = | 488     StoreTransitionStub::StoreMode store_mode = | 
| 483         Map::cast(transition->GetBackPointer())->unused_property_fields() == 0 | 489         Map::cast(transition->GetBackPointer())->unused_property_fields() == 0 | 
| 484             ? StoreTransitionStub::ExtendStorageAndStoreMapAndValue | 490             ? StoreTransitionStub::ExtendStorageAndStoreMapAndValue | 
| 485             : StoreTransitionStub::StoreMapAndValue; | 491             : StoreTransitionStub::StoreMapAndValue; | 
| 486 | 492 | 
| 487     GenerateRestoreMap(transition, scratch2(), &miss); | 493     GenerateRestoreMap(transition, map_reg, scratch2(), &miss); | 
|  | 494     if (push_map_on_stack) { | 
|  | 495       GeneratePushMap(map_reg, scratch2()); | 
|  | 496     } | 
| 488     GenerateRestoreName(name); | 497     GenerateRestoreName(name); | 
| 489     StoreTransitionStub stub(isolate(), | 498     StoreTransitionStub stub(isolate(), | 
| 490                              FieldIndex::ForDescriptor(*transition, descriptor), | 499                              FieldIndex::ForDescriptor(*transition, descriptor), | 
| 491                              representation, store_mode); | 500                              representation, store_mode); | 
| 492     GenerateTailCall(masm(), stub.GetCode()); | 501     GenerateTailCall(masm(), stub.GetCode()); | 
| 493   } | 502   } | 
| 494 | 503 | 
| 495   GenerateRestoreName(&miss, name); | 504   GenerateRestoreName(&miss, name); | 
| 496   TailCallBuiltin(masm(), MissBuiltin(kind())); | 505   TailCallBuiltin(masm(), MissBuiltin(kind())); | 
| 497 | 506 | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 579                                                  : kNoExtraICState); | 588                                                  : kNoExtraICState); | 
| 580         cached_stub = LoadDictionaryElementStub(isolate(), state).GetCode(); | 589         cached_stub = LoadDictionaryElementStub(isolate(), state).GetCode(); | 
| 581       } | 590       } | 
| 582     } | 591     } | 
| 583 | 592 | 
| 584     handlers->Add(cached_stub); | 593     handlers->Add(cached_stub); | 
| 585   } | 594   } | 
| 586 } | 595 } | 
| 587 }  // namespace internal | 596 }  // namespace internal | 
| 588 }  // namespace v8 | 597 }  // namespace v8 | 
| OLD | NEW | 
|---|