@@ -10,8 +10,6 @@ const IS_TARGET_COPIED_PROPERTY = 'f';
10
10
const PROXY_PROPERTY = 'p' ;
11
11
const PROXY_CACHE_PROPERTY = 'c' ;
12
12
const TARGET_CACHE_PROPERTY = 't' ;
13
- const NEXT_OBJECT_PROPERTY = 'n' ;
14
- const CHANGED_PROPERTY = 'g' ;
15
13
const HAS_KEY_PROPERTY = 'h' ;
16
14
const ALL_OWN_KEYS_PROPERTY = 'w' ;
17
15
const HAS_OWN_KEY_PROPERTY = 'o' ;
@@ -252,14 +250,6 @@ const isAllOwnKeysChanged = (prevObj: object, nextObj: object) => {
252
250
) ;
253
251
} ;
254
252
255
- type ChangedCache = WeakMap <
256
- object ,
257
- {
258
- [ NEXT_OBJECT_PROPERTY ] : object ;
259
- [ CHANGED_PROPERTY ] : boolean ;
260
- }
261
- > ;
262
-
263
253
/**
264
254
* Compare changes on objects.
265
255
*
@@ -299,7 +289,7 @@ export const isChanged = (
299
289
prevObj : unknown ,
300
290
nextObj : unknown ,
301
291
affected : WeakMap < object , unknown > ,
302
- cache ?: WeakMap < object , unknown > ,
292
+ cache ?: WeakMap < object , unknown > , // for object with cycles
303
293
isEqual : ( a : unknown , b : unknown ) => boolean = Object . is ,
304
294
) : boolean => {
305
295
if ( isEqual ( prevObj , nextObj ) ) {
@@ -309,53 +299,41 @@ export const isChanged = (
309
299
const used = ( affected as Affected ) . get ( getOriginalObject ( prevObj ) ) ;
310
300
if ( ! used ) return true ;
311
301
if ( cache ) {
312
- const hit = ( cache as ChangedCache ) . get ( prevObj ) ;
313
- if ( hit && hit [ NEXT_OBJECT_PROPERTY ] === nextObj ) {
314
- return hit [ CHANGED_PROPERTY ] ;
302
+ const hit = cache . get ( prevObj ) ;
303
+ if ( hit === nextObj ) {
304
+ return false ;
315
305
}
316
306
// for object with cycles
317
- ( cache as ChangedCache ) . set ( prevObj , {
318
- [ NEXT_OBJECT_PROPERTY ] : nextObj ,
319
- [ CHANGED_PROPERTY ] : false ,
320
- } ) ;
307
+ cache . set ( prevObj , nextObj ) ;
321
308
}
322
309
let changed : boolean | null = null ;
323
- try {
324
- for ( const key of used [ HAS_KEY_PROPERTY ] || [ ] ) {
325
- changed = Reflect . has ( prevObj , key ) !== Reflect . has ( nextObj , key ) ;
326
- if ( changed ) return changed ;
327
- }
328
- if ( used [ ALL_OWN_KEYS_PROPERTY ] === true ) {
329
- changed = isAllOwnKeysChanged ( prevObj , nextObj ) ;
330
- if ( changed ) return changed ;
331
- } else {
332
- for ( const key of used [ HAS_OWN_KEY_PROPERTY ] || [ ] ) {
333
- const hasPrev = ! ! Reflect . getOwnPropertyDescriptor ( prevObj , key ) ;
334
- const hasNext = ! ! Reflect . getOwnPropertyDescriptor ( nextObj , key ) ;
335
- changed = hasPrev !== hasNext ;
336
- if ( changed ) return changed ;
337
- }
338
- }
339
- for ( const key of used [ KEYS_PROPERTY ] || [ ] ) {
340
- changed = isChanged (
341
- ( prevObj as any ) [ key ] ,
342
- ( nextObj as any ) [ key ] ,
343
- affected ,
344
- cache ,
345
- isEqual ,
346
- ) ;
310
+ for ( const key of used [ HAS_KEY_PROPERTY ] || [ ] ) {
311
+ changed = Reflect . has ( prevObj , key ) !== Reflect . has ( nextObj , key ) ;
312
+ if ( changed ) return changed ;
313
+ }
314
+ if ( used [ ALL_OWN_KEYS_PROPERTY ] === true ) {
315
+ changed = isAllOwnKeysChanged ( prevObj , nextObj ) ;
316
+ if ( changed ) return changed ;
317
+ } else {
318
+ for ( const key of used [ HAS_OWN_KEY_PROPERTY ] || [ ] ) {
319
+ const hasPrev = ! ! Reflect . getOwnPropertyDescriptor ( prevObj , key ) ;
320
+ const hasNext = ! ! Reflect . getOwnPropertyDescriptor ( nextObj , key ) ;
321
+ changed = hasPrev !== hasNext ;
347
322
if ( changed ) return changed ;
348
323
}
349
- if ( changed === null ) changed = true ;
350
- return changed ;
351
- } finally {
352
- if ( cache ) {
353
- cache . set ( prevObj , {
354
- [ NEXT_OBJECT_PROPERTY ] : nextObj ,
355
- [ CHANGED_PROPERTY ] : changed ,
356
- } ) ;
357
- }
358
324
}
325
+ for ( const key of used [ KEYS_PROPERTY ] || [ ] ) {
326
+ changed = isChanged (
327
+ ( prevObj as any ) [ key ] ,
328
+ ( nextObj as any ) [ key ] ,
329
+ affected ,
330
+ cache ,
331
+ isEqual ,
332
+ ) ;
333
+ if ( changed ) return changed ;
334
+ }
335
+ if ( changed === null ) throw new Error ( 'invalid used' ) ;
336
+ return changed ;
359
337
} ;
360
338
361
339
// explicitly track object with memo
0 commit comments