[Jython-checkins] jython: BaseBuffer implementation takes care of cascading release().

jeff.allen jython-checkins at python.org
Sat Aug 27 09:12:25 EDT 2016


https://hg.python.org/jython/rev/4a92b336647a
changeset:   7947:4a92b336647a
user:        Jeff Allen <ja.py at farowl.co.uk>
date:        Thu Jun 30 12:45:54 2016 +0100
summary:
  BaseBuffer implementation takes care of cascading release().

No longer have to override releaseAction() to cascade a release
notification from a sliced view of a PyBuffer.

files:
  src/org/python/core/buffer/BaseBuffer.java              |  11 +++++-
  src/org/python/core/buffer/SimpleBuffer.java            |   9 -----
  src/org/python/core/buffer/SimpleNIOBuffer.java         |   8 ----
  src/org/python/core/buffer/SimpleStringBuffer.java      |   7 ----
  src/org/python/core/buffer/SimpleWritableBuffer.java    |   8 ----
  src/org/python/core/buffer/Strided1DBuffer.java         |   9 -----
  src/org/python/core/buffer/Strided1DNIOBuffer.java      |   7 ----
  src/org/python/core/buffer/Strided1DWritableBuffer.java |   8 ----
  src/org/python/core/buffer/ZeroByteBuffer.java          |   6 ---
  tests/java/org/python/core/PyBufferNIOTest.java         |  13 -------
  tests/java/org/python/core/PyBufferTest.java            |  17 +--------
  11 files changed, 12 insertions(+), 91 deletions(-)


diff --git a/src/org/python/core/buffer/BaseBuffer.java b/src/org/python/core/buffer/BaseBuffer.java
--- a/src/org/python/core/buffer/BaseBuffer.java
+++ b/src/org/python/core/buffer/BaseBuffer.java
@@ -580,13 +580,22 @@
      * equals the number of <code>getBuffer</code> calls), the implementation here calls
      * {@link #releaseAction()}, which the implementer of a specific buffer type should override if
      * it needs specific actions to take place.
+     * <p>
+     * Note that, when this is a sliced view obtained from another <code>PyBuffer</code> the
+     * implementation in <code>BaseBuffer</code> automatically sends one <code>release()</code>
+     * Sub-classes should not propagate the release themselves when overriding
+     * {@link #releaseAction()}.
      */
     @Override
     public void release() {
         if (--exports == 0) {
             // This is a final release.
             releaseAction();
-            // XXX Consider adding release of root if root!=this so sliced need not
+            // We have to release the root too if we are not a root.
+            PyBuffer root = getRoot();
+            if (root != this) {
+                root.release();
+            }
         } else if (exports < 0) {
             // Buffer already had 0 exports. (Put this right, in passing.)
             exports = 0;
diff --git a/src/org/python/core/buffer/SimpleBuffer.java b/src/org/python/core/buffer/SimpleBuffer.java
--- a/src/org/python/core/buffer/SimpleBuffer.java
+++ b/src/org/python/core/buffer/SimpleBuffer.java
@@ -9,7 +9,6 @@
  */
 public class SimpleBuffer extends BaseArrayBuffer {
 
-
     /**
      * Provide an instance of <code>SimpleBuffer</code> with navigation variables initialised, for
      * sub-class use. The buffer ({@link #storage}, {@link #index0}), and the {@link #shape} array
@@ -199,13 +198,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
-
 }
diff --git a/src/org/python/core/buffer/SimpleNIOBuffer.java b/src/org/python/core/buffer/SimpleNIOBuffer.java
--- a/src/org/python/core/buffer/SimpleNIOBuffer.java
+++ b/src/org/python/core/buffer/SimpleNIOBuffer.java
@@ -185,13 +185,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
-
 }
diff --git a/src/org/python/core/buffer/SimpleStringBuffer.java b/src/org/python/core/buffer/SimpleStringBuffer.java
--- a/src/org/python/core/buffer/SimpleStringBuffer.java
+++ b/src/org/python/core/buffer/SimpleStringBuffer.java
@@ -214,12 +214,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
 }
diff --git a/src/org/python/core/buffer/SimpleWritableBuffer.java b/src/org/python/core/buffer/SimpleWritableBuffer.java
--- a/src/org/python/core/buffer/SimpleWritableBuffer.java
+++ b/src/org/python/core/buffer/SimpleWritableBuffer.java
@@ -130,13 +130,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
-
 }
diff --git a/src/org/python/core/buffer/Strided1DBuffer.java b/src/org/python/core/buffer/Strided1DBuffer.java
--- a/src/org/python/core/buffer/Strided1DBuffer.java
+++ b/src/org/python/core/buffer/Strided1DBuffer.java
@@ -208,14 +208,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // XXX Consider making this automatic within BaseBuffer.release() when getRoot()!=this
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
-
 }
diff --git a/src/org/python/core/buffer/Strided1DNIOBuffer.java b/src/org/python/core/buffer/Strided1DNIOBuffer.java
--- a/src/org/python/core/buffer/Strided1DNIOBuffer.java
+++ b/src/org/python/core/buffer/Strided1DNIOBuffer.java
@@ -200,12 +200,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
 }
diff --git a/src/org/python/core/buffer/Strided1DWritableBuffer.java b/src/org/python/core/buffer/Strided1DWritableBuffer.java
--- a/src/org/python/core/buffer/Strided1DWritableBuffer.java
+++ b/src/org/python/core/buffer/Strided1DWritableBuffer.java
@@ -116,13 +116,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
-
     }
-
 }
diff --git a/src/org/python/core/buffer/ZeroByteBuffer.java b/src/org/python/core/buffer/ZeroByteBuffer.java
--- a/src/org/python/core/buffer/ZeroByteBuffer.java
+++ b/src/org/python/core/buffer/ZeroByteBuffer.java
@@ -184,11 +184,5 @@
         protected PyBuffer getRoot() {
             return root;
         }
-
-        @Override
-        public void releaseAction() {
-            // We have to release the root too if ours was final.
-            root.release();
-        }
     }
 }
diff --git a/tests/java/org/python/core/PyBufferNIOTest.java b/tests/java/org/python/core/PyBufferNIOTest.java
--- a/tests/java/org/python/core/PyBufferNIOTest.java
+++ b/tests/java/org/python/core/PyBufferNIOTest.java
@@ -276,19 +276,6 @@
         }
 
         @Override
-        public void releaseAction() {
-            // XXX Consider making this automatic within BaseBuffer.release() when getRoot()!=this
-            /*
-             * ... so that {@link #release()} takes care of this: sub-classes should not propagate
-             * the release themselves when overriding {@link #releaseAction()}.
-             */
-            // We have to release the root too if ours was final and we are not that root.
-            if (root != this) {
-                root.release();
-            }
-        }
-
-        @Override
         public PyBuffer getBufferSlice(int flags, int start, int count, int stride) {
             int newStart = index0 + start * strides[0];
             int newStride = strides[0] * stride;
diff --git a/tests/java/org/python/core/PyBufferTest.java b/tests/java/org/python/core/PyBufferTest.java
--- a/tests/java/org/python/core/PyBufferTest.java
+++ b/tests/java/org/python/core/PyBufferTest.java
@@ -945,8 +945,8 @@
         } else if (subject instanceof PyByteArray) {
             // Size-changing access should fail
             try {
-                ((PyByteArray)subject).bytearray_extend(Py.One); // Appends one zero byte
-                fail("bytearray_extend with exports should fail");
+                ((PyByteArray)subject).bytearray_append(Py.One); // Appends one zero byte
+                fail("bytearray_append with exports should fail");
             } catch (Exception e) {
                 // Success
             }
@@ -1509,19 +1509,6 @@
         }
 
         @Override
-        public void releaseAction() {
-            // XXX Consider making this automatic within BaseBuffer.release() when getRoot()!=this
-            /*
-             * ... so that {@link #release()} takes care of this: sub-classes should not propagate
-             * the release themselves when overriding {@link #releaseAction()}.
-             */
-            // We have to release the root too if ours was final and we are not that root.
-            if (root != this) {
-                root.release();
-            }
-        }
-
-        @Override
         public PyBuffer getBufferSlice(int flags, int start, int length, int stride) {
             int newStart = index0 + start * strides[0];
             int newStride = strides[0] * stride;

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list