Index: runtime/lib/mirrors_impl.dart |
=================================================================== |
--- runtime/lib/mirrors_impl.dart (revision 0) |
+++ runtime/lib/mirrors_impl.dart (revision 0) |
@@ -0,0 +1,58 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+// VM-specific implementation of the dart:mirrors library. |
+ |
+class _IsolateMirrorImpl implements IsolateMirror { |
+ _IsolateMirrorImpl(this.port, this.debugName) {} |
+ |
+ final SendPort port; |
+ final String debugName; |
+ |
+ static buildCommand(List command) { |
+ command.add('isolateMirrorOf'); |
+ } |
+ |
+ static buildResponse(Map response) native "IsolateMirrorImpl_buildResponse"; |
+ |
+ static processResponse(SendPort port, Map response) { |
+ if (response['ok']) { |
+ return new _IsolateMirrorImpl(port, response['debugName']); |
+ } |
+ return null; |
+ } |
+} |
+ |
+class _Mirrors { |
+ static Future<IsolateMirror> isolateMirrorOf(SendPort port) { |
+ Completer<IsolateMirror> completer = new Completer<IsolateMirror>(); |
+ List command = new List(); |
+ _IsolateMirrorImpl.buildCommand(command); |
+ call(port, command).receive((message, _) { |
+ completer.complete(_IsolateMirrorImpl.processResponse(port, message)); |
+ }); |
+ return completer.future; |
+ } |
+ |
+ static void processCommand(var message, SendPort replyTo) { |
+ Map response = new Map(); |
+ if (message[0] == 'isolateMirrorOf') { |
+ _IsolateMirrorImpl.buildResponse(response); |
+ } else { |
+ response['ok'] = false; |
+ } |
+ replyTo.send(response); |
+ } |
+ |
+ static ReceivePort call(SendPort port, Object message) { |
+ ReceivePort rp = new ReceivePort.singleShot(); |
+ if (!send(port, message, rp.toSendPort())) { |
+ throw new Exception("Unable to send mirror request to port $port"); |
+ } |
+ return rp; |
+ } |
+ |
+ static bool send(SendPort port, Object message, SendPort replyTo) |
+ native "Mirrors_send"; |
+} |