| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 49a9d01b033d9885078ff393c4c3b5c73c4c7dd8..55255c276ae361065f02e75867b20da9b4d201f7 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -10984,6 +10984,87 @@ void PcDescriptors::Verify(const Function& function) const {
|
| }
|
|
|
|
|
| +TokenPosition CodeSourceMap::TokenPositionForPCOffset(
|
| + uword pc_offset) const {
|
| + Iterator iterator(*this);
|
| +
|
| + TokenPosition result = TokenPosition::kNoSource;
|
| +
|
| + while (iterator.MoveNext()) {
|
| + if (iterator.PcOffset() > pc_offset) {
|
| + break;
|
| + }
|
| + result = iterator.TokenPos();
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +
|
| +RawFunction* CodeSourceMap::FunctionForPCOffset(const Code& code,
|
| + const Function& function,
|
| + uword pc_offset) const {
|
| + GrowableArray<Function*> inlined_functions;
|
| + code.GetInlinedFunctionsAt(pc_offset, &inlined_functions);
|
| + if (inlined_functions.length() > 0) {
|
| + Function* inlined_function = inlined_functions[0];
|
| + return inlined_function->raw();
|
| + } else {
|
| + return function.raw();
|
| + }
|
| +}
|
| +
|
| +
|
| +RawScript* CodeSourceMap::ScriptForPCOffset(const Code& code,
|
| + const Function& function,
|
| + uword pc_offset) const {
|
| + const Function& func =
|
| + Function::Handle(FunctionForPCOffset(code, function, pc_offset));
|
| + return func.script();
|
| +}
|
| +
|
| +
|
| +void CodeSourceMap::Dump(const CodeSourceMap& code_source_map,
|
| + const Code& code,
|
| + const Function& function) {
|
| + const String& code_name = String::Handle(code.QualifiedName());
|
| + THR_Print("Dumping Code Source Map for %s\n", code_name.ToCString());
|
| + if (code_source_map.Length() == 0) {
|
| + THR_Print("<empty>\n");
|
| + return;
|
| + }
|
| +
|
| + const int addr_width = kBitsPerWord / 4;
|
| +
|
| + Iterator iterator(code_source_map);
|
| + Function& current_function = Function::Handle();
|
| + Script& current_script = Script::Handle();
|
| + TokenPosition tp;
|
| + while (iterator.MoveNext()) {
|
| + const uword pc_offset = iterator.PcOffset();
|
| + tp = code_source_map.TokenPositionForPCOffset(pc_offset);
|
| + current_function ^=
|
| + code_source_map.FunctionForPCOffset(code, function, pc_offset);
|
| + current_script ^=
|
| + code_source_map.ScriptForPCOffset(code, function, pc_offset);
|
| + if (current_function.IsNull() || current_script.IsNull()) {
|
| + THR_Print("%#-*" Px "\t%s\t%s\n", addr_width,
|
| + pc_offset,
|
| + tp.ToCString(),
|
| + code_name.ToCString());
|
| + continue;
|
| + }
|
| + const String& uri = String::Handle(current_script.url());
|
| + ASSERT(!uri.IsNull());
|
| + THR_Print("%#-*" Px "\t%s\t%s\t%s\n", addr_width,
|
| + pc_offset,
|
| + tp.ToCString(),
|
| + current_function.ToQualifiedCString(),
|
| + uri.ToCString());
|
| + }
|
| +}
|
| +
|
| +
|
| intptr_t CodeSourceMap::Length() const {
|
| return raw_ptr()->length_;
|
| }
|
|
|