tests/test-propertycache.py.out
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sun, 09 Oct 2016 01:03:16 +0900
changeset 30143 2d858c771760
parent 19846 9789670992d6
permissions -rw-r--r--
perf: introduce safeattrsetter to replace direct attribute assignment Referring not-existing attribute immediately causes failure, but assigning a value to such attribute doesn't. For example, perf.py has code paths below, which assign a value to not-existing attribute. This causes incorrect performance measurement, but these code paths are executed successfully. - "repo._tags = None" in perftags() recent Mercurial has tags cache information in repo._tagscache - "branchmap.write = lambda repo: None" in perfbranchmap() branchmap cache is written out by branchcache.write() in branchmap.py "util.safehasattr() before assignment" can avoid this issue, but might increase mistake at "copy & paste" attribute name or so. To centralize (1) examining existence of, (2) assigning a value to, and (3) restoring an old value to the attribute, this patch introduces safeattrsetter(). This is used to replace direct attribute assignment in subsequent patches. Encapsulation of restoring is needed to completely remove direct attribute assignment from perf.py, even though restoring isn't needed so often.


=== property cache ===

calllog: []
cached value (unfiltered): NOCACHE

= first access on unfiltered, should do a call
access: 0
calllog: [0]
cached value (unfiltered): 0

= second access on unfiltered, should not do call
access 0
calllog: [0]
cached value (unfiltered): 0

= first access on "visible" view, should do a call
cached value ("visible" view): NOCACHE
access: 7
calllog: [0, 7]
cached value (unfiltered): 0
cached value ("visible" view): 7

= second access on "visible view", should not do call
access: 7
calllog: [0, 7]
cached value (unfiltered): 0
cached value ("visible" view): 7

= no effect on other view
cached value ("immutable" view): NOCACHE
access: 9
calllog: [0, 7, 9]
cached value (unfiltered): 0
cached value ("visible" view): 7
cached value ("immutable" view): 9


=== unfiltered property cache ===

unficalllog: []
cached value (unfiltered):       NOCACHE
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE

= first access on unfiltered, should do a call
access (unfiltered): 100
unficalllog: [100]
cached value (unfiltered):       100

= second access on unfiltered, should not do call
access (unfiltered): 100
unficalllog: [100]
cached value (unfiltered):       100

= access on view should use the unfiltered cache
access (unfiltered):       100
access ("visible" view):   100
access ("immutable" view): 100
unficalllog: [100]
cached value (unfiltered):       100
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE

= even if we clear the unfiltered cache
cached value (unfiltered):       NOCACHE
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE
unficalllog: [100]
access ("visible" view):   100
unficalllog: [100, 100]
cached value (unfiltered):       100
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE
access ("immutable" view): 100
unficalllog: [100, 100]
cached value (unfiltered):       100
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE
access (unfiltered):       100
unficalllog: [100, 100]
cached value (unfiltered):       100
cached value ("visible" view):   NOCACHE
cached value ("immutable" view): NOCACHE