Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: runtime/bin/socket_patch.dart

Issue 113923004: Only store the address bytes for an internet address in Dart (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket.cc ('k') | sdk/lib/io/secure_socket.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/socket_patch.dart
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index a85320cf53e25a91ef2d143ab4a9e75c914e9802..423761497e2c8e1dac11f66a15d784713a13af2a 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -62,8 +62,7 @@ class _InternetAddress implements InternetAddress {
static const int _ADDRESS_LOOPBACK_IP_V6 = 1;
static const int _ADDRESS_ANY_IP_V4 = 2;
static const int _ADDRESS_ANY_IP_V6 = 3;
- static const int _IPV4_ADDR_OFFSET = 4;
- static const int _IPV6_ADDR_OFFSET = 8;
+ static const int _IPV4_ADDR_LENGTH = 4;
static const int _IPV6_ADDR_LENGTH = 16;
static _InternetAddress LOOPBACK_IP_V4 =
@@ -75,24 +74,26 @@ class _InternetAddress implements InternetAddress {
static _InternetAddress ANY_IP_V6 =
new _InternetAddress.fixed(_ADDRESS_ANY_IP_V6);
- final InternetAddressType type;
final String address;
final String _host;
- final Uint8List _sockaddr_storage;
+ final Uint8List _in_addr;
+
+ InternetAddressType get type =>
+ _in_addr.length == _IPV4_ADDR_LENGTH ? InternetAddressType.IP_V4
+ : InternetAddressType.IP_V6;
String get host => _host != null ? _host : address;
bool get isLoopback {
switch (type) {
case InternetAddressType.IP_V4:
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 127;
+ return _in_addr[0] == 127;
case InternetAddressType.IP_V6:
for (int i = 0; i < _IPV6_ADDR_LENGTH - 1; i++) {
- if (_sockaddr_storage[_IPV6_ADDR_OFFSET + i] != 0) return false;
+ if (_in_addr[i] != 0) return false;
}
- int lastByteIndex = _IPV6_ADDR_OFFSET + _IPV6_ADDR_LENGTH - 1;
- return _sockaddr_storage[lastByteIndex] == 1;
+ return _in_addr[_IPV6_ADDR_LENGTH - 1] == 1;
}
}
@@ -100,13 +101,11 @@ class _InternetAddress implements InternetAddress {
switch (type) {
case InternetAddressType.IP_V4:
// Checking for 169.254.0.0/16.
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 169 &&
- _sockaddr_storage[_IPV4_ADDR_OFFSET + 1] == 254;
+ return _in_addr[0] == 169 && _in_addr[1] == 254;
case InternetAddressType.IP_V6:
// Checking for fe80::/10.
- return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFE &&
- (_sockaddr_storage[_IPV6_ADDR_OFFSET + 1] & 0xB0) == 0x80;
+ return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
}
}
@@ -114,48 +113,45 @@ class _InternetAddress implements InternetAddress {
switch (type) {
case InternetAddressType.IP_V4:
// Checking for 224.0.0.0 through 239.255.255.255.
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 &&
- _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240;
+ return _in_addr[0] >= 224 && _in_addr[0] < 240;
case InternetAddressType.IP_V6:
// Checking for ff00::/8.
- return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF;
+ return _in_addr[0] == 0xFF;
}
}
Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
- _InternetAddress(InternetAddressType this.type,
- String this.address,
+ _InternetAddress(String this.address,
String this._host,
- List<int> this._sockaddr_storage);
+ List<int> this._in_addr);
factory _InternetAddress.parse(String address) {
- var type = address.indexOf(':') == -1
- ? InternetAddressType.IP_V4
- : InternetAddressType.IP_V6;
- var raw = _parse(type._value, address);
- if (raw == null) {
+ var in_addr = _parse(address);
+ if (in_addr == null) {
throw new ArgumentError("Invalid internet address $address");
}
- return new _InternetAddress(type, address, null, raw);
+ return new _InternetAddress(address, null, in_addr);
}
factory _InternetAddress.fixed(int id) {
- var sockaddr = _fixed(id);
switch (id) {
case _ADDRESS_LOOPBACK_IP_V4:
- return new _InternetAddress(
- InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr);
+ var in_addr = new Uint8List(_IPV4_ADDR_LENGTH);
+ in_addr[0] = 127;
+ in_addr[_IPV4_ADDR_LENGTH - 1] = 1;
+ return new _InternetAddress("127.0.0.1", null, in_addr);
case _ADDRESS_LOOPBACK_IP_V6:
- return new _InternetAddress(
- InternetAddressType.IP_V6, "::1", null, sockaddr);
+ var in_addr = new Uint8List(_IPV6_ADDR_LENGTH);
+ in_addr[_IPV6_ADDR_LENGTH - 1] = 1;
+ return new _InternetAddress("::1", null, in_addr);
case _ADDRESS_ANY_IP_V4:
- return new _InternetAddress(
- InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr);
+ var in_addr = new Uint8List(_IPV4_ADDR_LENGTH);
+ return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
case _ADDRESS_ANY_IP_V6:
- return new _InternetAddress(
- InternetAddressType.IP_V6, "::", "::", sockaddr);
+ var in_addr = new Uint8List(_IPV6_ADDR_LENGTH);
+ return new _InternetAddress("::", "::", in_addr);
default:
assert(false);
throw new ArgumentError();
@@ -165,23 +161,23 @@ class _InternetAddress implements InternetAddress {
// Create a clone of this _InternetAddress replacing the host.
_InternetAddress _cloneWithNewHost(String host) {
return new _InternetAddress(
- type, address, host, new Uint8List.fromList(_sockaddr_storage));
+ address, host, new Uint8List.fromList(_in_addr));
}
bool operator ==(other) {
if (!(other is _InternetAddress)) return false;
if (other.type != type) return false;
bool equals = true;
- for (int i = 0; i < _sockaddr_storage.length && equals; i++) {
- equals = other._sockaddr_storage[i] == _sockaddr_storage[i];
+ for (int i = 0; i < _in_addr.length && equals; i++) {
+ equals = other._in_addr[i] == _in_addr[i];
}
return equals;
}
int get hashCode {
int result = 1;
- for (int i = 0; i < _sockaddr_storage.length; i++) {
- result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF;
+ for (int i = 0; i < _in_addr.length; i++) {
+ result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF;
}
return result;
}
@@ -190,9 +186,7 @@ class _InternetAddress implements InternetAddress {
return "InternetAddress('$address', ${type.name})";
}
- static Uint8List _fixed(int id) native "InternetAddress_Fixed";
- static Uint8List _parse(int type, String address)
- native "InternetAddress_Parse";
+ static Uint8List _parse(String address) native "InternetAddress_Parse";
}
class _NetworkInterface implements NetworkInterface {
@@ -284,14 +278,14 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
} else {
return response.skip(1).map((result) {
var type = new InternetAddressType._from(result[0]);
- return new _InternetAddress(type, result[1], host, result[2]);
+ return new _InternetAddress(result[1], host, result[2]);
}).toList();
}
});
}
static Future<InternetAddress> reverseLookup(InternetAddress addr) {
- return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._sockaddr_storage])
+ return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._in_addr])
.then((response) {
if (isErrorResponse(response)) {
throw createError(response, "Failed reverse host lookup", addr);
@@ -315,8 +309,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
var type = new InternetAddressType._from(result[0]);
var name = result[3];
var index = result[4];
- var address = new _InternetAddress(
- type, result[1], "", result[2]);
+ var address = new _InternetAddress(result[1], "", result[2]);
if (!includeLinkLocal && address.isLinkLocal) return map;
if (!includeLoopback && address.isLoopback) return map;
map.putIfAbsent(
@@ -345,7 +338,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
var socket = new _NativeSocket.normal();
socket.address = address;
var result = socket.nativeCreateConnect(
- address._sockaddr_storage, port);
+ address._in_addr, port);
if (result is OSError) {
throw createError(result, "Connection failed", address, port);
} else {
@@ -387,7 +380,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
.then((address) {
var socket = new _NativeSocket.listen();
socket.address = address;
- var result = socket.nativeCreateBindListen(address._sockaddr_storage,
+ var result = socket.nativeCreateBindListen(address._in_addr,
port,
backlog,
v6Only);
@@ -418,7 +411,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
.then((address) {
var socket = new _NativeSocket.datagram(address);
var result = socket.nativeCreateBindDatagram(
- address._sockaddr_storage, port, reuseAddress);
+ address._in_addr, port, reuseAddress);
if (result is OSError) {
throw new SocketException("Failed to create datagram socket",
osError: result,
@@ -525,7 +518,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
buffer, offset, bytes);
var result = nativeSendTo(
bufferAndStart.buffer, bufferAndStart.start, bytes,
- address._sockaddr_storage, port);
+ address._in_addr, port);
if (result is OSError) {
scheduleMicrotask(() => reportError(result, "Send failed"));
result = 0;
@@ -555,7 +548,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
InternetAddress get remoteAddress {
var result = nativeGetRemotePeer()[0];
var type = new InternetAddressType._from(result[0]);
- return new _InternetAddress(type, result[1], null, result[2]);
+ return new _InternetAddress(result[1], null, result[2]);
}
// Multiplexes socket events to the socket handlers.
@@ -801,8 +794,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
var interfaceAddr = multicastAddress(addr, interface);
var interfaceIndex = interface == null ? 0 : interface.index;
var result = nativeJoinMulticast(
- addr._sockaddr_storage,
- interfaceAddr == null ? null : interfaceAddr._sockaddr_storage,
+ addr._in_addr,
+ interfaceAddr == null ? null : interfaceAddr._in_addr,
interfaceIndex);
if (result is OSError) throw result;
}
@@ -811,8 +804,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 {
var interfaceAddr = multicastAddress(addr, interface);
var interfaceIndex = interface == null ? 0 : interface.index;
var result = nativeLeaveMulticast(
- addr._sockaddr_storage,
- interfaceAddr == null ? null : interfaceAddr._sockaddr_storage,
+ addr._in_addr,
+ interfaceAddr == null ? null : interfaceAddr._in_addr,
interfaceIndex);
if (result is OSError) throw result;
}
@@ -1551,14 +1544,11 @@ class _RawDatagramSocket extends Stream implements RawDatagramSocket {
}
Datagram _makeDatagram(List<int> data,
- bool ipV6,
String address,
- List<int> sockaddr_storage,
+ List<int> in_addr,
int port) {
- var addressType =
- ipV6 ? InternetAddressType.IP_V6 : InternetAddressType.IP_V4;
return new Datagram(
data,
- new _InternetAddress(addressType, address, null, sockaddr_storage),
+ new _InternetAddress(address, null, in_addr),
port);
}
« no previous file with comments | « runtime/bin/socket.cc ('k') | sdk/lib/io/secure_socket.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698