diff options
-rw-r--r-- | src/engine/SCons/Node/Python.py | 28 | ||||
-rw-r--r-- | src/engine/SCons/Node/PythonTests.py | 12 |
2 files changed, 20 insertions, 20 deletions
diff --git a/src/engine/SCons/Node/Python.py b/src/engine/SCons/Node/Python.py index 1fb2866..a5bcd4b 100644 --- a/src/engine/SCons/Node/Python.py +++ b/src/engine/SCons/Node/Python.py @@ -31,7 +31,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import SCons.Node -_memoLookupMap = {} +_memo_lookup_map = {} class ValueNodeInfo(SCons.Node.NodeInfoBase): @@ -178,24 +178,24 @@ class Value(SCons.Node.Node): def ValueWithMemo(value, built_value=None): - global _memoLookupMap + global _memo_lookup_map # No current support for memoizing a value that needs to be built. if built_value: return Value(value, built_value) - # No current support for memoizing non-primitive types in case they change - # after this call. - if not isinstance(value, (int, str, float, bool)): - return Value(value, built_value) - - value_str = str(value) - if value_str in _memoLookupMap: - return _memoLookupMap[value_str] - - v = Value(value) - _memoLookupMap[value_str] = v - return v + try: + memo_lookup_key = hash(value) + except TypeError: + # Non-primitive types will hit this codepath. + return Value(value) + + try: + return _memo_lookup_map[memo_lookup_key] + except KeyError: + v = Value(value) + _memo_lookup_map[memo_lookup_key] = v + return v # Local Variables: diff --git a/src/engine/SCons/Node/PythonTests.py b/src/engine/SCons/Node/PythonTests.py index 6af3e60..b69f47d 100644 --- a/src/engine/SCons/Node/PythonTests.py +++ b/src/engine/SCons/Node/PythonTests.py @@ -128,20 +128,20 @@ class ValueMemoTestCase(unittest.TestCase): def test_built_value(self): """Confirm that built values are not memoized.""" - v1 = SCons.Node.Python.Value('c', 'ca') - v2 = SCons.Node.Python.Value('c', 'ca') + v1 = SCons.Node.Python.ValueWithMemo('c', 'ca') + v2 = SCons.Node.Python.ValueWithMemo('c', 'ca') assert v1 is not v2 def test_non_primitive_values(self): """Confirm that non-primitive values are not memoized.""" d = {'a': 1} - v1 = SCons.Node.Python.Value(d) - v2 = SCons.Node.Python.Value(d) + v1 = SCons.Node.Python.ValueWithMemo(d) + v2 = SCons.Node.Python.ValueWithMemo(d) assert v1 is not v2 l = [1] - v3 = SCons.Node.Python.Value(l) - v4 = SCons.Node.Python.Value(l) + v3 = SCons.Node.Python.ValueWithMemo(l) + v4 = SCons.Node.Python.ValueWithMemo(l) assert v3 is not v4 if __name__ == "__main__": |