OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 12741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12752 | 12752 |
12753 | 12753 |
12754 bool Code::HasBreakpoint() const { | 12754 bool Code::HasBreakpoint() const { |
12755 if (!FLAG_support_debugger) { | 12755 if (!FLAG_support_debugger) { |
12756 return false; | 12756 return false; |
12757 } | 12757 } |
12758 return Isolate::Current()->debugger()->HasBreakpoint(*this); | 12758 return Isolate::Current()->debugger()->HasBreakpoint(*this); |
12759 } | 12759 } |
12760 | 12760 |
12761 | 12761 |
| 12762 TokenPosition Code::GetTokenPositionAt(intptr_t offset) const { |
| 12763 const CodeSourceMap& map = CodeSourceMap::Handle(code_source_map()); |
| 12764 if (map.IsNull()) { |
| 12765 return TokenPosition::kNoSource; |
| 12766 } |
| 12767 return map.TokenPositionForPCOffset(offset); |
| 12768 } |
| 12769 |
| 12770 |
12762 RawTypedData* Code::GetDeoptInfoAtPc(uword pc, | 12771 RawTypedData* Code::GetDeoptInfoAtPc(uword pc, |
12763 ICData::DeoptReasonId* deopt_reason, | 12772 ICData::DeoptReasonId* deopt_reason, |
12764 uint32_t* deopt_flags) const { | 12773 uint32_t* deopt_flags) const { |
12765 ASSERT(is_optimized()); | 12774 ASSERT(is_optimized()); |
12766 const Instructions& instrs = Instructions::Handle(instructions()); | 12775 const Instructions& instrs = Instructions::Handle(instructions()); |
12767 uword code_entry = instrs.EntryPoint(); | 12776 uword code_entry = instrs.EntryPoint(); |
12768 const Array& table = Array::Handle(deopt_info_array()); | 12777 const Array& table = Array::Handle(deopt_info_array()); |
12769 if (table.IsNull()) { | 12778 if (table.IsNull()) { |
12770 ASSERT(Dart::IsRunningPrecompiledCode()); | 12779 ASSERT(Dart::IsRunningPrecompiledCode()); |
12771 return TypedData::null(); | 12780 return TypedData::null(); |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13356 if (map.IsNull() || (map.Length() == 0)) { | 13365 if (map.IsNull() || (map.Length() == 0)) { |
13357 return -1; | 13366 return -1; |
13358 } | 13367 } |
13359 Smi& smi = Smi::Handle(); | 13368 Smi& smi = Smi::Handle(); |
13360 smi ^= map.At(inlined_id); | 13369 smi ^= map.At(inlined_id); |
13361 return smi.Value(); | 13370 return smi.Value(); |
13362 } | 13371 } |
13363 | 13372 |
13364 | 13373 |
13365 void Code::GetInlinedFunctionsAt( | 13374 void Code::GetInlinedFunctionsAt( |
13366 intptr_t offset, GrowableArray<Function*>* fs) const { | 13375 intptr_t offset, |
| 13376 GrowableArray<Function*>* fs, |
| 13377 GrowableArray<TokenPosition>* token_positions) const { |
13367 fs->Clear(); | 13378 fs->Clear(); |
| 13379 if (token_positions != NULL) { |
| 13380 token_positions->Clear(); |
| 13381 } |
13368 const Array& intervals = Array::Handle(GetInlinedIntervals()); | 13382 const Array& intervals = Array::Handle(GetInlinedIntervals()); |
13369 if (intervals.IsNull() || (intervals.Length() == 0)) { | 13383 if (intervals.IsNull() || (intervals.Length() == 0)) { |
13370 // E.g., for code stubs. | 13384 // E.g., for code stubs. |
13371 return; | 13385 return; |
13372 } | 13386 } |
13373 // First find the right interval. TODO(srdjan): use binary search since | 13387 // First find the right interval. TODO(srdjan): use binary search since |
13374 // intervals are sorted. | 13388 // intervals are sorted. |
13375 Smi& start = Smi::Handle(); | 13389 Smi& start = Smi::Handle(); |
13376 Smi& end = Smi::Handle(); | 13390 Smi& end = Smi::Handle(); |
13377 intptr_t found_interval_ix = intervals.Length() - Code::kInlIntNumEntries; | 13391 intptr_t found_interval_ix = intervals.Length() - Code::kInlIntNumEntries; |
13378 for (intptr_t i = 0; i < intervals.Length() - Code::kInlIntNumEntries; | 13392 for (intptr_t i = 0; i < intervals.Length() - Code::kInlIntNumEntries; |
13379 i += Code::kInlIntNumEntries) { | 13393 i += Code::kInlIntNumEntries) { |
13380 start ^= intervals.At(i + Code::kInlIntStart); | 13394 start ^= intervals.At(i + Code::kInlIntStart); |
13381 if (!start.IsNull()) { | 13395 if (!start.IsNull()) { |
13382 end ^= intervals.At(i + Code::kInlIntNumEntries + Code::kInlIntStart); | 13396 end ^= intervals.At(i + Code::kInlIntNumEntries + Code::kInlIntStart); |
13383 if ((start.Value() <= offset) && (offset < end.Value())) { | 13397 if ((start.Value() <= offset) && (offset < end.Value())) { |
13384 found_interval_ix = i; | 13398 found_interval_ix = i; |
13385 break; | 13399 break; |
13386 } | 13400 } |
13387 } | 13401 } |
13388 } | 13402 } |
13389 | 13403 |
13390 // Find all functions. | 13404 // Find all functions. |
13391 const Array& id_map = Array::Handle(GetInlinedIdToFunction()); | 13405 const Array& id_map = Array::Handle(GetInlinedIdToFunction()); |
| 13406 const Array& token_pos_map = Array::Handle(GetInlinedIdToTokenPos()); |
13392 Smi& temp_smi = Smi::Handle(); | 13407 Smi& temp_smi = Smi::Handle(); |
13393 temp_smi ^= intervals.At(found_interval_ix + Code::kInlIntInliningId); | 13408 temp_smi ^= intervals.At(found_interval_ix + Code::kInlIntInliningId); |
13394 intptr_t inlining_id = temp_smi.Value(); | 13409 intptr_t inlining_id = temp_smi.Value(); |
13395 ASSERT(inlining_id >= 0); | 13410 ASSERT(inlining_id >= 0); |
13396 intptr_t caller_id = GetCallerId(inlining_id); | 13411 intptr_t caller_id = GetCallerId(inlining_id); |
13397 while (inlining_id >= 0) { | 13412 while (inlining_id >= 0) { |
13398 Function& function = Function::ZoneHandle(); | 13413 Function& function = Function::ZoneHandle(); |
13399 function ^= id_map.At(inlining_id); | 13414 function ^= id_map.At(inlining_id); |
13400 fs->Add(&function); | 13415 fs->Add(&function); |
| 13416 if ((token_positions != NULL) && (inlining_id < token_pos_map.Length())) { |
| 13417 temp_smi ^= token_pos_map.At(inlining_id); |
| 13418 token_positions->Add(TokenPosition(temp_smi.Value())); |
| 13419 } |
13401 inlining_id = caller_id; | 13420 inlining_id = caller_id; |
13402 caller_id = GetCallerId(inlining_id); | 13421 caller_id = GetCallerId(inlining_id); |
13403 } | 13422 } |
13404 } | 13423 } |
13405 | 13424 |
13406 | 13425 |
13407 void Code::DumpInlinedIntervals() const { | 13426 void Code::DumpInlinedIntervals() const { |
13408 LogBlock lb; | 13427 LogBlock lb; |
13409 THR_Print("Inlined intervals:\n"); | 13428 THR_Print("Inlined intervals:\n"); |
13410 const Array& intervals = Array::Handle(GetInlinedIntervals()); | 13429 const Array& intervals = Array::Handle(GetInlinedIntervals()); |
(...skipping 8248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21659 return UserTag::null(); | 21678 return UserTag::null(); |
21660 } | 21679 } |
21661 | 21680 |
21662 | 21681 |
21663 const char* UserTag::ToCString() const { | 21682 const char* UserTag::ToCString() const { |
21664 const String& tag_label = String::Handle(label()); | 21683 const String& tag_label = String::Handle(label()); |
21665 return tag_label.ToCString(); | 21684 return tag_label.ToCString(); |
21666 } | 21685 } |
21667 | 21686 |
21668 } // namespace dart | 21687 } // namespace dart |
OLD | NEW |