Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 32f70302d97eeadde72b515a5742568d4776885b..ad209ff3f06f282cfd6de72b7c6d59ef70d64f90 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -5098,7 +5098,8 @@ void Function::ClearCode() const { |
void Function::SwitchToUnoptimizedCode() const { |
ASSERT(HasOptimizedCode()); |
- const Code& current_code = Code::Handle(CurrentCode()); |
+ Isolate* isolate = Isolate::Current(); |
+ const Code& current_code = Code::Handle(isolate, CurrentCode()); |
if (FLAG_trace_disabling_optimized_code) { |
OS::Print("Disabling optimized code: '%s' entry: %#" Px "\n", |
@@ -5108,8 +5109,9 @@ void Function::SwitchToUnoptimizedCode() const { |
// Patch entry of the optimized code. |
CodePatcher::PatchEntry(current_code); |
// Use previously compiled unoptimized code. |
- AttachCode(Code::Handle(unoptimized_code())); |
- CodePatcher::RestoreEntry(Code::Handle(unoptimized_code())); |
+ AttachCode(Code::Handle(isolate, unoptimized_code())); |
+ CodePatcher::RestoreEntry(Code::Handle(isolate, unoptimized_code())); |
+ isolate->TrackDeoptimizedCode(current_code); |
} |
@@ -12555,6 +12557,47 @@ void Code::PrintJSONImpl(JSONStream* stream, bool ref) const { |
JSONObject desc(&jsobj, "descriptors"); |
descriptors.PrintToJSONObject(&desc, false); |
} |
+ const Array& inlined_function_table = Array::Handle(inlined_id_to_function()); |
+ if (!inlined_function_table.IsNull()) { |
+ JSONArray inlined_functions(&jsobj, "inlinedFunctions"); |
+ Function& function = Function::Handle(); |
+ for (intptr_t i = 0; i < inlined_function_table.Length(); i++) { |
+ function ^= inlined_function_table.At(i); |
+ ASSERT(!function.IsNull()); |
+ inlined_functions.AddValue(function); |
+ } |
+ } |
+ const Array& intervals = Array::Handle(inlined_intervals()); |
+ if (!intervals.IsNull()) { |
+ Smi& start = Smi::Handle(); |
+ Smi& end = Smi::Handle(); |
+ Smi& temp_smi = Smi::Handle(); |
+ JSONArray inline_intervals(&jsobj, "inlinedIntervals"); |
+ for (intptr_t i = 0; i < intervals.Length() - Code::kInlIntNumEntries; |
+ i += Code::kInlIntNumEntries) { |
+ start ^= intervals.At(i + Code::kInlIntStart); |
+ if (start.IsNull()) { |
+ continue; |
+ } |
+ end ^= intervals.At(i + Code::kInlIntNumEntries + Code::kInlIntStart); |
+ |
+ // Format: [start, end, inline functions...] |
+ JSONArray inline_interval(&inline_intervals); |
+ inline_interval.AddValue(start.Value()); |
+ inline_interval.AddValue(end.Value()); |
+ |
+ temp_smi ^= intervals.At(i + Code::kInlIntInliningId); |
+ intptr_t inlining_id = temp_smi.Value(); |
+ ASSERT(inlining_id >= 0); |
+ temp_smi ^= intervals.At(i + Code::kInlIntCallerId); |
+ intptr_t caller_id = temp_smi.Value(); |
+ while (inlining_id >= 0) { |
+ inline_interval.AddValue(inlining_id); |
+ inlining_id = caller_id; |
+ caller_id = GetCallerId(inlining_id); |
+ } |
+ } |
+ } |
} |