| 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 |