@@ -144,33 +144,66 @@ function hashString(string) {
144
144
return hash ;
145
145
}
146
146
function hashJSObj ( obj ) {
147
- if ( obj [ UID_HASH_KEY ] ) {
148
- return obj [ UID_HASH_KEY ] ;
149
- }
150
- var uid = ++ UID_HASH_COUNT & HASH_MAX_VAL ;
151
- if ( ! isIE8 ) {
152
- try {
147
+ var hash = obj [ UID_HASH_KEY ] ;
148
+ if ( hash )
149
+ return hash ;
150
+ if ( ! canDefineProperty ) {
151
+ hash = obj . propertyIsEnumerable && obj . propertyIsEnumerable [ UID_HASH_KEY ] ;
152
+ if ( hash )
153
+ return hash ;
154
+ hash = getIENodeHash ( obj ) ;
155
+ if ( hash )
156
+ return hash ;
157
+ }
158
+ if ( ! canDefineProperty || Object . isExtensible ( obj ) ) {
159
+ hash = ++ UID_HASH_COUNT & HASH_MAX_VAL ;
160
+ if ( canDefineProperty ) {
153
161
Object . defineProperty ( obj , UID_HASH_KEY , {
154
162
'enumerable' : false ,
155
163
'configurable' : false ,
156
164
'writable' : false ,
157
- 'value' : uid
165
+ 'value' : hash
158
166
} ) ;
159
- return uid ;
160
- } catch ( e ) {
161
- isIE8 = true ;
167
+ } else if ( obj . propertyIsEnumerable === propertyIsEnumerable ) {
168
+ obj . propertyIsEnumerable = function ( ) {
169
+ return Object . prototype . propertyIsEnumerable . apply ( this , arguments ) ;
170
+ } ;
171
+ obj . propertyIsEnumerable [ UID_HASH_KEY ] = hash ;
172
+ } else if ( obj . nodeType ) {
173
+ obj [ UID_HASH_KEY ] = hash ;
174
+ } else {
175
+ throw new Error ( 'Unable to set a non-enumerable property on object.' ) ;
176
+ }
177
+ return hash ;
178
+ } else {
179
+ throw new Error ( 'Non-extensible objects are not allowed as keys.' ) ;
180
+ }
181
+ }
182
+ var propertyIsEnumerable = Object . prototype . propertyIsEnumerable ;
183
+ var canDefineProperty = ( function ( ) {
184
+ try {
185
+ Object . defineProperty ( { } , 'x' , { } ) ;
186
+ return true ;
187
+ } catch ( e ) {
188
+ return false ;
189
+ }
190
+ } ( ) ) ;
191
+ function getIENodeHash ( node ) {
192
+ if ( node && node . nodeType > 0 ) {
193
+ switch ( node . nodeType ) {
194
+ case 1 :
195
+ return node . uniqueID ;
196
+ case 9 :
197
+ return node . documentElement && node . documentElement . uniqueID ;
162
198
}
163
199
}
164
- obj [ UID_HASH_KEY ] = uid ;
165
- return uid ;
166
200
}
167
201
var HASH_MAX_VAL = 0x7FFFFFFF ;
168
202
var UID_HASH_COUNT = 0 ;
169
203
var UID_HASH_KEY = '__immutablehash__' ;
170
204
if ( typeof Symbol !== 'undefined' ) {
171
205
UID_HASH_KEY = Symbol ( UID_HASH_KEY ) ;
172
206
}
173
- var isIE8 = false ;
174
207
var STRING_HASH_CACHE_MIN_STRLEN = 16 ;
175
208
var STRING_HASH_CACHE_MAX_SIZE = 255 ;
176
209
var STRING_HASH_CACHE_SIZE = 0 ;
0 commit comments