Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Side by Side Diff: runtime/vm/service.cc

Issue 211283004: Support Types in instance-ref/instance-view (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: gen js Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/service_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 // Skip the dash. 791 // Skip the dash.
792 s++; 792 s++;
793 // Extract the PC. 793 // Extract the PC.
794 if (!GetUnsignedIntegerId(s, address, 16)) { 794 if (!GetUnsignedIntegerId(s, address, 16)) {
795 return false; 795 return false;
796 } 796 }
797 return true; 797 return true;
798 } 798 }
799 799
800 800
801 static bool HandleInstanceCommands(Isolate* isolate,
802 const Object& obj,
803 JSONStream* js,
804 intptr_t arg_pos) {
805 ASSERT(js->num_arguments() > arg_pos);
806 const char* action = js->GetArgument(arg_pos);
807 if (strcmp(action, "eval") == 0) {
808 if (js->num_arguments() > (arg_pos + 1)) {
809 PrintError(js, "expected at most %" Pd " arguments but found %" Pd "\n",
810 arg_pos + 1,
811 js->num_arguments());
812 return true;
813 }
814 if (obj.IsNull()) {
815 PrintErrorWithKind(js, "EvalCollected",
816 "attempt to evaluate against collected object\n",
817 js->num_arguments());
818 return true;
819 }
820 if (obj.raw() == Object::sentinel().raw()) {
821 PrintErrorWithKind(js, "EvalExpired",
822 "attempt to evaluate against expired object\n",
823 js->num_arguments());
824 return true;
825 }
826 const char* expr = js->LookupOption("expr");
827 if (expr == NULL) {
828 PrintError(js, "eval expects an 'expr' option\n",
829 js->num_arguments());
830 return true;
831 }
832 const String& expr_str = String::Handle(isolate, String::New(expr));
833 ASSERT(obj.IsInstance());
834 const Instance& instance = Instance::Cast(obj);
835 const Object& result = Object::Handle(instance.Evaluate(expr_str));
836 if (result.IsNull()) {
837 Object::null_instance().PrintToJSONStream(js, true);
838 } else {
839 result.PrintToJSONStream(js, true);
840 }
841 return true;
842 }
843
844 PrintError(js, "unrecognized action '%s'\n", action);
845 return true;
846 }
847
848
801 static bool HandleClassesClosures(Isolate* isolate, const Class& cls, 849 static bool HandleClassesClosures(Isolate* isolate, const Class& cls,
802 JSONStream* js) { 850 JSONStream* js) {
803 intptr_t id; 851 intptr_t id;
804 if (js->num_arguments() > 4) { 852 if (js->num_arguments() > 4) {
805 PrintError(js, "Command too long"); 853 PrintError(js, "Command too long");
806 return true; 854 return true;
807 } 855 }
808 if (!GetIntegerId(js->GetArgument(3), &id)) { 856 if (!GetIntegerId(js->GetArgument(3), &id)) {
809 PrintError(js, "Must specify collection object id: closures/id"); 857 PrintError(js, "Must specify collection object id: closures/id");
810 return true; 858 return true;
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 jsobj.AddProperty("type", "TypeList"); 985 jsobj.AddProperty("type", "TypeList");
938 JSONArray members(&jsobj, "members"); 986 JSONArray members(&jsobj, "members");
939 const intptr_t num_types = cls.NumCanonicalTypes(); 987 const intptr_t num_types = cls.NumCanonicalTypes();
940 Type& type = Type::Handle(); 988 Type& type = Type::Handle();
941 for (intptr_t i = 0; i < num_types; i++) { 989 for (intptr_t i = 0; i < num_types; i++) {
942 type = cls.CanonicalTypeFromIndex(i); 990 type = cls.CanonicalTypeFromIndex(i);
943 members.AddValue(type); 991 members.AddValue(type);
944 } 992 }
945 return true; 993 return true;
946 } 994 }
995 ASSERT(js->num_arguments() >= 4);
947 intptr_t id; 996 intptr_t id;
948 if (js->num_arguments() > 4) {
949 PrintError(js, "Command too long");
950 return true;
951 }
952 if (!GetIntegerId(js->GetArgument(3), &id)) { 997 if (!GetIntegerId(js->GetArgument(3), &id)) {
953 PrintError(js, "Must specify collection object id: types/id"); 998 PrintError(js, "Must specify collection object id: types/id");
954 return true; 999 return true;
955 } 1000 }
956 Type& type = Type::Handle(); 1001 Type& type = Type::Handle();
957 type ^= cls.CanonicalTypeFromIndex(id); 1002 type ^= cls.CanonicalTypeFromIndex(id);
958 if (type.IsNull()) { 1003 if (type.IsNull()) {
959 PrintError(js, "Canonical type %" Pd " not found", id); 1004 PrintError(js, "Canonical type %" Pd " not found", id);
960 return true; 1005 return true;
961 } 1006 }
962 type.PrintToJSONStream(js, false); 1007 if (js->num_arguments() == 4) {
963 return true; 1008 type.PrintToJSONStream(js, false);
1009 return true;
1010 }
1011 return HandleInstanceCommands(isolate, type, js, 4);
964 } 1012 }
965 1013
966 1014
967 static bool HandleClasses(Isolate* isolate, JSONStream* js) { 1015 static bool HandleClasses(Isolate* isolate, JSONStream* js) {
968 if (js->num_arguments() == 1) { 1016 if (js->num_arguments() == 1) {
969 ClassTable* table = isolate->class_table(); 1017 ClassTable* table = isolate->class_table();
970 JSONObject jsobj(js); 1018 JSONObject jsobj(js);
971 table->PrintToJSONObject(&jsobj); 1019 table->PrintToJSONObject(&jsobj);
972 return true; 1020 return true;
973 } 1021 }
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 } 1222 }
1175 1223
1176 // Lookup the object. 1224 // Lookup the object.
1177 Object& obj = Object::Handle(isolate); 1225 Object& obj = Object::Handle(isolate);
1178 bool error = false; 1226 bool error = false;
1179 obj = LookupObjectId(isolate, arg, &error); 1227 obj = LookupObjectId(isolate, arg, &error);
1180 if (error) { 1228 if (error) {
1181 PrintError(js, "unrecognized object id '%s'", arg); 1229 PrintError(js, "unrecognized object id '%s'", arg);
1182 return true; 1230 return true;
1183 } 1231 }
1184
1185 // Now what should we do with the object?
1186 if (js->num_arguments() == 2) { 1232 if (js->num_arguments() == 2) {
1187 // Print. 1233 // Print.
1188 if (obj.IsNull()) { 1234 if (obj.IsNull()) {
1189 // The object has been collected by the gc. 1235 // The object has been collected by the gc.
1190 PrintPseudoNull(js, "objects/collected", "<collected>"); 1236 PrintPseudoNull(js, "objects/collected", "<collected>");
1191 return true; 1237 return true;
1192 } else if (obj.raw() == Object::sentinel().raw()) { 1238 } else if (obj.raw() == Object::sentinel().raw()) {
1193 // The object id has expired. 1239 // The object id has expired.
1194 PrintPseudoNull(js, "objects/expired", "<expired>"); 1240 PrintPseudoNull(js, "objects/expired", "<expired>");
1195 return true; 1241 return true;
1196 } 1242 }
1197 obj.PrintToJSONStream(js, false); 1243 obj.PrintToJSONStream(js, false);
1198 return true; 1244 return true;
1199 } 1245 }
1200 ASSERT(js->num_arguments() > 2); 1246 return HandleInstanceCommands(isolate, obj, js, 2);
1201
1202 const char* action = js->GetArgument(2);
1203 if (strcmp(action, "eval") == 0) {
1204 if (js->num_arguments() > 3) {
1205 PrintError(js, "expected at most 3 arguments but found %" Pd "\n",
1206 js->num_arguments());
1207 return true;
1208 }
1209 if (obj.IsNull()) {
1210 PrintErrorWithKind(js, "EvalCollected",
1211 "attempt to evaluate against collected object\n",
1212 js->num_arguments());
1213 return true;
1214 }
1215 if (obj.raw() == Object::sentinel().raw()) {
1216 PrintErrorWithKind(js, "EvalExpired",
1217 "attempt to evaluate against expired object\n",
1218 js->num_arguments());
1219 return true;
1220 }
1221 const char* expr = js->LookupOption("expr");
1222 if (expr == NULL) {
1223 PrintError(js, "eval expects an 'expr' option\n",
1224 js->num_arguments());
1225 return true;
1226 }
1227 const String& expr_str = String::Handle(isolate, String::New(expr));
1228 ASSERT(obj.IsInstance());
1229 const Instance& instance = Instance::Cast(obj);
1230 const Object& result = Object::Handle(instance.Evaluate(expr_str));
1231 if (result.IsNull()) {
1232 Object::null_instance().PrintToJSONStream(js, true);
1233 } else {
1234 result.PrintToJSONStream(js, true);
1235 }
1236 return true;
1237 }
1238
1239 PrintError(js, "unrecognized action '%s'\n", action);
1240 return true;
1241 } 1247 }
1242 1248
1243 1249
1244 static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) { 1250 static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) {
1245 JSONObject jsobj(js); 1251 JSONObject jsobj(js);
1246 jsobj.AddProperty("type", "ScriptList"); 1252 jsobj.AddProperty("type", "ScriptList");
1247 JSONArray members(&jsobj, "members"); 1253 JSONArray members(&jsobj, "members");
1248 const GrowableObjectArray& libs = 1254 const GrowableObjectArray& libs =
1249 GrowableObjectArray::Handle(isolate->object_store()->libraries()); 1255 GrowableObjectArray::Handle(isolate->object_store()->libraries());
1250 int num_libs = libs.Length(); 1256 int num_libs = libs.Length();
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
1880 while (current != NULL) { 1886 while (current != NULL) {
1881 if (strcmp(name, current->name()) == 0) { 1887 if (strcmp(name, current->name()) == 0) {
1882 return current; 1888 return current;
1883 } 1889 }
1884 current = current->next(); 1890 current = current->next();
1885 } 1891 }
1886 return NULL; 1892 return NULL;
1887 } 1893 }
1888 1894
1889 } // namespace dart 1895 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/service_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698