| Index: sdk/lib/core/uri.dart
|
| diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
|
| index a01b6701df1498407e28a369bec6650d1e13f320..17f290d14e9be14108050c037aac48ff94348329 100644
|
| --- a/sdk/lib/core/uri.dart
|
| +++ b/sdk/lib/core/uri.dart
|
| @@ -1370,6 +1370,13 @@ class _Uri implements Uri {
|
| String _text;
|
|
|
| /**
|
| + * Cache of the hashCode of [_text].
|
| + *
|
| + * Is null until computed.
|
| + */
|
| + int _hashCodeCache;
|
| +
|
| + /**
|
| * Cache the computed return value of [queryParameters].
|
| */
|
| Map<String, String> _queryParameters;
|
| @@ -2580,7 +2587,11 @@ class _Uri implements Uri {
|
| UriData get data => (scheme == "data") ? new UriData.fromUri(this) : null;
|
|
|
| String toString() {
|
| - if (_text != null) return _text;
|
| + return _text ??= _initializeText();
|
| + }
|
| +
|
| + String _initializeText() {
|
| + assert(_text == null);
|
| StringBuffer sb = new StringBuffer();
|
| if (scheme.isNotEmpty) sb..write(scheme)..write(":");
|
| if (hasAuthority || path.startsWith("//") || (scheme == "file")) {
|
| @@ -2592,8 +2603,7 @@ class _Uri implements Uri {
|
| sb.write(path);
|
| if (_query != null) sb..write("?")..write(_query);
|
| if (_fragment != null) sb..write("#")..write(_fragment);
|
| - _text = sb.toString();
|
| - return _text;
|
| + return sb.toString();
|
| }
|
|
|
| bool operator==(other) {
|
| @@ -2615,7 +2625,7 @@ class _Uri implements Uri {
|
| }
|
|
|
| int get hashCode {
|
| - return (_text ?? toString()).hashCode;
|
| + return _hashCodeCache ??= toString().hashCode;
|
| }
|
|
|
| static List _createList() => [];
|
| @@ -4002,6 +4012,7 @@ class _SimpleUri implements Uri {
|
| /// To make comparisons more efficient, we cache the value, and
|
| /// canonicalize a few known types.
|
| String _schemeCache;
|
| + int _hashCodeCache;
|
|
|
| _SimpleUri(
|
| this._uri,
|
| @@ -4409,7 +4420,7 @@ class _SimpleUri implements Uri {
|
| return null;
|
| }
|
|
|
| - int get hashCode => _uri.hashCode;
|
| + int get hashCode => _hashCodeCache ??= _uri.hashCode;
|
|
|
| bool operator==(Object other) {
|
| if (identical(this, other)) return true;
|
|
|