| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index de18700d5ee7856c0b302fdb7ef516f99e088fda..aef2c62e18d07de0c423719d611f0154be1c8fce 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -529,57 +529,59 @@ void StoreICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| assembler->StoreIC(&p);
|
| }
|
|
|
| +void StoreMapStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| + typedef compiler::Node Node;
|
| +
|
| + Node* receiver = assembler->Parameter(Descriptor::kReceiver);
|
| + Node* map = assembler->Parameter(Descriptor::kMap);
|
| + Node* value = assembler->Parameter(Descriptor::kValue);
|
| +
|
| + assembler->StoreObjectField(receiver, JSObject::kMapOffset, map);
|
| + assembler->Return(value);
|
| +}
|
| +
|
| void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| typedef CodeStubAssembler::Label Label;
|
| typedef compiler::Node Node;
|
|
|
| Node* receiver = assembler->Parameter(Descriptor::kReceiver);
|
| Node* name = assembler->Parameter(Descriptor::kName);
|
| + Node* offset =
|
| + assembler->SmiUntag(assembler->Parameter(Descriptor::kFieldOffset));
|
| Node* value = assembler->Parameter(Descriptor::kValue);
|
| Node* map = assembler->Parameter(Descriptor::kMap);
|
| Node* slot = assembler->Parameter(Descriptor::kSlot);
|
| Node* vector = assembler->Parameter(Descriptor::kVector);
|
| Node* context = assembler->Parameter(Descriptor::kContext);
|
|
|
| - StoreMode store_mode = this->store_mode();
|
| - Node* prepared_value = value;
|
| -
|
| Label miss(assembler);
|
| - bool needs_miss_case = false;
|
| -
|
| - if (store_mode != StoreTransitionStub::StoreMapOnly) {
|
| - Representation representation = this->representation();
|
| - FieldIndex index = this->index();
|
| - assembler->Comment(
|
| - "Prepare value for write: representation: %s, index.is_inobject: %d, "
|
| - "index.offset: %d",
|
| - representation.Mnemonic(), index.is_inobject(), index.offset());
|
| - prepared_value =
|
| - assembler->PrepareValueForWrite(prepared_value, representation, &miss);
|
| - // Only store to tagged field never bails out.
|
| - needs_miss_case |= !representation.IsTagged();
|
| - }
|
|
|
| - switch (store_mode) {
|
| - case StoreTransitionStub::ExtendStorageAndStoreMapAndValue:
|
| - assembler->Comment("Extend storage");
|
| - assembler->ExtendPropertiesBackingStore(receiver);
|
| - // Fall through.
|
| - case StoreTransitionStub::StoreMapAndValue:
|
| - assembler->Comment("Store value");
|
| - // Store the new value into the "extended" object.
|
| - assembler->StoreNamedField(receiver, index(), representation(),
|
| - prepared_value, true);
|
| - // Fall through.
|
| - case StoreTransitionStub::StoreMapOnly:
|
| - assembler->Comment("Store map");
|
| - // And finally update the map.
|
| - assembler->StoreObjectField(receiver, JSObject::kMapOffset, map);
|
| - break;
|
| + Representation representation = this->representation();
|
| + assembler->Comment("StoreTransitionStub: is_inobject: %d: representation: %s",
|
| + is_inobject(), representation.Mnemonic());
|
| +
|
| + Node* prepared_value =
|
| + assembler->PrepareValueForWrite(value, representation, &miss);
|
| +
|
| + if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) {
|
| + assembler->Comment("Extend storage");
|
| + assembler->ExtendPropertiesBackingStore(receiver);
|
| + } else {
|
| + DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue);
|
| }
|
| +
|
| + // Store the new value into the "extended" object.
|
| + assembler->Comment("Store value");
|
| + assembler->StoreNamedField(receiver, offset, is_inobject(), representation,
|
| + prepared_value, true);
|
| +
|
| + // And finally update the map.
|
| + assembler->Comment("Store map");
|
| + assembler->StoreObjectField(receiver, JSObject::kMapOffset, map);
|
| assembler->Return(value);
|
|
|
| - if (needs_miss_case) {
|
| + // Only store to tagged field never bails out.
|
| + if (!representation.IsTagged()) {
|
| assembler->Bind(&miss);
|
| {
|
| assembler->Comment("Miss");
|
|
|