| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/service.h" | 5 #include "vm/service.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/globals.h" | 8 #include "platform/globals.h" |
| 9 | 9 |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 // TODO(johnmccutchan): Support asynchronous replies. | 679 // TODO(johnmccutchan): Support asynchronous replies. |
| 680 js.PostReply(); | 680 js.PostReply(); |
| 681 } | 681 } |
| 682 } | 682 } |
| 683 } | 683 } |
| 684 } | 684 } |
| 685 } | 685 } |
| 686 | 686 |
| 687 | 687 |
| 688 static bool HandleIsolate(Isolate* isolate, JSONStream* js) { | 688 static bool HandleIsolate(Isolate* isolate, JSONStream* js) { |
| 689 isolate->PrintToJSONStream(js, false); | 689 isolate->PrintJSON(js, false); |
| 690 return true; | 690 return true; |
| 691 } | 691 } |
| 692 | 692 |
| 693 | 693 |
| 694 static bool HandleStackTrace(Isolate* isolate, JSONStream* js) { | 694 static bool HandleStackTrace(Isolate* isolate, JSONStream* js) { |
| 695 if (js->num_arguments() > 1) { | 695 if (js->num_arguments() > 1) { |
| 696 PrintError(js, "Command too long"); | 696 PrintError(js, "Command too long"); |
| 697 return true; | 697 return true; |
| 698 } | 698 } |
| 699 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); | 699 DebuggerStackTrace* stack = isolate->debugger()->StackTrace(); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 js->num_arguments()); | 879 js->num_arguments()); |
| 880 return true; | 880 return true; |
| 881 } | 881 } |
| 882 const String& expr_str = String::Handle(isolate, String::New(expr)); | 882 const String& expr_str = String::Handle(isolate, String::New(expr)); |
| 883 ASSERT(obj.IsInstance()); | 883 ASSERT(obj.IsInstance()); |
| 884 const Instance& instance = Instance::Cast(obj); | 884 const Instance& instance = Instance::Cast(obj); |
| 885 const Object& result = | 885 const Object& result = |
| 886 Object::Handle(instance.Evaluate(expr_str, | 886 Object::Handle(instance.Evaluate(expr_str, |
| 887 Array::empty_array(), | 887 Array::empty_array(), |
| 888 Array::empty_array())); | 888 Array::empty_array())); |
| 889 if (result.IsNull()) { | 889 result.PrintJSON(js, true); |
| 890 Object::null_instance().PrintToJSONStream(js, true); | |
| 891 } else { | |
| 892 result.PrintToJSONStream(js, true); | |
| 893 } | |
| 894 return true; | 890 return true; |
| 895 } | 891 } |
| 896 | 892 |
| 897 PrintError(js, "unrecognized action '%s'\n", action); | 893 PrintError(js, "unrecognized action '%s'\n", action); |
| 898 return true; | 894 return true; |
| 899 } | 895 } |
| 900 | 896 |
| 901 | 897 |
| 902 static bool HandleClassesClosures(Isolate* isolate, const Class& cls, | 898 static bool HandleClassesClosures(Isolate* isolate, const Class& cls, |
| 903 JSONStream* js) { | 899 JSONStream* js) { |
| 904 intptr_t id; | 900 intptr_t id; |
| 905 if (js->num_arguments() > 4) { | 901 if (js->num_arguments() > 4) { |
| 906 PrintError(js, "Command too long"); | 902 PrintError(js, "Command too long"); |
| 907 return true; | 903 return true; |
| 908 } | 904 } |
| 909 if (!GetIntegerId(js->GetArgument(3), &id)) { | 905 if (!GetIntegerId(js->GetArgument(3), &id)) { |
| 910 PrintError(js, "Must specify collection object id: closures/id"); | 906 PrintError(js, "Must specify collection object id: closures/id"); |
| 911 return true; | 907 return true; |
| 912 } | 908 } |
| 913 Function& func = Function::Handle(); | 909 Function& func = Function::Handle(); |
| 914 func ^= cls.ClosureFunctionFromIndex(id); | 910 func ^= cls.ClosureFunctionFromIndex(id); |
| 915 if (func.IsNull()) { | 911 if (func.IsNull()) { |
| 916 PrintError(js, "Closure function %" Pd " not found", id); | 912 PrintError(js, "Closure function %" Pd " not found", id); |
| 917 return true; | 913 return true; |
| 918 } | 914 } |
| 919 func.PrintToJSONStream(js, false); | 915 func.PrintJSON(js, false); |
| 920 return true; | 916 return true; |
| 921 } | 917 } |
| 922 | 918 |
| 923 | 919 |
| 924 static bool HandleClassesEval(Isolate* isolate, const Class& cls, | 920 static bool HandleClassesEval(Isolate* isolate, const Class& cls, |
| 925 JSONStream* js) { | 921 JSONStream* js) { |
| 926 if (js->num_arguments() > 3) { | 922 if (js->num_arguments() > 3) { |
| 927 PrintError(js, "Command too long"); | 923 PrintError(js, "Command too long"); |
| 928 return true; | 924 return true; |
| 929 } | 925 } |
| 930 const char* expr = js->LookupOption("expr"); | 926 const char* expr = js->LookupOption("expr"); |
| 931 if (expr == NULL) { | 927 if (expr == NULL) { |
| 932 PrintError(js, "eval expects an 'expr' option\n", | 928 PrintError(js, "eval expects an 'expr' option\n", |
| 933 js->num_arguments()); | 929 js->num_arguments()); |
| 934 return true; | 930 return true; |
| 935 } | 931 } |
| 936 const String& expr_str = String::Handle(isolate, String::New(expr)); | 932 const String& expr_str = String::Handle(isolate, String::New(expr)); |
| 937 const Object& result = Object::Handle(cls.Evaluate(expr_str, | 933 const Object& result = Object::Handle(cls.Evaluate(expr_str, |
| 938 Array::empty_array(), | 934 Array::empty_array(), |
| 939 Array::empty_array())); | 935 Array::empty_array())); |
| 940 if (result.IsNull()) { | 936 result.PrintJSON(js, true); |
| 941 Object::null_instance().PrintToJSONStream(js, true); | |
| 942 } else { | |
| 943 result.PrintToJSONStream(js, true); | |
| 944 } | |
| 945 return true; | 937 return true; |
| 946 } | 938 } |
| 947 | 939 |
| 948 | 940 |
| 949 static bool HandleClassesDispatchers(Isolate* isolate, const Class& cls, | 941 static bool HandleClassesDispatchers(Isolate* isolate, const Class& cls, |
| 950 JSONStream* js) { | 942 JSONStream* js) { |
| 951 intptr_t id; | 943 intptr_t id; |
| 952 if (js->num_arguments() > 4) { | 944 if (js->num_arguments() > 4) { |
| 953 PrintError(js, "Command too long"); | 945 PrintError(js, "Command too long"); |
| 954 return true; | 946 return true; |
| 955 } | 947 } |
| 956 if (!GetIntegerId(js->GetArgument(3), &id)) { | 948 if (!GetIntegerId(js->GetArgument(3), &id)) { |
| 957 PrintError(js, "Must specify collection object id: dispatchers/id"); | 949 PrintError(js, "Must specify collection object id: dispatchers/id"); |
| 958 return true; | 950 return true; |
| 959 } | 951 } |
| 960 Function& func = Function::Handle(); | 952 Function& func = Function::Handle(); |
| 961 func ^= cls.InvocationDispatcherFunctionFromIndex(id); | 953 func ^= cls.InvocationDispatcherFunctionFromIndex(id); |
| 962 if (func.IsNull()) { | 954 if (func.IsNull()) { |
| 963 PrintError(js, "Dispatcher %" Pd " not found", id); | 955 PrintError(js, "Dispatcher %" Pd " not found", id); |
| 964 return true; | 956 return true; |
| 965 } | 957 } |
| 966 func.PrintToJSONStream(js, false); | 958 func.PrintJSON(js, false); |
| 967 return true; | 959 return true; |
| 968 } | 960 } |
| 969 | 961 |
| 970 | 962 |
| 971 static bool HandleClassesFunctions(Isolate* isolate, const Class& cls, | 963 static bool HandleClassesFunctions(Isolate* isolate, const Class& cls, |
| 972 JSONStream* js) { | 964 JSONStream* js) { |
| 973 intptr_t id; | 965 intptr_t id; |
| 974 if (js->num_arguments() > 4) { | 966 if (js->num_arguments() > 4) { |
| 975 PrintError(js, "Command too long"); | 967 PrintError(js, "Command too long"); |
| 976 return true; | 968 return true; |
| 977 } | 969 } |
| 978 if (!GetIntegerId(js->GetArgument(3), &id)) { | 970 if (!GetIntegerId(js->GetArgument(3), &id)) { |
| 979 PrintError(js, "Must specify collection object id: functions/id"); | 971 PrintError(js, "Must specify collection object id: functions/id"); |
| 980 return true; | 972 return true; |
| 981 } | 973 } |
| 982 Function& func = Function::Handle(); | 974 Function& func = Function::Handle(); |
| 983 func ^= cls.FunctionFromIndex(id); | 975 func ^= cls.FunctionFromIndex(id); |
| 984 if (func.IsNull()) { | 976 if (func.IsNull()) { |
| 985 PrintError(js, "Function %" Pd " not found", id); | 977 PrintError(js, "Function %" Pd " not found", id); |
| 986 return true; | 978 return true; |
| 987 } | 979 } |
| 988 func.PrintToJSONStream(js, false); | 980 func.PrintJSON(js, false); |
| 989 return true; | 981 return true; |
| 990 } | 982 } |
| 991 | 983 |
| 992 | 984 |
| 993 static bool HandleClassesImplicitClosures(Isolate* isolate, const Class& cls, | 985 static bool HandleClassesImplicitClosures(Isolate* isolate, const Class& cls, |
| 994 JSONStream* js) { | 986 JSONStream* js) { |
| 995 intptr_t id; | 987 intptr_t id; |
| 996 if (js->num_arguments() > 4) { | 988 if (js->num_arguments() > 4) { |
| 997 PrintError(js, "Command too long"); | 989 PrintError(js, "Command too long"); |
| 998 return true; | 990 return true; |
| 999 } | 991 } |
| 1000 if (!GetIntegerId(js->GetArgument(3), &id)) { | 992 if (!GetIntegerId(js->GetArgument(3), &id)) { |
| 1001 PrintError(js, "Must specify collection object id: implicit_closures/id"); | 993 PrintError(js, "Must specify collection object id: implicit_closures/id"); |
| 1002 return true; | 994 return true; |
| 1003 } | 995 } |
| 1004 Function& func = Function::Handle(); | 996 Function& func = Function::Handle(); |
| 1005 func ^= cls.ImplicitClosureFunctionFromIndex(id); | 997 func ^= cls.ImplicitClosureFunctionFromIndex(id); |
| 1006 if (func.IsNull()) { | 998 if (func.IsNull()) { |
| 1007 PrintError(js, "Implicit closure function %" Pd " not found", id); | 999 PrintError(js, "Implicit closure function %" Pd " not found", id); |
| 1008 return true; | 1000 return true; |
| 1009 } | 1001 } |
| 1010 func.PrintToJSONStream(js, false); | 1002 func.PrintJSON(js, false); |
| 1011 return true; | 1003 return true; |
| 1012 } | 1004 } |
| 1013 | 1005 |
| 1014 | 1006 |
| 1015 static bool HandleClassesFields(Isolate* isolate, const Class& cls, | 1007 static bool HandleClassesFields(Isolate* isolate, const Class& cls, |
| 1016 JSONStream* js) { | 1008 JSONStream* js) { |
| 1017 intptr_t id; | 1009 intptr_t id; |
| 1018 if (js->num_arguments() > 4) { | 1010 if (js->num_arguments() > 4) { |
| 1019 PrintError(js, "Command too long"); | 1011 PrintError(js, "Command too long"); |
| 1020 return true; | 1012 return true; |
| 1021 } | 1013 } |
| 1022 if (!GetIntegerId(js->GetArgument(3), &id)) { | 1014 if (!GetIntegerId(js->GetArgument(3), &id)) { |
| 1023 PrintError(js, "Must specify collection object id: fields/id"); | 1015 PrintError(js, "Must specify collection object id: fields/id"); |
| 1024 return true; | 1016 return true; |
| 1025 } | 1017 } |
| 1026 Field& field = Field::Handle(cls.FieldFromIndex(id)); | 1018 Field& field = Field::Handle(cls.FieldFromIndex(id)); |
| 1027 if (field.IsNull()) { | 1019 if (field.IsNull()) { |
| 1028 PrintError(js, "Field %" Pd " not found", id); | 1020 PrintError(js, "Field %" Pd " not found", id); |
| 1029 return true; | 1021 return true; |
| 1030 } | 1022 } |
| 1031 field.PrintToJSONStream(js, false); | 1023 field.PrintJSON(js, false); |
| 1032 return true; | 1024 return true; |
| 1033 } | 1025 } |
| 1034 | 1026 |
| 1035 | 1027 |
| 1036 static bool HandleClassesTypes(Isolate* isolate, const Class& cls, | 1028 static bool HandleClassesTypes(Isolate* isolate, const Class& cls, |
| 1037 JSONStream* js) { | 1029 JSONStream* js) { |
| 1038 if (js->num_arguments() == 3) { | 1030 if (js->num_arguments() == 3) { |
| 1039 JSONObject jsobj(js); | 1031 JSONObject jsobj(js); |
| 1040 jsobj.AddProperty("type", "TypeList"); | 1032 jsobj.AddProperty("type", "TypeList"); |
| 1041 JSONArray members(&jsobj, "members"); | 1033 JSONArray members(&jsobj, "members"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1053 PrintError(js, "Must specify collection object id: types/id"); | 1045 PrintError(js, "Must specify collection object id: types/id"); |
| 1054 return true; | 1046 return true; |
| 1055 } | 1047 } |
| 1056 Type& type = Type::Handle(); | 1048 Type& type = Type::Handle(); |
| 1057 type ^= cls.CanonicalTypeFromIndex(id); | 1049 type ^= cls.CanonicalTypeFromIndex(id); |
| 1058 if (type.IsNull()) { | 1050 if (type.IsNull()) { |
| 1059 PrintError(js, "Canonical type %" Pd " not found", id); | 1051 PrintError(js, "Canonical type %" Pd " not found", id); |
| 1060 return true; | 1052 return true; |
| 1061 } | 1053 } |
| 1062 if (js->num_arguments() == 4) { | 1054 if (js->num_arguments() == 4) { |
| 1063 type.PrintToJSONStream(js, false); | 1055 type.PrintJSON(js, false); |
| 1064 return true; | 1056 return true; |
| 1065 } | 1057 } |
| 1066 return HandleInstanceCommands(isolate, type, js, 4); | 1058 return HandleInstanceCommands(isolate, type, js, 4); |
| 1067 } | 1059 } |
| 1068 | 1060 |
| 1069 | 1061 |
| 1070 static bool HandleClasses(Isolate* isolate, JSONStream* js) { | 1062 static bool HandleClasses(Isolate* isolate, JSONStream* js) { |
| 1071 if (js->num_arguments() == 1) { | 1063 if (js->num_arguments() == 1) { |
| 1072 ClassTable* table = isolate->class_table(); | 1064 ClassTable* table = isolate->class_table(); |
| 1073 JSONObject jsobj(js); | 1065 JSONObject jsobj(js); |
| 1074 table->PrintToJSONObject(&jsobj); | 1066 table->PrintToJSONObject(&jsobj); |
| 1075 return true; | 1067 return true; |
| 1076 } | 1068 } |
| 1077 ASSERT(js->num_arguments() >= 2); | 1069 ASSERT(js->num_arguments() >= 2); |
| 1078 intptr_t id; | 1070 intptr_t id; |
| 1079 if (!GetIntegerId(js->GetArgument(1), &id)) { | 1071 if (!GetIntegerId(js->GetArgument(1), &id)) { |
| 1080 PrintError(js, "Must specify collection object id: /classes/id"); | 1072 PrintError(js, "Must specify collection object id: /classes/id"); |
| 1081 return true; | 1073 return true; |
| 1082 } | 1074 } |
| 1083 ClassTable* table = isolate->class_table(); | 1075 ClassTable* table = isolate->class_table(); |
| 1084 if (!table->IsValidIndex(id)) { | 1076 if (!table->IsValidIndex(id)) { |
| 1085 PrintError(js, "%" Pd " is not a valid class id.", id); | 1077 PrintError(js, "%" Pd " is not a valid class id.", id); |
| 1086 return true; | 1078 return true; |
| 1087 } | 1079 } |
| 1088 Class& cls = Class::Handle(table->At(id)); | 1080 Class& cls = Class::Handle(table->At(id)); |
| 1089 if (js->num_arguments() == 2) { | 1081 if (js->num_arguments() == 2) { |
| 1090 cls.PrintToJSONStream(js, false); | 1082 cls.PrintJSON(js, false); |
| 1091 return true; | 1083 return true; |
| 1092 } else if (js->num_arguments() >= 3) { | 1084 } else if (js->num_arguments() >= 3) { |
| 1093 const char* second = js->GetArgument(2); | 1085 const char* second = js->GetArgument(2); |
| 1094 if (strcmp(second, "eval") == 0) { | 1086 if (strcmp(second, "eval") == 0) { |
| 1095 return HandleClassesEval(isolate, cls, js); | 1087 return HandleClassesEval(isolate, cls, js); |
| 1096 } else if (strcmp(second, "closures") == 0) { | 1088 } else if (strcmp(second, "closures") == 0) { |
| 1097 return HandleClassesClosures(isolate, cls, js); | 1089 return HandleClassesClosures(isolate, cls, js); |
| 1098 } else if (strcmp(second, "fields") == 0) { | 1090 } else if (strcmp(second, "fields") == 0) { |
| 1099 return HandleClassesFields(isolate, cls, js); | 1091 return HandleClassesFields(isolate, cls, js); |
| 1100 } else if (strcmp(second, "functions") == 0) { | 1092 } else if (strcmp(second, "functions") == 0) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1124 const char* expr = js->LookupOption("expr"); | 1116 const char* expr = js->LookupOption("expr"); |
| 1125 if (expr == NULL) { | 1117 if (expr == NULL) { |
| 1126 PrintError(js, "eval expects an 'expr' option\n", | 1118 PrintError(js, "eval expects an 'expr' option\n", |
| 1127 js->num_arguments()); | 1119 js->num_arguments()); |
| 1128 return true; | 1120 return true; |
| 1129 } | 1121 } |
| 1130 const String& expr_str = String::Handle(isolate, String::New(expr)); | 1122 const String& expr_str = String::Handle(isolate, String::New(expr)); |
| 1131 const Object& result = Object::Handle(lib.Evaluate(expr_str, | 1123 const Object& result = Object::Handle(lib.Evaluate(expr_str, |
| 1132 Array::empty_array(), | 1124 Array::empty_array(), |
| 1133 Array::empty_array())); | 1125 Array::empty_array())); |
| 1134 if (result.IsNull()) { | 1126 result.PrintJSON(js, true); |
| 1135 Object::null_instance().PrintToJSONStream(js, true); | |
| 1136 } else { | |
| 1137 result.PrintToJSONStream(js, true); | |
| 1138 } | |
| 1139 return true; | 1127 return true; |
| 1140 } | 1128 } |
| 1141 | 1129 |
| 1142 | 1130 |
| 1143 static bool HandleLibraries(Isolate* isolate, JSONStream* js) { | 1131 static bool HandleLibraries(Isolate* isolate, JSONStream* js) { |
| 1144 // TODO(johnmccutchan): Support fields and functions on libraries. | 1132 // TODO(johnmccutchan): Support fields and functions on libraries. |
| 1145 REQUIRE_COLLECTION_ID("libraries"); | 1133 REQUIRE_COLLECTION_ID("libraries"); |
| 1146 const GrowableObjectArray& libs = | 1134 const GrowableObjectArray& libs = |
| 1147 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | 1135 GrowableObjectArray::Handle(isolate->object_store()->libraries()); |
| 1148 ASSERT(!libs.IsNull()); | 1136 ASSERT(!libs.IsNull()); |
| 1149 intptr_t id = 0; | 1137 intptr_t id = 0; |
| 1150 CHECK_COLLECTION_ID_BOUNDS("libraries", libs.Length(), js->GetArgument(1), | 1138 CHECK_COLLECTION_ID_BOUNDS("libraries", libs.Length(), js->GetArgument(1), |
| 1151 id, js); | 1139 id, js); |
| 1152 Library& lib = Library::Handle(); | 1140 Library& lib = Library::Handle(); |
| 1153 lib ^= libs.At(id); | 1141 lib ^= libs.At(id); |
| 1154 ASSERT(!lib.IsNull()); | 1142 ASSERT(!lib.IsNull()); |
| 1155 if (js->num_arguments() == 2) { | 1143 if (js->num_arguments() == 2) { |
| 1156 lib.PrintToJSONStream(js, false); | 1144 lib.PrintJSON(js, false); |
| 1157 return true; | 1145 return true; |
| 1158 } else if (js->num_arguments() >= 3) { | 1146 } else if (js->num_arguments() >= 3) { |
| 1159 const char* second = js->GetArgument(2); | 1147 const char* second = js->GetArgument(2); |
| 1160 if (strcmp(second, "eval") == 0) { | 1148 if (strcmp(second, "eval") == 0) { |
| 1161 return HandleLibrariesEval(isolate, lib, js); | 1149 return HandleLibrariesEval(isolate, lib, js); |
| 1162 } else { | 1150 } else { |
| 1163 PrintError(js, "Invalid sub collection %s", second); | 1151 PrintError(js, "Invalid sub collection %s", second); |
| 1164 return true; | 1152 return true; |
| 1165 } | 1153 } |
| 1166 } | 1154 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 return true; | 1209 return true; |
| 1222 } | 1210 } |
| 1223 const char* arg = js->GetArgument(1); | 1211 const char* arg = js->GetArgument(1); |
| 1224 | 1212 |
| 1225 // Handle special objects first. | 1213 // Handle special objects first. |
| 1226 if (strcmp(arg, "null") == 0) { | 1214 if (strcmp(arg, "null") == 0) { |
| 1227 if (js->num_arguments() > 2) { | 1215 if (js->num_arguments() > 2) { |
| 1228 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", | 1216 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", |
| 1229 js->num_arguments()); | 1217 js->num_arguments()); |
| 1230 } else { | 1218 } else { |
| 1231 Instance::null_instance().PrintToJSONStream(js, false); | 1219 Instance::null_instance().PrintJSON(js, false); |
| 1232 } | 1220 } |
| 1233 return true; | 1221 return true; |
| 1234 | 1222 |
| 1235 } else if (strcmp(arg, "not-initialized") == 0) { | 1223 } else if (strcmp(arg, "not-initialized") == 0) { |
| 1236 if (js->num_arguments() > 2) { | 1224 if (js->num_arguments() > 2) { |
| 1237 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", | 1225 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", |
| 1238 js->num_arguments()); | 1226 js->num_arguments()); |
| 1239 } else { | 1227 } else { |
| 1240 Object::sentinel().PrintToJSONStream(js, false); | 1228 Object::sentinel().PrintJSON(js, false); |
| 1241 } | 1229 } |
| 1242 return true; | 1230 return true; |
| 1243 | 1231 |
| 1244 } else if (strcmp(arg, "being-initialized") == 0) { | 1232 } else if (strcmp(arg, "being-initialized") == 0) { |
| 1245 if (js->num_arguments() > 2) { | 1233 if (js->num_arguments() > 2) { |
| 1246 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", | 1234 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", |
| 1247 js->num_arguments()); | 1235 js->num_arguments()); |
| 1248 } else { | 1236 } else { |
| 1249 Object::transition_sentinel().PrintToJSONStream(js, false); | 1237 Object::transition_sentinel().PrintJSON(js, false); |
| 1250 } | 1238 } |
| 1251 return true; | 1239 return true; |
| 1252 | 1240 |
| 1253 } else if (strcmp(arg, "optimized-out") == 0) { | 1241 } else if (strcmp(arg, "optimized-out") == 0) { |
| 1254 if (js->num_arguments() > 2) { | 1242 if (js->num_arguments() > 2) { |
| 1255 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", | 1243 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", |
| 1256 js->num_arguments()); | 1244 js->num_arguments()); |
| 1257 } else { | 1245 } else { |
| 1258 Symbols::OptimizedOut().PrintToJSONStream(js, false); | 1246 Symbols::OptimizedOut().PrintJSON(js, false); |
| 1259 } | 1247 } |
| 1260 return true; | 1248 return true; |
| 1261 | 1249 |
| 1262 } else if (strcmp(arg, "collected") == 0) { | 1250 } else if (strcmp(arg, "collected") == 0) { |
| 1263 if (js->num_arguments() > 2) { | 1251 if (js->num_arguments() > 2) { |
| 1264 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", | 1252 PrintError(js, "expected at most 2 arguments but found %" Pd "\n", |
| 1265 js->num_arguments()); | 1253 js->num_arguments()); |
| 1266 } else { | 1254 } else { |
| 1267 PrintPseudoNull(js, "objects/collected", "<collected>"); | 1255 PrintPseudoNull(js, "objects/collected", "<collected>"); |
| 1268 } | 1256 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1290 // Print. | 1278 // Print. |
| 1291 if (obj.IsNull()) { | 1279 if (obj.IsNull()) { |
| 1292 // The object has been collected by the gc. | 1280 // The object has been collected by the gc. |
| 1293 PrintPseudoNull(js, "objects/collected", "<collected>"); | 1281 PrintPseudoNull(js, "objects/collected", "<collected>"); |
| 1294 return true; | 1282 return true; |
| 1295 } else if (obj.raw() == Object::sentinel().raw()) { | 1283 } else if (obj.raw() == Object::sentinel().raw()) { |
| 1296 // The object id has expired. | 1284 // The object id has expired. |
| 1297 PrintPseudoNull(js, "objects/expired", "<expired>"); | 1285 PrintPseudoNull(js, "objects/expired", "<expired>"); |
| 1298 return true; | 1286 return true; |
| 1299 } | 1287 } |
| 1300 obj.PrintToJSONStream(js, false); | 1288 obj.PrintJSON(js, false); |
| 1301 return true; | 1289 return true; |
| 1302 } | 1290 } |
| 1303 return HandleInstanceCommands(isolate, obj, js, 2); | 1291 return HandleInstanceCommands(isolate, obj, js, 2); |
| 1304 } | 1292 } |
| 1305 | 1293 |
| 1306 | 1294 |
| 1307 static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) { | 1295 static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) { |
| 1308 JSONObject jsobj(js); | 1296 JSONObject jsobj(js); |
| 1309 jsobj.AddProperty("type", "ScriptList"); | 1297 jsobj.AddProperty("type", "ScriptList"); |
| 1310 jsobj.AddProperty("id", "scripts"); | 1298 jsobj.AddProperty("id", "scripts"); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1346 ASSERT(!lib.IsNull()); | 1334 ASSERT(!lib.IsNull()); |
| 1347 ASSERT(Smi::IsValid(lib.index())); | 1335 ASSERT(Smi::IsValid(lib.index())); |
| 1348 const Array& loaded_scripts = Array::Handle(lib.LoadedScripts()); | 1336 const Array& loaded_scripts = Array::Handle(lib.LoadedScripts()); |
| 1349 ASSERT(!loaded_scripts.IsNull()); | 1337 ASSERT(!loaded_scripts.IsNull()); |
| 1350 intptr_t num_scripts = loaded_scripts.Length(); | 1338 intptr_t num_scripts = loaded_scripts.Length(); |
| 1351 for (intptr_t i = 0; i < num_scripts; i++) { | 1339 for (intptr_t i = 0; i < num_scripts; i++) { |
| 1352 script ^= loaded_scripts.At(i); | 1340 script ^= loaded_scripts.At(i); |
| 1353 ASSERT(!script.IsNull()); | 1341 ASSERT(!script.IsNull()); |
| 1354 url ^= script.url(); | 1342 url ^= script.url(); |
| 1355 if (url.Equals(requested_url)) { | 1343 if (url.Equals(requested_url)) { |
| 1356 script.PrintToJSONStream(js, false); | 1344 script.PrintJSON(js, false); |
| 1357 return true; | 1345 return true; |
| 1358 } | 1346 } |
| 1359 } | 1347 } |
| 1360 } | 1348 } |
| 1361 PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s", | 1349 PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s", |
| 1362 requested_url.ToCString()); | 1350 requested_url.ToCString()); |
| 1363 return true; | 1351 return true; |
| 1364 } | 1352 } |
| 1365 | 1353 |
| 1366 | 1354 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1393 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); | 1381 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); |
| 1394 return true; | 1382 return true; |
| 1395 } else if (js->num_arguments() == 3) { | 1383 } else if (js->num_arguments() == 3) { |
| 1396 // Print individual breakpoint. | 1384 // Print individual breakpoint. |
| 1397 intptr_t id = 0; | 1385 intptr_t id = 0; |
| 1398 SourceBreakpoint* bpt = NULL; | 1386 SourceBreakpoint* bpt = NULL; |
| 1399 if (GetIntegerId(js->GetArgument(2), &id)) { | 1387 if (GetIntegerId(js->GetArgument(2), &id)) { |
| 1400 bpt = isolate->debugger()->GetBreakpointById(id); | 1388 bpt = isolate->debugger()->GetBreakpointById(id); |
| 1401 } | 1389 } |
| 1402 if (bpt != NULL) { | 1390 if (bpt != NULL) { |
| 1403 bpt->PrintToJSONStream(js); | 1391 bpt->PrintJSON(js); |
| 1404 return true; | 1392 return true; |
| 1405 } else { | 1393 } else { |
| 1406 PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2)); | 1394 PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2)); |
| 1407 return true; | 1395 return true; |
| 1408 } | 1396 } |
| 1409 } else { | 1397 } else { |
| 1410 PrintError(js, "Command too long"); | 1398 PrintError(js, "Command too long"); |
| 1411 return true; | 1399 return true; |
| 1412 } | 1400 } |
| 1413 } else { | 1401 } else { |
| 1414 PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1)); | 1402 PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1)); |
| 1415 return true; | 1403 return true; |
| 1416 } | 1404 } |
| 1417 } | 1405 } |
| 1418 | 1406 |
| 1419 | 1407 |
| 1420 static bool HandleNullCode(uintptr_t pc, JSONStream* js) { | 1408 static bool HandleNullCode(uintptr_t pc, JSONStream* js) { |
| 1421 // TODO(turnidge): Consider adding/using Object::null_code() for | 1409 // TODO(turnidge): Consider adding/using Object::null_code() for |
| 1422 // consistent "type". | 1410 // consistent "type". |
| 1423 Object::null_object().PrintToJSONStream(js, false); | 1411 Object::null_object().PrintJSON(js, false); |
| 1424 return true; | 1412 return true; |
| 1425 } | 1413 } |
| 1426 | 1414 |
| 1427 | 1415 |
| 1428 static bool HandleCode(Isolate* isolate, JSONStream* js) { | 1416 static bool HandleCode(Isolate* isolate, JSONStream* js) { |
| 1429 REQUIRE_COLLECTION_ID("code"); | 1417 REQUIRE_COLLECTION_ID("code"); |
| 1430 uword pc; | 1418 uword pc; |
| 1431 if (js->num_arguments() > 2) { | 1419 if (js->num_arguments() > 2) { |
| 1432 PrintError(js, "Command too long"); | 1420 PrintError(js, "Command too long"); |
| 1433 return true; | 1421 return true; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1465 } | 1453 } |
| 1466 return HandleNullCode(pc, js); | 1454 return HandleNullCode(pc, js); |
| 1467 } | 1455 } |
| 1468 int64_t timestamp = 0; | 1456 int64_t timestamp = 0; |
| 1469 if (!GetCodeId(command, ×tamp, &pc) || (timestamp < 0)) { | 1457 if (!GetCodeId(command, ×tamp, &pc) || (timestamp < 0)) { |
| 1470 PrintError(js, "Malformed code id: %s", command); | 1458 PrintError(js, "Malformed code id: %s", command); |
| 1471 return true; | 1459 return true; |
| 1472 } | 1460 } |
| 1473 Code& code = Code::Handle(Code::FindCode(pc, timestamp)); | 1461 Code& code = Code::Handle(Code::FindCode(pc, timestamp)); |
| 1474 if (!code.IsNull()) { | 1462 if (!code.IsNull()) { |
| 1475 code.PrintToJSONStream(js, false); | 1463 code.PrintJSON(js, false); |
| 1476 return true; | 1464 return true; |
| 1477 } | 1465 } |
| 1478 PrintError(js, "Could not find code with id: %s", command); | 1466 PrintError(js, "Could not find code with id: %s", command); |
| 1479 return true; | 1467 return true; |
| 1480 } | 1468 } |
| 1481 | 1469 |
| 1482 | 1470 |
| 1483 static bool HandleProfile(Isolate* isolate, JSONStream* js) { | 1471 static bool HandleProfile(Isolate* isolate, JSONStream* js) { |
| 1484 if (js->num_arguments() == 2) { | 1472 if (js->num_arguments() == 2) { |
| 1485 const char* sub_command = js->GetArgument(1); | 1473 const char* sub_command = js->GetArgument(1); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1510 tag_order = Profiler::kUser; | 1498 tag_order = Profiler::kUser; |
| 1511 } else if (js->OptionIs("tags", "vu")) { | 1499 } else if (js->OptionIs("tags", "vu")) { |
| 1512 tag_order = Profiler::kVMUser; | 1500 tag_order = Profiler::kVMUser; |
| 1513 } else if (js->OptionIs("tags", "v")) { | 1501 } else if (js->OptionIs("tags", "v")) { |
| 1514 tag_order = Profiler::kVM; | 1502 tag_order = Profiler::kVM; |
| 1515 } else { | 1503 } else { |
| 1516 PrintError(js, "Invalid tags option value: %s\n", tags_option); | 1504 PrintError(js, "Invalid tags option value: %s\n", tags_option); |
| 1517 return true; | 1505 return true; |
| 1518 } | 1506 } |
| 1519 } | 1507 } |
| 1520 Profiler::PrintToJSONStream(isolate, js, full_profile, tag_order); | 1508 Profiler::PrintJSON(isolate, js, full_profile, tag_order); |
| 1521 return true; | 1509 return true; |
| 1522 } | 1510 } |
| 1523 | 1511 |
| 1524 static bool HandleCoverage(Isolate* isolate, JSONStream* js) { | 1512 static bool HandleCoverage(Isolate* isolate, JSONStream* js) { |
| 1525 CodeCoverage::PrintToJSONStream(isolate, js); | 1513 CodeCoverage::PrintJSON(isolate, js); |
| 1526 return true; | 1514 return true; |
| 1527 } | 1515 } |
| 1528 | 1516 |
| 1529 | 1517 |
| 1530 static bool HandleAllocationProfile(Isolate* isolate, JSONStream* js) { | 1518 static bool HandleAllocationProfile(Isolate* isolate, JSONStream* js) { |
| 1531 bool should_reset_accumulator = false; | 1519 bool should_reset_accumulator = false; |
| 1532 bool should_collect = false; | 1520 bool should_collect = false; |
| 1533 if (js->num_arguments() != 1) { | 1521 if (js->num_arguments() != 1) { |
| 1534 PrintError(js, "Command too long"); | 1522 PrintError(js, "Command too long"); |
| 1535 return true; | 1523 return true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1550 PrintError(js, "Unrecognized gc option '%s'", js->LookupOption("gc")); | 1538 PrintError(js, "Unrecognized gc option '%s'", js->LookupOption("gc")); |
| 1551 return true; | 1539 return true; |
| 1552 } | 1540 } |
| 1553 } | 1541 } |
| 1554 if (should_reset_accumulator) { | 1542 if (should_reset_accumulator) { |
| 1555 isolate->class_table()->ResetAllocationAccumulators(); | 1543 isolate->class_table()->ResetAllocationAccumulators(); |
| 1556 } | 1544 } |
| 1557 if (should_collect) { | 1545 if (should_collect) { |
| 1558 isolate->heap()->CollectAllGarbage(); | 1546 isolate->heap()->CollectAllGarbage(); |
| 1559 } | 1547 } |
| 1560 isolate->class_table()->AllocationProfilePrintToJSONStream(js); | 1548 isolate->class_table()->AllocationProfilePrintJSON(js); |
| 1561 return true; | 1549 return true; |
| 1562 } | 1550 } |
| 1563 | 1551 |
| 1564 | 1552 |
| 1565 static bool HandleResume(Isolate* isolate, JSONStream* js) { | 1553 static bool HandleResume(Isolate* isolate, JSONStream* js) { |
| 1566 if (isolate->message_handler()->pause_on_start()) { | 1554 if (isolate->message_handler()->pause_on_start()) { |
| 1567 isolate->message_handler()->set_pause_on_start(false); | 1555 isolate->message_handler()->set_pause_on_start(false); |
| 1568 JSONObject jsobj(js); | 1556 JSONObject jsobj(js); |
| 1569 jsobj.AddProperty("type", "Success"); | 1557 jsobj.AddProperty("type", "Success"); |
| 1570 jsobj.AddProperty("id", ""); | 1558 jsobj.AddProperty("id", ""); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1623 // Note that the table index of the canonical type arguments will change | 1611 // Note that the table index of the canonical type arguments will change |
| 1624 // when the table grows. Should we not support this access at all? | 1612 // when the table grows. Should we not support this access at all? |
| 1625 PrintError(js, "Must specify collection object id: /typearguments/id"); | 1613 PrintError(js, "Must specify collection object id: /typearguments/id"); |
| 1626 return true; | 1614 return true; |
| 1627 } | 1615 } |
| 1628 if ((id < 0) || (id >= table_size) || (table.At(id) == Object::null())) { | 1616 if ((id < 0) || (id >= table_size) || (table.At(id) == Object::null())) { |
| 1629 PrintError(js, "%" Pd " is not a valid typearguments id.", id); | 1617 PrintError(js, "%" Pd " is not a valid typearguments id.", id); |
| 1630 return true; | 1618 return true; |
| 1631 } | 1619 } |
| 1632 type_args ^= table.At(id); | 1620 type_args ^= table.At(id); |
| 1633 type_args.PrintToJSONStream(js, false); | 1621 type_args.PrintJSON(js, false); |
| 1634 return true; | 1622 return true; |
| 1635 } | 1623 } |
| 1636 | 1624 |
| 1637 | 1625 |
| 1638 static bool HandleHeapMap(Isolate* isolate, JSONStream* js) { | 1626 static bool HandleHeapMap(Isolate* isolate, JSONStream* js) { |
| 1639 isolate->heap()->PrintHeapMapToJSONStream(isolate, js); | 1627 isolate->heap()->PrintHeapMapToJSONStream(isolate, js); |
| 1640 return true; | 1628 return true; |
| 1641 } | 1629 } |
| 1642 | 1630 |
| 1643 | 1631 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1670 static const uword kExampleAddr = static_cast<uword>(kIntptrMax / 7); | 1658 static const uword kExampleAddr = static_cast<uword>(kIntptrMax / 7); |
| 1671 PrintError(js, "Must specify address: address/" Px ".", kExampleAddr); | 1659 PrintError(js, "Must specify address: address/" Px ".", kExampleAddr); |
| 1672 return true; | 1660 return true; |
| 1673 } | 1661 } |
| 1674 Object& object = Object::Handle(isolate); | 1662 Object& object = Object::Handle(isolate); |
| 1675 { | 1663 { |
| 1676 NoGCScope no_gc; | 1664 NoGCScope no_gc; |
| 1677 ContainsAddressVisitor visitor(isolate, addr); | 1665 ContainsAddressVisitor visitor(isolate, addr); |
| 1678 object = isolate->heap()->FindObject(&visitor); | 1666 object = isolate->heap()->FindObject(&visitor); |
| 1679 } | 1667 } |
| 1680 object.PrintToJSONStream(js, true); | 1668 object.PrintJSON(js, true); |
| 1681 return true; | 1669 return true; |
| 1682 } | 1670 } |
| 1683 | 1671 |
| 1684 | 1672 |
| 1685 static bool HandleMalformedJson(Isolate* isolate, JSONStream* js) { | 1673 static bool HandleMalformedJson(Isolate* isolate, JSONStream* js) { |
| 1686 JSONObject jsobj(js); | 1674 JSONObject jsobj(js); |
| 1687 jsobj.AddProperty("a", "a"); | 1675 jsobj.AddProperty("a", "a"); |
| 1688 JSONObject jsobj1(js); | 1676 JSONObject jsobj1(js); |
| 1689 jsobj1.AddProperty("a", "a"); | 1677 jsobj1.AddProperty("a", "a"); |
| 1690 JSONObject jsobj2(js); | 1678 JSONObject jsobj2(js); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1974 while (current != NULL) { | 1962 while (current != NULL) { |
| 1975 if (strcmp(name, current->name()) == 0) { | 1963 if (strcmp(name, current->name()) == 0) { |
| 1976 return current; | 1964 return current; |
| 1977 } | 1965 } |
| 1978 current = current->next(); | 1966 current = current->next(); |
| 1979 } | 1967 } |
| 1980 return NULL; | 1968 return NULL; |
| 1981 } | 1969 } |
| 1982 | 1970 |
| 1983 } // namespace dart | 1971 } // namespace dart |
| OLD | NEW |