Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index 2b3be6ab67064a625248b711dc4dfd21e7cfed65..384ffa5fc52f1e7067d937cc6fac71e78a1ff19f 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -798,6 +798,54 @@ static bool GetCodeId(const char* s, int64_t* timestamp, uword* address) { |
} |
+static bool HandleInstanceCommands(Isolate* isolate, |
+ const Object& obj, |
+ JSONStream* js, |
+ intptr_t arg_pos) { |
+ ASSERT(js->num_arguments() > arg_pos); |
+ const char* action = js->GetArgument(arg_pos); |
+ if (strcmp(action, "eval") == 0) { |
+ if (js->num_arguments() > (arg_pos + 1)) { |
+ PrintError(js, "expected at most %" Pd " arguments but found %" Pd "\n", |
+ arg_pos + 1, |
+ js->num_arguments()); |
+ return true; |
+ } |
+ if (obj.IsNull()) { |
+ PrintErrorWithKind(js, "EvalCollected", |
+ "attempt to evaluate against collected object\n", |
+ js->num_arguments()); |
+ return true; |
+ } |
+ if (obj.raw() == Object::sentinel().raw()) { |
+ PrintErrorWithKind(js, "EvalExpired", |
+ "attempt to evaluate against expired object\n", |
+ js->num_arguments()); |
+ return true; |
+ } |
+ const char* expr = js->LookupOption("expr"); |
+ if (expr == NULL) { |
+ PrintError(js, "eval expects an 'expr' option\n", |
+ js->num_arguments()); |
+ return true; |
+ } |
+ const String& expr_str = String::Handle(isolate, String::New(expr)); |
+ ASSERT(obj.IsInstance()); |
+ const Instance& instance = Instance::Cast(obj); |
+ const Object& result = Object::Handle(instance.Evaluate(expr_str)); |
+ if (result.IsNull()) { |
+ Object::null_instance().PrintToJSONStream(js, true); |
+ } else { |
+ result.PrintToJSONStream(js, true); |
+ } |
+ return true; |
+ } |
+ |
+ PrintError(js, "unrecognized action '%s'\n", action); |
+ return true; |
+} |
+ |
+ |
static bool HandleClassesClosures(Isolate* isolate, const Class& cls, |
JSONStream* js) { |
intptr_t id; |
@@ -944,11 +992,8 @@ static bool HandleClassesTypes(Isolate* isolate, const Class& cls, |
} |
return true; |
} |
+ ASSERT(js->num_arguments() >= 4); |
intptr_t id; |
- if (js->num_arguments() > 4) { |
- PrintError(js, "Command too long"); |
- return true; |
- } |
if (!GetIntegerId(js->GetArgument(3), &id)) { |
PrintError(js, "Must specify collection object id: types/id"); |
return true; |
@@ -959,8 +1004,11 @@ static bool HandleClassesTypes(Isolate* isolate, const Class& cls, |
PrintError(js, "Canonical type %" Pd " not found", id); |
return true; |
} |
- type.PrintToJSONStream(js, false); |
- return true; |
+ if (js->num_arguments() == 4) { |
+ type.PrintToJSONStream(js, false); |
+ return true; |
+ } |
+ return HandleInstanceCommands(isolate, type, js, 4); |
} |
@@ -1181,8 +1229,6 @@ static bool HandleObjects(Isolate* isolate, JSONStream* js) { |
PrintError(js, "unrecognized object id '%s'", arg); |
return true; |
} |
- |
- // Now what should we do with the object? |
if (js->num_arguments() == 2) { |
// Print. |
if (obj.IsNull()) { |
@@ -1197,47 +1243,7 @@ static bool HandleObjects(Isolate* isolate, JSONStream* js) { |
obj.PrintToJSONStream(js, false); |
return true; |
} |
- ASSERT(js->num_arguments() > 2); |
- |
- const char* action = js->GetArgument(2); |
- if (strcmp(action, "eval") == 0) { |
- if (js->num_arguments() > 3) { |
- PrintError(js, "expected at most 3 arguments but found %" Pd "\n", |
- js->num_arguments()); |
- return true; |
- } |
- if (obj.IsNull()) { |
- PrintErrorWithKind(js, "EvalCollected", |
- "attempt to evaluate against collected object\n", |
- js->num_arguments()); |
- return true; |
- } |
- if (obj.raw() == Object::sentinel().raw()) { |
- PrintErrorWithKind(js, "EvalExpired", |
- "attempt to evaluate against expired object\n", |
- js->num_arguments()); |
- return true; |
- } |
- const char* expr = js->LookupOption("expr"); |
- if (expr == NULL) { |
- PrintError(js, "eval expects an 'expr' option\n", |
- js->num_arguments()); |
- return true; |
- } |
- const String& expr_str = String::Handle(isolate, String::New(expr)); |
- ASSERT(obj.IsInstance()); |
- const Instance& instance = Instance::Cast(obj); |
- const Object& result = Object::Handle(instance.Evaluate(expr_str)); |
- if (result.IsNull()) { |
- Object::null_instance().PrintToJSONStream(js, true); |
- } else { |
- result.PrintToJSONStream(js, true); |
- } |
- return true; |
- } |
- |
- PrintError(js, "unrecognized action '%s'\n", action); |
- return true; |
+ return HandleInstanceCommands(isolate, obj, js, 2); |
} |