[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