diff options
Diffstat (limited to 'chromium/v8/src/type-info.cc')
-rw-r--r-- | chromium/v8/src/type-info.cc | 416 |
1 files changed, 163 insertions, 253 deletions
diff --git a/chromium/v8/src/type-info.cc b/chromium/v8/src/type-info.cc index 190eb3e6fff..eed54ce2bcd 100644 --- a/chromium/v8/src/type-info.cc +++ b/chromium/v8/src/type-info.cc @@ -99,77 +99,48 @@ Handle<Cell> TypeFeedbackOracle::GetInfoCell( } -bool TypeFeedbackOracle::LoadIsUninitialized(Property* expr) { - Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); - if (map_or_code->IsMap()) return false; - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); +bool TypeFeedbackOracle::LoadIsUninitialized(TypeFeedbackId id) { + Handle<Object> maybe_code = GetInfo(id); + if (maybe_code->IsCode()) { + Handle<Code> code = Handle<Code>::cast(maybe_code); return code->is_inline_cache_stub() && code->ic_state() == UNINITIALIZED; } return false; } -bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { - Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); - if (map_or_code->IsMap()) return true; - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); - bool preliminary_checks = code->is_keyed_load_stub() && - code->ic_state() == MONOMORPHIC && - Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; - if (!preliminary_checks) return false; - Map* map = code->FindFirstMap(); - if (map == NULL) return false; - map = map->CurrentMapForDeprecated(); - return map != NULL && !CanRetainOtherContext(map, *native_context_); - } - return false; -} - - -bool TypeFeedbackOracle::LoadIsPolymorphic(Property* expr) { - Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); - return code->is_keyed_load_stub() && code->ic_state() == POLYMORPHIC; +bool TypeFeedbackOracle::LoadIsPreMonomorphic(TypeFeedbackId id) { + Handle<Object> maybe_code = GetInfo(id); + if (maybe_code->IsCode()) { + Handle<Code> code = Handle<Code>::cast(maybe_code); + return code->is_inline_cache_stub() && code->ic_state() == PREMONOMORPHIC; } return false; } bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) { - Handle<Object> map_or_code = GetInfo(ast_id); - if (map_or_code->IsMap()) return false; - if (!map_or_code->IsCode()) return false; - Handle<Code> code = Handle<Code>::cast(map_or_code); + Handle<Object> maybe_code = GetInfo(ast_id); + if (!maybe_code->IsCode()) return false; + Handle<Code> code = Handle<Code>::cast(maybe_code); return code->ic_state() == UNINITIALIZED; } -bool TypeFeedbackOracle::StoreIsMonomorphicNormal(TypeFeedbackId ast_id) { - Handle<Object> map_or_code = GetInfo(ast_id); - if (map_or_code->IsMap()) return true; - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); - bool preliminary_checks = - code->is_keyed_store_stub() && - code->ic_state() == MONOMORPHIC && - Code::ExtractTypeFromFlags(code->flags()) == Code::NORMAL; - if (!preliminary_checks) return false; - Map* map = code->FindFirstMap(); - if (map == NULL) return false; - map = map->CurrentMapForDeprecated(); - return map != NULL && !CanRetainOtherContext(map, *native_context_); +bool TypeFeedbackOracle::StoreIsPreMonomorphic(TypeFeedbackId ast_id) { + Handle<Object> maybe_code = GetInfo(ast_id); + if (maybe_code->IsCode()) { + Handle<Code> code = Handle<Code>::cast(maybe_code); + return code->ic_state() == PREMONOMORPHIC; } return false; } bool TypeFeedbackOracle::StoreIsKeyedPolymorphic(TypeFeedbackId ast_id) { - Handle<Object> map_or_code = GetInfo(ast_id); - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); + Handle<Object> maybe_code = GetInfo(ast_id); + if (maybe_code->IsCode()) { + Handle<Code> code = Handle<Code>::cast(maybe_code); return code->is_keyed_store_stub() && code->ic_state() == POLYMORPHIC; } @@ -177,118 +148,68 @@ bool TypeFeedbackOracle::StoreIsKeyedPolymorphic(TypeFeedbackId ast_id) { } -bool TypeFeedbackOracle::CallIsMonomorphic(Call* expr) { - Handle<Object> value = GetInfo(expr->CallFeedbackId()); - return value->IsMap() || value->IsAllocationSite() || value->IsJSFunction() || - value->IsSmi(); +bool TypeFeedbackOracle::CallIsMonomorphic(TypeFeedbackId id) { + Handle<Object> value = GetInfo(id); + return value->IsAllocationSite() || value->IsJSFunction() || value->IsSmi() || + (value->IsCode() && Handle<Code>::cast(value)->ic_state() == MONOMORPHIC); } -bool TypeFeedbackOracle::CallNewIsMonomorphic(CallNew* expr) { - Handle<Object> info = GetInfo(expr->CallNewFeedbackId()); - return info->IsAllocationSite() || info->IsJSFunction(); +bool TypeFeedbackOracle::KeyedArrayCallIsHoley(TypeFeedbackId id) { + Handle<Object> value = GetInfo(id); + Handle<Code> code = Handle<Code>::cast(value); + return KeyedArrayCallStub::IsHoley(code); } -bool TypeFeedbackOracle::ObjectLiteralStoreIsMonomorphic( - ObjectLiteral::Property* prop) { - Handle<Object> map_or_code = GetInfo(prop->key()->LiteralFeedbackId()); - return map_or_code->IsMap(); +bool TypeFeedbackOracle::CallNewIsMonomorphic(TypeFeedbackId id) { + Handle<Object> info = GetInfo(id); + return info->IsAllocationSite() || info->IsJSFunction(); } -byte TypeFeedbackOracle::ForInType(ForInStatement* stmt) { - Handle<Object> value = GetInfo(stmt->ForInFeedbackId()); +byte TypeFeedbackOracle::ForInType(TypeFeedbackId id) { + Handle<Object> value = GetInfo(id); return value->IsSmi() && Smi::cast(*value)->value() == TypeFeedbackCells::kForInFastCaseMarker ? ForInStatement::FAST_FOR_IN : ForInStatement::SLOW_FOR_IN; } -Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) { - ASSERT(LoadIsMonomorphicNormal(expr)); - Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); - Map* map = code->FindFirstMap()->CurrentMapForDeprecated(); - return map == NULL || CanRetainOtherContext(map, *native_context_) - ? Handle<Map>::null() - : Handle<Map>(map); - } - return Handle<Map>::cast(map_or_code); -} - - -Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType( - TypeFeedbackId ast_id) { - ASSERT(StoreIsMonomorphicNormal(ast_id)); - Handle<Object> map_or_code = GetInfo(ast_id); - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); - Map* map = code->FindFirstMap()->CurrentMapForDeprecated(); - return map == NULL || CanRetainOtherContext(map, *native_context_) - ? Handle<Map>::null() - : Handle<Map>(map); - } - return Handle<Map>::cast(map_or_code); -} - - KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode( TypeFeedbackId ast_id) { - Handle<Object> map_or_code = GetInfo(ast_id); - if (map_or_code->IsCode()) { - Handle<Code> code = Handle<Code>::cast(map_or_code); + Handle<Object> maybe_code = GetInfo(ast_id); + if (maybe_code->IsCode()) { + Handle<Code> code = Handle<Code>::cast(maybe_code); if (code->kind() == Code::KEYED_STORE_IC) { - return Code::GetKeyedAccessStoreMode(code->extra_ic_state()); + return KeyedStoreIC::GetKeyedAccessStoreMode(code->extra_ic_state()); } } return STANDARD_STORE; } -void TypeFeedbackOracle::LoadReceiverTypes(Property* expr, - Handle<String> name, - SmallMapList* types) { - Code::Flags flags = Code::ComputeFlags( - Code::STUB, MONOMORPHIC, Code::kNoExtraICState, - Code::NORMAL, Code::LOAD_IC); - CollectReceiverTypes(expr->PropertyFeedbackId(), name, flags, types); -} - - -void TypeFeedbackOracle::StoreReceiverTypes(Assignment* expr, - Handle<String> name, - SmallMapList* types) { - Code::Flags flags = Code::ComputeFlags( - Code::STUB, MONOMORPHIC, Code::kNoExtraICState, - Code::NORMAL, Code::STORE_IC); - CollectReceiverTypes(expr->AssignmentFeedbackId(), name, flags, types); -} - - -void TypeFeedbackOracle::CallReceiverTypes(Call* expr, +void TypeFeedbackOracle::CallReceiverTypes(TypeFeedbackId id, Handle<String> name, + int arity, CallKind call_kind, SmallMapList* types) { - int arity = expr->arguments()->length(); - // Note: Currently we do not take string extra ic data into account // here. - Code::ExtraICState extra_ic_state = - CallIC::Contextual::encode(call_kind == CALL_AS_FUNCTION); + ContextualMode contextual_mode = call_kind == CALL_AS_FUNCTION + ? CONTEXTUAL + : NOT_CONTEXTUAL; + ExtraICState extra_ic_state = + CallIC::Contextual::encode(contextual_mode); - Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, - extra_ic_state, - Code::NORMAL, - arity, - OWN_MAP); - CollectReceiverTypes(expr->CallFeedbackId(), name, flags, types); + Code::Flags flags = Code::ComputeMonomorphicFlags( + Code::CALL_IC, extra_ic_state, OWN_MAP, Code::NORMAL, arity); + CollectReceiverTypes(id, name, flags, types); } -CheckType TypeFeedbackOracle::GetCallCheckType(Call* expr) { - Handle<Object> value = GetInfo(expr->CallFeedbackId()); +CheckType TypeFeedbackOracle::GetCallCheckType(TypeFeedbackId id) { + Handle<Object> value = GetInfo(id); if (!value->IsSmi()) return RECEIVER_MAP_CHECK; CheckType check = static_cast<CheckType>(Smi::cast(*value)->value()); ASSERT(check != RECEIVER_MAP_CHECK); @@ -296,8 +217,8 @@ CheckType TypeFeedbackOracle::GetCallCheckType(Call* expr) { } -Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(Call* expr) { - Handle<Object> info = GetInfo(expr->CallFeedbackId()); +Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(TypeFeedbackId id) { + Handle<Object> info = GetInfo(id); if (info->IsAllocationSite()) { return Handle<JSFunction>(isolate_->global_context()->array_function()); } else { @@ -306,8 +227,8 @@ Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(Call* expr) { } -Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget(CallNew* expr) { - Handle<Object> info = GetInfo(expr->CallNewFeedbackId()); +Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget(TypeFeedbackId id) { + Handle<Object> info = GetInfo(id); if (info->IsAllocationSite()) { return Handle<JSFunction>(isolate_->global_context()->array_function()); } else { @@ -316,26 +237,20 @@ Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget(CallNew* expr) { } -Handle<Cell> TypeFeedbackOracle::GetCallNewAllocationInfoCell(CallNew* expr) { - return GetInfoCell(expr->CallNewFeedbackId()); +Handle<Cell> TypeFeedbackOracle::GetCallNewAllocationInfoCell( + TypeFeedbackId id) { + return GetInfoCell(id); } -Handle<Map> TypeFeedbackOracle::GetObjectLiteralStoreMap( - ObjectLiteral::Property* prop) { - ASSERT(ObjectLiteralStoreIsMonomorphic(prop)); - return Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId())); +bool TypeFeedbackOracle::LoadIsBuiltin( + TypeFeedbackId id, Builtins::Name builtin) { + return *GetInfo(id) == isolate_->builtins()->builtin(builtin); } -bool TypeFeedbackOracle::LoadIsBuiltin(Property* expr, Builtins::Name id) { - return *GetInfo(expr->PropertyFeedbackId()) == - isolate_->builtins()->builtin(id); -} - - -bool TypeFeedbackOracle::LoadIsStub(Property* expr, ICStub* stub) { - Handle<Object> object = GetInfo(expr->PropertyFeedbackId()); +bool TypeFeedbackOracle::LoadIsStub(TypeFeedbackId id, ICStub* stub) { + Handle<Object> object = GetInfo(id); if (!object->IsCode()) return false; Handle<Code> code = Handle<Code>::cast(object); if (!code->is_load_stub()) return false; @@ -359,9 +274,9 @@ void TypeFeedbackOracle::CompareType(TypeFeedbackId id, Handle<Map> map; Map* raw_map = code->FindFirstMap(); if (raw_map != NULL) { - raw_map = raw_map->CurrentMapForDeprecated(); - if (raw_map != NULL && !CanRetainOtherContext(raw_map, *native_context_)) { - map = handle(raw_map, isolate_); + map = Map::CurrentMapForDeprecated(handle(raw_map)); + if (!map.is_null() && CanRetainOtherContext(*map, *native_context_)) { + map = Handle<Map>::null(); } } @@ -381,20 +296,27 @@ void TypeFeedbackOracle::BinaryType(TypeFeedbackId id, Handle<Type>* left, Handle<Type>* right, Handle<Type>* result, - Maybe<int>* fixed_right_arg) { + Maybe<int>* fixed_right_arg, + Token::Value op) { Handle<Object> object = GetInfo(id); if (!object->IsCode()) { - // For some binary ops we don't have ICs, e.g. Token::COMMA. + // For some binary ops we don't have ICs, e.g. Token::COMMA, but for the + // operations covered by the BinaryOpIC we should always have them. + ASSERT(op < BinaryOpIC::State::FIRST_TOKEN || + op > BinaryOpIC::State::LAST_TOKEN); *left = *right = *result = handle(Type::None(), isolate_); + *fixed_right_arg = Maybe<int>(); return; } Handle<Code> code = Handle<Code>::cast(object); - ASSERT(code->is_binary_op_stub()); + ASSERT_EQ(Code::BINARY_OP_IC, code->kind()); + BinaryOpIC::State state(code->extended_extra_ic_state()); + ASSERT_EQ(op, state.op()); - int minor_key = code->stub_info(); - BinaryOpIC::StubInfoToType(minor_key, left, right, result, isolate()); - *fixed_right_arg = - BinaryOpStub::decode_fixed_right_arg_from_minor_key(minor_key); + *left = state.GetLeftType(isolate()); + *right = state.GetRightType(isolate()); + *result = state.GetResultType(isolate()); + *fixed_right_arg = state.fixed_right_arg(); } @@ -410,53 +332,69 @@ Handle<Type> TypeFeedbackOracle::ClauseType(TypeFeedbackId id) { } -TypeInfo TypeFeedbackOracle::IncrementType(CountOperation* expr) { - Handle<Object> object = GetInfo(expr->CountBinOpFeedbackId()); - TypeInfo unknown = TypeInfo::Unknown(); - if (!object->IsCode()) return unknown; +Handle<Type> TypeFeedbackOracle::CountType(TypeFeedbackId id) { + Handle<Object> object = GetInfo(id); + if (!object->IsCode()) return handle(Type::None(), isolate_); Handle<Code> code = Handle<Code>::cast(object); - if (!code->is_binary_op_stub()) return unknown; - - BinaryOpIC::TypeInfo left_type, right_type, unused_result_type; - BinaryOpStub::decode_types_from_minor_key(code->stub_info(), &left_type, - &right_type, &unused_result_type); - // CountOperations should always have +1 or -1 as their right input. - ASSERT(right_type == BinaryOpIC::SMI || - right_type == BinaryOpIC::UNINITIALIZED); - - switch (left_type) { - case BinaryOpIC::UNINITIALIZED: - case BinaryOpIC::SMI: - return TypeInfo::Smi(); - case BinaryOpIC::INT32: - return TypeInfo::Integer32(); - case BinaryOpIC::NUMBER: - return TypeInfo::Double(); - case BinaryOpIC::STRING: - case BinaryOpIC::GENERIC: - return unknown; - default: - return unknown; + ASSERT_EQ(Code::BINARY_OP_IC, code->kind()); + BinaryOpIC::State state(code->extended_extra_ic_state()); + return state.GetLeftType(isolate()); +} + + +void TypeFeedbackOracle::PropertyReceiverTypes( + TypeFeedbackId id, Handle<String> name, + SmallMapList* receiver_types, bool* is_prototype) { + receiver_types->Clear(); + FunctionPrototypeStub proto_stub(Code::LOAD_IC); + *is_prototype = LoadIsStub(id, &proto_stub); + if (!*is_prototype) { + Code::Flags flags = Code::ComputeFlags( + Code::HANDLER, MONOMORPHIC, kNoExtraICState, + Code::NORMAL, Code::LOAD_IC); + CollectReceiverTypes(id, name, flags, receiver_types); } - UNREACHABLE(); - return unknown; } -void TypeFeedbackOracle::CollectPolymorphicMaps(Handle<Code> code, - SmallMapList* types) { - MapHandleList maps; - code->FindAllMaps(&maps); - types->Reserve(maps.length(), zone()); - for (int i = 0; i < maps.length(); i++) { - Handle<Map> map(maps.at(i)); - if (!CanRetainOtherContext(*map, *native_context_)) { - types->AddMapIfMissing(map, zone()); - } +void TypeFeedbackOracle::KeyedPropertyReceiverTypes( + TypeFeedbackId id, SmallMapList* receiver_types, bool* is_string) { + receiver_types->Clear(); + *is_string = false; + if (LoadIsBuiltin(id, Builtins::kKeyedLoadIC_String)) { + *is_string = true; + } else { + CollectReceiverTypes(id, receiver_types); } } +void TypeFeedbackOracle::AssignmentReceiverTypes( + TypeFeedbackId id, Handle<String> name, SmallMapList* receiver_types) { + receiver_types->Clear(); + Code::Flags flags = Code::ComputeFlags( + Code::HANDLER, MONOMORPHIC, kNoExtraICState, + Code::NORMAL, Code::STORE_IC); + CollectReceiverTypes(id, name, flags, receiver_types); +} + + +void TypeFeedbackOracle::KeyedAssignmentReceiverTypes( + TypeFeedbackId id, SmallMapList* receiver_types, + KeyedAccessStoreMode* store_mode) { + receiver_types->Clear(); + CollectReceiverTypes(id, receiver_types); + *store_mode = GetStoreMode(id); +} + + +void TypeFeedbackOracle::CountReceiverTypes(TypeFeedbackId id, + SmallMapList* receiver_types) { + receiver_types->Clear(); + CollectReceiverTypes(id, receiver_types); +} + + void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, Handle<String> name, Code::Flags flags, @@ -464,24 +402,16 @@ void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, Handle<Object> object = GetInfo(ast_id); if (object->IsUndefined() || object->IsSmi()) return; - if (object.is_identical_to(isolate_->builtins()->StoreIC_GlobalProxy())) { - // TODO(fschneider): We could collect the maps and signal that - // we need a generic store (or load) here. - ASSERT(Handle<Code>::cast(object)->ic_state() == GENERIC); - } else if (object->IsMap()) { - types->AddMapIfMissing(Handle<Map>::cast(object), zone()); - } else if (Handle<Code>::cast(object)->ic_state() == POLYMORPHIC || - Handle<Code>::cast(object)->ic_state() == MONOMORPHIC) { - CollectPolymorphicMaps(Handle<Code>::cast(object), types); - } else if (FLAG_collect_megamorphic_maps_from_stub_cache && - Handle<Code>::cast(object)->ic_state() == MEGAMORPHIC) { + ASSERT(object->IsCode()); + Handle<Code> code(Handle<Code>::cast(object)); + + if (FLAG_collect_megamorphic_maps_from_stub_cache && + code->ic_state() == MEGAMORPHIC) { types->Reserve(4, zone()); - ASSERT(object->IsCode()); - isolate_->stub_cache()->CollectMatchingMaps(types, - name, - flags, - native_context_, - zone()); + isolate_->stub_cache()->CollectMatchingMaps( + types, name, flags, native_context_, zone()); + } else { + CollectReceiverTypes(ast_id, types); } } @@ -520,26 +450,26 @@ bool TypeFeedbackOracle::CanRetainOtherContext(JSFunction* function, } -void TypeFeedbackOracle::CollectKeyedReceiverTypes(TypeFeedbackId ast_id, - SmallMapList* types) { +void TypeFeedbackOracle::CollectReceiverTypes(TypeFeedbackId ast_id, + SmallMapList* types) { Handle<Object> object = GetInfo(ast_id); if (!object->IsCode()) return; Handle<Code> code = Handle<Code>::cast(object); - if (code->kind() == Code::KEYED_LOAD_IC || - code->kind() == Code::KEYED_STORE_IC) { - CollectPolymorphicMaps(code, types); + MapHandleList maps; + if (code->ic_state() == MONOMORPHIC) { + Map* map = code->FindFirstMap(); + if (map != NULL) maps.Add(handle(map)); + } else if (code->ic_state() == POLYMORPHIC) { + code->FindAllMaps(&maps); + } else { + return; } -} - - -void TypeFeedbackOracle::CollectPolymorphicStoreReceiverTypes( - TypeFeedbackId ast_id, - SmallMapList* types) { - Handle<Object> object = GetInfo(ast_id); - if (!object->IsCode()) return; - Handle<Code> code = Handle<Code>::cast(object); - if (code->kind() == Code::STORE_IC && code->ic_state() == POLYMORPHIC) { - CollectPolymorphicMaps(code, types); + types->Reserve(maps.length(), zone()); + for (int i = 0; i < maps.length(); i++) { + Handle<Map> map(maps.at(i)); + if (!CanRetainOtherContext(*map, *native_context_)) { + types->AddMapIfMissing(map, zone()); + } } } @@ -609,37 +539,17 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) { TypeFeedbackId(static_cast<unsigned>((*infos)[i].data())); Code* target = Code::GetCodeFromTargetAddress(target_address); switch (target->kind()) { + case Code::CALL_IC: + if (target->ic_state() == MONOMORPHIC && + target->check_type() != RECEIVER_MAP_CHECK) { + SetInfo(ast_id, Smi::FromInt(target->check_type())); + break; + } case Code::LOAD_IC: case Code::STORE_IC: - case Code::CALL_IC: case Code::KEYED_CALL_IC: - if (target->ic_state() == MONOMORPHIC) { - if (target->kind() == Code::CALL_IC && - target->check_type() != RECEIVER_MAP_CHECK) { - SetInfo(ast_id, Smi::FromInt(target->check_type())); - } else { - Object* map = target->FindFirstMap(); - if (map == NULL) { - SetInfo(ast_id, static_cast<Object*>(target)); - } else if (!CanRetainOtherContext(Map::cast(map), - *native_context_)) { - Map* feedback = Map::cast(map)->CurrentMapForDeprecated(); - if (feedback != NULL) SetInfo(ast_id, feedback); - } - } - } else { - SetInfo(ast_id, target); - } - break; - case Code::KEYED_LOAD_IC: case Code::KEYED_STORE_IC: - if (target->ic_state() == MONOMORPHIC || - target->ic_state() == POLYMORPHIC) { - SetInfo(ast_id, target); - } - break; - case Code::BINARY_OP_IC: case Code::COMPARE_IC: case Code::TO_BOOLEAN_IC: |