[Jython-checkins] jython: Upgraded Guava collections library to 17.0.
jim.baker
jython-checkins at python.org
Sun May 11 06:32:01 CEST 2014
http://hg.python.org/jython/rev/3059c41e3838
changeset: 7240:3059c41e3838
user: Jim Baker <jim.baker at rackspace.com>
date: Sat May 10 22:31:48 2014 -0600
summary:
Upgraded Guava collections library to 17.0.
Updated PyDefaultDict to use LoadingCache idiom instead of deprecated
ComputingMap; fixes bug 2087.
Only use computed loads with __getitem__, not other get usage; fixes
bug 2133 re memory leaks.
files:
Lib/test/test_defaultdict_jy.py | 21 ++++++-
build.xml | 4 +-
extlibs/guava-13.0.1.jar | Bin
extlibs/guava-17.0.jar | Bin
src/org/python/modules/_collections/PyDefaultDict.java | 31 ++++++---
5 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/Lib/test/test_defaultdict_jy.py b/Lib/test/test_defaultdict_jy.py
--- a/Lib/test/test_defaultdict_jy.py
+++ b/Lib/test/test_defaultdict_jy.py
@@ -74,9 +74,28 @@
for i in xrange(size):
self.assertEqual(counters[i].get(), 0, counters)
+class GetVariantsTestCase(unittest.TestCase):
+
+ #http://bugs.jython.org/issue2133
+
+ def test_get_does_not_vivify(self):
+ d = defaultdict(list)
+ self.assertEquals(d.get("foo"), None)
+ self.assertEquals(d.items(), [])
+
+ def test_get_default_does_not_vivify(self):
+ d = defaultdict(list)
+ self.assertEquals(d.get("foo", 42), 42)
+ self.assertEquals(d.items(), [])
+
+ def test_getitem_does_vivify(self):
+ d = defaultdict(list)
+ self.assertEquals(d["vivify"], [])
+ self.assertEquals(d.items(), [("vivify", [])])
+
def test_main():
- test_support.run_unittest(PickleTestCase, ThreadSafetyTestCase)
+ test_support.run_unittest(PickleTestCase, ThreadSafetyTestCase, GetVariantsTestCase)
if __name__ == '__main__':
diff --git a/build.xml b/build.xml
--- a/build.xml
+++ b/build.xml
@@ -152,7 +152,7 @@
<pathelement path="${extlibs.dir}/asm-4.0.jar" />
<pathelement path="${extlibs.dir}/asm-commons-4.0.jar" />
<pathelement path="${extlibs.dir}/asm-util-4.0.jar" />
- <pathelement path="${extlibs.dir}/guava-13.0.1.jar" />
+ <pathelement path="${extlibs.dir}/guava-17.0.jar" />
<pathelement path="${extlibs.dir}/icu4j-52_1.jar" />
<pathelement path="${extlibs.dir}/jffi-1.2.7.jar"/>
<pathelement path="${extlibs.dir}/jffi-1.2.7-native.jar"/>
@@ -562,7 +562,7 @@
<rule pattern="org.bouncycastle.**" result="org.python.bouncycastle. at 1"/>
<zipfileset src="extlibs/commons-compress-1.8.jar"/>
<rule pattern="org.apache.**" result="org.python.apache. at 1"/>
- <zipfileset src="extlibs/guava-13.0.1.jar"/>
+ <zipfileset src="extlibs/guava-17.0.jar"/>
<rule pattern="com.google.**" result="org.python.google. at 1"/>
<zipfileset src="extlibs/icu4j-52_1.jar"/>
<rule pattern="com.ibm.icu.**" result="org.python.icu. at 1"/>
diff --git a/extlibs/guava-13.0.1.jar b/extlibs/guava-13.0.1.jar
deleted file mode 100644
index 09c5449115df66fdd2611e2c4f8c362fbb6aaff3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
[stripped]
diff --git a/extlibs/guava-17.0.jar b/extlibs/guava-17.0.jar
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..661fc7473f8760f5f81874ddc1fcc0b5634fd6cf
GIT binary patch
[stripped]
diff --git a/src/org/python/modules/_collections/PyDefaultDict.java b/src/org/python/modules/_collections/PyDefaultDict.java
--- a/src/org/python/modules/_collections/PyDefaultDict.java
+++ b/src/org/python/modules/_collections/PyDefaultDict.java
@@ -4,6 +4,9 @@
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import org.python.core.Py;
import org.python.core.PyDictionary;
import org.python.core.PyObject;
@@ -40,10 +43,10 @@
* argument to the constructor, if present, or to None, if absent.
*/
private PyObject defaultFactory = Py.None;
- private final ConcurrentMap<PyObject, PyObject> backingMap;
+ private final LoadingCache<PyObject, PyObject> backingMap;
public ConcurrentMap<PyObject, PyObject> getMap() {
- return backingMap;
+ return backingMap.asMap();
}
public PyDefaultDict() {
@@ -52,17 +55,16 @@
public PyDefaultDict(PyType subtype) {
super(subtype, false);
- backingMap =
- new MapMaker().makeComputingMap(
- new Function<PyObject, PyObject>() {
-
- public PyObject apply(PyObject key) {
+ backingMap = CacheBuilder.newBuilder().build(
+ new CacheLoader<PyObject, PyObject>() {
+ public PyObject load(PyObject key) {
if (defaultFactory == Py.None) {
throw Py.KeyError(key);
}
return defaultFactory.__call__();
}
- });
+ }
+ );
}
public PyDefaultDict(PyType subtype, Map<PyObject, PyObject> map) {
@@ -165,11 +167,18 @@
@ExposedMethod(doc = BuiltinDocs.dict___getitem___doc)
protected final PyObject defaultdict___getitem__(PyObject key) {
try {
- return getMap().get(key);
-// } catch (ComputationException ex) {
-// throw Py.RuntimeError(ex.getCause());
+ return backingMap.get(key);
} catch (Exception ex) {
throw Py.KeyError(key);
}
}
+
+ public PyObject get(PyObject key, PyObject defaultObj) {
+ PyObject value = getMap().get(key);
+ if (value != null) {
+ return value;
+ } else {
+ return defaultObj;
+ }
+ }
}
--
Repository URL: http://hg.python.org/jython
More information about the Jython-checkins
mailing list