Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index db1f6953eb9561c5a62e9f166e2645bdeee8411e..45b6384b1ea6ff37f922aefd864069343acfcf9d 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -5428,11 +5428,6 @@ void Function::set_modifier(RawFunction::AsyncModifier value) const { |
} |
-void Function::set_is_intrinsic(bool value) const { |
- set_kind_tag(IntrinsicBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
void Function::set_recognized_kind(MethodRecognizer::Kind value) const { |
// Prevent multiple settings of kind. |
ASSERT((value == MethodRecognizer::kUnknown) || !IsRecognized()); |
@@ -5440,33 +5435,6 @@ void Function::set_recognized_kind(MethodRecognizer::Kind value) const { |
} |
-void Function::set_is_redirecting(bool value) const { |
- set_kind_tag(RedirectingBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_static(bool value) const { |
- set_kind_tag(StaticBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_const(bool value) const { |
- set_kind_tag(ConstBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_external(bool value) const { |
- set_kind_tag(ExternalBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_async_closure(bool value) const { |
- set_kind_tag(AsyncClosureBit::update(value, raw_ptr()->kind_tag_)); |
- // Prohibit inlining as the closure is used for implementing a continuation. |
- set_is_inlinable(false); |
-} |
- |
- |
void Function::set_token_pos(intptr_t value) const { |
ASSERT(value >= 0); |
StoreNonPointer(&raw_ptr()->token_pos_, value); |
@@ -5547,41 +5515,11 @@ void Function::SetIsNativeAutoSetupScope(bool value) const { |
} |
-void Function::set_is_optimizable(bool value) const { |
- set_kind_tag(OptimizableBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_allows_hoisting_check_class(bool value) const { |
- set_kind_tag( |
- AllowsHoistingCheckClassBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_native(bool value) const { |
- set_kind_tag(NativeBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_abstract(bool value) const { |
- set_kind_tag(AbstractBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-void Function::set_is_inlinable(bool value) const { |
- set_kind_tag(InlinableBit::update(value, raw_ptr()->kind_tag_)); |
-} |
- |
- |
-bool Function::IsInlineable() const { |
- return (InlinableBit::decode(raw_ptr()->kind_tag_) && |
- HasCode() && |
- !Isolate::Current()->debugger()->HasBreakpoint(*this)); |
-} |
- |
- |
-void Function::set_is_visible(bool value) const { |
- set_kind_tag(VisibleBit::update(value, raw_ptr()->kind_tag_)); |
+bool Function::CanBeInlined() const { |
+ return is_inlinable() && |
+ !is_async_closure() && |
+ HasCode() && |
+ !Isolate::Current()->debugger()->HasBreakpoint(*this); |
} |
@@ -6120,6 +6058,7 @@ RawFunction* Function::New(const String& name, |
result.set_is_optimizable(is_native ? false : true); |
result.set_is_inlinable(true); |
result.set_allows_hoisting_check_class(true); |
+ result.set_allows_bounds_check_generalization(true); |
result.SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code())); |
if (kind == RawFunction::kClosureFunction) { |
const ClosureData& data = ClosureData::Handle(ClosureData::New()); |
@@ -6773,7 +6712,7 @@ void Function::PrintJSONImpl(JSONStream* stream, bool ref) const { |
jsobj.AddProperty("static", is_static()); |
jsobj.AddProperty("const", is_const()); |
jsobj.AddProperty("optimizable", is_optimizable()); |
- jsobj.AddProperty("inlinable", IsInlineable()); |
+ jsobj.AddProperty("inlinable", CanBeInlined()); |
jsobj.AddProperty("unoptimizedCode", Object::Handle(unoptimized_code())); |
jsobj.AddProperty("usageCounter", usage_counter()); |
jsobj.AddProperty("optimizedCallSiteCount", optimized_call_site_count()); |
@@ -11137,7 +11076,7 @@ void DeoptInfo::ToInstructions(const Array& table, |
ASSERT(instructions->is_empty()); |
Smi& offset = Smi::Handle(); |
DeoptInfo& info = DeoptInfo::Handle(raw()); |
- Smi& reason = Smi::Handle(); |
+ Smi& reason_and_flags = Smi::Handle(); |
intptr_t index = 0; |
intptr_t length = TranslationLength(); |
while (index < length) { |
@@ -11149,7 +11088,8 @@ void DeoptInfo::ToInstructions(const Array& table, |
intptr_t info_number = 0; |
intptr_t suffix_length = |
DeoptInstr::DecodeSuffix(from_index, &info_number); |
- DeoptTable::GetEntry(table, info_number, &offset, &info, &reason); |
+ DeoptTable::GetEntry( |
+ table, info_number, &offset, &info, &reason_and_flags); |
length = info.TranslationLength(); |
index = length - suffix_length; |
} else { |
@@ -11925,8 +11865,9 @@ bool Code::HasBreakpoint() const { |
} |
-RawDeoptInfo* Code::GetDeoptInfoAtPc( |
- uword pc, ICData::DeoptReasonId* deopt_reason) const { |
+RawDeoptInfo* Code::GetDeoptInfoAtPc(uword pc, |
+ ICData::DeoptReasonId* deopt_reason, |
+ uint32_t* deopt_flags) const { |
ASSERT(is_optimized()); |
const Instructions& instrs = Instructions::Handle(instructions()); |
uword code_entry = instrs.EntryPoint(); |
@@ -11935,15 +11876,14 @@ RawDeoptInfo* Code::GetDeoptInfoAtPc( |
// Linear search for the PC offset matching the target PC. |
intptr_t length = DeoptTable::GetLength(table); |
Smi& offset = Smi::Handle(); |
- Smi& reason = Smi::Handle(); |
+ Smi& reason_and_flags = Smi::Handle(); |
DeoptInfo& info = DeoptInfo::Handle(); |
for (intptr_t i = 0; i < length; ++i) { |
- DeoptTable::GetEntry(table, i, &offset, &info, &reason); |
+ DeoptTable::GetEntry(table, i, &offset, &info, &reason_and_flags); |
if (pc == (code_entry + offset.Value())) { |
ASSERT(!info.IsNull()); |
- ASSERT((0 <= reason.Value()) && |
- (reason.Value() < ICData::kDeoptNumReasons)); |
- *deopt_reason = static_cast<ICData::DeoptReasonId>(reason.Value()); |
+ *deopt_reason = DeoptTable::ReasonField::decode(reason_and_flags.Value()); |
+ *deopt_flags = DeoptTable::FlagsField::decode(reason_and_flags.Value()); |
return info.raw(); |
} |
} |