| Index: src/ic/handler-compiler.cc
|
| diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc
|
| index fef1f63116eaff8b91b2297581c7d674da7388d6..9ca434293ae57a117b0fe6a41c7cd5ed0eface25 100644
|
| --- a/src/ic/handler-compiler.cc
|
| +++ b/src/ic/handler-compiler.cc
|
| @@ -193,27 +193,6 @@ void PropertyHandlerCompiler::NonexistentFrontendHeader(Handle<Name> name,
|
| }
|
| }
|
|
|
| -
|
| -Handle<Code> NamedLoadHandlerCompiler::CompileLoadField(Handle<Name> name,
|
| - FieldIndex field) {
|
| - Register reg = Frontend(name);
|
| - __ Move(receiver(), reg);
|
| - LoadFieldStub stub(isolate(), field);
|
| - GenerateTailCall(masm(), stub.GetCode());
|
| - return GetCode(kind(), name);
|
| -}
|
| -
|
| -
|
| -Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(Handle<Name> name,
|
| - int constant_index) {
|
| - Register reg = Frontend(name);
|
| - __ Move(receiver(), reg);
|
| - LoadConstantStub stub(isolate(), constant_index);
|
| - GenerateTailCall(masm(), stub.GetCode());
|
| - return GetCode(kind(), name);
|
| -}
|
| -
|
| -
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
|
| Handle<Name> name) {
|
| Label miss;
|
| @@ -440,150 +419,11 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter(
|
| return GetCode(kind(), name);
|
| }
|
|
|
| -
|
| -// TODO(verwaest): Cleanup. holder() is actually the receiver.
|
| -Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
|
| - Handle<Map> transition, Handle<Name> name) {
|
| - Label miss;
|
| -
|
| - // Ensure that the StoreTransitionStub we are going to call has the same
|
| - // number of stack arguments. This means that we don't have to adapt them
|
| - // if we decide to call the transition or miss stub.
|
| - STATIC_ASSERT(Descriptor::kStackArgumentsCount ==
|
| - StoreTransitionDescriptor::kStackArgumentsCount);
|
| - STATIC_ASSERT(Descriptor::kStackArgumentsCount == 0 ||
|
| - Descriptor::kStackArgumentsCount == 3);
|
| - STATIC_ASSERT(Descriptor::kParameterCount - Descriptor::kValue ==
|
| - StoreTransitionDescriptor::kParameterCount -
|
| - StoreTransitionDescriptor::kValue);
|
| - STATIC_ASSERT(Descriptor::kParameterCount - Descriptor::kSlot ==
|
| - StoreTransitionDescriptor::kParameterCount -
|
| - StoreTransitionDescriptor::kSlot);
|
| - STATIC_ASSERT(Descriptor::kParameterCount - Descriptor::kVector ==
|
| - StoreTransitionDescriptor::kParameterCount -
|
| - StoreTransitionDescriptor::kVector);
|
| -
|
| - if (Descriptor::kPassLastArgsOnStack) {
|
| - __ LoadParameterFromStack<Descriptor>(value(), Descriptor::kValue);
|
| - }
|
| -
|
| - bool need_save_restore = IC::ShouldPushPopSlotAndVector(kind());
|
| - if (need_save_restore) {
|
| - PushVectorAndSlot();
|
| - }
|
| -
|
| - // Check that we are allowed to write this.
|
| - bool is_nonexistent = holder()->map() == transition->GetBackPointer();
|
| - if (is_nonexistent) {
|
| - // Find the top object.
|
| - Handle<JSObject> last;
|
| - PrototypeIterator::WhereToEnd end =
|
| - name->IsPrivate() ? PrototypeIterator::END_AT_NON_HIDDEN
|
| - : PrototypeIterator::END_AT_NULL;
|
| - PrototypeIterator iter(isolate(), holder(), kStartAtPrototype, end);
|
| - while (!iter.IsAtEnd()) {
|
| - last = PrototypeIterator::GetCurrent<JSObject>(iter);
|
| - iter.Advance();
|
| - }
|
| - if (!last.is_null()) set_holder(last);
|
| - NonexistentFrontendHeader(name, &miss, scratch1(), scratch2());
|
| - } else {
|
| - FrontendHeader(receiver(), name, &miss, DONT_RETURN_ANYTHING);
|
| - DCHECK(holder()->HasFastProperties());
|
| - }
|
| -
|
| - int descriptor = transition->LastAdded();
|
| - Handle<DescriptorArray> descriptors(transition->instance_descriptors());
|
| - PropertyDetails details = descriptors->GetDetails(descriptor);
|
| - Representation representation = details.representation();
|
| - DCHECK(!representation.IsNone());
|
| -
|
| - // Stub is never generated for objects that require access checks.
|
| - DCHECK(!transition->is_access_check_needed());
|
| -
|
| - // Call to respective StoreTransitionStub.
|
| - Register map_reg = StoreTransitionDescriptor::MapRegister();
|
| -
|
| - if (details.type() == DATA_CONSTANT) {
|
| - DCHECK(descriptors->GetValue(descriptor)->IsJSFunction());
|
| - GenerateRestoreMap(transition, map_reg, scratch1(), &miss);
|
| - GenerateConstantCheck(map_reg, descriptor, value(), scratch1(), &miss);
|
| - if (need_save_restore) {
|
| - PopVectorAndSlot();
|
| - }
|
| - GenerateRestoreName(name);
|
| - StoreMapStub stub(isolate());
|
| - GenerateTailCall(masm(), stub.GetCode());
|
| -
|
| - } else {
|
| - if (representation.IsHeapObject()) {
|
| - GenerateFieldTypeChecks(descriptors->GetFieldType(descriptor), value(),
|
| - &miss);
|
| - }
|
| - StoreTransitionStub::StoreMode store_mode =
|
| - Map::cast(transition->GetBackPointer())->unused_property_fields() == 0
|
| - ? StoreTransitionStub::ExtendStorageAndStoreMapAndValue
|
| - : StoreTransitionStub::StoreMapAndValue;
|
| - GenerateRestoreMap(transition, map_reg, scratch1(), &miss);
|
| - if (need_save_restore) {
|
| - PopVectorAndSlot();
|
| - }
|
| - // We need to pass name on the stack.
|
| - PopReturnAddress(this->name());
|
| - __ Push(name);
|
| - PushReturnAddress(this->name());
|
| -
|
| - FieldIndex index = FieldIndex::ForDescriptor(*transition, descriptor);
|
| - __ Move(StoreNamedTransitionDescriptor::FieldOffsetRegister(),
|
| - Smi::FromInt(index.index() << kPointerSizeLog2));
|
| -
|
| - StoreTransitionStub stub(isolate(), index.is_inobject(), representation,
|
| - store_mode);
|
| - GenerateTailCall(masm(), stub.GetCode());
|
| - }
|
| -
|
| - __ bind(&miss);
|
| - if (need_save_restore) {
|
| - PopVectorAndSlot();
|
| - }
|
| - GenerateRestoreName(name);
|
| - TailCallBuiltin(masm(), MissBuiltin(kind()));
|
| -
|
| - return GetCode(kind(), name);
|
| -}
|
| -
|
| bool NamedStoreHandlerCompiler::RequiresFieldTypeChecks(
|
| FieldType* field_type) const {
|
| return field_type->IsClass();
|
| }
|
|
|
| -
|
| -Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupIterator* it) {
|
| - Label miss;
|
| - DCHECK(it->representation().IsHeapObject());
|
| -
|
| - FieldType* field_type = *it->GetFieldType();
|
| - bool need_save_restore = false;
|
| - if (RequiresFieldTypeChecks(field_type)) {
|
| - need_save_restore = IC::ShouldPushPopSlotAndVector(kind());
|
| - if (Descriptor::kPassLastArgsOnStack) {
|
| - __ LoadParameterFromStack<Descriptor>(value(), Descriptor::kValue);
|
| - }
|
| - if (need_save_restore) PushVectorAndSlot();
|
| - GenerateFieldTypeChecks(field_type, value(), &miss);
|
| - if (need_save_restore) PopVectorAndSlot();
|
| - }
|
| -
|
| - StoreFieldStub stub(isolate(), it->GetFieldIndex(), it->representation());
|
| - GenerateTailCall(masm(), stub.GetCode());
|
| -
|
| - __ bind(&miss);
|
| - if (need_save_restore) PopVectorAndSlot();
|
| - TailCallBuiltin(masm(), MissBuiltin(kind()));
|
| - return GetCode(kind(), it->name());
|
| -}
|
| -
|
| -
|
| Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
|
| Handle<JSObject> object, Handle<Name> name, int accessor_index,
|
| int expected_arguments) {
|
|
|