diff options
Diffstat (limited to 'deps/v8/src/ic/handler-compiler.cc')
-rw-r--r-- | deps/v8/src/ic/handler-compiler.cc | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/deps/v8/src/ic/handler-compiler.cc b/deps/v8/src/ic/handler-compiler.cc index 4ed92ec6bf..7f440c07ca 100644 --- a/deps/v8/src/ic/handler-compiler.cc +++ b/deps/v8/src/ic/handler-compiler.cc @@ -309,7 +309,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter( // TODO(verwaest): Cleanup. holder() is actually the receiver. Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( Handle<Map> transition, Handle<Name> name) { - Label miss, slow; + Label miss; // Ensure no transitions to deprecated maps are followed. __ CheckMapDeprecated(transition, scratch1(), &miss); @@ -331,21 +331,55 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition( DCHECK(holder()->HasFastProperties()); } - GenerateStoreTransition(transition, name, receiver(), this->name(), value(), - scratch1(), scratch2(), scratch3(), &miss, &slow); + int descriptor = transition->LastAdded(); + 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. + if (details.type() == CONSTANT) { + GenerateConstantCheck(descriptors->GetValue(descriptor), value(), &miss); + + GenerateRestoreNameAndMap(name, transition); + StoreTransitionStub 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; + + GenerateRestoreNameAndMap(name, transition); + StoreTransitionStub stub(isolate(), + FieldIndex::ForDescriptor(*transition, descriptor), + representation, store_mode); + GenerateTailCall(masm(), stub.GetCode()); + } GenerateRestoreName(&miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); - GenerateRestoreName(&slow, name); - TailCallBuiltin(masm(), SlowBuiltin(kind())); return GetCode(kind(), Code::FAST, name); } Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupIterator* it) { Label miss; - GenerateStoreField(it, value(), &miss); + DCHECK(it->representation().IsHeapObject()); + + GenerateFieldTypeChecks(*it->GetFieldType(), value(), &miss); + StoreFieldStub stub(isolate(), it->GetFieldIndex(), it->representation()); + GenerateTailCall(masm(), stub.GetCode()); + __ bind(&miss); TailCallBuiltin(masm(), MissBuiltin(kind())); return GetCode(kind(), Code::FAST, it->name()); @@ -381,8 +415,8 @@ void ElementHandlerCompiler::CompileElementHandlers( Handle<Map> receiver_map = receiver_maps->at(i); Handle<Code> cached_stub; - if ((receiver_map->instance_type() & kNotStringTag) == 0) { - cached_stub = isolate()->builtins()->KeyedLoadIC_String(); + if (receiver_map->IsStringMap()) { + cached_stub = LoadIndexedStringStub(isolate()).GetCode(); } else if (receiver_map->instance_type() < FIRST_JS_RECEIVER_TYPE) { cached_stub = isolate()->builtins()->KeyedLoadIC_Slow(); } else { |