| Index: src/profile-generator.cc
 | 
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
 | 
| index d030b681ec669b1d7e99ed26751fd23e0899a59a..385e753025b58c9c91e3798685b13a3a3e97dfa9 100644
 | 
| --- a/src/profile-generator.cc
 | 
| +++ b/src/profile-generator.cc
 | 
| @@ -112,8 +112,42 @@ void CodeEntry::FillFunctionInfo(SharedFunctionInfo* shared) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +DeoptInfo CodeEntry::GetDeoptInfo() {
 | 
| +  DCHECK(has_deopt_info());
 | 
| +
 | 
| +  DeoptInfo info;
 | 
| +  info.deopt_reason = deopt_reason_;
 | 
| +  if (inlined_function_infos_.empty()) {
 | 
| +    info.stack.push_back(DeoptInfo::Frame(
 | 
| +        {script_id_,
 | 
| +         static_cast<int>(position_ + deopt_position_.position())}));
 | 
| +    return info;
 | 
| +  }
 | 
| +  // Copy the only branch from the inlining tree where the deopt happened.
 | 
| +  SourcePosition position = deopt_position_;
 | 
| +  int inlining_id = InlinedFunctionInfo::kNoParentId;
 | 
| +  for (size_t i = 0; i < inlined_function_infos_.size(); ++i) {
 | 
| +    InlinedFunctionInfo& current_info = inlined_function_infos_.at(i);
 | 
| +    if (std::binary_search(current_info.deopt_pc_offsets.begin(),
 | 
| +                           current_info.deopt_pc_offsets.end(), pc_offset_)) {
 | 
| +      inlining_id = static_cast<int>(i);
 | 
| +      break;
 | 
| +    }
 | 
| +  }
 | 
| +  while (inlining_id != InlinedFunctionInfo::kNoParentId) {
 | 
| +    InlinedFunctionInfo& inlined_info = inlined_function_infos_.at(inlining_id);
 | 
| +    info.stack.push_back(DeoptInfo::Frame(
 | 
| +        {inlined_info.script_id,
 | 
| +         static_cast<int>(inlined_info.start_position + position.raw())}));
 | 
| +    position = inlined_info.inline_position;
 | 
| +    inlining_id = inlined_info.parent_id;
 | 
| +  }
 | 
| +  return info;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void ProfileNode::CollectDeoptInfo(CodeEntry* entry) {
 | 
| -  deopt_infos_.Add(DeoptInfo(entry->deopt_reason(), entry->deopt_position()));
 | 
| +  deopt_infos_.push_back(entry->GetDeoptInfo());
 | 
|    entry->clear_deopt_info();
 | 
|  }
 | 
|  
 | 
| @@ -181,14 +215,16 @@ void ProfileNode::Print(int indent) {
 | 
|    if (entry_->resource_name()[0] != '\0')
 | 
|      base::OS::Print(" %s:%d", entry_->resource_name(), entry_->line_number());
 | 
|    base::OS::Print("\n");
 | 
| -  for (auto info : deopt_infos_) {
 | 
| -    if (FLAG_hydrogen_track_positions) {
 | 
| -      base::OS::Print("%*s deopted at %d_%d with reason '%s'\n", indent + 10,
 | 
| -                      "", info.deopt_position.inlining_id(),
 | 
| -                      info.deopt_position.position(), info.deopt_reason);
 | 
| -    } else {
 | 
| -      base::OS::Print("%*s deopted at %d with reason '%s'\n", indent + 10, "",
 | 
| -                      info.deopt_position.raw(), info.deopt_reason);
 | 
| +  for (size_t i = 0; i < deopt_infos_.size(); ++i) {
 | 
| +    DeoptInfo& info = deopt_infos_[i];
 | 
| +    base::OS::Print(
 | 
| +        "%*s;;; deopted at script_id: %d position: %d with reason '%s'.\n",
 | 
| +        indent + 10, "", info.stack[0].script_id, info.stack[0].position,
 | 
| +        info.deopt_reason);
 | 
| +    for (size_t index = 1; index < info.stack.size(); ++index) {
 | 
| +      base::OS::Print("%*s;;;     Inline point: script_id %d position: %d.\n",
 | 
| +                      indent + 10, "", info.stack[index].script_id,
 | 
| +                      info.stack[index].position);
 | 
|      }
 | 
|    }
 | 
|    const char* bailout_reason = entry_->bailout_reason();
 | 
| 
 |