| 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 | 6 |
| 7 #include "include/dart_native_api.h" |
| 7 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
| 8 #include "vm/debugger.h" | 9 #include "vm/debugger.h" |
| 9 #include "vm/json_stream.h" | 10 #include "vm/json_stream.h" |
| 10 #include "vm/message.h" | 11 #include "vm/message.h" |
| 11 #include "vm/metrics.h" | 12 #include "vm/metrics.h" |
| 12 #include "vm/object.h" | 13 #include "vm/object.h" |
| 14 #include "vm/safepoint.h" |
| 13 #include "vm/service.h" | 15 #include "vm/service.h" |
| 14 #include "vm/service_event.h" | 16 #include "vm/service_event.h" |
| 15 #include "vm/timeline.h" | 17 #include "vm/timeline.h" |
| 16 #include "vm/unicode.h" | 18 #include "vm/unicode.h" |
| 17 | 19 |
| 18 | 20 |
| 19 namespace dart { | 21 namespace dart { |
| 20 | 22 |
| 21 #ifndef PRODUCT | 23 #ifndef PRODUCT |
| 22 | 24 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 va_start(args2, details_format); | 188 va_start(args2, details_format); |
| 187 OS::VSNPrint(buffer, (len + 1), details_format, args2); | 189 OS::VSNPrint(buffer, (len + 1), details_format, args2); |
| 188 va_end(args2); | 190 va_end(args2); |
| 189 | 191 |
| 190 data.AddProperty("details", buffer); | 192 data.AddProperty("details", buffer); |
| 191 } | 193 } |
| 192 } | 194 } |
| 193 } | 195 } |
| 194 | 196 |
| 195 | 197 |
| 196 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | |
| 197 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | |
| 198 return reinterpret_cast<uint8_t*>(new_ptr); | |
| 199 } | |
| 200 | |
| 201 | |
| 202 void JSONStream::PostNullReply(Dart_Port port) { | 198 void JSONStream::PostNullReply(Dart_Port port) { |
| 203 PortMap::PostMessage(new Message( | 199 PortMap::PostMessage(new Message( |
| 204 port, Object::null(), Message::kNormalPriority)); | 200 port, Object::null(), Message::kNormalPriority)); |
| 205 } | 201 } |
| 206 | 202 |
| 207 | 203 |
| 204 static void Finalizer(void* isolate_callback_data, |
| 205 Dart_WeakPersistentHandle handle, |
| 206 void* buffer) { |
| 207 free(buffer); |
| 208 } |
| 209 |
| 210 |
| 208 void JSONStream::PostReply() { | 211 void JSONStream::PostReply() { |
| 209 Dart_Port port = reply_port(); | 212 Dart_Port port = reply_port(); |
| 210 ASSERT(port != ILLEGAL_PORT); | 213 ASSERT(port != ILLEGAL_PORT); |
| 211 set_reply_port(ILLEGAL_PORT); // Prevent double replies. | 214 set_reply_port(ILLEGAL_PORT); // Prevent double replies. |
| 212 ASSERT(seq_ != NULL); | 215 ASSERT(seq_ != NULL); |
| 213 if (seq_->IsString()) { | 216 if (seq_->IsString()) { |
| 214 const String& str = String::Cast(*seq_); | 217 const String& str = String::Cast(*seq_); |
| 215 PrintProperty("id", str.ToCString()); | 218 PrintProperty("id", str.ToCString()); |
| 216 } else if (seq_->IsInteger()) { | 219 } else if (seq_->IsInteger()) { |
| 217 const Integer& integer = Integer::Cast(*seq_); | 220 const Integer& integer = Integer::Cast(*seq_); |
| 218 PrintProperty64("id", integer.AsInt64Value()); | 221 PrintProperty64("id", integer.AsInt64Value()); |
| 219 } else if (seq_->IsDouble()) { | 222 } else if (seq_->IsDouble()) { |
| 220 const Double& dbl = Double::Cast(*seq_); | 223 const Double& dbl = Double::Cast(*seq_); |
| 221 PrintProperty("id", dbl.value()); | 224 PrintProperty("id", dbl.value()); |
| 222 } else if (seq_->IsNull()) { | 225 } else if (seq_->IsNull()) { |
| 223 // JSON-RPC 2.0 says that a request with a null ID shouldn't get a reply. | 226 // JSON-RPC 2.0 says that a request with a null ID shouldn't get a reply. |
| 224 PostNullReply(port); | 227 PostNullReply(port); |
| 225 return; | 228 return; |
| 226 } | 229 } |
| 227 buffer_.AddChar('}'); | 230 buffer_.AddChar('}'); |
| 228 | 231 |
| 229 const String& reply = String::Handle(String::New(ToCString())); | 232 char* cstr; |
| 230 ASSERT(!reply.IsNull()); | 233 intptr_t length; |
| 234 Steal(&cstr, &length); |
| 231 | 235 |
| 232 uint8_t* data = NULL; | 236 bool result; |
| 233 MessageWriter writer(&data, &allocator, false); | 237 { |
| 234 writer.WriteMessage(reply); | 238 TransitionVMToNative transition(Thread::Current()); |
| 235 bool result = PortMap::PostMessage(new Message(port, data, | 239 Dart_CObject bytes; |
| 236 writer.BytesWritten(), | 240 bytes.type = Dart_CObject_kExternalTypedData; |
| 237 Message::kNormalPriority)); | 241 bytes.value.as_external_typed_data.type = Dart_TypedData_kUint8; |
| 242 bytes.value.as_external_typed_data.length = length; |
| 243 bytes.value.as_external_typed_data.data = reinterpret_cast<uint8_t*>(cstr); |
| 244 bytes.value.as_external_typed_data.peer = cstr; |
| 245 bytes.value.as_external_typed_data.callback = Finalizer; |
| 246 Dart_CObject* elements[1]; |
| 247 elements[0] = &bytes; |
| 248 Dart_CObject message; |
| 249 message.type = Dart_CObject_kArray; |
| 250 message.value.as_array.length = 1; |
| 251 message.value.as_array.values = elements; |
| 252 result = Dart_PostCObject(port, &message); |
| 253 } |
| 254 |
| 255 if (!result) { |
| 256 free(cstr); |
| 257 } |
| 258 |
| 238 if (FLAG_trace_service) { | 259 if (FLAG_trace_service) { |
| 239 Isolate* isolate = Isolate::Current(); | 260 Isolate* isolate = Isolate::Current(); |
| 240 ASSERT(isolate != NULL); | 261 ASSERT(isolate != NULL); |
| 241 const char* isolate_name = isolate->name(); | 262 const char* isolate_name = isolate->name(); |
| 242 int64_t total_time = OS::GetCurrentTimeMicros() - setup_time_micros_; | 263 int64_t total_time = OS::GetCurrentTimeMicros() - setup_time_micros_; |
| 243 if (result) { | 264 if (result) { |
| 244 OS::Print("[+%" Pd64 "ms] Isolate %s processed service request %s " | 265 OS::Print("[+%" Pd64 "ms] Isolate %s processed service request %s " |
| 245 "(%" Pd64 "us)\n", | 266 "(%" Pd64 "us)\n", |
| 246 Dart::timestamp(), isolate_name, method_, total_time); | 267 Dart::timestamp(), isolate_name, method_, total_time); |
| 247 } else { | 268 } else { |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); | 686 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| 666 va_end(args); | 687 va_end(args); |
| 667 ASSERT(len == len2); | 688 ASSERT(len == len2); |
| 668 buffer_.AddChar('"'); | 689 buffer_.AddChar('"'); |
| 669 AddEscapedUTF8String(p); | 690 AddEscapedUTF8String(p); |
| 670 buffer_.AddChar('"'); | 691 buffer_.AddChar('"'); |
| 671 free(p); | 692 free(p); |
| 672 } | 693 } |
| 673 | 694 |
| 674 | 695 |
| 675 void JSONStream::Steal(const char** buffer, intptr_t* buffer_length) { | 696 void JSONStream::Steal(char** buffer, intptr_t* buffer_length) { |
| 676 ASSERT(buffer != NULL); | 697 ASSERT(buffer != NULL); |
| 677 ASSERT(buffer_length != NULL); | 698 ASSERT(buffer_length != NULL); |
| 678 *buffer_length = buffer_.length(); | 699 *buffer_length = buffer_.length(); |
| 679 *buffer = buffer_.Steal(); | 700 *buffer = buffer_.Steal(); |
| 680 } | 701 } |
| 681 | 702 |
| 682 | 703 |
| 683 void JSONStream::set_reply_port(Dart_Port port) { | 704 void JSONStream::set_reply_port(Dart_Port port) { |
| 684 reply_port_ = port; | 705 reply_port_ = port; |
| 685 } | 706 } |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 ASSERT(len == len2); | 983 ASSERT(len == len2); |
| 963 stream_->buffer_.AddChar('"'); | 984 stream_->buffer_.AddChar('"'); |
| 964 stream_->AddEscapedUTF8String(p); | 985 stream_->AddEscapedUTF8String(p); |
| 965 stream_->buffer_.AddChar('"'); | 986 stream_->buffer_.AddChar('"'); |
| 966 free(p); | 987 free(p); |
| 967 } | 988 } |
| 968 | 989 |
| 969 #endif // !PRODUCT | 990 #endif // !PRODUCT |
| 970 | 991 |
| 971 } // namespace dart | 992 } // namespace dart |
| OLD | NEW |