| 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 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 } | 432 } |
| 433 ASSERT(!pc_desc_.IsNull()); | 433 ASSERT(!pc_desc_.IsNull()); |
| 434 intptr_t innermost_begin_pos = 0; | 434 intptr_t innermost_begin_pos = 0; |
| 435 intptr_t activation_token_pos = TokenPos(); | 435 intptr_t activation_token_pos = TokenPos(); |
| 436 ASSERT(activation_token_pos >= 0); | 436 ASSERT(activation_token_pos >= 0); |
| 437 GetVarDescriptors(); | 437 GetVarDescriptors(); |
| 438 intptr_t var_desc_len = var_descriptors_.Length(); | 438 intptr_t var_desc_len = var_descriptors_.Length(); |
| 439 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { | 439 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { |
| 440 RawLocalVarDescriptors::VarInfo var_info; | 440 RawLocalVarDescriptors::VarInfo var_info; |
| 441 var_descriptors_.GetInfo(cur_idx, &var_info); | 441 var_descriptors_.GetInfo(cur_idx, &var_info); |
| 442 if ((var_info.kind == RawLocalVarDescriptors::kContextLevel) && | 442 const int8_t kind = var_info.kind(); |
| 443 if ((kind == RawLocalVarDescriptors::kContextLevel) && |
| 443 (var_info.begin_pos <= activation_token_pos) && | 444 (var_info.begin_pos <= activation_token_pos) && |
| 444 (activation_token_pos < var_info.end_pos)) { | 445 (activation_token_pos < var_info.end_pos)) { |
| 445 // This var_descriptors_ entry is a context scope which is in scope | 446 // This var_descriptors_ entry is a context scope which is in scope |
| 446 // of the current token position. Now check whether it is shadowing | 447 // of the current token position. Now check whether it is shadowing |
| 447 // the previous context scope. | 448 // the previous context scope. |
| 448 if (innermost_begin_pos < var_info.begin_pos) { | 449 if (innermost_begin_pos < var_info.begin_pos) { |
| 449 innermost_begin_pos = var_info.begin_pos; | 450 innermost_begin_pos = var_info.begin_pos; |
| 450 context_level_ = var_info.index; | 451 context_level_ = var_info.index(); |
| 451 } | 452 } |
| 452 } | 453 } |
| 453 } | 454 } |
| 454 ASSERT(context_level_ >= 0); | 455 ASSERT(context_level_ >= 0); |
| 455 } | 456 } |
| 456 return context_level_; | 457 return context_level_; |
| 457 } | 458 } |
| 458 | 459 |
| 459 | 460 |
| 460 RawContext* ActivationFrame::GetSavedEntryContext() { | 461 RawContext* ActivationFrame::GetSavedEntryContext() { |
| 461 // Attempt to find a saved context. | 462 // Attempt to find a saved context. |
| 462 GetVarDescriptors(); | 463 GetVarDescriptors(); |
| 463 intptr_t var_desc_len = var_descriptors_.Length(); | 464 intptr_t var_desc_len = var_descriptors_.Length(); |
| 464 for (intptr_t i = 0; i < var_desc_len; i++) { | 465 for (intptr_t i = 0; i < var_desc_len; i++) { |
| 465 RawLocalVarDescriptors::VarInfo var_info; | 466 RawLocalVarDescriptors::VarInfo var_info; |
| 466 var_descriptors_.GetInfo(i, &var_info); | 467 var_descriptors_.GetInfo(i, &var_info); |
| 467 if (var_info.kind == RawLocalVarDescriptors::kSavedEntryContext) { | 468 const int8_t kind = var_info.kind(); |
| 469 if (kind == RawLocalVarDescriptors::kSavedEntryContext) { |
| 468 if (FLAG_trace_debugger_stacktrace) { | 470 if (FLAG_trace_debugger_stacktrace) { |
| 469 OS::PrintErr("\tFound saved entry ctx at index %" Pd "\n", | 471 OS::PrintErr("\tFound saved entry ctx at index %d\n", var_info.index()); |
| 470 var_info.index); | |
| 471 } | 472 } |
| 472 return GetLocalContextVar(var_info.index); | 473 return GetLocalContextVar(var_info.index()); |
| 473 } | 474 } |
| 474 } | 475 } |
| 475 | 476 |
| 476 // No saved context. Return the current context. | 477 // No saved context. Return the current context. |
| 477 return ctx_.raw(); | 478 return ctx_.raw(); |
| 478 } | 479 } |
| 479 | 480 |
| 480 | 481 |
| 481 // Get the saved context if the callee of this activation frame is a | 482 // Get the saved context if the callee of this activation frame is a |
| 482 // closure function. | 483 // closure function. |
| 483 RawContext* ActivationFrame::GetSavedCurrentContext() { | 484 RawContext* ActivationFrame::GetSavedCurrentContext() { |
| 484 GetVarDescriptors(); | 485 GetVarDescriptors(); |
| 485 intptr_t var_desc_len = var_descriptors_.Length(); | 486 intptr_t var_desc_len = var_descriptors_.Length(); |
| 486 for (intptr_t i = 0; i < var_desc_len; i++) { | 487 for (intptr_t i = 0; i < var_desc_len; i++) { |
| 487 RawLocalVarDescriptors::VarInfo var_info; | 488 RawLocalVarDescriptors::VarInfo var_info; |
| 488 var_descriptors_.GetInfo(i, &var_info); | 489 var_descriptors_.GetInfo(i, &var_info); |
| 489 if (var_info.kind == RawLocalVarDescriptors::kSavedCurrentContext) { | 490 const int8_t kind = var_info.kind(); |
| 491 if (kind == RawLocalVarDescriptors::kSavedCurrentContext) { |
| 490 if (FLAG_trace_debugger_stacktrace) { | 492 if (FLAG_trace_debugger_stacktrace) { |
| 491 OS::PrintErr("\tFound saved current ctx at index %" Pd "\n", | 493 OS::PrintErr("\tFound saved current ctx at index %d\n", |
| 492 var_info.index); | 494 var_info.index()); |
| 493 } | 495 } |
| 494 return GetLocalContextVar(var_info.index); | 496 return GetLocalContextVar(var_info.index()); |
| 495 } | 497 } |
| 496 } | 498 } |
| 497 UNREACHABLE(); | 499 UNREACHABLE(); |
| 498 return Context::null(); | 500 return Context::null(); |
| 499 } | 501 } |
| 500 | 502 |
| 501 | 503 |
| 502 const char* DebuggerEvent::EventTypeToCString(EventType type) { | 504 const char* DebuggerEvent::EventTypeToCString(EventType type) { |
| 503 switch (type) { | 505 switch (type) { |
| 504 case kBreakpointReached: | 506 case kBreakpointReached: |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 vars_initialized_ = true; | 591 vars_initialized_ = true; |
| 590 return; | 592 return; |
| 591 } | 593 } |
| 592 | 594 |
| 593 GrowableArray<String*> var_names(8); | 595 GrowableArray<String*> var_names(8); |
| 594 intptr_t var_desc_len = var_descriptors_.Length(); | 596 intptr_t var_desc_len = var_descriptors_.Length(); |
| 595 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { | 597 for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) { |
| 596 ASSERT(var_names.length() == desc_indices_.length()); | 598 ASSERT(var_names.length() == desc_indices_.length()); |
| 597 RawLocalVarDescriptors::VarInfo var_info; | 599 RawLocalVarDescriptors::VarInfo var_info; |
| 598 var_descriptors_.GetInfo(cur_idx, &var_info); | 600 var_descriptors_.GetInfo(cur_idx, &var_info); |
| 599 if ((var_info.kind != RawLocalVarDescriptors::kStackVar) && | 601 const int8_t kind = var_info.kind(); |
| 600 (var_info.kind != RawLocalVarDescriptors::kContextVar)) { | 602 if ((kind != RawLocalVarDescriptors::kStackVar) && |
| 603 (kind != RawLocalVarDescriptors::kContextVar)) { |
| 601 continue; | 604 continue; |
| 602 } | 605 } |
| 603 if ((var_info.begin_pos <= activation_token_pos) && | 606 if ((var_info.begin_pos <= activation_token_pos) && |
| 604 (activation_token_pos <= var_info.end_pos)) { | 607 (activation_token_pos <= var_info.end_pos)) { |
| 605 if ((var_info.kind == RawLocalVarDescriptors::kContextVar) && | 608 if ((kind == RawLocalVarDescriptors::kContextVar) && |
| 606 (ContextLevel() < var_info.scope_id)) { | 609 (ContextLevel() < var_info.scope_id)) { |
| 607 // The variable is textually in scope but the context level | 610 // The variable is textually in scope but the context level |
| 608 // at the activation frame's PC is lower than the context | 611 // at the activation frame's PC is lower than the context |
| 609 // level of the variable. The context containing the variable | 612 // level of the variable. The context containing the variable |
| 610 // has already been removed from the chain. This can happen when we | 613 // has already been removed from the chain. This can happen when we |
| 611 // break at a return statement, since the contexts get discarded | 614 // break at a return statement, since the contexts get discarded |
| 612 // before the debugger gets called. | 615 // before the debugger gets called. |
| 613 continue; | 616 continue; |
| 614 } | 617 } |
| 615 // The current variable is textually in scope. Now check whether | 618 // The current variable is textually in scope. Now check whether |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 intptr_t desc_index = desc_indices_[i]; | 749 intptr_t desc_index = desc_indices_[i]; |
| 747 ASSERT(name != NULL); | 750 ASSERT(name != NULL); |
| 748 *name ^= var_descriptors_.GetName(desc_index); | 751 *name ^= var_descriptors_.GetName(desc_index); |
| 749 RawLocalVarDescriptors::VarInfo var_info; | 752 RawLocalVarDescriptors::VarInfo var_info; |
| 750 var_descriptors_.GetInfo(desc_index, &var_info); | 753 var_descriptors_.GetInfo(desc_index, &var_info); |
| 751 ASSERT(token_pos != NULL); | 754 ASSERT(token_pos != NULL); |
| 752 *token_pos = var_info.begin_pos; | 755 *token_pos = var_info.begin_pos; |
| 753 ASSERT(end_pos != NULL); | 756 ASSERT(end_pos != NULL); |
| 754 *end_pos = var_info.end_pos; | 757 *end_pos = var_info.end_pos; |
| 755 ASSERT(value != NULL); | 758 ASSERT(value != NULL); |
| 756 if (var_info.kind == RawLocalVarDescriptors::kStackVar) { | 759 const int8_t kind = var_info.kind(); |
| 757 *value = GetLocalInstanceVar(var_info.index); | 760 if (kind == RawLocalVarDescriptors::kStackVar) { |
| 761 *value = GetLocalInstanceVar(var_info.index()); |
| 758 } else { | 762 } else { |
| 759 ASSERT(var_info.kind == RawLocalVarDescriptors::kContextVar); | 763 ASSERT(kind == RawLocalVarDescriptors::kContextVar); |
| 760 if (ctx_.IsNull()) { | 764 if (ctx_.IsNull()) { |
| 761 // The context has been removed by the optimizing compiler. | 765 // The context has been removed by the optimizing compiler. |
| 762 // | 766 // |
| 763 // TODO(turnidge): This may be erroneous. Revisit. | 767 // TODO(turnidge): This may be erroneous. Revisit. |
| 764 *value = Symbols::OptimizedOut().raw(); | 768 *value = Symbols::OptimizedOut().raw(); |
| 765 return; | 769 return; |
| 766 } | 770 } |
| 767 | 771 |
| 768 // The context level at the PC/token index of this activation frame. | 772 // The context level at the PC/token index of this activation frame. |
| 769 intptr_t frame_ctx_level = ContextLevel(); | 773 intptr_t frame_ctx_level = ContextLevel(); |
| 770 | 774 |
| 771 // The context level of the variable. | 775 // The context level of the variable. |
| 772 intptr_t var_ctx_level = var_info.scope_id; | 776 intptr_t var_ctx_level = var_info.scope_id; |
| 773 intptr_t level_diff = frame_ctx_level - var_ctx_level; | 777 intptr_t level_diff = frame_ctx_level - var_ctx_level; |
| 774 intptr_t ctx_slot = var_info.index; | 778 intptr_t ctx_slot = var_info.index(); |
| 775 if (level_diff == 0) { | 779 if (level_diff == 0) { |
| 776 if ((ctx_slot < 0) || | 780 if ((ctx_slot < 0) || |
| 777 (ctx_slot >= ctx_.num_variables())) { | 781 (ctx_slot >= ctx_.num_variables())) { |
| 778 PrintContextMismatchError(*name, ctx_slot, | 782 PrintContextMismatchError(*name, ctx_slot, |
| 779 frame_ctx_level, var_ctx_level); | 783 frame_ctx_level, var_ctx_level); |
| 780 } | 784 } |
| 781 ASSERT((ctx_slot >= 0) && (ctx_slot < ctx_.num_variables())); | 785 ASSERT((ctx_slot >= 0) && (ctx_slot < ctx_.num_variables())); |
| 782 *value = ctx_.At(ctx_slot); | 786 *value = ctx_.At(ctx_slot); |
| 783 } else { | 787 } else { |
| 784 ASSERT(level_diff > 0); | 788 ASSERT(level_diff > 0); |
| (...skipping 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2579 } | 2583 } |
| 2580 | 2584 |
| 2581 | 2585 |
| 2582 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 2586 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
| 2583 ASSERT(bpt->next() == NULL); | 2587 ASSERT(bpt->next() == NULL); |
| 2584 bpt->set_next(code_breakpoints_); | 2588 bpt->set_next(code_breakpoints_); |
| 2585 code_breakpoints_ = bpt; | 2589 code_breakpoints_ = bpt; |
| 2586 } | 2590 } |
| 2587 | 2591 |
| 2588 } // namespace dart | 2592 } // namespace dart |
| OLD | NEW |