summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/engine/SCons/Node/Python.py28
-rw-r--r--src/engine/SCons/Node/PythonTests.py12
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__":