diff options
Diffstat (limited to 'deps/v8/src/type-info.cc')
-rw-r--r-- | deps/v8/src/type-info.cc | 80 |
1 files changed, 41 insertions, 39 deletions
diff --git a/deps/v8/src/type-info.cc b/deps/v8/src/type-info.cc index 190eb3e6ff..65d1364058 100644 --- a/deps/v8/src/type-info.cc +++ b/deps/v8/src/type-info.cc @@ -128,6 +128,16 @@ bool TypeFeedbackOracle::LoadIsMonomorphicNormal(Property* expr) { } +bool TypeFeedbackOracle::LoadIsPreMonomorphic(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_inline_cache_stub() && code->ic_state() == PREMONOMORPHIC; + } + return false; +} + + bool TypeFeedbackOracle::LoadIsPolymorphic(Property* expr) { Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId()); if (map_or_code->IsCode()) { @@ -166,6 +176,16 @@ bool TypeFeedbackOracle::StoreIsMonomorphicNormal(TypeFeedbackId ast_id) { } +bool TypeFeedbackOracle::StoreIsPreMonomorphic(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); + 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()) { @@ -251,7 +271,7 @@ void TypeFeedbackOracle::LoadReceiverTypes(Property* expr, Handle<String> name, SmallMapList* types) { Code::Flags flags = Code::ComputeFlags( - Code::STUB, MONOMORPHIC, Code::kNoExtraICState, + Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState, Code::NORMAL, Code::LOAD_IC); CollectReceiverTypes(expr->PropertyFeedbackId(), name, flags, types); } @@ -261,7 +281,7 @@ void TypeFeedbackOracle::StoreReceiverTypes(Assignment* expr, Handle<String> name, SmallMapList* types) { Code::Flags flags = Code::ComputeFlags( - Code::STUB, MONOMORPHIC, Code::kNoExtraICState, + Code::HANDLER, MONOMORPHIC, Code::kNoExtraICState, Code::NORMAL, Code::STORE_IC); CollectReceiverTypes(expr->AssignmentFeedbackId(), name, flags, types); } @@ -381,20 +401,29 @@ 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 operation) { 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 BinaryOpStub we should always have them. + ASSERT(!(operation >= BinaryOpStub::FIRST_TOKEN && + operation <= BinaryOpStub::LAST_TOKEN)); *left = *right = *result = handle(Type::None(), isolate_); return; } Handle<Code> code = Handle<Code>::cast(object); ASSERT(code->is_binary_op_stub()); - 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); + BinaryOpStub stub(code->extended_extra_ic_state()); + + // Sanity check. + ASSERT(stub.operation() == operation); + + *left = stub.GetLeftType(isolate()); + *right = stub.GetRightType(isolate()); + *result = stub.GetResultType(isolate()); + *fixed_right_arg = stub.fixed_right_arg(); } @@ -410,36 +439,15 @@ Handle<Type> TypeFeedbackOracle::ClauseType(TypeFeedbackId id) { } -TypeInfo TypeFeedbackOracle::IncrementType(CountOperation* expr) { +Handle<Type> TypeFeedbackOracle::IncrementType(CountOperation* expr) { Handle<Object> object = GetInfo(expr->CountBinOpFeedbackId()); - TypeInfo unknown = TypeInfo::Unknown(); + Handle<Type> unknown(Type::None(), isolate_); if (!object->IsCode()) return unknown; 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; - } - UNREACHABLE(); - return unknown; + BinaryOpStub stub(code->extended_extra_ic_state()); + return stub.GetLeftType(isolate()); } @@ -634,12 +642,6 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) { 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: |