| 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 "bin/vmservice_impl.h" | 5 #include "bin/vmservice_impl.h" | 
| 6 | 6 | 
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" | 
| 8 | 8 | 
| 9 #include "bin/builtin.h" | 9 #include "bin/builtin.h" | 
| 10 #include "bin/dartutils.h" | 10 #include "bin/dartutils.h" | 
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 484   return reinterpret_cast<uint8_t*>(new_ptr); | 484   return reinterpret_cast<uint8_t*>(new_ptr); | 
| 485 } | 485 } | 
| 486 | 486 | 
| 487 | 487 | 
| 488 static void SendServiceMessage(Dart_NativeArguments args) { | 488 static void SendServiceMessage(Dart_NativeArguments args) { | 
| 489   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 489   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 
| 490   Isolate* isolate = arguments->isolate(); | 490   Isolate* isolate = arguments->isolate(); | 
| 491   StackZone zone(isolate); | 491   StackZone zone(isolate); | 
| 492   HANDLESCOPE(isolate); | 492   HANDLESCOPE(isolate); | 
| 493   GET_NON_NULL_NATIVE_ARGUMENT(Instance, sp, arguments->NativeArgAt(0)); | 493   GET_NON_NULL_NATIVE_ARGUMENT(Instance, sp, arguments->NativeArgAt(0)); | 
| 494   GET_NON_NULL_NATIVE_ARGUMENT(Instance, rp, arguments->NativeArgAt(1)); | 494   GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(1)); | 
| 495   GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(2)); |  | 
| 496 | 495 | 
| 497   // Extract SendPort port id. | 496   // Extract SendPort port id. | 
| 498   const Object& sp_id_obj = Object::Handle(DartLibraryCalls::PortGetId(sp)); | 497   const Object& sp_id_obj = Object::Handle(DartLibraryCalls::PortGetId(sp)); | 
| 499   if (sp_id_obj.IsError()) { | 498   if (sp_id_obj.IsError()) { | 
| 500     Exceptions::PropagateError(Error::Cast(sp_id_obj)); | 499     Exceptions::PropagateError(Error::Cast(sp_id_obj)); | 
| 501   } | 500   } | 
| 502   Integer& id = Integer::Handle(); | 501   Integer& id = Integer::Handle(); | 
| 503   id ^= sp_id_obj.raw(); | 502   id ^= sp_id_obj.raw(); | 
| 504   Dart_Port sp_id = static_cast<Dart_Port>(id.AsInt64Value()); | 503   Dart_Port sp_id = static_cast<Dart_Port>(id.AsInt64Value()); | 
| 505 |  | 
| 506   // Extract ReceivePort port id. |  | 
| 507   const Object& rp_id_obj = Object::Handle(DartLibraryCalls::PortGetId(rp)); |  | 
| 508   if (rp_id_obj.IsError()) { |  | 
| 509     Exceptions::PropagateError(Error::Cast(rp_id_obj)); |  | 
| 510   } |  | 
| 511   ASSERT(rp_id_obj.IsSmi() || rp_id_obj.IsMint()); |  | 
| 512   id ^= rp_id_obj.raw(); |  | 
| 513   Dart_Port rp_id = static_cast<Dart_Port>(id.AsInt64Value()); |  | 
| 514 |  | 
| 515   // Both are valid ports. |  | 
| 516   ASSERT(sp_id != ILLEGAL_PORT); | 504   ASSERT(sp_id != ILLEGAL_PORT); | 
| 517   ASSERT(rp_id != ILLEGAL_PORT); |  | 
| 518 | 505 | 
| 519   // Serialize message. | 506   // Serialize message. | 
| 520   uint8_t* data = NULL; | 507   uint8_t* data = NULL; | 
| 521   MessageWriter writer(&data, &allocator); | 508   MessageWriter writer(&data, &allocator); | 
| 522   writer.WriteMessage(message); | 509   writer.WriteMessage(message); | 
| 523 | 510 | 
| 524   // TODO(turnidge): Throw an exception when the return value is false? | 511   // TODO(turnidge): Throw an exception when the return value is false? | 
| 525   PortMap::PostMessage(new Message(sp_id, rp_id, data, writer.BytesWritten(), | 512   PortMap::PostMessage(new Message(sp_id, data, writer.BytesWritten(), | 
| 526                                    Message::kOOBPriority)); | 513                                    Message::kOOBPriority)); | 
| 527 } | 514 } | 
| 528 | 515 | 
| 529 | 516 | 
| 530 struct VmServiceNativeEntry { | 517 struct VmServiceNativeEntry { | 
| 531   const char* name; | 518   const char* name; | 
| 532   int num_arguments; | 519   int num_arguments; | 
| 533   Dart_NativeFunction function; | 520   Dart_NativeFunction function; | 
| 534 }; | 521 }; | 
| 535 | 522 | 
| 536 | 523 | 
| 537 static VmServiceNativeEntry _VmServiceNativeEntries[] = { | 524 static VmServiceNativeEntry _VmServiceNativeEntries[] = { | 
| 538   {"VMService_SendServiceMessage", 3, SendServiceMessage} | 525   {"VMService_SendServiceMessage", 2, SendServiceMessage} | 
| 539 }; | 526 }; | 
| 540 | 527 | 
| 541 | 528 | 
| 542 static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name, | 529 static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name, | 
| 543                                                    int num_arguments) { | 530                                                    int num_arguments) { | 
| 544   const Object& obj = Object::Handle(Api::UnwrapHandle(name)); | 531   const Object& obj = Object::Handle(Api::UnwrapHandle(name)); | 
| 545   if (!obj.IsString()) { | 532   if (!obj.IsString()) { | 
| 546     return NULL; | 533     return NULL; | 
| 547   } | 534   } | 
| 548   const char* function_name = obj.ToCString(); | 535   const char* function_name = obj.ToCString(); | 
| 549   ASSERT(function_name != NULL); | 536   ASSERT(function_name != NULL); | 
| 550   intptr_t n = | 537   intptr_t n = | 
| 551       sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]); | 538       sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]); | 
| 552   for (intptr_t i = 0; i < n; i++) { | 539   for (intptr_t i = 0; i < n; i++) { | 
| 553     VmServiceNativeEntry entry = _VmServiceNativeEntries[i]; | 540     VmServiceNativeEntry entry = _VmServiceNativeEntries[i]; | 
| 554     if (!strcmp(function_name, entry.name) && | 541     if (!strcmp(function_name, entry.name) && | 
| 555         (num_arguments == entry.num_arguments)) { | 542         (num_arguments == entry.num_arguments)) { | 
| 556       return entry.function; | 543       return entry.function; | 
| 557     } | 544     } | 
| 558   } | 545   } | 
| 559   return NULL; | 546   return NULL; | 
| 560 } | 547 } | 
| 561 | 548 | 
| 562 }  // namespace bin | 549 }  // namespace bin | 
| 563 }  // namespace dart | 550 }  // namespace dart | 
| OLD | NEW | 
|---|