diff options
Diffstat (limited to 'deps/v8/src/ic.cc')
-rw-r--r-- | deps/v8/src/ic.cc | 97 |
1 files changed, 20 insertions, 77 deletions
diff --git a/deps/v8/src/ic.cc b/deps/v8/src/ic.cc index 134ef8b843..643fa88413 100644 --- a/deps/v8/src/ic.cc +++ b/deps/v8/src/ic.cc @@ -352,9 +352,9 @@ void IC::Clear(Address address) { return KeyedStoreIC::Clear(address, target); case Code::CALL_IC: return CallIC::Clear(address, target); case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target); - case Code::COMPARE_IC: return CompareIC::Clear(address, target); case Code::UNARY_OP_IC: case Code::BINARY_OP_IC: + case Code::COMPARE_IC: case Code::TO_BOOLEAN_IC: // Clearing these is tricky and does not // make any performance difference. @@ -365,8 +365,9 @@ void IC::Clear(Address address) { void CallICBase::Clear(Address address, Code* target) { - if (target->ic_state() == UNINITIALIZED) return; bool contextual = CallICBase::Contextual::decode(target->extra_ic_state()); + State state = target->ic_state(); + if (state == UNINITIALIZED) return; Code* code = Isolate::Current()->stub_cache()->FindCallInitialize( target->arguments_count(), @@ -409,17 +410,6 @@ void KeyedStoreIC::Clear(Address address, Code* target) { } -void CompareIC::Clear(Address address, Code* target) { - // Only clear ICCompareStubs, we currently cannot clear generic CompareStubs. - if (target->major_key() != CodeStub::CompareIC) return; - // Only clear CompareICs that can retain objects. - if (target->compare_state() != KNOWN_OBJECTS) return; - Token::Value op = CompareIC::ComputeOperation(target); - SetTargetAtAddress(address, GetRawUninitialized(op)); - PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); -} - - static bool HasInterceptorGetter(JSObject* object) { return !object->GetNamedInterceptor()->getter()->IsUndefined(); } @@ -1644,7 +1634,8 @@ Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck( return string_stub(); } else { ASSERT(receiver_map->has_dictionary_elements() || - receiver_map->has_fast_smi_or_object_elements() || + receiver_map->has_fast_elements() || + receiver_map->has_fast_smi_only_elements() || receiver_map->has_fast_double_elements() || receiver_map->has_external_array_elements()); bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; @@ -1659,7 +1650,8 @@ Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver, StubKind stub_kind, StrictModeFlag strict_mode, Handle<Code> generic_stub) { - if (receiver->HasFastSmiOrObjectElements() || + if (receiver->HasFastElements() || + receiver->HasFastSmiOnlyElements() || receiver->HasExternalArrayElements() || receiver->HasFastDoubleElements() || receiver->HasDictionaryElements()) { @@ -1679,26 +1671,15 @@ Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver, case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS); + break; case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE: case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS); - case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_OBJECT: - case KeyedIC::STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: - case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT: - case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: - return JSObject::GetElementsTransitionMap(receiver, - FAST_HOLEY_ELEMENTS); - case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE: - case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE: - return JSObject::GetElementsTransitionMap(receiver, - FAST_HOLEY_DOUBLE_ELEMENTS); - case KeyedIC::LOAD: - case KeyedIC::STORE_NO_TRANSITION: - case KeyedIC::STORE_AND_GROW_NO_TRANSITION: - UNREACHABLE(); break; + default: + UNREACHABLE(); + return Handle<Map>::null(); } - return Handle<Map>::null(); } @@ -1758,54 +1739,30 @@ KeyedIC::StubKind KeyedStoreIC::GetStubKind(Handle<JSObject> receiver, if (allow_growth) { // Handle growing array in stub if necessary. - if (receiver->HasFastSmiElements()) { + if (receiver->HasFastSmiOnlyElements()) { if (value->IsHeapNumber()) { - if (receiver->HasFastHoleyElements()) { - return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE; - } else { - return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; - } + return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; } if (value->IsHeapObject()) { - if (receiver->HasFastHoleyElements()) { - return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT; - } else { - return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; - } + return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; } } else if (receiver->HasFastDoubleElements()) { if (!value->IsSmi() && !value->IsHeapNumber()) { - if (receiver->HasFastHoleyElements()) { - return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; - } else { - return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; - } + return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; } } return STORE_AND_GROW_NO_TRANSITION; } else { // Handle only in-bounds elements accesses. - if (receiver->HasFastSmiElements()) { + if (receiver->HasFastSmiOnlyElements()) { if (value->IsHeapNumber()) { - if (receiver->HasFastHoleyElements()) { - return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE; - } else { - return STORE_TRANSITION_SMI_TO_DOUBLE; - } + return STORE_TRANSITION_SMI_TO_DOUBLE; } else if (value->IsHeapObject()) { - if (receiver->HasFastHoleyElements()) { - return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT; - } else { - return STORE_TRANSITION_SMI_TO_OBJECT; - } + return STORE_TRANSITION_SMI_TO_OBJECT; } } else if (receiver->HasFastDoubleElements()) { if (!value->IsSmi() && !value->IsHeapNumber()) { - if (receiver->HasFastHoleyElements()) { - return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; - } else { - return STORE_TRANSITION_DOUBLE_TO_OBJECT; - } + return STORE_TRANSITION_DOUBLE_TO_OBJECT; } } return STORE_NO_TRANSITION; @@ -2439,7 +2396,7 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { // Activate inlined smi code. if (previous_type == BinaryOpIC::UNINITIALIZED) { - PatchInlinedSmiCode(ic.address(), ENABLE_INLINED_SMI_CHECK); + PatchInlinedSmiCode(ic.address()); } } @@ -2500,14 +2457,6 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { } -Code* CompareIC::GetRawUninitialized(Token::Value op) { - ICCompareStub stub(op, UNINITIALIZED); - Code* code = NULL; - CHECK(stub.FindCodeInCache(&code)); - return code; -} - - Handle<Code> CompareIC::GetUninitialized(Token::Value op) { ICCompareStub stub(op, UNINITIALIZED); return stub.GetCode(); @@ -2522,12 +2471,6 @@ CompareIC::State CompareIC::ComputeState(Code* target) { } -Token::Value CompareIC::ComputeOperation(Code* target) { - ASSERT(target->major_key() == CodeStub::CompareIC); - return static_cast<Token::Value>(target->compare_operation()); -} - - const char* CompareIC::GetStateName(State state) { switch (state) { case UNINITIALIZED: return "UNINITIALIZED"; |