summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Gross <grossag@vmware.com>2019-12-23 15:10:01 (GMT)
committerAdam Gross <grossag@vmware.com>2019-12-23 15:10:01 (GMT)
commit4f6fa862878fa4c14ea8895bec2476d394385d57 (patch)
treeee53c4b42d899ec15d72e8e3a0bcebe72c9291de
parent4463d8629c5945d8973818a32be55334617e0d6c (diff)
downloadSCons-4f6fa862878fa4c14ea8895bec2476d394385d57.zip
SCons-4f6fa862878fa4c14ea8895bec2476d394385d57.tar.gz
SCons-4f6fa862878fa4c14ea8895bec2476d394385d57.tar.bz2
Exclude non-primitive values from memoization
-rw-r--r--src/engine/SCons/Node/Python.py5
-rw-r--r--src/engine/SCons/Node/PythonTests.py12
2 files changed, 17 insertions, 0 deletions
diff --git a/src/engine/SCons/Node/Python.py b/src/engine/SCons/Node/Python.py
index 7b25edb..1fb2866 100644
--- a/src/engine/SCons/Node/Python.py
+++ b/src/engine/SCons/Node/Python.py
@@ -184,6 +184,11 @@ def ValueWithMemo(value, built_value=None):
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]
diff --git a/src/engine/SCons/Node/PythonTests.py b/src/engine/SCons/Node/PythonTests.py
index e1aa58b..6af3e60 100644
--- a/src/engine/SCons/Node/PythonTests.py
+++ b/src/engine/SCons/Node/PythonTests.py
@@ -132,6 +132,18 @@ class ValueMemoTestCase(unittest.TestCase):
v2 = SCons.Node.Python.Value('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)
+ assert v1 is not v2
+
+ l = [1]
+ v3 = SCons.Node.Python.Value(l)
+ v4 = SCons.Node.Python.Value(l)
+ assert v3 is not v4
+
if __name__ == "__main__":
unittest.main()