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

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

Issue 897193002: Finish moving service protocol to json rpc. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 5 years, 10 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/json_stream.h ('k') | runtime/vm/json_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 "platform/assert.h" 5 #include "platform/assert.h"
6 6
7 #include "vm/dart_entry.h" 7 #include "vm/dart_entry.h"
8 #include "vm/debugger.h" 8 #include "vm/debugger.h"
9 #include "vm/json_stream.h" 9 #include "vm/json_stream.h"
10 #include "vm/message.h" 10 #include "vm/message.h"
11 #include "vm/metrics.h" 11 #include "vm/metrics.h"
12 #include "vm/object.h" 12 #include "vm/object.h"
13 #include "vm/unicode.h" 13 #include "vm/unicode.h"
14 14
15 15
16 namespace dart { 16 namespace dart {
17 17
18 DECLARE_FLAG(bool, trace_service); 18 DECLARE_FLAG(bool, trace_service);
19 19
20 JSONStream::JSONStream(intptr_t buf_size) 20 JSONStream::JSONStream(intptr_t buf_size)
21 : open_objects_(0), 21 : open_objects_(0),
22 buffer_(buf_size), 22 buffer_(buf_size),
23 reply_port_(ILLEGAL_PORT), 23 reply_port_(ILLEGAL_PORT),
24 command_(""), 24 method_(""),
25 arguments_(NULL), 25 param_keys_(NULL),
26 num_arguments_(0), 26 param_values_(NULL),
27 option_keys_(NULL), 27 num_params_(0) {
28 option_values_(NULL),
29 num_options_(0) {
30 } 28 }
31 29
32 30
33 JSONStream::~JSONStream() { 31 JSONStream::~JSONStream() {
34 } 32 }
35 33
36 34
37 void JSONStream::Setup(Zone* zone, 35 void JSONStream::Setup(Zone* zone,
38 Dart_Port reply_port, 36 Dart_Port reply_port,
39 const GrowableObjectArray& path, 37 const String& method,
40 const Array& option_keys, 38 const Array& param_keys,
41 const Array& option_values) { 39 const Array& param_values) {
42 set_reply_port(reply_port); 40 set_reply_port(reply_port);
41 method_ = method.ToCString();
43 42
44 // Setup JSONStream arguments and options. The arguments and options
45 // are zone allocated and will be freed immediately after handling the
46 // message.
47 const char** arguments = zone->Alloc<const char*>(path.Length());
48 String& string_iterator = String::Handle(); 43 String& string_iterator = String::Handle();
49 for (intptr_t i = 0; i < path.Length(); i++) { 44 if (param_keys.Length() > 0) {
50 string_iterator ^= path.At(i); 45 ASSERT(param_keys.Length() == param_values.Length());
51 arguments[i] = zone->MakeCopyOfString(string_iterator.ToCString()); 46 const char** param_keys_native =
52 if (i == 0) { 47 zone->Alloc<const char*>(param_keys.Length());
53 command_ = arguments[i]; 48 const char** param_values_native =
54 } 49 zone->Alloc<const char*>(param_keys.Length());
55 } 50 for (intptr_t i = 0; i < param_keys.Length(); i++) {
56 SetArguments(arguments, path.Length()); 51 string_iterator ^= param_keys.At(i);
57 if (option_keys.Length() > 0) { 52 param_keys_native[i] =
58 const char** option_keys_native =
59 zone->Alloc<const char*>(option_keys.Length());
60 const char** option_values_native =
61 zone->Alloc<const char*>(option_keys.Length());
62 for (intptr_t i = 0; i < option_keys.Length(); i++) {
63 string_iterator ^= option_keys.At(i);
64 option_keys_native[i] =
65 zone->MakeCopyOfString(string_iterator.ToCString()); 53 zone->MakeCopyOfString(string_iterator.ToCString());
66 string_iterator ^= option_values.At(i); 54 string_iterator ^= param_values.At(i);
67 option_values_native[i] = 55 param_values_native[i] =
68 zone->MakeCopyOfString(string_iterator.ToCString()); 56 zone->MakeCopyOfString(string_iterator.ToCString());
69 } 57 }
70 SetOptions(option_keys_native, option_values_native, option_keys.Length()); 58 SetParams(param_keys_native, param_values_native, param_keys.Length());
71 } 59 }
72 if (FLAG_trace_service) { 60 if (FLAG_trace_service) {
73 Isolate* isolate = Isolate::Current(); 61 Isolate* isolate = Isolate::Current();
74 ASSERT(isolate != NULL); 62 ASSERT(isolate != NULL);
75 const char* isolate_name = isolate->name(); 63 const char* isolate_name = isolate->name();
76 OS::Print("Isolate %s processing service request %s", 64 OS::Print("Isolate %s processing service request %s\n",
77 isolate_name, command_); 65 isolate_name, method_);
78 for (intptr_t i = 1; i < num_arguments(); i++) {
79 OS::Print("/%s", GetArgument(i));
80 }
81 OS::Print("\n");
82 setup_time_micros_ = OS::GetCurrentTimeMicros(); 66 setup_time_micros_ = OS::GetCurrentTimeMicros();
83 } 67 }
84 } 68 }
85
86
87 void JSONStream::SetupNew(Zone* zone,
88 Dart_Port reply_port,
89 const String& method,
90 const Array& option_keys,
91 const Array& option_values) {
92 set_reply_port(reply_port);
93 command_ = method.ToCString();
94
95 String& string_iterator = String::Handle();
96 if (option_keys.Length() > 0) {
97 ASSERT(option_keys.Length() == option_values.Length());
98 const char** option_keys_native =
99 zone->Alloc<const char*>(option_keys.Length());
100 const char** option_values_native =
101 zone->Alloc<const char*>(option_keys.Length());
102 for (intptr_t i = 0; i < option_keys.Length(); i++) {
103 string_iterator ^= option_keys.At(i);
104 option_keys_native[i] =
105 zone->MakeCopyOfString(string_iterator.ToCString());
106 string_iterator ^= option_values.At(i);
107 option_values_native[i] =
108 zone->MakeCopyOfString(string_iterator.ToCString());
109 }
110 SetOptions(option_keys_native, option_values_native, option_keys.Length());
111 }
112 if (FLAG_trace_service) {
113 Isolate* isolate = Isolate::Current();
114 ASSERT(isolate != NULL);
115 const char* isolate_name = isolate->name();
116 OS::Print("Isolate %s processing service request %s",
117 isolate_name, command_);
118 for (intptr_t i = 1; i < num_arguments(); i++) {
119 OS::Print("/%s", GetArgument(i));
120 }
121 OS::Print("\n");
122 setup_time_micros_ = OS::GetCurrentTimeMicros();
123 }
124 }
125 69
126 70
127 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 71 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
128 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 72 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
129 return reinterpret_cast<uint8_t*>(new_ptr); 73 return reinterpret_cast<uint8_t*>(new_ptr);
130 } 74 }
131 75
132 76
133 void JSONStream::PostReply() { 77 void JSONStream::PostReply() {
134 Dart_Port port = reply_port(); 78 Dart_Port port = reply_port();
135 ASSERT(port != ILLEGAL_PORT); 79 ASSERT(port != ILLEGAL_PORT);
136 set_reply_port(ILLEGAL_PORT); // Prevent double replies. 80 set_reply_port(ILLEGAL_PORT); // Prevent double replies.
137 int64_t process_delta_micros = 0; 81 int64_t process_delta_micros = 0;
138 if (FLAG_trace_service) { 82 if (FLAG_trace_service) {
139 process_delta_micros = OS::GetCurrentTimeMicros() - setup_time_micros_; 83 process_delta_micros = OS::GetCurrentTimeMicros() - setup_time_micros_;
140 } 84 }
141 const String& reply = String::Handle(String::New(ToCString())); 85 const String& reply = String::Handle(String::New(ToCString()));
142 ASSERT(!reply.IsNull()); 86 ASSERT(!reply.IsNull());
143 87
144 uint8_t* data = NULL; 88 uint8_t* data = NULL;
145 MessageWriter writer(&data, &allocator, false); 89 MessageWriter writer(&data, &allocator, false);
146 writer.WriteMessage(reply); 90 writer.WriteMessage(reply);
147 PortMap::PostMessage(new Message(port, data, 91 PortMap::PostMessage(new Message(port, data,
148 writer.BytesWritten(), 92 writer.BytesWritten(),
149 Message::kNormalPriority)); 93 Message::kNormalPriority));
150 if (FLAG_trace_service) { 94 if (FLAG_trace_service) {
151 Isolate* isolate = Isolate::Current(); 95 Isolate* isolate = Isolate::Current();
152 ASSERT(isolate != NULL); 96 ASSERT(isolate != NULL);
153 const char* isolate_name = isolate->name(); 97 const char* isolate_name = isolate->name();
154 OS::Print("Isolate %s processed service request %s", 98 OS::Print("Isolate %s processed service request %s in %" Pd64" us.\n",
155 isolate_name, command_); 99 isolate_name, method_, process_delta_micros);
156 for (intptr_t i = 1; i < num_arguments(); i++) {
157 OS::Print("/%s", GetArgument(i));
158 }
159 OS::Print(" in %" Pd64" us.\n", process_delta_micros);
160 } 100 }
161 } 101 }
162 102
163 103
164 const char* JSONStream::LookupOption(const char* key) const { 104 const char* JSONStream::LookupParam(const char* key) const {
165 for (int i = 0; i < num_options(); i++) { 105 for (int i = 0; i < num_params(); i++) {
166 if (!strcmp(key, option_keys_[i])) { 106 if (!strcmp(key, param_keys_[i])) {
167 return option_values_[i]; 107 return param_values_[i];
168 } 108 }
169 } 109 }
170 return NULL; 110 return NULL;
171 } 111 }
172 112
173 113
174 bool JSONStream::HasOption(const char* key) const { 114 bool JSONStream::HasParam(const char* key) const {
175 ASSERT(key); 115 ASSERT(key);
176 return LookupOption(key) != NULL; 116 return LookupParam(key) != NULL;
177 } 117 }
178 118
179 119
180 bool JSONStream::OptionIs(const char* key, const char* value) const { 120 bool JSONStream::ParamIs(const char* key, const char* value) const {
181 ASSERT(key); 121 ASSERT(key);
182 ASSERT(value); 122 ASSERT(value);
183 const char* key_value = LookupOption(key); 123 const char* key_value = LookupParam(key);
184 return (key_value != NULL) && (strcmp(key_value, value) == 0); 124 return (key_value != NULL) && (strcmp(key_value, value) == 0);
185 } 125 }
186 126
187 127
188 void JSONStream::Clear() { 128 void JSONStream::Clear() {
189 buffer_.Clear(); 129 buffer_.Clear();
190 open_objects_ = 0; 130 open_objects_ = 0;
191 } 131 }
192 132
193 133
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 buffer_.AddChar('"'); 344 buffer_.AddChar('"');
405 free(p); 345 free(p);
406 } 346 }
407 347
408 348
409 void JSONStream::set_reply_port(Dart_Port port) { 349 void JSONStream::set_reply_port(Dart_Port port) {
410 reply_port_ = port; 350 reply_port_ = port;
411 } 351 }
412 352
413 353
414 void JSONStream::SetArguments(const char** arguments, intptr_t num_arguments) { 354 void JSONStream::SetParams(const char** param_keys,
415 if (num_arguments > 0) { 355 const char** param_values,
416 // Set command. 356 intptr_t num_params) {
417 command_ = arguments[0]; 357 param_keys_ = param_keys;
418 } 358 param_values_ = param_values;
419 arguments_ = arguments; 359 num_params_ = num_params;
420 num_arguments_ = num_arguments;
421 } 360 }
422 361
423 362
424 void JSONStream::SetOptions(const char** option_keys,
425 const char** option_values,
426 intptr_t num_options) {
427 option_keys_ = option_keys;
428 option_values_ = option_values;
429 num_options_ = num_options;
430 }
431
432
433 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) { 363 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) {
434 PrintPropertyName(name); 364 PrintPropertyName(name);
435 PrintValue(o, ref); 365 PrintValue(o, ref);
436 } 366 }
437 367
438 368
439 void JSONStream::PrintPropertyName(const char* name) { 369 void JSONStream::PrintPropertyName(const char* name) {
440 ASSERT(name != NULL); 370 ASSERT(name != NULL);
441 PrintCommaIfNeeded(); 371 PrintCommaIfNeeded();
442 buffer_.AddChar('"'); 372 buffer_.AddChar('"');
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); 477 intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
548 va_end(args); 478 va_end(args);
549 ASSERT(len == len2); 479 ASSERT(len == len2);
550 stream_->buffer_.AddChar('"'); 480 stream_->buffer_.AddChar('"');
551 stream_->AddEscapedUTF8String(p); 481 stream_->AddEscapedUTF8String(p);
552 stream_->buffer_.AddChar('"'); 482 stream_->buffer_.AddChar('"');
553 free(p); 483 free(p);
554 } 484 }
555 485
556 } // namespace dart 486 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/json_stream.h ('k') | runtime/vm/json_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698