| Index: runtime/vm/json_stream.cc
|
| diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
|
| index 003f1b36d3c76a91340a6ab3dbfadf43be15d4af..c367f2e0837239535cb870f09fdfeef9b434228a 100644
|
| --- a/runtime/vm/json_stream.cc
|
| +++ b/runtime/vm/json_stream.cc
|
| @@ -46,6 +46,8 @@ JSONStream::JSONStream(intptr_t buf_size)
|
| id_zone_(&default_id_zone_),
|
| reply_port_(ILLEGAL_PORT),
|
| seq_(NULL),
|
| + parameter_keys_(NULL),
|
| + parameter_values_(NULL),
|
| method_(""),
|
| param_keys_(NULL),
|
| param_values_(NULL),
|
| @@ -70,13 +72,18 @@ void JSONStream::Setup(Zone* zone,
|
| const Instance& seq,
|
| const String& method,
|
| const Array& param_keys,
|
| - const Array& param_values) {
|
| + const Array& param_values,
|
| + bool parameters_are_dart_objects) {
|
| set_reply_port(reply_port);
|
| seq_ = &Instance::ZoneHandle(seq.raw());
|
| method_ = method.ToCString();
|
|
|
| - String& string_iterator = String::Handle();
|
| - if (param_keys.Length() > 0) {
|
| + if (parameters_are_dart_objects) {
|
| + parameter_keys_ = &Array::ZoneHandle(param_keys.raw());
|
| + parameter_values_ = &Array::ZoneHandle(param_values.raw());
|
| + ASSERT(parameter_keys_->Length() == parameter_values_->Length());
|
| + } else if (param_keys.Length() > 0) {
|
| + String& string_iterator = String::Handle();
|
| ASSERT(param_keys.Length() == param_values.Length());
|
| const char** param_keys_native =
|
| zone->Alloc<const char*>(param_keys.Length());
|
| @@ -92,6 +99,7 @@ void JSONStream::Setup(Zone* zone,
|
| }
|
| SetParams(param_keys_native, param_values_native, param_keys.Length());
|
| }
|
| +
|
| if (FLAG_trace_service) {
|
| Isolate* isolate = Isolate::Current();
|
| ASSERT(isolate != NULL);
|
| @@ -130,6 +138,14 @@ static const char* GetJSONRpcErrorMessage(intptr_t code) {
|
| return "Isolate must be runnable";
|
| case kIsolateMustBePaused:
|
| return "Isolate must be paused";
|
| + case kIsolateIsReloading:
|
| + return "Isolate is reloading";
|
| + case kFileSystemAlreadyExists:
|
| + return "File system already exists";
|
| + case kFileSystemDoesNotExist:
|
| + return "File system does not exist";
|
| + case kFileDoesNotExist:
|
| + return "File does not exist";
|
| default:
|
| return "Extension error";
|
| }
|
| @@ -667,6 +683,42 @@ void JSONStream::set_reply_port(Dart_Port port) {
|
| }
|
|
|
|
|
| +intptr_t JSONStream::NumObjectParameters() const {
|
| + if (parameter_keys_ == NULL) {
|
| + return 0;
|
| + }
|
| + ASSERT(parameter_keys_ != NULL);
|
| + ASSERT(parameter_values_ != NULL);
|
| + return parameter_keys_->Length();
|
| +}
|
| +
|
| +
|
| +RawObject* JSONStream::GetObjectParameterKey(intptr_t i) const {
|
| + ASSERT((i >= 0) && (i < NumObjectParameters()));
|
| + return parameter_keys_->At(i);
|
| +}
|
| +
|
| +
|
| +RawObject* JSONStream::GetObjectParameterValue(intptr_t i) const {
|
| + ASSERT((i >= 0) && (i < NumObjectParameters()));
|
| + return parameter_values_->At(i);
|
| +}
|
| +
|
| +
|
| +RawObject* JSONStream::LookupObjectParam(const char* c_key) const {
|
| + const String& key = String::Handle(String::New(c_key));
|
| + Object& test = Object::Handle();
|
| + const intptr_t num_object_parameters = NumObjectParameters();
|
| + for (intptr_t i = 0; i < num_object_parameters; i++) {
|
| + test = GetObjectParameterKey(i);
|
| + if (test.IsString() && String::Cast(test).Equals(key)) {
|
| + return GetObjectParameterValue(i);
|
| + }
|
| + }
|
| + return Object::null();
|
| +}
|
| +
|
| +
|
| void JSONStream::SetParams(const char** param_keys,
|
| const char** param_values,
|
| intptr_t num_params) {
|
|
|