| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 11de55fb370d6ae092d04b3d981a094e0e1b0343..37f707a095b1ec08bda63b32767c57c4566135b3 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -12759,6 +12759,15 @@ bool Code::HasBreakpoint() const {
|
| }
|
|
|
|
|
| +TokenPosition Code::GetTokenPositionAt(intptr_t offset) const {
|
| + const CodeSourceMap& map = CodeSourceMap::Handle(code_source_map());
|
| + if (map.IsNull()) {
|
| + return TokenPosition::kNoSource;
|
| + }
|
| + return map.TokenPositionForPCOffset(offset);
|
| +}
|
| +
|
| +
|
| RawTypedData* Code::GetDeoptInfoAtPc(uword pc,
|
| ICData::DeoptReasonId* deopt_reason,
|
| uint32_t* deopt_flags) const {
|
| @@ -13363,8 +13372,13 @@ intptr_t Code::GetCallerId(intptr_t inlined_id) const {
|
|
|
|
|
| void Code::GetInlinedFunctionsAt(
|
| - intptr_t offset, GrowableArray<Function*>* fs) const {
|
| + intptr_t offset,
|
| + GrowableArray<Function*>* fs,
|
| + GrowableArray<TokenPosition>* token_positions) const {
|
| fs->Clear();
|
| + if (token_positions != NULL) {
|
| + token_positions->Clear();
|
| + }
|
| const Array& intervals = Array::Handle(GetInlinedIntervals());
|
| if (intervals.IsNull() || (intervals.Length() == 0)) {
|
| // E.g., for code stubs.
|
| @@ -13389,6 +13403,7 @@ void Code::GetInlinedFunctionsAt(
|
|
|
| // Find all functions.
|
| const Array& id_map = Array::Handle(GetInlinedIdToFunction());
|
| + const Array& token_pos_map = Array::Handle(GetInlinedIdToTokenPos());
|
| Smi& temp_smi = Smi::Handle();
|
| temp_smi ^= intervals.At(found_interval_ix + Code::kInlIntInliningId);
|
| intptr_t inlining_id = temp_smi.Value();
|
| @@ -13396,8 +13411,12 @@ void Code::GetInlinedFunctionsAt(
|
| intptr_t caller_id = GetCallerId(inlining_id);
|
| while (inlining_id >= 0) {
|
| Function& function = Function::ZoneHandle();
|
| - function ^= id_map.At(inlining_id);
|
| + function ^= id_map.At(inlining_id);
|
| fs->Add(&function);
|
| + if ((token_positions != NULL) && (inlining_id < token_pos_map.Length())) {
|
| + temp_smi ^= token_pos_map.At(inlining_id);
|
| + token_positions->Add(TokenPosition(temp_smi.Value()));
|
| + }
|
| inlining_id = caller_id;
|
| caller_id = GetCallerId(inlining_id);
|
| }
|
|
|