| Index: runtime/bin/socket_patch.dart
 | 
| diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
 | 
| index 58c9ddd0547f12a6942202b8a03a54bc5f699535..f5c302656fb05e324a09839d69dc364ef4875e31 100644
 | 
| --- a/runtime/bin/socket_patch.dart
 | 
| +++ b/runtime/bin/socket_patch.dart
 | 
| @@ -12,36 +12,12 @@ patch class RawServerSocket  {
 | 
|  
 | 
|  
 | 
|  patch class RawSocket {
 | 
| -  /* patch */ static Future<RawSocket> connect(host, int port) {
 | 
| +  /* patch */ static Future<RawSocket> connect(String host, int port) {
 | 
|      return _RawSocket.connect(host, port);
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  
 | 
| -patch class InternetAddress {
 | 
| -  /* patch */ static Future<List<InternetAddress>> lookup(
 | 
| -      String host, {InternetAddressType type: InternetAddressType.ANY}) {
 | 
| -    return _NativeSocket.lookup(host, type: type);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -class _InternetAddress implements InternetAddress {
 | 
| -  final InternetAddressType type;
 | 
| -  final String address;
 | 
| -  final String host;
 | 
| -  final Uint8List _sockaddr_storage;
 | 
| -
 | 
| -  _InternetAddress(InternetAddressType this.type,
 | 
| -                   String this.address,
 | 
| -                   String this.host,
 | 
| -                   List<int> this._sockaddr_storage);
 | 
| -
 | 
| -  String toString() {
 | 
| -    return "InternetAddress('$address', ${type.name})";
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -
 | 
|  // The _NativeSocket class encapsulates an OS socket.
 | 
|  class _NativeSocket extends NativeFieldWrapperClass1 {
 | 
|    // Bit flags used when communicating between the eventhandler and
 | 
| @@ -98,91 +74,57 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
 | 
|    // Holds the port of the socket, null if not known.
 | 
|    int localPort;
 | 
|  
 | 
| -  // Holds the address used to connect or bind the socket.
 | 
| -  InternetAddress address;
 | 
| +  // Holds the host or address used to connect or bind the socket.
 | 
| +  String localHost;
 | 
|  
 | 
|    // Native port for socket services.
 | 
|    static SendPort socketService;
 | 
|  
 | 
| -  static Future<List<InternetAddress>> lookup(
 | 
| -      String host, {InternetAddressType type: InternetAddressType.ANY}) {
 | 
| +  static Future<_NativeSocket> connect(String host, int port) {
 | 
| +    var completer = new Completer();
 | 
|      ensureSocketService();
 | 
| -    return socketService.call([HOST_NAME_LOOKUP, host, type._value])
 | 
| -        .then((response) {
 | 
| -          if (isErrorResponse(response)) {
 | 
| -            throw createError(response, "Failed host name lookup");
 | 
| -          } else {
 | 
| -            return response.skip(1).map((result) {
 | 
| -              var type = new InternetAddressType._from(result[0]);
 | 
| -              return new _InternetAddress(type, result[1], host, result[2]);
 | 
| -            }).toList();
 | 
| -          }
 | 
| -        });
 | 
| -  }
 | 
| -
 | 
| -  static Future<_NativeSocket> connect(host, int port) {
 | 
| -    return new Future.value(host)
 | 
| -        .then((host) {
 | 
| -          if (host is _InternetAddress) return host;
 | 
| -          return lookup(host)
 | 
| -              .then((list) {
 | 
| -                if (list.length == 0) {
 | 
| -                  throw createError(response, "Failed host name lookup");
 | 
| -                }
 | 
| -                return list[0];
 | 
| -              });
 | 
| -        })
 | 
| -        .then((address) {
 | 
| -          ensureSocketService();
 | 
| -          var socket = new _NativeSocket.normal();
 | 
| -          socket.address = address;
 | 
| -          var result = socket.nativeCreateConnect(
 | 
| -              address._sockaddr_storage, port);
 | 
| -          if (result is OSError) {
 | 
| -            throw createError(result, "Connection failed");
 | 
| -          } else {
 | 
| -            var completer = new Completer();
 | 
| -            // Setup handlers for receiving the first write event which
 | 
| -            // indicate that the socket is fully connected.
 | 
| -            socket.setHandlers(
 | 
| -                write: () {
 | 
| -                  socket.setListening(read: false, write: false);
 | 
| -                  completer.complete(socket);
 | 
| -                },
 | 
| -                error: (e) {
 | 
| -                  socket.close();
 | 
| -                  completer.completeError(createError(e, "Connection failed"));
 | 
| -                }
 | 
| -            );
 | 
| -            socket.setListening(read: false, write: true);
 | 
| -            return completer.future;
 | 
| -          }
 | 
| -        });
 | 
| +    socketService.call([HOST_NAME_LOOKUP, host]).then((response) {
 | 
| +      if (isErrorResponse(response)) {
 | 
| +        completer.completeError(
 | 
| +            createError(response, "Failed host name lookup"));
 | 
| +      } else {
 | 
| +        var socket = new _NativeSocket.normal();
 | 
| +        socket.localHost = host;
 | 
| +        var result = socket.nativeCreateConnect(response, port);
 | 
| +        if (result is OSError) {
 | 
| +          completer.completeError(createError(result, "Connection failed"));
 | 
| +        } else {
 | 
| +          // Setup handlers for receiving the first write event which
 | 
| +          // indicate that the socket is fully connected.
 | 
| +          socket.setHandlers(
 | 
| +              write: () {
 | 
| +                socket.setListening(read: false, write: false);
 | 
| +                completer.complete(socket);
 | 
| +              },
 | 
| +              error: (e) {
 | 
| +                socket.close();
 | 
| +                completer.completeError(createError(e, "Connection failed"));
 | 
| +              }
 | 
| +          );
 | 
| +          socket.setListening(read: false, write: true);
 | 
| +        }
 | 
| +      }
 | 
| +    });
 | 
| +    return completer.future;
 | 
|    }
 | 
|  
 | 
|    static Future<_NativeSocket> bind(String address,
 | 
|                                      int port,
 | 
|                                      int backlog) {
 | 
| -    return lookup(address)
 | 
| -        .then((list) {
 | 
| -          if (list.length == 0) {
 | 
| -            throw createError(response, "Failed host name lookup");
 | 
| -          }
 | 
| -          return list[0];
 | 
| -        })
 | 
| -        .then((address) {
 | 
| -          var socket = new _NativeSocket.listen();
 | 
| -          socket.address = address;
 | 
| -          var result = socket.nativeCreateBindListen(address._sockaddr_storage,
 | 
| -                                                     port,
 | 
| -                                                     backlog);
 | 
| -          if (result is OSError) {
 | 
| -            throw new SocketIOException(
 | 
| -                "Failed to create server socket", result);
 | 
| -          }
 | 
| -          if (port != 0) socket.localPort = port;
 | 
| -          return socket;
 | 
| -        });
 | 
| +    var socket = new _NativeSocket.listen();
 | 
| +    socket.localHost = address;
 | 
| +    var result = socket.nativeCreateBindListen(address, port, backlog);
 | 
| +    if (result is OSError) {
 | 
| +      return new Future.error(
 | 
| +          new SocketIOException("Failed to create server socket", result));
 | 
| +    }
 | 
| +    if (port != 0) socket.localPort = port;
 | 
| +    return new Future.value(socket);
 | 
|    }
 | 
|  
 | 
|    _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET {
 | 
| @@ -252,8 +194,6 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
 | 
|    _NativeSocket accept() {
 | 
|      var socket = new _NativeSocket.normal();
 | 
|      if (nativeAccept(socket) != true) return null;
 | 
| -    socket.localPort = localPort;
 | 
| -    socket.address = address;
 | 
|      return socket;
 | 
|    }
 | 
|  
 | 
| @@ -266,6 +206,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
 | 
|      return nativeGetRemotePeer()[1];
 | 
|    }
 | 
|  
 | 
| +  String get host => localHost;
 | 
| +
 | 
|    String get remoteHost {
 | 
|      return nativeGetRemotePeer()[0];
 | 
|    }
 | 
| @@ -467,9 +409,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
 | 
|    nativeRead(int len) native "Socket_Read";
 | 
|    nativeWrite(List<int> buffer, int offset, int bytes)
 | 
|        native "Socket_WriteList";
 | 
| -  nativeCreateConnect(List<int> addr,
 | 
| -                      int port) native "Socket_CreateConnect";
 | 
| -  nativeCreateBindListen(List<int> addr, int port, int backlog)
 | 
| +  nativeCreateConnect(String host, int port) native "Socket_CreateConnect";
 | 
| +  nativeCreateBindListen(String address, int port, int backlog)
 | 
|        native "ServerSocket_CreateBindListen";
 | 
|    nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
 | 
|    int nativeGetPort() native "Socket_GetPort";
 | 
| @@ -562,7 +503,7 @@ class _RawSocket extends Stream<RawSocketEvent>
 | 
|    bool _readEventsEnabled = true;
 | 
|    bool _writeEventsEnabled = true;
 | 
|  
 | 
| -  static Future<RawSocket> connect(host, int port) {
 | 
| +  static Future<RawSocket> connect(String host, int port) {
 | 
|      return _NativeSocket.connect(host, port)
 | 
|          .then((socket) => new _RawSocket(socket));
 | 
|    }
 | 
| @@ -630,7 +571,7 @@ class _RawSocket extends Stream<RawSocketEvent>
 | 
|  
 | 
|    int get remotePort => _socket.remotePort;
 | 
|  
 | 
| -  InternetAddress get address => _socket.address;
 | 
| +  String get host => _socket.host;
 | 
|  
 | 
|    String get remoteHost => _socket.remoteHost;
 | 
|  
 | 
| @@ -718,7 +659,7 @@ class _ServerSocket extends Stream<Socket>
 | 
|  
 | 
|  
 | 
|  patch class Socket {
 | 
| -  /* patch */ static Future<Socket> connect(host, int port) {
 | 
| +  /* patch */ static Future<Socket> connect(String host, int port) {
 | 
|      return RawSocket.connect(host, port).then(
 | 
|          (socket) => new _Socket(socket));
 | 
|    }
 | 
| 
 |