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 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 intptr_t num = 0; | 889 intptr_t num = 0; |
890 while ((frame != NULL)) { | 890 while ((frame != NULL)) { |
891 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString()); | 891 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString()); |
892 frame = iterator.NextFrame(); | 892 frame = iterator.NextFrame(); |
893 } | 893 } |
894 } | 894 } |
895 | 895 |
896 | 896 |
897 void ActivationFrame::VariableAt(intptr_t i, | 897 void ActivationFrame::VariableAt(intptr_t i, |
898 String* name, | 898 String* name, |
899 TokenPosition* token_pos, | 899 TokenPosition* declaration_token_pos, |
900 TokenPosition* end_pos, | 900 TokenPosition* visible_start_token_pos, |
| 901 TokenPosition* visible_end_token_pos, |
901 Object* value) { | 902 Object* value) { |
902 GetDescIndices(); | 903 GetDescIndices(); |
903 ASSERT(i < desc_indices_.length()); | 904 ASSERT(i < desc_indices_.length()); |
904 intptr_t desc_index = desc_indices_[i]; | 905 intptr_t desc_index = desc_indices_[i]; |
905 ASSERT(name != NULL); | 906 ASSERT(name != NULL); |
906 | 907 |
907 *name = var_descriptors_.GetName(desc_index); | 908 *name = var_descriptors_.GetName(desc_index); |
908 | 909 |
909 RawLocalVarDescriptors::VarInfo var_info; | 910 RawLocalVarDescriptors::VarInfo var_info; |
910 var_descriptors_.GetInfo(desc_index, &var_info); | 911 var_descriptors_.GetInfo(desc_index, &var_info); |
911 ASSERT(token_pos != NULL); | 912 ASSERT(declaration_token_pos != NULL); |
912 *token_pos = var_info.begin_pos; | 913 *declaration_token_pos = var_info.declaration_pos; |
913 ASSERT(end_pos != NULL); | 914 ASSERT(visible_start_token_pos != NULL); |
914 *end_pos = var_info.end_pos; | 915 *visible_start_token_pos = var_info.begin_pos; |
| 916 ASSERT(visible_end_token_pos != NULL); |
| 917 *visible_end_token_pos = var_info.end_pos; |
915 ASSERT(value != NULL); | 918 ASSERT(value != NULL); |
916 const int8_t kind = var_info.kind(); | 919 const int8_t kind = var_info.kind(); |
917 if (kind == RawLocalVarDescriptors::kStackVar) { | 920 if (kind == RawLocalVarDescriptors::kStackVar) { |
918 *value = GetStackVar(var_info.index()); | 921 *value = GetStackVar(var_info.index()); |
919 } else { | 922 } else { |
920 ASSERT(kind == RawLocalVarDescriptors::kContextVar); | 923 ASSERT(kind == RawLocalVarDescriptors::kContextVar); |
921 *value = GetContextVar(var_info.scope_id, var_info.index()); | 924 *value = GetContextVar(var_info.scope_id, var_info.index()); |
922 } | 925 } |
923 } | 926 } |
924 | 927 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 | 962 |
960 | 963 |
961 RawArray* ActivationFrame::GetLocalVariables() { | 964 RawArray* ActivationFrame::GetLocalVariables() { |
962 GetDescIndices(); | 965 GetDescIndices(); |
963 intptr_t num_variables = desc_indices_.length(); | 966 intptr_t num_variables = desc_indices_.length(); |
964 String& var_name = String::Handle(); | 967 String& var_name = String::Handle(); |
965 Object& value = Instance::Handle(); | 968 Object& value = Instance::Handle(); |
966 const Array& list = Array::Handle(Array::New(2 * num_variables)); | 969 const Array& list = Array::Handle(Array::New(2 * num_variables)); |
967 for (intptr_t i = 0; i < num_variables; i++) { | 970 for (intptr_t i = 0; i < num_variables; i++) { |
968 TokenPosition ignore; | 971 TokenPosition ignore; |
969 VariableAt(i, &var_name, &ignore, &ignore, &value); | 972 VariableAt(i, &var_name, &ignore, &ignore, &ignore, &value); |
970 list.SetAt(2 * i, var_name); | 973 list.SetAt(2 * i, var_name); |
971 list.SetAt((2 * i) + 1, value); | 974 list.SetAt((2 * i) + 1, value); |
972 } | 975 } |
973 return list.raw(); | 976 return list.raw(); |
974 } | 977 } |
975 | 978 |
976 | 979 |
977 RawObject* ActivationFrame::GetReceiver() { | 980 RawObject* ActivationFrame::GetReceiver() { |
978 GetDescIndices(); | 981 GetDescIndices(); |
979 intptr_t num_variables = desc_indices_.length(); | 982 intptr_t num_variables = desc_indices_.length(); |
980 String& var_name = String::Handle(); | 983 String& var_name = String::Handle(); |
981 Instance& value = Instance::Handle(); | 984 Instance& value = Instance::Handle(); |
982 for (intptr_t i = 0; i < num_variables; i++) { | 985 for (intptr_t i = 0; i < num_variables; i++) { |
983 TokenPosition ignore; | 986 TokenPosition ignore; |
984 VariableAt(i, &var_name, &ignore, &ignore, &value); | 987 VariableAt(i, &var_name, &ignore, &ignore, &ignore, &value); |
985 if (var_name.Equals(Symbols::This())) { | 988 if (var_name.Equals(Symbols::This())) { |
986 return value.raw(); | 989 return value.raw(); |
987 } | 990 } |
988 } | 991 } |
989 return Symbols::OptimizedOut().raw(); | 992 return Symbols::OptimizedOut().raw(); |
990 } | 993 } |
991 | 994 |
992 | 995 |
993 static bool IsSyntheticVariableName(const String& var_name) { | 996 static bool IsSyntheticVariableName(const String& var_name) { |
994 return (var_name.Length() >= 1) && (var_name.CharAt(0) == ':'); | 997 return (var_name.Length() >= 1) && (var_name.CharAt(0) == ':'); |
995 } | 998 } |
996 | 999 |
997 | 1000 |
998 static bool IsPrivateVariableName(const String& var_name) { | 1001 static bool IsPrivateVariableName(const String& var_name) { |
999 return (var_name.Length() >= 1) && (var_name.CharAt(0) == '_'); | 1002 return (var_name.Length() >= 1) && (var_name.CharAt(0) == '_'); |
1000 } | 1003 } |
1001 | 1004 |
1002 | 1005 |
1003 RawObject* ActivationFrame::Evaluate(const String& expr) { | 1006 RawObject* ActivationFrame::Evaluate(const String& expr) { |
1004 GetDescIndices(); | 1007 GetDescIndices(); |
1005 const GrowableObjectArray& param_names = | 1008 const GrowableObjectArray& param_names = |
1006 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 1009 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
1007 const GrowableObjectArray& param_values = | 1010 const GrowableObjectArray& param_values = |
1008 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 1011 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
1009 String& name = String::Handle(); | 1012 String& name = String::Handle(); |
1010 Object& value = Instance::Handle(); | 1013 Object& value = Instance::Handle(); |
1011 intptr_t num_variables = desc_indices_.length(); | 1014 intptr_t num_variables = desc_indices_.length(); |
1012 for (intptr_t i = 0; i < num_variables; i++) { | 1015 for (intptr_t i = 0; i < num_variables; i++) { |
1013 TokenPosition ignore; | 1016 TokenPosition ignore; |
1014 VariableAt(i, &name, &ignore, &ignore, &value); | 1017 VariableAt(i, &name, &ignore, &ignore, &ignore, &value); |
1015 if (!name.Equals(Symbols::This()) && !IsSyntheticVariableName(name)) { | 1018 if (!name.Equals(Symbols::This()) && !IsSyntheticVariableName(name)) { |
1016 if (IsPrivateVariableName(name)) { | 1019 if (IsPrivateVariableName(name)) { |
1017 name = String::ScrubName(name); | 1020 name = String::ScrubName(name); |
1018 } | 1021 } |
1019 param_names.Add(name); | 1022 param_names.Add(name); |
1020 param_values.Add(value); | 1023 param_values.Add(value); |
1021 } | 1024 } |
1022 } | 1025 } |
1023 | 1026 |
1024 if (function().is_static()) { | 1027 if (function().is_static()) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 // in the world where we pass the script as part of the | 1083 // in the world where we pass the script as part of the |
1081 // location. | 1084 // location. |
1082 jsobj->AddProperty("script", script, !full); | 1085 jsobj->AddProperty("script", script, !full); |
1083 } | 1086 } |
1084 { | 1087 { |
1085 JSONArray jsvars(jsobj, "vars"); | 1088 JSONArray jsvars(jsobj, "vars"); |
1086 const int num_vars = NumLocalVariables(); | 1089 const int num_vars = NumLocalVariables(); |
1087 for (intptr_t v = 0; v < num_vars; v++) { | 1090 for (intptr_t v = 0; v < num_vars; v++) { |
1088 String& var_name = String::Handle(); | 1091 String& var_name = String::Handle(); |
1089 Instance& var_value = Instance::Handle(); | 1092 Instance& var_value = Instance::Handle(); |
1090 TokenPosition token_pos; | 1093 TokenPosition declaration_token_pos; |
1091 TokenPosition end_token_pos; | 1094 TokenPosition visible_start_token_pos; |
1092 VariableAt(v, &var_name, &token_pos, &end_token_pos, &var_value); | 1095 TokenPosition visible_end_token_pos; |
| 1096 VariableAt(v, |
| 1097 &var_name, |
| 1098 &declaration_token_pos, |
| 1099 &visible_start_token_pos, |
| 1100 &visible_end_token_pos, |
| 1101 &var_value); |
1093 if (var_name.raw() != Symbols::AsyncOperation().raw()) { | 1102 if (var_name.raw() != Symbols::AsyncOperation().raw()) { |
1094 JSONObject jsvar(&jsvars); | 1103 JSONObject jsvar(&jsvars); |
1095 jsvar.AddProperty("type", "BoundVariable"); | 1104 jsvar.AddProperty("type", "BoundVariable"); |
1096 var_name = String::ScrubName(var_name); | 1105 var_name = String::ScrubName(var_name); |
1097 jsvar.AddProperty("name", var_name.ToCString()); | 1106 jsvar.AddProperty("name", var_name.ToCString()); |
1098 jsvar.AddProperty("value", var_value, !full); | 1107 jsvar.AddProperty("value", var_value, !full); |
1099 // TODO(turnidge): Do we really want to provide this on every | 1108 // Where was the variable declared? |
1100 // stack dump? Should be associated with the function object, I | 1109 jsvar.AddProperty("declarationTokenPos", declaration_token_pos); |
1101 // think, and not the stack frame. | 1110 // When the variable becomes visible to the scope. |
1102 jsvar.AddProperty("_tokenPos", token_pos); | 1111 jsvar.AddProperty("visibleStartTokenPos", visible_start_token_pos); |
1103 jsvar.AddProperty("_endTokenPos", end_token_pos); | 1112 // When the variable stops being visible to the scope. |
| 1113 jsvar.AddProperty("visibleEndTokenPos", visible_end_token_pos); |
1104 } | 1114 } |
1105 } | 1115 } |
1106 } | 1116 } |
1107 } | 1117 } |
1108 | 1118 |
1109 | 1119 |
1110 | 1120 |
1111 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) { | 1121 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) { |
1112 if (FLAG_show_invisible_frames || frame->function().is_visible()) { | 1122 if (FLAG_show_invisible_frames || frame->function().is_visible()) { |
1113 trace_.Add(frame); | 1123 trace_.Add(frame); |
(...skipping 2223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3337 | 3347 |
3338 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 3348 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
3339 ASSERT(bpt->next() == NULL); | 3349 ASSERT(bpt->next() == NULL); |
3340 bpt->set_next(code_breakpoints_); | 3350 bpt->set_next(code_breakpoints_); |
3341 code_breakpoints_ = bpt; | 3351 code_breakpoints_ = bpt; |
3342 } | 3352 } |
3343 | 3353 |
3344 #endif // !PRODUCT | 3354 #endif // !PRODUCT |
3345 | 3355 |
3346 } // namespace dart | 3356 } // namespace dart |
OLD | NEW |