Chromium Code Reviews| 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/debugger.h" | 5 #include "vm/debugger.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 | 8 |
| 9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
| 10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 440 } | 440 } |
| 441 ASSERT(!pc_desc_.IsNull()); | 441 ASSERT(!pc_desc_.IsNull()); |
| 442 intptr_t innermost_begin_pos = 0; | 442 intptr_t innermost_begin_pos = 0; |
| 443 intptr_t activation_token_pos = TokenPos(); | 443 intptr_t activation_token_pos = TokenPos(); |
| 444 ASSERT(activation_token_pos >= 0); | 444 ASSERT(activation_token_pos >= 0); |
| 445 GetVarDescriptors(); | 445 GetVarDescriptors(); |
| 446 intptr_t var_desc_len = var_descriptors_.Length(); | 446 intptr_t var_desc_len = var_descriptors_.Length(); |
| 447 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { | 447 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { |
| 448 RawLocalVarDescriptors::VarInfo var_info; | 448 RawLocalVarDescriptors::VarInfo var_info; |
| 449 var_descriptors_.GetInfo(cur_idx, &var_info); | 449 var_descriptors_.GetInfo(cur_idx, &var_info); |
| 450 if ((var_info.kind == RawLocalVarDescriptors::kContextLevel) && | 450 const int8_t kind = |
| 451 RawLocalVarDescriptors::KindBits::decode(var_info.index_kind); | |
|
Ivan Posva
2014/07/23 12:23:26
Wouldn't this read better if it was
const int8_t
zra
2014/08/20 22:13:56
Done and also added set_kind() and set_index()
| |
| 452 if ((kind == RawLocalVarDescriptors::kContextLevel) && | |
| 451 (var_info.begin_pos <= activation_token_pos) && | 453 (var_info.begin_pos <= activation_token_pos) && |
| 452 (activation_token_pos < var_info.end_pos)) { | 454 (activation_token_pos < var_info.end_pos)) { |
| 453 // This var_descriptors_ entry is a context scope which is in scope | 455 // This var_descriptors_ entry is a context scope which is in scope |
| 454 // of the current token position. Now check whether it is shadowing | 456 // of the current token position. Now check whether it is shadowing |
| 455 // the previous context scope. | 457 // the previous context scope. |
| 456 if (innermost_begin_pos < var_info.begin_pos) { | 458 if (innermost_begin_pos < var_info.begin_pos) { |
| 457 innermost_begin_pos = var_info.begin_pos; | 459 innermost_begin_pos = var_info.begin_pos; |
| 458 context_level_ = var_info.index; | 460 context_level_ = |
| 461 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind); | |
|
Ivan Posva
2014/07/23 12:23:27
ditto
zra
2014/08/20 22:13:56
Done.
| |
| 459 } | 462 } |
| 460 } | 463 } |
| 461 } | 464 } |
| 462 ASSERT(context_level_ >= 0); | 465 ASSERT(context_level_ >= 0); |
| 463 } | 466 } |
| 464 return context_level_; | 467 return context_level_; |
| 465 } | 468 } |
| 466 | 469 |
| 467 | 470 |
| 468 RawContext* ActivationFrame::GetSavedEntryContext() { | 471 RawContext* ActivationFrame::GetSavedEntryContext() { |
| 469 // Attempt to find a saved context. | 472 // Attempt to find a saved context. |
| 470 GetVarDescriptors(); | 473 GetVarDescriptors(); |
| 471 intptr_t var_desc_len = var_descriptors_.Length(); | 474 intptr_t var_desc_len = var_descriptors_.Length(); |
| 472 for (intptr_t i = 0; i < var_desc_len; i++) { | 475 for (intptr_t i = 0; i < var_desc_len; i++) { |
| 473 RawLocalVarDescriptors::VarInfo var_info; | 476 RawLocalVarDescriptors::VarInfo var_info; |
| 474 var_descriptors_.GetInfo(i, &var_info); | 477 var_descriptors_.GetInfo(i, &var_info); |
| 475 if (var_info.kind == RawLocalVarDescriptors::kSavedEntryContext) { | 478 const int8_t kind = |
| 479 RawLocalVarDescriptors::KindBits::decode(var_info.index_kind); | |
| 480 if (kind == RawLocalVarDescriptors::kSavedEntryContext) { | |
| 476 if (FLAG_trace_debugger_stacktrace) { | 481 if (FLAG_trace_debugger_stacktrace) { |
| 477 OS::PrintErr("\tFound saved entry ctx at index %" Pd "\n", | 482 OS::PrintErr("\tFound saved entry ctx at index %d\n", |
| 478 var_info.index); | 483 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind)); |
| 479 } | 484 } |
| 480 return GetLocalContextVar(var_info.index); | 485 return GetLocalContextVar( |
| 486 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind)); | |
| 481 } | 487 } |
| 482 } | 488 } |
| 483 | 489 |
| 484 // No saved context. Return the current context. | 490 // No saved context. Return the current context. |
| 485 return ctx_.raw(); | 491 return ctx_.raw(); |
| 486 } | 492 } |
| 487 | 493 |
| 488 | 494 |
| 489 // Get the saved context if the callee of this activation frame is a | 495 // Get the saved context if the callee of this activation frame is a |
| 490 // closure function. | 496 // closure function. |
| 491 RawContext* ActivationFrame::GetSavedCurrentContext() { | 497 RawContext* ActivationFrame::GetSavedCurrentContext() { |
| 492 GetVarDescriptors(); | 498 GetVarDescriptors(); |
| 493 intptr_t var_desc_len = var_descriptors_.Length(); | 499 intptr_t var_desc_len = var_descriptors_.Length(); |
| 494 for (intptr_t i = 0; i < var_desc_len; i++) { | 500 for (intptr_t i = 0; i < var_desc_len; i++) { |
| 495 RawLocalVarDescriptors::VarInfo var_info; | 501 RawLocalVarDescriptors::VarInfo var_info; |
| 496 var_descriptors_.GetInfo(i, &var_info); | 502 var_descriptors_.GetInfo(i, &var_info); |
| 497 if (var_info.kind == RawLocalVarDescriptors::kSavedCurrentContext) { | 503 const int8_t kind = |
| 504 RawLocalVarDescriptors::KindBits::decode(var_info.index_kind); | |
| 505 if (kind == RawLocalVarDescriptors::kSavedCurrentContext) { | |
| 498 if (FLAG_trace_debugger_stacktrace) { | 506 if (FLAG_trace_debugger_stacktrace) { |
| 499 OS::PrintErr("\tFound saved current ctx at index %" Pd "\n", | 507 OS::PrintErr("\tFound saved current ctx at index %d\n", |
| 500 var_info.index); | 508 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind)); |
| 501 } | 509 } |
| 502 return GetLocalContextVar(var_info.index); | 510 return GetLocalContextVar( |
| 511 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind)); | |
| 503 } | 512 } |
| 504 } | 513 } |
| 505 UNREACHABLE(); | 514 UNREACHABLE(); |
| 506 return Context::null(); | 515 return Context::null(); |
| 507 } | 516 } |
| 508 | 517 |
| 509 | 518 |
| 510 const char* DebuggerEvent::EventTypeToCString(EventType type) { | 519 const char* DebuggerEvent::EventTypeToCString(EventType type) { |
| 511 switch (type) { | 520 switch (type) { |
| 512 case kBreakpointReached: | 521 case kBreakpointReached: |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 596 vars_initialized_ = true; | 605 vars_initialized_ = true; |
| 597 return; | 606 return; |
| 598 } | 607 } |
| 599 | 608 |
| 600 GrowableArray<String*> var_names(8); | 609 GrowableArray<String*> var_names(8); |
| 601 intptr_t var_desc_len = var_descriptors_.Length(); | 610 intptr_t var_desc_len = var_descriptors_.Length(); |
| 602 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { | 611 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { |
| 603 ASSERT(var_names.length() == desc_indices_.length()); | 612 ASSERT(var_names.length() == desc_indices_.length()); |
| 604 RawLocalVarDescriptors::VarInfo var_info; | 613 RawLocalVarDescriptors::VarInfo var_info; |
| 605 var_descriptors_.GetInfo(cur_idx, &var_info); | 614 var_descriptors_.GetInfo(cur_idx, &var_info); |
| 606 if ((var_info.kind != RawLocalVarDescriptors::kStackVar) && | 615 const int8_t kind = |
| 607 (var_info.kind != RawLocalVarDescriptors::kContextVar)) { | 616 RawLocalVarDescriptors::KindBits::decode(var_info.index_kind); |
| 617 if ((kind != RawLocalVarDescriptors::kStackVar) && | |
| 618 (kind != RawLocalVarDescriptors::kContextVar)) { | |
| 608 continue; | 619 continue; |
| 609 } | 620 } |
| 610 if ((var_info.begin_pos <= activation_token_pos) && | 621 if ((var_info.begin_pos <= activation_token_pos) && |
| 611 (activation_token_pos <= var_info.end_pos)) { | 622 (activation_token_pos <= var_info.end_pos)) { |
| 612 if ((var_info.kind == RawLocalVarDescriptors::kContextVar) && | 623 if ((kind == RawLocalVarDescriptors::kContextVar) && |
| 613 (ContextLevel() < var_info.scope_id)) { | 624 (ContextLevel() < var_info.scope_id)) { |
| 614 // The variable is textually in scope but the context level | 625 // The variable is textually in scope but the context level |
| 615 // at the activation frame's PC is lower than the context | 626 // at the activation frame's PC is lower than the context |
| 616 // level of the variable. The context containing the variable | 627 // level of the variable. The context containing the variable |
| 617 // has already been removed from the chain. This can happen when we | 628 // has already been removed from the chain. This can happen when we |
| 618 // break at a return statement, since the contexts get discarded | 629 // break at a return statement, since the contexts get discarded |
| 619 // before the debugger gets called. | 630 // before the debugger gets called. |
| 620 continue; | 631 continue; |
| 621 } | 632 } |
| 622 // The current variable is textually in scope. Now check whether | 633 // The current variable is textually in scope. Now check whether |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 753 intptr_t desc_index = desc_indices_[i]; | 764 intptr_t desc_index = desc_indices_[i]; |
| 754 ASSERT(name != NULL); | 765 ASSERT(name != NULL); |
| 755 *name ^= var_descriptors_.GetName(desc_index); | 766 *name ^= var_descriptors_.GetName(desc_index); |
| 756 RawLocalVarDescriptors::VarInfo var_info; | 767 RawLocalVarDescriptors::VarInfo var_info; |
| 757 var_descriptors_.GetInfo(desc_index, &var_info); | 768 var_descriptors_.GetInfo(desc_index, &var_info); |
| 758 ASSERT(token_pos != NULL); | 769 ASSERT(token_pos != NULL); |
| 759 *token_pos = var_info.begin_pos; | 770 *token_pos = var_info.begin_pos; |
| 760 ASSERT(end_pos != NULL); | 771 ASSERT(end_pos != NULL); |
| 761 *end_pos = var_info.end_pos; | 772 *end_pos = var_info.end_pos; |
| 762 ASSERT(value != NULL); | 773 ASSERT(value != NULL); |
| 763 if (var_info.kind == RawLocalVarDescriptors::kStackVar) { | 774 const int8_t kind = |
| 764 *value = GetLocalInstanceVar(var_info.index); | 775 RawLocalVarDescriptors::KindBits::decode(var_info.index_kind); |
| 776 if (kind == RawLocalVarDescriptors::kStackVar) { | |
| 777 *value = GetLocalInstanceVar( | |
| 778 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind)); | |
| 765 } else { | 779 } else { |
| 766 ASSERT(var_info.kind == RawLocalVarDescriptors::kContextVar); | 780 ASSERT(kind == RawLocalVarDescriptors::kContextVar); |
| 767 if (ctx_.IsNull()) { | 781 if (ctx_.IsNull()) { |
| 768 // The context has been removed by the optimizing compiler. | 782 // The context has been removed by the optimizing compiler. |
| 769 // | 783 // |
| 770 // TODO(turnidge): This may be erroneous. Revisit. | 784 // TODO(turnidge): This may be erroneous. Revisit. |
| 771 *value = Symbols::OptimizedOut().raw(); | 785 *value = Symbols::OptimizedOut().raw(); |
| 772 return; | 786 return; |
| 773 } | 787 } |
| 774 | 788 |
| 775 // The context level at the PC/token index of this activation frame. | 789 // The context level at the PC/token index of this activation frame. |
| 776 intptr_t frame_ctx_level = ContextLevel(); | 790 intptr_t frame_ctx_level = ContextLevel(); |
| 777 | 791 |
| 778 // The context level of the variable. | 792 // The context level of the variable. |
| 779 intptr_t var_ctx_level = var_info.scope_id; | 793 intptr_t var_ctx_level = var_info.scope_id; |
| 780 intptr_t level_diff = frame_ctx_level - var_ctx_level; | 794 intptr_t level_diff = frame_ctx_level - var_ctx_level; |
| 781 intptr_t ctx_slot = var_info.index; | 795 intptr_t ctx_slot = |
| 796 RawLocalVarDescriptors::IndexBits::decode(var_info.index_kind); | |
| 782 if (level_diff == 0) { | 797 if (level_diff == 0) { |
| 783 if ((ctx_slot < 0) || | 798 if ((ctx_slot < 0) || |
| 784 (ctx_slot >= ctx_.num_variables())) { | 799 (ctx_slot >= ctx_.num_variables())) { |
| 785 PrintContextMismatchError(*name, ctx_slot, | 800 PrintContextMismatchError(*name, ctx_slot, |
| 786 frame_ctx_level, var_ctx_level); | 801 frame_ctx_level, var_ctx_level); |
| 787 } | 802 } |
| 788 ASSERT((ctx_slot >= 0) && (ctx_slot < ctx_.num_variables())); | 803 ASSERT((ctx_slot >= 0) && (ctx_slot < ctx_.num_variables())); |
| 789 *value = ctx_.At(ctx_slot); | 804 *value = ctx_.At(ctx_slot); |
| 790 } else { | 805 } else { |
| 791 ASSERT(level_diff > 0); | 806 ASSERT(level_diff > 0); |
| (...skipping 1792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2584 } | 2599 } |
| 2585 | 2600 |
| 2586 | 2601 |
| 2587 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 2602 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
| 2588 ASSERT(bpt->next() == NULL); | 2603 ASSERT(bpt->next() == NULL); |
| 2589 bpt->set_next(code_breakpoints_); | 2604 bpt->set_next(code_breakpoints_); |
| 2590 code_breakpoints_ = bpt; | 2605 code_breakpoints_ = bpt; |
| 2591 } | 2606 } |
| 2592 | 2607 |
| 2593 } // namespace dart | 2608 } // namespace dart |
| OLD | NEW |