| Index: runtime/lib/function.dart
|
| diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
|
| index 7f0556de37369ccc5dda11d71eea2b0e25f49832..05a20a46bf3f28e47cbb5e79f7bac4238708d969 100644
|
| --- a/runtime/lib/function.dart
|
| +++ b/runtime/lib/function.dart
|
| @@ -5,16 +5,23 @@
|
| class _Closure implements Function {
|
| bool operator ==(other) native "Closure_equals";
|
|
|
| - int get hashCode native "Closure_hashCode";
|
| + int get hashCode {
|
| + if (_hash == null) {
|
| + _hash = _computeHash();
|
| + }
|
| + return _hash;
|
| + }
|
|
|
| _Closure get call => this;
|
|
|
| _Closure _clone() native "Closure_clone";
|
|
|
| + int _computeHash() native "Closure_computeHash";
|
| +
|
| // No instance fields should be declared before the following 4 fields whose
|
| // offsets must be identical in Dart and C++.
|
|
|
| - // The following 4 fields are declared both in raw_object.h (for direct access
|
| + // The following fields are declared both in raw_object.h (for direct access
|
| // from C++ code) and also here so that the offset-to-field map used by
|
| // deferred objects is properly initialized.
|
| // Caution: These fields are not Dart instances, but VM objects. Their Dart
|
| @@ -23,4 +30,13 @@ class _Closure implements Function {
|
| var _function_type_arguments;
|
| var _function;
|
| var _context;
|
| +
|
| + // Note: _Closure objects are created by VM "magically", without invoking
|
| + // constructor. So, _Closure default constructor is never compiled and
|
| + // detection of default-initialized fields is not performed.
|
| + // As a consequence, VM incorrectly assumes that _hash field is not
|
| + // nullable and may incorrectly remove 'if (_hash == null)' in get:hashCode.
|
| + // This initializer makes _hash field nullable even without constructor
|
| + // compilation.
|
| + var _hash = null;
|
| }
|
|
|