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 "vm/service.h" | 5 #include "vm/service.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
10 | 10 |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 return true; | 504 return true; |
505 } | 505 } |
506 | 506 |
507 | 507 |
508 void Service::PostError(const String& method_name, | 508 void Service::PostError(const String& method_name, |
509 const Array& parameter_keys, | 509 const Array& parameter_keys, |
510 const Array& parameter_values, | 510 const Array& parameter_values, |
511 const Instance& reply_port, | 511 const Instance& reply_port, |
512 const Instance& id, | 512 const Instance& id, |
513 const Error& error) { | 513 const Error& error) { |
514 Isolate* isolate = Isolate::Current(); | 514 Thread* thread = Thread::Current(); |
| 515 Isolate* isolate = thread->isolate(); |
515 StackZone zone(isolate); | 516 StackZone zone(isolate); |
516 HANDLESCOPE(isolate); | 517 HANDLESCOPE(thread); |
517 JSONStream js; | 518 JSONStream js; |
518 js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(), | 519 js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(), |
519 id, method_name, parameter_keys, parameter_values); | 520 id, method_name, parameter_keys, parameter_values); |
520 js.PrintError(kExtensionError, | 521 js.PrintError(kExtensionError, |
521 "Error in extension `%s`: %s", | 522 "Error in extension `%s`: %s", |
522 js.method(), error.ToErrorCString()); | 523 js.method(), error.ToErrorCString()); |
523 js.PostReply(); | 524 js.PostReply(); |
524 } | 525 } |
525 | 526 |
526 | 527 |
527 void Service::InvokeMethod(Isolate* isolate, const Array& msg) { | 528 void Service::InvokeMethod(Isolate* isolate, const Array& msg) { |
| 529 Thread* thread = Thread::Current(); |
| 530 ASSERT(isolate == thread->isolate()); |
528 ASSERT(isolate != NULL); | 531 ASSERT(isolate != NULL); |
529 ASSERT(!msg.IsNull()); | 532 ASSERT(!msg.IsNull()); |
530 ASSERT(msg.Length() == 6); | 533 ASSERT(msg.Length() == 6); |
531 | 534 |
532 { | 535 { |
533 StackZone zone(isolate); | 536 StackZone zone(isolate); |
534 HANDLESCOPE(isolate); | 537 HANDLESCOPE(thread); |
535 | 538 |
536 Instance& reply_port = Instance::Handle(isolate); | 539 Instance& reply_port = Instance::Handle(isolate); |
537 Instance& seq = String::Handle(isolate); | 540 Instance& seq = String::Handle(isolate); |
538 String& method_name = String::Handle(isolate); | 541 String& method_name = String::Handle(isolate); |
539 Array& param_keys = Array::Handle(isolate); | 542 Array& param_keys = Array::Handle(isolate); |
540 Array& param_values = Array::Handle(isolate); | 543 Array& param_values = Array::Handle(isolate); |
541 reply_port ^= msg.At(1); | 544 reply_port ^= msg.At(1); |
542 seq ^= msg.At(2); | 545 seq ^= msg.At(2); |
543 method_name ^= msg.At(3); | 546 method_name ^= msg.At(3); |
544 param_keys ^= msg.At(4); | 547 param_keys ^= msg.At(4); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 } | 646 } |
644 | 647 |
645 | 648 |
646 void Service::SendEvent(const char* stream_id, | 649 void Service::SendEvent(const char* stream_id, |
647 const char* event_type, | 650 const char* event_type, |
648 const Object& event_message) { | 651 const Object& event_message) { |
649 ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())); | 652 ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())); |
650 if (!ServiceIsolate::IsRunning()) { | 653 if (!ServiceIsolate::IsRunning()) { |
651 return; | 654 return; |
652 } | 655 } |
653 Isolate* isolate = Isolate::Current(); | 656 Thread* thread = Thread::Current(); |
| 657 Isolate* isolate = thread->isolate(); |
654 ASSERT(isolate != NULL); | 658 ASSERT(isolate != NULL); |
655 HANDLESCOPE(isolate); | 659 HANDLESCOPE(thread); |
656 | 660 |
657 const Array& list = Array::Handle(Array::New(2)); | 661 const Array& list = Array::Handle(Array::New(2)); |
658 ASSERT(!list.IsNull()); | 662 ASSERT(!list.IsNull()); |
659 const String& stream_id_str = String::Handle(String::New(stream_id)); | 663 const String& stream_id_str = String::Handle(String::New(stream_id)); |
660 list.SetAt(0, stream_id_str); | 664 list.SetAt(0, stream_id_str); |
661 list.SetAt(1, event_message); | 665 list.SetAt(1, event_message); |
662 | 666 |
663 // Push the event to port_. | 667 // Push the event to port_. |
664 uint8_t* data = NULL; | 668 uint8_t* data = NULL; |
665 MessageWriter writer(&data, &allocator, false); | 669 MessageWriter writer(&data, &allocator, false); |
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1471 isolate->message_handler()->AcquireQueues(&aq); | 1475 isolate->message_handler()->AcquireQueues(&aq); |
1472 Message* message = aq.queue()->FindMessageById(message_id); | 1476 Message* message = aq.queue()->FindMessageById(message_id); |
1473 if (message == NULL) { | 1477 if (message == NULL) { |
1474 // The user may try to load an expired message, so we treat | 1478 // The user may try to load an expired message, so we treat |
1475 // unrecognized ids as if they are expired. | 1479 // unrecognized ids as if they are expired. |
1476 PrintSentinel(js, kExpiredSentinel); | 1480 PrintSentinel(js, kExpiredSentinel); |
1477 return true; | 1481 return true; |
1478 } | 1482 } |
1479 MessageSnapshotReader reader(message->data(), | 1483 MessageSnapshotReader reader(message->data(), |
1480 message->len(), | 1484 message->len(), |
1481 isolate, | 1485 Thread::Current()); |
1482 Thread::Current()->zone()); | |
1483 const Object& msg_obj = Object::Handle(reader.ReadObject()); | 1486 const Object& msg_obj = Object::Handle(reader.ReadObject()); |
1484 msg_obj.PrintJSON(js); | 1487 msg_obj.PrintJSON(js); |
1485 return true; | 1488 return true; |
1486 } | 1489 } |
1487 } | 1490 } |
1488 return false; | 1491 return false; |
1489 } | 1492 } |
1490 | 1493 |
1491 | 1494 |
1492 static bool PrintInboundReferences(Isolate* isolate, | 1495 static bool PrintInboundReferences(Isolate* isolate, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1539 } | 1542 } |
1540 | 1543 |
1541 | 1544 |
1542 static const MethodParameter* get_inbound_references_params[] = { | 1545 static const MethodParameter* get_inbound_references_params[] = { |
1543 ISOLATE_PARAMETER, | 1546 ISOLATE_PARAMETER, |
1544 NULL, | 1547 NULL, |
1545 }; | 1548 }; |
1546 | 1549 |
1547 | 1550 |
1548 static bool GetInboundReferences(Isolate* isolate, JSONStream* js) { | 1551 static bool GetInboundReferences(Isolate* isolate, JSONStream* js) { |
| 1552 Thread* thread = Thread::Current(); |
| 1553 ASSERT(isolate == thread->isolate()); |
| 1554 |
1549 const char* target_id = js->LookupParam("targetId"); | 1555 const char* target_id = js->LookupParam("targetId"); |
1550 if (target_id == NULL) { | 1556 if (target_id == NULL) { |
1551 PrintMissingParamError(js, "targetId"); | 1557 PrintMissingParamError(js, "targetId"); |
1552 return true; | 1558 return true; |
1553 } | 1559 } |
1554 const char* limit_cstr = js->LookupParam("limit"); | 1560 const char* limit_cstr = js->LookupParam("limit"); |
1555 if (limit_cstr == NULL) { | 1561 if (limit_cstr == NULL) { |
1556 PrintMissingParamError(js, "limit"); | 1562 PrintMissingParamError(js, "limit"); |
1557 return true; | 1563 return true; |
1558 } | 1564 } |
1559 intptr_t limit; | 1565 intptr_t limit; |
1560 if (!GetIntegerId(limit_cstr, &limit)) { | 1566 if (!GetIntegerId(limit_cstr, &limit)) { |
1561 PrintInvalidParamError(js, "limit"); | 1567 PrintInvalidParamError(js, "limit"); |
1562 return true; | 1568 return true; |
1563 } | 1569 } |
1564 | 1570 |
1565 Object& obj = Object::Handle(isolate); | 1571 Object& obj = Object::Handle(isolate); |
1566 ObjectIdRing::LookupResult lookup_result; | 1572 ObjectIdRing::LookupResult lookup_result; |
1567 { | 1573 { |
1568 HANDLESCOPE(isolate); | 1574 HANDLESCOPE(thread); |
1569 obj = LookupHeapObject(isolate, target_id, &lookup_result); | 1575 obj = LookupHeapObject(isolate, target_id, &lookup_result); |
1570 } | 1576 } |
1571 if (obj.raw() == Object::sentinel().raw()) { | 1577 if (obj.raw() == Object::sentinel().raw()) { |
1572 if (lookup_result == ObjectIdRing::kCollected) { | 1578 if (lookup_result == ObjectIdRing::kCollected) { |
1573 PrintSentinel(js, kCollectedSentinel); | 1579 PrintSentinel(js, kCollectedSentinel); |
1574 } else if (lookup_result == ObjectIdRing::kExpired) { | 1580 } else if (lookup_result == ObjectIdRing::kExpired) { |
1575 PrintSentinel(js, kExpiredSentinel); | 1581 PrintSentinel(js, kExpiredSentinel); |
1576 } else { | 1582 } else { |
1577 PrintInvalidParamError(js, "targetId"); | 1583 PrintInvalidParamError(js, "targetId"); |
1578 } | 1584 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 } | 1644 } |
1639 | 1645 |
1640 | 1646 |
1641 static const MethodParameter* get_retaining_path_params[] = { | 1647 static const MethodParameter* get_retaining_path_params[] = { |
1642 ISOLATE_PARAMETER, | 1648 ISOLATE_PARAMETER, |
1643 NULL, | 1649 NULL, |
1644 }; | 1650 }; |
1645 | 1651 |
1646 | 1652 |
1647 static bool GetRetainingPath(Isolate* isolate, JSONStream* js) { | 1653 static bool GetRetainingPath(Isolate* isolate, JSONStream* js) { |
| 1654 Thread* thread = Thread::Current(); |
| 1655 ASSERT(isolate == thread->isolate()); |
| 1656 |
1648 const char* target_id = js->LookupParam("targetId"); | 1657 const char* target_id = js->LookupParam("targetId"); |
1649 if (target_id == NULL) { | 1658 if (target_id == NULL) { |
1650 PrintMissingParamError(js, "targetId"); | 1659 PrintMissingParamError(js, "targetId"); |
1651 return true; | 1660 return true; |
1652 } | 1661 } |
1653 const char* limit_cstr = js->LookupParam("limit"); | 1662 const char* limit_cstr = js->LookupParam("limit"); |
1654 if (limit_cstr == NULL) { | 1663 if (limit_cstr == NULL) { |
1655 PrintMissingParamError(js, "limit"); | 1664 PrintMissingParamError(js, "limit"); |
1656 return true; | 1665 return true; |
1657 } | 1666 } |
1658 intptr_t limit; | 1667 intptr_t limit; |
1659 if (!GetIntegerId(limit_cstr, &limit)) { | 1668 if (!GetIntegerId(limit_cstr, &limit)) { |
1660 PrintInvalidParamError(js, "limit"); | 1669 PrintInvalidParamError(js, "limit"); |
1661 return true; | 1670 return true; |
1662 } | 1671 } |
1663 | 1672 |
1664 Object& obj = Object::Handle(isolate); | 1673 Object& obj = Object::Handle(isolate); |
1665 ObjectIdRing::LookupResult lookup_result; | 1674 ObjectIdRing::LookupResult lookup_result; |
1666 { | 1675 { |
1667 HANDLESCOPE(isolate); | 1676 HANDLESCOPE(thread); |
1668 obj = LookupHeapObject(isolate, target_id, &lookup_result); | 1677 obj = LookupHeapObject(isolate, target_id, &lookup_result); |
1669 } | 1678 } |
1670 if (obj.raw() == Object::sentinel().raw()) { | 1679 if (obj.raw() == Object::sentinel().raw()) { |
1671 if (lookup_result == ObjectIdRing::kCollected) { | 1680 if (lookup_result == ObjectIdRing::kCollected) { |
1672 PrintSentinel(js, kCollectedSentinel); | 1681 PrintSentinel(js, kCollectedSentinel); |
1673 } else if (lookup_result == ObjectIdRing::kExpired) { | 1682 } else if (lookup_result == ObjectIdRing::kExpired) { |
1674 PrintSentinel(js, kExpiredSentinel); | 1683 PrintSentinel(js, kExpiredSentinel); |
1675 } else { | 1684 } else { |
1676 PrintInvalidParamError(js, "targetId"); | 1685 PrintInvalidParamError(js, "targetId"); |
1677 } | 1686 } |
(...skipping 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3163 ServiceMethodDescriptor& method = service_methods_[i]; | 3172 ServiceMethodDescriptor& method = service_methods_[i]; |
3164 if (strcmp(method_name, method.name) == 0) { | 3173 if (strcmp(method_name, method.name) == 0) { |
3165 return &method; | 3174 return &method; |
3166 } | 3175 } |
3167 } | 3176 } |
3168 return NULL; | 3177 return NULL; |
3169 } | 3178 } |
3170 | 3179 |
3171 | 3180 |
3172 } // namespace dart | 3181 } // namespace dart |
OLD | NEW |