From: <kz...@us...> - 2007-04-23 15:50:49
|
Revision: 3184 http://svn.sourceforge.net/jython/?rev=3184&view=rev Author: kzuberi Date: 2007-04-23 08:50:47 -0700 (Mon, 23 Apr 2007) Log Message: ----------- LinkedList.pop() is a java 1.6ism, use removeFirst() Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-04-23 05:30:52 UTC (rev 3183) +++ trunk/jython/src/org/python/core/PyFile.java 2007-04-23 15:50:47 UTC (rev 3184) @@ -1642,7 +1642,7 @@ synchronized(closers) { while(closers.size() > 0) { try { - ((Closer)closers.pop())._close(); + ((Closer)closers.removeFirst())._close(); } catch(PyException e) {} } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-18 20:06:40
|
Revision: 3326 http://svn.sourceforge.net/jython/?rev=3326&view=rev Author: cgroves Date: 2007-07-18 13:06:38 -0700 (Wed, 18 Jul 2007) Log Message: ----------- only automatically close PyFiles if they're created with a string filename from Python Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-07-17 09:14:39 UTC (rev 3325) +++ trunk/jython/src/org/python/core/PyFile.java 2007-07-18 20:06:38 UTC (rev 3326) @@ -1056,6 +1056,9 @@ // called as a builtin. newobj = new PyFile(); newobj.file_init(args, keywords); + if(args[0] instanceof PyString){ + newobj.closer = new Closer(newobj.file); + } } else { // assume it's being called as a java class PyJavaClass pjc = new PyJavaClass(PyFile.class); @@ -1124,7 +1127,6 @@ }else{ this.file = file; } - closer = new Closer(this.file); } public PyFile(java.io.InputStream istream, java.io.OutputStream ostream, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-21 18:40:35
|
Revision: 3335 http://svn.sourceforge.net/jython/?rev=3335&view=rev Author: cgroves Date: 2007-07-21 11:40:32 -0700 (Sat, 21 Jul 2007) Log Message: ----------- Use the regular file close mechanism if we haven't created a closer since this PyFile was created as a Java class. Always use a closer if the PyFile is being created as a builtin. Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-07-21 05:43:54 UTC (rev 3334) +++ trunk/jython/src/org/python/core/PyFile.java 2007-07-21 18:40:32 UTC (rev 3335) @@ -1056,9 +1056,7 @@ // called as a builtin. newobj = new PyFile(); newobj.file_init(args, keywords); - if(args[0] instanceof PyString){ - newobj.closer = new Closer(newobj.file); - } + newobj.closer = new Closer(newobj.file); } else { // assume it's being called as a java class PyJavaClass pjc = new PyJavaClass(PyFile.class); @@ -1484,9 +1482,15 @@ } final void file_close() { - if(closer != null){ + if (closer != null) { closer.close(); closer = null; + } else { + try { + file.close(); + } catch (java.io.IOException e) { + throw Py.IOError(e); + } } closed = true; file = new FileWrapper(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-13 00:21:47
|
Revision: 3471 http://jython.svn.sourceforge.net/jython/?rev=3471&view=rev Author: pjenvey Date: 2007-09-12 17:21:35 -0700 (Wed, 12 Sep 2007) Log Message: ----------- prefer importing to using fully qualified names Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-06 15:47:53 UTC (rev 3470) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-13 00:21:35 UTC (rev 3471) @@ -1,11 +1,16 @@ // Copyright (c) Corporation for National Research Initiatives package org.python.core; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.InputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; +import java.io.PushbackInputStream; +import java.io.RandomAccessFile; +import java.io.Writer; + import java.util.LinkedList; // To do: @@ -32,33 +37,33 @@ mode.indexOf('a') >= 0; binary = mode.indexOf('b') >= 0; } - public String read(int n) throws java.io.IOException { - throw new java.io.IOException("file not open for reading"); + public String read(int n) throws IOException { + throw new IOException("file not open for reading"); } - public int read() throws java.io.IOException { - throw new java.io.IOException("file not open for reading"); + public int read() throws IOException { + throw new IOException("file not open for reading"); } - public int available() throws java.io.IOException { - throw new java.io.IOException("file not open for reading"); + public int available() throws IOException { + throw new IOException("file not open for reading"); } - public void unread(int c) throws java.io.IOException { - throw new java.io.IOException("file doesn't support unread"); + public void unread(int c) throws IOException { + throw new IOException("file doesn't support unread"); } - public void write(String s) throws java.io.IOException { - throw new java.io.IOException("file not open for writing"); + public void write(String s) throws IOException { + throw new IOException("file not open for writing"); } - public long tell() throws java.io.IOException { - throw new java.io.IOException("file doesn't support tell/seek"); + public long tell() throws IOException { + throw new IOException("file doesn't support tell/seek"); } - public void seek(long pos, int how) throws java.io.IOException { - throw new java.io.IOException("file doesn't support tell/seek"); + public void seek(long pos, int how) throws IOException { + throw new IOException("file doesn't support tell/seek"); } - public void flush() throws java.io.IOException { + public void flush() throws IOException { } - public void close() throws java.io.IOException { + public void close() throws IOException { } - public void truncate(long position) throws java.io.IOException { - throw new java.io.IOException("file doesn't support truncate"); + public void truncate(long position) throws IOException { + throw new IOException("file doesn't support truncate"); } public Object __tojava__(Class cls) throws IOException { @@ -85,13 +90,13 @@ } private static class InputStreamWrapper extends FileWrapper { - java.io.InputStream istream; + InputStream istream; - public InputStreamWrapper(java.io.InputStream s) { + public InputStreamWrapper(InputStream s) { istream = s; } - public String read(int n) throws java.io.IOException { + public String read(int n) throws IOException { if (n == 0) // nothing to do return ""; @@ -116,19 +121,19 @@ return new String(buf, 0, 0, read); } - public int read() throws java.io.IOException { + public int read() throws IOException { return istream.read(); } - public int available() throws java.io.IOException { + public int available() throws IOException { return istream.available(); } - public void unread(int c) throws java.io.IOException { - ((java.io.PushbackInputStream)istream).unread(c); + public void unread(int c) throws IOException { + ((PushbackInputStream)istream).unread(c); } - public void close() throws java.io.IOException { + public void close() throws IOException { istream.close(); } @@ -140,15 +145,15 @@ } private static class OutputStreamWrapper extends FileWrapper { - private java.io.OutputStream ostream; + private OutputStream ostream; - public OutputStreamWrapper(java.io.OutputStream s) { + public OutputStreamWrapper(OutputStream s) { ostream = s; } private static final int MAX_WRITE = 30000; - public void write(String s) throws java.io.IOException { + public void write(String s) throws IOException { byte[] bytes = getBytes(s); int n = bytes.length; int i = 0; @@ -160,11 +165,11 @@ } } - public void flush() throws java.io.IOException { + public void flush() throws IOException { ostream.flush(); } - public void close() throws java.io.IOException { + public void close() throws IOException { ostream.close(); } @@ -176,23 +181,23 @@ } private static class IOStreamWrapper extends InputStreamWrapper { - private java.io.OutputStream ostream; + private OutputStream ostream; - public IOStreamWrapper(java.io.InputStream istream, - java.io.OutputStream ostream) { + public IOStreamWrapper(InputStream istream, + OutputStream ostream) { super(istream); this.ostream = ostream; } - public void write(String s) throws java.io.IOException { + public void write(String s) throws IOException { ostream.write(getBytes(s)); } - public void flush() throws java.io.IOException { + public void flush() throws IOException { ostream.flush(); } - public void close() throws java.io.IOException { + public void close() throws IOException { ostream.close(); istream.close(); } @@ -205,23 +210,23 @@ } private static class WriterWrapper extends FileWrapper { - private java.io.Writer writer; + private Writer writer; - public WriterWrapper(java.io.Writer s) { + public WriterWrapper(Writer s) { writer = s; } //private static final int MAX_WRITE = 30000; - public void write(String s) throws java.io.IOException { + public void write(String s) throws IOException { writer.write(s); } - public void flush() throws java.io.IOException { + public void flush() throws IOException { writer.flush(); } - public void close() throws java.io.IOException { + public void close() throws IOException { writer.close(); } } @@ -230,8 +235,8 @@ /** The default buffer size, in bytes. */ protected static final int defaultBufferSize = 4096; - /** The underlying java.io.RandomAccessFile. */ - protected java.io.RandomAccessFile file; + /** The underlying RandomAccessFile. */ + protected RandomAccessFile file; /** The offset in bytes from the file start, of the next read or * write operation. */ @@ -260,11 +265,11 @@ /** True if the data in the buffer has been modified. */ boolean bufferModified = false; - public RFileWrapper(java.io.RandomAccessFile file) { + public RFileWrapper(RandomAccessFile file) { this(file, 8092); } - public RFileWrapper(java.io.RandomAccessFile file, int bufferSize) { + public RFileWrapper(RandomAccessFile file, int bufferSize) { this.file = file; bufferStart = 0; dataEnd = 0; @@ -274,7 +279,7 @@ endOfFile = false; } - public String read(int n) throws java.io.IOException { + public String read(int n) throws IOException { if (n < 0) { n = (int)(file.length() - filePosition); if (n < 0) @@ -346,7 +351,7 @@ } - public int read() throws java.io.IOException { + public int read() throws IOException { // If the file position is within the data, return the byte... if (filePosition < dataEnd) { return (buffer[(int)(filePosition++ - bufferStart)] @@ -361,15 +366,15 @@ } } - public int available() throws java.io.IOException { + public int available() throws IOException { return 1; } - public void unread(int c) throws java.io.IOException { + public void unread(int c) throws IOException { filePosition--; } - public void write(String s) throws java.io.IOException { + public void write(String s) throws IOException { byte[] b = getBytes(s); int len = b.length; @@ -421,11 +426,11 @@ } } - public long tell() throws java.io.IOException { + public long tell() throws IOException { return filePosition; } - public void seek(long pos, int how) throws java.io.IOException { + public void seek(long pos, int how) throws IOException { if (how == 1) pos += filePosition; else if (how == 2) @@ -462,14 +467,14 @@ dataEnd = bufferStart + dataSize; } - public void flush() throws java.io.IOException { + public void flush() throws IOException { file.seek(bufferStart); file.write(buffer, 0, dataSize); bufferModified = false; file.getFD().sync(); } - public void close() throws java.io.IOException { + public void close() throws IOException { if (writing && bufferModified) { file.seek(bufferStart); file.write(buffer, 0, dataSize); @@ -478,7 +483,7 @@ file.close(); } - public void truncate(long position) throws java.io.IOException { + public void truncate(long position) throws IOException { flush(); try { // file.setLength(position); @@ -519,7 +524,7 @@ sep_is_nl = (sep == "\n"); } - public String read(int n) throws java.io.IOException { + public String read(int n) throws IOException { String s = this.file.read(n); int index = s.indexOf('\r'); if (index < 0) @@ -544,7 +549,7 @@ return buf.toString(); } - public int read() throws java.io.IOException { + public int read() throws IOException { int c = file.read(); if (c != '\r') return c; @@ -556,7 +561,7 @@ return '\n'; } - public void write(String s) throws java.io.IOException { + public void write(String s) throws IOException { if (!sep_is_nl) { int index = s.indexOf('\n'); if (index >= 0) { @@ -575,23 +580,23 @@ this.file.write(s); } - public long tell() throws java.io.IOException { + public long tell() throws IOException { return file.tell(); } - public void seek(long pos, int how) throws java.io.IOException { + public void seek(long pos, int how) throws IOException { file.seek(pos, how); } - public void flush() throws java.io.IOException { + public void flush() throws IOException { file.flush(); } - public void close() throws java.io.IOException { + public void close() throws IOException { file.close(); } - public void truncate(long position) throws java.io.IOException { + public void truncate(long position) throws IOException { file.truncate(position); } @@ -1082,13 +1087,13 @@ private FileWrapper file; - private static java.io.InputStream _pb(java.io.InputStream s, String mode) + private static InputStream _pb(InputStream s, String mode) { if (mode.indexOf('b') < 0) { - if(s instanceof java.io.PushbackInputStream) { + if(s instanceof PushbackInputStream) { return s; } - return new java.io.PushbackInputStream(s); + return new PushbackInputStream(s); } return s; } @@ -1127,67 +1132,67 @@ } } - public PyFile(java.io.InputStream istream, java.io.OutputStream ostream, + public PyFile(InputStream istream, OutputStream ostream, String name, String mode) { this(new IOStreamWrapper(_pb(istream, mode), ostream), name, mode); } - public PyFile(java.io.InputStream istream, java.io.OutputStream ostream, + public PyFile(InputStream istream, OutputStream ostream, String name) { this(istream, ostream, name, "r+"); } - public PyFile(java.io.InputStream istream, java.io.OutputStream ostream) { + public PyFile(InputStream istream, OutputStream ostream) { this(istream, ostream, "<???>", "r+"); } - public PyFile(java.io.InputStream istream, String name, String mode) { + public PyFile(InputStream istream, String name, String mode) { this(new InputStreamWrapper(_pb(istream, mode)), name, mode); } - public PyFile(java.io.InputStream istream, String name) { + public PyFile(InputStream istream, String name) { this(istream, name, "r"); } - public PyFile(java.io.InputStream istream) { + public PyFile(InputStream istream) { this(istream, "<???>", "r"); } - public PyFile(java.io.OutputStream ostream, String name, String mode) { + public PyFile(OutputStream ostream, String name, String mode) { this(new OutputStreamWrapper(ostream), name, mode); } - public PyFile(java.io.OutputStream ostream, String name) { + public PyFile(OutputStream ostream, String name) { this(ostream, name, "w"); } - public PyFile(java.io.OutputStream ostream) { + public PyFile(OutputStream ostream) { this(ostream, "<???>", "w"); } - public PyFile(java.io.Writer ostream, String name, String mode) { + public PyFile(Writer ostream, String name, String mode) { this(new WriterWrapper(ostream), name, mode); } - public PyFile(java.io.Writer ostream, String name) { + public PyFile(Writer ostream, String name) { this(ostream, name, "w"); } - public PyFile(java.io.Writer ostream) { + public PyFile(Writer ostream) { this(ostream, "<???>", "w"); } - public PyFile(java.io.RandomAccessFile file, String name, String mode) { + public PyFile(RandomAccessFile file, String name, String mode) { this(new RFileWrapper(file), name, mode); } - public PyFile(java.io.RandomAccessFile file, String name) { + public PyFile(RandomAccessFile file, String name) { this(file, name, "r+"); } - public PyFile(java.io.RandomAccessFile file) { + public PyFile(RandomAccessFile file) { this(file, "<???>", "r+"); } @@ -1209,7 +1214,7 @@ Object o = null; try { o = file.__tojava__(cls); - } catch (java.io.IOException exc) { } + } catch (IOException exc) { } if (o == null) o = super.__tojava__(cls); return o; @@ -1239,27 +1244,27 @@ } else if (c1 == 'w' || c1 == 'a') jmode = "rw"; try { - java.io.File f = new java.io.File(name); + File f = new File(name); if (c1 == 'r') { if (!f.exists()) { - throw new java.io.IOException("No such file or directory: " + name); + throw new IOException("No such file or directory: " + name); } } if (c1 == 'w') { // Hack to truncate the file without deleting it: // create a FileOutputStream for it and close it again. - java.io.FileOutputStream fo = new java.io.FileOutputStream(f); + FileOutputStream fo = new FileOutputStream(f); fo.close(); fo = null; } // What about bufsize? - java.io.RandomAccessFile rfile = - new java.io.RandomAccessFile(f, jmode); + RandomAccessFile rfile = + new RandomAccessFile(f, jmode); RFileWrapper iofile = new RFileWrapper(rfile); if (c1 == 'a') iofile.seek(0, 2); return iofile; - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1281,7 +1286,7 @@ break; } } - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } return data.toString(); @@ -1307,7 +1312,7 @@ int c; try { c = file.read(); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } if (c < 0) @@ -1406,7 +1411,7 @@ try { file.write(s); softspace = false; - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1436,7 +1441,7 @@ err_closed(); try { return file.tell(); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1450,7 +1455,7 @@ err_closed(); try { file.seek(pos, how); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1472,7 +1477,7 @@ err_closed(); try { file.flush(); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1488,7 +1493,7 @@ } else { try { file.close(); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1503,7 +1508,7 @@ final void file_truncate() { try { file.truncate(file.tell()); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1515,7 +1520,7 @@ final void file_truncate(long position) { try { file.truncate(position); - } catch (java.io.IOException e) { + } catch (IOException e) { throw Py.IOError(e); } } @@ -1616,7 +1621,7 @@ public void _close(){ try { fw.close(); - } catch(java.io.IOException e) { + } catch(IOException e) { throw Py.IOError(e); } finally { fw = null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-21 20:13:20
|
Revision: 3493 http://jython.svn.sourceforge.net/jython/?rev=3493&view=rev Author: pjenvey Date: 2007-09-21 13:13:18 -0700 (Fri, 21 Sep 2007) Log Message: ----------- more PyFile cleanup: move all inner classes to the bottom of the file, variables and static block towards the top, whitespace Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-21 08:38:05 UTC (rev 3492) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-21 20:13:18 UTC (rev 3493) @@ -10,6 +10,7 @@ import java.io.PushbackInputStream; import java.io.RandomAccessFile; import java.io.Writer; + import java.util.LinkedList; // To do: @@ -24,568 +25,6 @@ */ public class PyFile extends PyObject { - - private static class FileWrapper { - protected boolean reading; - protected boolean writing; - protected boolean binary; - - void setMode(String mode) { - reading = mode.indexOf('r') >= 0; - writing = mode.indexOf('w') >= 0 || mode.indexOf("+") >= 0 || - mode.indexOf('a') >= 0; - binary = mode.indexOf('b') >= 0; - } - public String read(int n) throws IOException { - throw new IOException("file not open for reading"); - } - public int read() throws IOException { - throw new IOException("file not open for reading"); - } - public int available() throws IOException { - throw new IOException("file not open for reading"); - } - public void unread(int c) throws IOException { - throw new IOException("file doesn't support unread"); - } - public void write(String s) throws IOException { - throw new IOException("file not open for writing"); - } - public long tell() throws IOException { - throw new IOException("file doesn't support tell/seek"); - } - public void seek(long pos, int how) throws IOException { - throw new IOException("file doesn't support tell/seek"); - } - public void flush() throws IOException { - } - public void close() throws IOException { - } - public void truncate(long position) throws IOException { - throw new IOException("file doesn't support truncate"); - } - - public Object __tojava__(Class cls) throws IOException { - return null; - } - } - - private static class InputStreamWrapper extends FileWrapper { - InputStream istream; - - public InputStreamWrapper(InputStream s) { - istream = s; - } - - public String read(int n) throws IOException { - if (n == 0) - // nothing to do - return ""; - if (n < 0) { - // read until we hit EOF - byte buf[] = new byte[1024]; - StringBuffer sbuf = new StringBuffer(); - for (int read=0; read >= 0; read=istream.read(buf)) - sbuf.append(PyString.from_bytes(buf, 0, read)); - return sbuf.toString(); - } - // read the next chunk available, but make sure it's at least - // one byte so as not to trip the `empty string' return value - // test done by the caller - //int avail = istream.available(); - //n = (n > avail) ? n : avail; - byte buf[] = new byte[n]; - int read = istream.read(buf); - if (read < 0) - // EOF encountered - return ""; - return PyString.from_bytes(buf, 0, read); - } - - public int read() throws IOException { - return istream.read(); - } - - public int available() throws IOException { - return istream.available(); - } - - public void unread(int c) throws IOException { - ((PushbackInputStream)istream).unread(c); - } - - public void close() throws IOException { - istream.close(); - } - - public Object __tojava__(Class cls) throws IOException { - if (InputStream.class.isAssignableFrom(cls)) - return istream; - return null; - } - } - - private static class OutputStreamWrapper extends FileWrapper { - private OutputStream ostream; - - public OutputStreamWrapper(OutputStream s) { - ostream = s; - } - - private static final int MAX_WRITE = 30000; - - public void write(String s) throws IOException { - byte[] bytes = PyString.to_bytes(s); - int n = bytes.length; - int i = 0; - while (i < n) { - int sz = n-i; - sz = sz > MAX_WRITE ? MAX_WRITE : sz; - ostream.write(bytes, i, sz); - i += sz; - } - } - - public void flush() throws IOException { - ostream.flush(); - } - - public void close() throws IOException { - ostream.close(); - } - - public Object __tojava__(Class cls) throws IOException { - if (OutputStream.class.isAssignableFrom(cls)) - return ostream; - return null; - } - } - - private static class IOStreamWrapper extends InputStreamWrapper { - private OutputStream ostream; - - public IOStreamWrapper(InputStream istream, - OutputStream ostream) { - super(istream); - this.ostream = ostream; - } - - public void write(String s) throws IOException { - ostream.write(PyString.to_bytes(s)); - } - - public void flush() throws IOException { - ostream.flush(); - } - - public void close() throws IOException { - ostream.close(); - istream.close(); - } - - public Object __tojava__(Class cls) throws IOException { - if (OutputStream.class.isAssignableFrom(cls)) - return ostream; - return super.__tojava__(cls); - } - } - - private static class WriterWrapper extends FileWrapper { - private Writer writer; - - public WriterWrapper(Writer s) { - writer = s; - } - - //private static final int MAX_WRITE = 30000; - - public void write(String s) throws IOException { - writer.write(s); - } - - public void flush() throws IOException { - writer.flush(); - } - - public void close() throws IOException { - writer.close(); - } - } - - private static class RFileWrapper extends FileWrapper { - /** The default buffer size, in bytes. */ - protected static final int defaultBufferSize = 4096; - - /** The underlying RandomAccessFile. */ - protected RandomAccessFile file; - - /** The offset in bytes from the file start, of the next read or - * write operation. */ - protected long filePosition; - - /** The buffer used to load the data. */ - protected byte buffer[]; - - /** The offset in bytes of the start of the buffer, from the start - * of the file. */ - protected long bufferStart; - - /** The offset in bytes of the end of the data in the buffer, from - * the start of the file. This can be calculated from - * <code>bufferStart + dataSize</code>, but it is cached to speed - * up the read( ) method. */ - protected long dataEnd; - - /** The size of the data stored in the buffer, in bytes. This may be - * less than the size of the buffer.*/ - protected int dataSize; - - /** True if we are at the end of the file. */ - protected boolean endOfFile; - - /** True if the data in the buffer has been modified. */ - boolean bufferModified = false; - - public RFileWrapper(RandomAccessFile file) { - this(file, 8092); - } - - public RFileWrapper(RandomAccessFile file, int bufferSize) { - this.file = file; - bufferStart = 0; - dataEnd = 0; - dataSize = 0; - filePosition = 0; - buffer = new byte[bufferSize]; - endOfFile = false; - } - - public String read(int n) throws IOException { - if (n < 0) { - n = (int)(file.length() - filePosition); - if (n < 0) - n = 0; - } - byte[] buf = new byte[n]; - n = readBytes(buf, 0, n); - if (n < 0) - n = 0; - return PyString.from_bytes(buf, 0, n); - } - - - private int readBytes( byte b[], int off, int len ) - throws IOException - { - // Check for end of file. - if( endOfFile ) - return -1; - - // See how many bytes are available in the buffer - if none, - // seek to the file position to update the buffer and try again. - int bytesAvailable = (int)(dataEnd - filePosition); - if (bytesAvailable < 1) { - seek(filePosition, 0); - return readBytes( b, off, len ); - } - - // Copy as much as we can. - int copyLength = (bytesAvailable >= len) ? len : bytesAvailable; - System.arraycopy(buffer, (int)(filePosition - bufferStart), - b, off, copyLength); - filePosition += copyLength; - - // If there is more to copy... - if (copyLength < len) { - int extraCopy = len - copyLength; - - // If the amount remaining is more than a buffer's - // length, read it directly from the file. - if (extraCopy > buffer.length) { - file.seek(filePosition); - extraCopy = file.read(b, off + copyLength, - len - copyLength); - } else { - // ...or read a new buffer full, and copy as much - // as possible... - seek(filePosition, 0); - if (!endOfFile) { - extraCopy = (extraCopy > dataSize) ? - dataSize : extraCopy; - System.arraycopy(buffer, 0, b, off + copyLength, - extraCopy); - } else { - extraCopy = -1; - } - } - - // If we did manage to copy any more, update the file - // position and return the amount copied. - if (extraCopy > 0) { - filePosition += extraCopy; - return copyLength + extraCopy; - } - } - - // Return the amount copied. - return copyLength; - } - - - public int read() throws IOException { - // If the file position is within the data, return the byte... - if (filePosition < dataEnd) { - return (buffer[(int)(filePosition++ - bufferStart)] - & 0xff); - } else if (endOfFile) { - // ...or should we indicate EOF... - return -1; - } else { - // ...or seek to fill the buffer, and try again. - seek(filePosition, 0); - return read(); - } - } - - public int available() throws IOException { - return 1; - } - - public void unread(int c) throws IOException { - filePosition--; - } - - public void write(String s) throws IOException { - byte[] b = PyString.to_bytes(s); - int len = b.length; - - // If the amount of data is small (less than a full buffer)... - if (len < buffer.length) { - // If any of the data fits within the buffer... - int spaceInBuffer = 0; - int copyLength = 0; - if (filePosition >= bufferStart) - spaceInBuffer = (int)((bufferStart + buffer.length) - - filePosition); - if (spaceInBuffer > 0) { - // Copy as much as possible to the buffer. - copyLength = (spaceInBuffer > len) ? - len : spaceInBuffer; - System.arraycopy(b, 0, buffer, - (int)(filePosition - bufferStart), - copyLength ); - bufferModified = true; - long myDataEnd = filePosition + copyLength; - dataEnd = myDataEnd > dataEnd ? myDataEnd : dataEnd; - dataSize = (int)(dataEnd - bufferStart); - filePosition += copyLength; - } - - // If there is any data remaining, move to the - // new position and copy to the new buffer. - if (copyLength < len) { - seek(filePosition, 0); - System.arraycopy(b, copyLength, buffer, - (int)(filePosition - bufferStart), - len - copyLength); - bufferModified = true; - long myDataEnd = filePosition + (len - copyLength); - dataEnd = myDataEnd > dataEnd ? myDataEnd : dataEnd; - dataSize = (int)(dataEnd - bufferStart); - filePosition += (len - copyLength); - } - } else { - // ...or write a lot of data... - - // Flush the current buffer, and write this data to the file. - if (bufferModified) { - flush( ); - bufferStart = dataEnd = dataSize = 0; - } - file.write( b, 0, len ); - filePosition += len; - } - } - - public long tell() throws IOException { - return filePosition; - } - - public void seek(long pos, int how) throws IOException { - if (how == 1) - pos += filePosition; - else if (how == 2) - pos += file.length(); - if (pos < 0) - pos = 0; - - // If the seek is into the buffer, just update the file pointer. - if (pos >= bufferStart && pos < dataEnd) { - filePosition = pos; - endOfFile = false; - return; - } - - // If the current buffer is modified, write it to disk. - if (bufferModified) - flush(); - - // Move to the position on the disk. - file.seek(pos); - filePosition = file.getFilePointer(); - bufferStart = filePosition; - - // Fill the buffer from the disk. - dataSize = file.read(buffer); - if (dataSize < 0) { - dataSize = 0; - endOfFile = true; - } else { - endOfFile = false; - } - - // Cache the position of the buffer end. - dataEnd = bufferStart + dataSize; - } - - public void flush() throws IOException { - file.seek(bufferStart); - file.write(buffer, 0, dataSize); - bufferModified = false; - file.getFD().sync(); - } - - public void close() throws IOException { - if (writing && bufferModified) { - file.seek(bufferStart); - file.write(buffer, 0, dataSize); - } - - file.close(); - } - - public void truncate(long position) throws IOException { - flush(); - try { - // file.setLength(position); - java.lang.reflect.Method m = file.getClass().getMethod( - "setLength", new Class[] { Long.TYPE }); - m.invoke(file, new Object[] { new Long(position) }); - } catch (NoSuchMethodException exc) { - super.truncate(position); - } catch (SecurityException exc) { - super.truncate(position); - } catch (IllegalAccessException exc) { - super.truncate(position); - } catch (java.lang.reflect.InvocationTargetException exc) { - if (exc.getTargetException() instanceof IOException) - throw (IOException) exc.getTargetException(); - super.truncate(position); - } - } - - public Object __tojava__(Class cls) throws IOException { - if (OutputStream.class.isAssignableFrom(cls) && writing) - return new FileOutputStream(file.getFD()); - else if (InputStream.class.isAssignableFrom(cls) && reading) - return new FileInputStream(file.getFD()); - return super.__tojava__(cls); - } - - } - - private static class TextWrapper extends FileWrapper { - private FileWrapper file; - private String sep; - private boolean sep_is_nl; - - public TextWrapper(FileWrapper file) { - this.file = file; - sep = System.getProperty("line.separator"); - sep_is_nl = (sep == "\n"); - } - - public String read(int n) throws IOException { - String s = this.file.read(n); - int index = s.indexOf('\r'); - if (index < 0) - return s; - StringBuffer buf = new StringBuffer(); - int start = 0; - int end = s.length(); - do { - buf.append(s.substring(start, index)); - buf.append('\n'); - start = index + 1; - if (start < end && s.charAt(start) == '\n') - start++; - index = s.indexOf('\r', start); - } while (index >= 0); - buf.append(s.substring(start)); - if (s.endsWith("\r") && file.available() > 0) { - int c = file.read(); - if (c != -1 && c != '\n') - file.unread(c); - } - return buf.toString(); - } - - public int read() throws IOException { - int c = file.read(); - if (c != '\r') - return c; - if (file.available() > 0) { - c = file.read(); - if (c != -1 && c != '\n') - file.unread(c); - } - return '\n'; - } - - public void write(String s) throws IOException { - if (!sep_is_nl) { - int index = s.indexOf('\n'); - if (index >= 0) { - StringBuffer buf = new StringBuffer(); - int start = 0; - do { - buf.append(s.substring(start, index)); - buf.append(sep); - start = index + 1; - index = s.indexOf('\n', start); - } while (index >= 0); - buf.append(s.substring(start)); - s = buf.toString(); - } - } - this.file.write(s); - } - - public long tell() throws IOException { - return file.tell(); - } - - public void seek(long pos, int how) throws IOException { - file.seek(pos, how); - } - - public void flush() throws IOException { - file.flush(); - } - - public void close() throws IOException { - file.close(); - } - - public void truncate(long position) throws IOException { - file.truncate(position); - } - - public Object __tojava__(Class cls) throws IOException { - return file.__tojava__(cls); - } - } - //~ BEGIN GENERATED REGION -- DO NOT EDIT SEE gexpose.py /* type info */ @@ -1068,10 +507,20 @@ private FileWrapper file; + private Closer closer; + private static LinkedList closers = new LinkedList(); + static { + try { + Runtime.getRuntime().addShutdownHook(new PyFileCloser()); + } catch(SecurityException e) { + Py.writeDebug("PyFile", "Can't register file closer hook"); + } + } + private static InputStream _pb(InputStream s, String mode) { if (mode.indexOf('b') < 0) { - if(s instanceof PushbackInputStream) { + if (s instanceof PushbackInputStream) { return s; } return new PushbackInputStream(s); @@ -1081,7 +530,8 @@ final void file_init(PyObject[] args,String[] kwds) { - ArgParser ap = new ArgParser("file", args, kwds, new String[] { "name", "mode", "bufsize" }, 1); + ArgParser ap = new ArgParser("file", args, kwds, + new String[] { "name", "mode", "bufsize" }, 1); String nameArg = ap.getString(0, null); String modeArg = ap.getString(1, "r"); int buffArg = ap.getInt(2, 0); @@ -1089,7 +539,7 @@ } public PyFile() { - //xxx: this constructor should only be used in conjunction with file_init + // xxx: this constructor should only be used in conjunction with file_init } public PyFile(PyType subType) { @@ -1100,27 +550,26 @@ file_init(file, name, mode); } - private void file_init(FileWrapper file, String name, String mode){ + private void file_init(FileWrapper file, String name, String mode) { file.setMode(mode); this.name = name; this.mode = mode; this.softspace = false; this.closed = false; - if (mode.indexOf('b') < 0){ + if (mode.indexOf('b') < 0) { this.file = new TextWrapper(file); }else{ this.file = file; } } - public PyFile(InputStream istream, OutputStream ostream, - String name, String mode) + public PyFile(InputStream istream, OutputStream ostream, String name, + String mode) { this(new IOStreamWrapper(_pb(istream, mode), ostream), name, mode); } - public PyFile(InputStream istream, OutputStream ostream, - String name) + public PyFile(InputStream istream, OutputStream ostream, String name) { this(istream, ostream, name, "r+"); } @@ -1239,8 +688,7 @@ fo = null; } // What about bufsize? - RandomAccessFile rfile = - new RandomAccessFile(f, jmode); + RandomAccessFile rfile = new RandomAccessFile(f, jmode); RFileWrapper iofile = new RFileWrapper(rfile); if (c1 == 'a') iofile.seek(0, 2); @@ -1563,28 +1011,597 @@ protected void finalize() throws Throwable { super.finalize(); - if(closer != null) { + if (closer != null) { closer.close(); } } + private static class FileWrapper { + protected boolean reading; + protected boolean writing; + protected boolean binary; + + void setMode(String mode) { + reading = mode.indexOf('r') >= 0; + writing = mode.indexOf('w') >= 0 || mode.indexOf("+") >= 0 || + mode.indexOf('a') >= 0; + binary = mode.indexOf('b') >= 0; + } + + public String read(int n) throws IOException { + throw new IOException("file not open for reading"); + } + + public int read() throws IOException { + throw new IOException("file not open for reading"); + } + + public int available() throws IOException { + throw new IOException("file not open for reading"); + } + + public void unread(int c) throws IOException { + throw new IOException("file doesn't support unread"); + } + + public void write(String s) throws IOException { + throw new IOException("file not open for writing"); + } + + public long tell() throws IOException { + throw new IOException("file doesn't support tell/seek"); + } + + public void seek(long pos, int how) throws IOException { + throw new IOException("file doesn't support tell/seek"); + } + + public void flush() throws IOException { + } + + public void close() throws IOException { + } + + public void truncate(long position) throws IOException { + throw new IOException("file doesn't support truncate"); + } + + public Object __tojava__(Class cls) throws IOException { + return null; + } + } + + private static class InputStreamWrapper extends FileWrapper { + InputStream istream; + + public InputStreamWrapper(InputStream s) { + istream = s; + } + + public String read(int n) throws IOException { + if (n == 0) + // nothing to do + return ""; + if (n < 0) { + // read until we hit EOF + byte buf[] = new byte[1024]; + StringBuffer sbuf = new StringBuffer(); + for (int read=0; read >= 0; read=istream.read(buf)) + sbuf.append(PyString.from_bytes(buf, 0, read)); + return sbuf.toString(); + } + // read the next chunk available, but make sure it's at least + // one byte so as not to trip the `empty string' return value + // test done by the caller + //int avail = istream.available(); + //n = (n > avail) ? n : avail; + byte buf[] = new byte[n]; + int read = istream.read(buf); + if (read < 0) + // EOF encountered + return ""; + return PyString.from_bytes(buf, 0, read); + } + + public int read() throws IOException { + return istream.read(); + } + + public int available() throws IOException { + return istream.available(); + } + + public void unread(int c) throws IOException { + ((PushbackInputStream)istream).unread(c); + } + + public void close() throws IOException { + istream.close(); + } + + public Object __tojava__(Class cls) throws IOException { + if (InputStream.class.isAssignableFrom(cls)) + return istream; + return null; + } + } + + private static class OutputStreamWrapper extends FileWrapper { + private OutputStream ostream; + + public OutputStreamWrapper(OutputStream s) { + ostream = s; + } + + private static final int MAX_WRITE = 30000; + + public void write(String s) throws IOException { + byte[] bytes = PyString.to_bytes(s); + int n = bytes.length; + int i = 0; + while (i < n) { + int sz = n-i; + sz = sz > MAX_WRITE ? MAX_WRITE : sz; + ostream.write(bytes, i, sz); + i += sz; + } + } + + public void flush() throws IOException { + ostream.flush(); + } + + public void close() throws IOException { + ostream.close(); + } + + public Object __tojava__(Class cls) throws IOException { + if (OutputStream.class.isAssignableFrom(cls)) + return ostream; + return null; + } + } + + private static class IOStreamWrapper extends InputStreamWrapper { + private OutputStream ostream; + + public IOStreamWrapper(InputStream istream, OutputStream ostream) { + super(istream); + this.ostream = ostream; + } + + public void write(String s) throws IOException { + ostream.write(PyString.to_bytes(s)); + } + + public void flush() throws IOException { + ostream.flush(); + } + + public void close() throws IOException { + ostream.close(); + istream.close(); + } + + public Object __tojava__(Class cls) throws IOException { + if (OutputStream.class.isAssignableFrom(cls)) + return ostream; + return super.__tojava__(cls); + } + } + + private static class WriterWrapper extends FileWrapper { + private Writer writer; + + public WriterWrapper(Writer s) { + writer = s; + } + + //private static final int MAX_WRITE = 30000; + + public void write(String s) throws IOException { + writer.write(s); + } + + public void flush() throws IOException { + writer.flush(); + } + + public void close() throws IOException { + writer.close(); + } + } + + private static class RFileWrapper extends FileWrapper { + /** The default buffer size, in bytes. */ + protected static final int defaultBufferSize = 4096; + + /** The underlying RandomAccessFile. */ + protected RandomAccessFile file; + + /** The offset in bytes from the file start, of the next read or + * write operation. */ + protected long filePosition; + + /** The buffer used to load the data. */ + protected byte buffer[]; + + /** The offset in bytes of the start of the buffer, from the start + * of the file. */ + protected long bufferStart; + + /** The offset in bytes of the end of the data in the buffer, from + * the start of the file. This can be calculated from + * <code>bufferStart + dataSize</code>, but it is cached to speed + * up the read() method. */ + protected long dataEnd; + + /** The size of the data stored in the buffer, in bytes. This may be + * less than the size of the buffer.*/ + protected int dataSize; + + /** True if we are at the end of the file. */ + protected boolean endOfFile; + + /** True if the data in the buffer has been modified. */ + boolean bufferModified = false; + + public RFileWrapper(RandomAccessFile file) { + this(file, 8092); + } + + public RFileWrapper(RandomAccessFile file, int bufferSize) { + this.file = file; + bufferStart = 0; + dataEnd = 0; + dataSize = 0; + filePosition = 0; + buffer = new byte[bufferSize]; + endOfFile = false; + } + + public String read(int n) throws IOException { + if (n < 0) { + n = (int)(file.length() - filePosition); + if (n < 0) + n = 0; + } + byte[] buf = new byte[n]; + n = readBytes(buf, 0, n); + if (n < 0) + n = 0; + return PyString.from_bytes(buf, 0, n); + } + + + private int readBytes(byte b[], int off, int len) throws IOException { + // Check for end of file. + if (endOfFile) + return -1; + + // See how many bytes are available in the buffer - if none, + // seek to the file position to update the buffer and try again. + int bytesAvailable = (int)(dataEnd - filePosition); + if (bytesAvailable < 1) { + seek(filePosition, 0); + return readBytes(b, off, len); + } + + // Copy as much as we can. + int copyLength = (bytesAvailable >= len) ? len : bytesAvailable; + System.arraycopy(buffer, (int)(filePosition - bufferStart), b, off, + copyLength); + filePosition += copyLength; + + // If there is more to copy... + if (copyLength < len) { + int extraCopy = len - copyLength; + + // If the amount remaining is more than a buffer's + // length, read it directly from the file. + if (extraCopy > buffer.length) { + file.seek(filePosition); + extraCopy = file.read(b, off + copyLength, + len - copyLength); + } else { + // ...or read a new buffer full, and copy as much + // as possible... + seek(filePosition, 0); + if (!endOfFile) { + extraCopy = (extraCopy > dataSize) ? + dataSize : extraCopy; + System.arraycopy(buffer, 0, b, off + copyLength, + extraCopy); + } else { + extraCopy = -1; + } + } + + // If we did manage to copy any more, update the file + // position and return the amount copied. + if (extraCopy > 0) { + filePosition += extraCopy; + return copyLength + extraCopy; + } + } + + // Return the amount copied. + return copyLength; + } + + + public int read() throws IOException { + // If the file position is within the data, return the byte... + if (filePosition < dataEnd) { + return (buffer[(int)(filePosition++ - bufferStart)] & 0xff); + } else if (endOfFile) { + // ...or should we indicate EOF... + return -1; + } else { + // ...or seek to fill the buffer, and try again. + seek(filePosition, 0); + return read(); + } + } + + public int available() throws IOException { + return 1; + } + + public void unread(int c) throws IOException { + filePosition--; + } + + public void write(String s) throws IOException { + byte[] b = PyString.to_bytes(s); + int len = b.length; + + // If the amount of data is small (less than a full buffer)... + if (len < buffer.length) { + // If any of the data fits within the buffer... + int spaceInBuffer = 0; + int copyLength = 0; + if (filePosition >= bufferStart) + spaceInBuffer = (int)((bufferStart + buffer.length) - + filePosition); + if (spaceInBuffer > 0) { + // Copy as much as possible to the buffer. + copyLength = (spaceInBuffer > len) ? + len : spaceInBuffer; + System.arraycopy(b, 0, buffer, + (int)(filePosition - bufferStart), + copyLength); + bufferModified = true; + long myDataEnd = filePosition + copyLength; + dataEnd = myDataEnd > dataEnd ? myDataEnd : dataEnd; + dataSize = (int)(dataEnd - bufferStart); + filePosition += copyLength; + } + + // If there is any data remaining, move to the + // new position and copy to the new buffer. + if (copyLength < len) { + seek(filePosition, 0); + System.arraycopy(b, copyLength, buffer, + (int)(filePosition - bufferStart), + len - copyLength); + bufferModified = true; + long myDataEnd = filePosition + (len - copyLength); + dataEnd = myDataEnd > dataEnd ? myDataEnd : dataEnd; + dataSize = (int)(dataEnd - bufferStart); + filePosition += (len - copyLength); + } + } else { + // ...or write a lot of data... + + // Flush the current buffer, and write this data to the file. + if (bufferModified) { + flush(); + bufferStart = dataEnd = dataSize = 0; + } + file.write(b, 0, len); + filePosition += len; + } + } + + public long tell() throws IOException { + return filePosition; + } + + public void seek(long pos, int how) throws IOException { + if (how == 1) + pos += filePosition; + else if (how == 2) + pos += file.length(); + if (pos < 0) + pos = 0; + + // If the seek is into the buffer, just update the file pointer. + if (pos >= bufferStart && pos < dataEnd) { + filePosition = pos; + endOfFile = false; + return; + } + + // If the current buffer is modified, write it to disk. + if (bufferModified) + flush(); + + // Move to the position on the disk. + file.seek(pos); + filePosition = file.getFilePointer(); + bufferStart = filePosition; + + // Fill the buffer from the disk. + dataSize = file.read(buffer); + if (dataSize < 0) { + dataSize = 0; + endOfFile = true; + } else { + endOfFile = false; + } + + // Cache the position of the buffer end. + dataEnd = bufferStart + dataSize; + } + + public void flush() throws IOException { + file.seek(bufferStart); + file.write(buffer, 0, dataSize); + bufferModified = false; + file.getFD().sync(); + } + + public void close() throws IOException { + if (writing && bufferModified) { + file.seek(bufferStart); + file.write(buffer, 0, dataSize); + } + + file.close(); + } + + public void truncate(long position) throws IOException { + flush(); + try { + // file.setLength(position); + java.lang.reflect.Method m = file.getClass().getMethod( + "setLength", new Class[] { Long.TYPE }); + m.invoke(file, new Object[] { new Long(position) }); + } catch (NoSuchMethodException exc) { + super.truncate(position); + } catch (SecurityException exc) { + super.truncate(position); + } catch (IllegalAccessException exc) { + super.truncate(position); + } catch (java.lang.reflect.InvocationTargetException exc) { + if (exc.getTargetException() instanceof IOException) + throw (IOException) exc.getTargetException(); + super.truncate(position); + } + } + + public Object __tojava__(Class cls) throws IOException { + if (OutputStream.class.isAssignableFrom(cls) && writing) + return new FileOutputStream(file.getFD()); + else if (InputStream.class.isAssignableFrom(cls) && reading) + return new FileInputStream(file.getFD()); + return super.__tojava__(cls); + } + + } + + private static class TextWrapper extends FileWrapper { + private FileWrapper file; + private String sep; + private boolean sep_is_nl; + + public TextWrapper(FileWrapper file) { + this.file = file; + sep = System.getProperty("line.separator"); + sep_is_nl = (sep == "\n"); + } + + public String read(int n) throws IOException { + String s = this.file.read(n); + int index = s.indexOf('\r'); + if (index < 0) + return s; + StringBuffer buf = new StringBuffer(); + int start = 0; + int end = s.length(); + do { + buf.append(s.substring(start, index)); + buf.append('\n'); + start = index + 1; + if (start < end && s.charAt(start) == '\n') + start++; + index = s.indexOf('\r', start); + } while (index >= 0); + buf.append(s.substring(start)); + if (s.endsWith("\r") && file.available() > 0) { + int c = file.read(); + if (c != -1 && c != '\n') + file.unread(c); + } + return buf.toString(); + } + + public int read() throws IOException { + int c = file.read(); + if (c != '\r') + return c; + if (file.available() > 0) { + c = file.read(); + if (c != -1 && c != '\n') + file.unread(c); + } + return '\n'; + } + + public void write(String s) throws IOException { + if (!sep_is_nl) { + int index = s.indexOf('\n'); + if (index >= 0) { + StringBuffer buf = new StringBuffer(); + int start = 0; + do { + buf.append(s.substring(start, index)); + buf.append(sep); + start = index + 1; + index = s.indexOf('\n', start); + } while (index >= 0); + buf.append(s.substring(start)); + s = buf.toString(); + } + } + this.file.write(s); + } + + public long tell() throws IOException { + return file.tell(); + } + + public void seek(long pos, int how) throws IOException { + file.seek(pos, how); + } + + public void flush() throws IOException { + file.flush(); + } + + public void close() throws IOException { + file.close(); + } + + public void truncate(long position) throws IOException { + file.truncate(position); + } + + public Object __tojava__(Class cls) throws IOException { + return file.__tojava__(cls); + } + } + /** - * A mechanism to make sure PyFiles are closed on exit. On creation Closer - * adds itself to a list of Closers that will be run by PyFileCloser on JVM - * shutdown. When a PyFile's close or finalize methods are called, PyFile calls - * its Closer.close which clears Closer out of the shutdown queue. + * A mechanism to make sure PyFiles are closed on exit. On + * creation Closer adds itself to a list of Closers that will be + * run by PyFileCloser on JVM shutdown. When a PyFile's close or + * finalize methods are called, PyFile calls its Closer.close + * which clears Closer out of the shutdown queue. * - * We use a regular object here rather than WeakReferences and their - * ilk as they may be collected before the shutdown hook runs. There's no - * guarantee that finalize will be called during shutdown, so we can't use - * it. It's vital that this Closer has no reference to the PyFile it's - * closing so the PyFile remains garbage collectable. + * We use a regular object here rather than WeakReferences and + * their ilk as they may be collected before the shutdown hook + * runs. There's no guarantee that finalize will be called during + * shutdown, so we can't use it. It's vital that this Closer has + * no reference to the PyFile it's closing so the PyFile remains + * garbage collectable. */ private static class Closer { - public Closer(FileWrapper fw){ + public Closer(FileWrapper fw) { this.fw = fw; - //Add ourselves to the queue of Closers to be run on shutdown + // Add ourselves to the queue of Closers to be run on shutdown synchronized(closers) { closers.add(this); } @@ -1592,14 +1609,14 @@ public void close() { synchronized(closers) { - if(!closers.remove(this)){ + if (!closers.remove(this)) { return; } } _close(); } - public void _close(){ + public void _close() { try { fw.close(); } catch(IOException e) { @@ -1612,18 +1629,6 @@ private FileWrapper fw; } - - private Closer closer; - - private static LinkedList closers = new LinkedList(); - static { - try { - Runtime.getRuntime().addShutdownHook(new PyFileCloser()); - } catch(SecurityException e) { - Py.writeDebug("PyFile", "Can't register file closer hook"); - } - } - private static class PyFileCloser extends Thread { public PyFileCloser() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-22 00:09:10
|
Revision: 3495 http://jython.svn.sourceforge.net/jython/?rev=3495&view=rev Author: pjenvey Date: 2007-09-21 17:08:55 -0700 (Fri, 21 Sep 2007) Log Message: ----------- whitespace Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-22 00:01:20 UTC (rev 3494) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-22 00:08:55 UTC (rev 3495) @@ -1711,7 +1711,7 @@ newlineTypes.add(Newline.CRLF); } else if (next != -1) { // Not a CRLF; rewind unless EOF - file.seek(file.tell() -1, 0); + file.seek(file.tell() - 1, 0); } } return pos; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-22 04:15:06
|
Revision: 3497 http://jython.svn.sourceforge.net/jython/?rev=3497&view=rev Author: pjenvey Date: 2007-09-21 21:15:04 -0700 (Fri, 21 Sep 2007) Log Message: ----------- call setLength directly, instead of using reflection to support JDK < 1.2 Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-22 04:09:11 UTC (rev 3496) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-22 04:15:04 UTC (rev 3497) @@ -1510,22 +1510,7 @@ public void truncate(long position) throws IOException { flush(); - try { - // file.setLength(position); - java.lang.reflect.Method m = file.getClass().getMethod( - "setLength", new Class[] { Long.TYPE }); - m.invoke(file, new Object[] { new Long(position) }); - } catch (NoSuchMethodException exc) { - super.truncate(position); - } catch (SecurityException exc) { - super.truncate(position); - } catch (IllegalAccessException exc) { - super.truncate(position); - } catch (java.lang.reflect.InvocationTargetException exc) { - if (exc.getTargetException() instanceof IOException) - throw (IOException) exc.getTargetException(); - super.truncate(position); - } + file.setLength(position); } public Object __tojava__(Class cls) throws IOException { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-22 19:51:17
|
Revision: 3510 http://jython.svn.sourceforge.net/jython/?rev=3510&view=rev Author: pjenvey Date: 2007-09-22 12:51:15 -0700 (Sat, 22 Sep 2007) Log Message: ----------- fix file mode parsing bug introduced in r3494: identify '+' when it's the third character in the mode string. cleanup Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-22 18:57:08 UTC (rev 3509) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-22 19:51:15 UTC (rev 3510) @@ -698,16 +698,15 @@ "'U', not '" + origMode + "'"); } - binary = mode.indexOf('b') > -1; + binary = mode.contains("b"); - String cleanMode; - if ("wa".indexOf(mode.charAt(0)) > -1 || (mode.length() > 1 && - mode.charAt(1) == '+')) { - cleanMode = "rw"; + int maxSearch = mode.length() < 3 ? mode.length() : 3; + if ("wa".indexOf(mode.charAt(0)) > -1 || + mode.substring(0, maxSearch).contains("+")) { + return "rw"; } else { - cleanMode = "r"; + return "r"; } - return cleanMode; } final String file_read(int n) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-09-23 00:31:59
|
Revision: 3514 http://jython.svn.sourceforge.net/jython/?rev=3514&view=rev Author: pjenvey Date: 2007-09-22 17:31:52 -0700 (Sat, 22 Sep 2007) Log Message: ----------- fix universal newlines being broken on windows, stemming from a typo Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-09-22 22:35:36 UTC (rev 3513) +++ trunk/jython/src/org/python/core/PyFile.java 2007-09-23 00:31:52 UTC (rev 3514) @@ -546,10 +546,10 @@ this.mode = mode; this.softspace = false; this.closed = false; - if (binary) { + if (universal) { + this.file = new UniversalWrapper(file); + } else if (!binary) { this.file = new TextWrapper(file); - } else if (universal) { - this.file = new UniversalWrapper(file); } else { this.file = file; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-11-17 01:05:43
|
Revision: 3692 http://jython.svn.sourceforge.net/jython/?rev=3692&view=rev Author: pjenvey Date: 2007-11-16 17:05:35 -0800 (Fri, 16 Nov 2007) Log Message: ----------- handle closers being null in some strange cases fixes #1831710 patch from Byron Foster Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-11-17 00:28:15 UTC (rev 3691) +++ trunk/jython/src/org/python/core/PyFile.java 2007-11-17 01:05:35 UTC (rev 3692) @@ -1119,6 +1119,10 @@ } public void run() { + if (closers == null) { + // closers can be null in some strange cases + return; + } synchronized (closers) { while (closers.size() > 0) { try { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2007-11-20 23:59:52
|
Revision: 3709 http://jython.svn.sourceforge.net/jython/?rev=3709&view=rev Author: pjenvey Date: 2007-11-20 15:59:51 -0800 (Tue, 20 Nov 2007) Log Message: ----------- whitespace Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2007-11-20 20:03:46 UTC (rev 3708) +++ trunk/jython/src/org/python/core/PyFile.java 2007-11-20 23:59:51 UTC (rev 3709) @@ -659,7 +659,7 @@ PyObject name = ap.getPyObject(0); if (!(name instanceof PyString)) { throw Py.TypeError("coercing to Unicode: need string, '" + - name.getType().getFullName() + "'type found"); + name.getType().getFullName() + "' type found"); } String mode = ap.getString(1, "r"); int bufsize = ap.getInt(2, -1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-01-02 07:29:10
|
Revision: 3954 http://jython.svn.sourceforge.net/jython/?rev=3954&view=rev Author: pjenvey Date: 2008-01-01 23:29:09 -0800 (Tue, 01 Jan 2008) Log Message: ----------- we need __init__ exposed. misc cleanup Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-01-02 07:22:17 UTC (rev 3953) +++ trunk/jython/src/org/python/core/PyFile.java 2008-01-02 07:29:09 UTC (rev 3954) @@ -32,8 +32,7 @@ * A python file wrapper around a java stream, reader/writer or file. */ @ExposedType(name = "file") -public class PyFile extends PyObject -{ +public class PyFile extends PyObject { /** The filename */ private PyObject name; @@ -86,13 +85,13 @@ public PyFile(RawIOBase raw, String name, String mode, int bufsize) { parseMode(mode); - file_init(raw, name, mode, bufsize); + file___init__(raw, name, mode, bufsize); } public PyFile(InputStream istream, String name, String mode, int bufsize, boolean closefd) { parseMode(mode); - file_init(new StreamIO(istream, closefd), name, mode, bufsize); + file___init__(new StreamIO(istream, closefd), name, mode, bufsize); } public PyFile(InputStream istream, String name, String mode, int bufsize) { @@ -111,10 +110,9 @@ this(istream, "<???>", "r"); } - public PyFile(OutputStream ostream, String name, String mode, int bufsize, - boolean closefd) { + public PyFile(OutputStream ostream, String name, String mode, int bufsize, boolean closefd) { parseMode(mode); - file_init(new StreamIO(ostream, closefd), name, mode, bufsize); + file___init__(new StreamIO(ostream, closefd), name, mode, bufsize); } public PyFile(OutputStream ostream, String name, String mode, int bufsize) { @@ -134,7 +132,7 @@ } public PyFile(RandomAccessFile file, String name, String mode, int bufsize) { - file_init(new FileIO(file.getChannel(), parseMode(mode)), name, mode, bufsize); + file___init__(new FileIO(file.getChannel(), parseMode(mode)), name, mode, bufsize); } public PyFile(RandomAccessFile file, String name, String mode) { @@ -150,25 +148,25 @@ } public PyFile(String name, String mode, int bufsize) { - file_init(new FileIO(name, parseMode(mode)), name, mode, bufsize); + file___init__(new FileIO(name, parseMode(mode)), name, mode, bufsize); } @ExposedNew - final static PyObject file_new(PyNewWrapper new_, boolean init, PyType subtype, - PyObject[]args, String[]keywords) { + static final PyObject file_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[]args, + String[]keywords) { PyFile newFile; if (new_.for_type == subtype) { if (init) { if (args.length == 0) { newFile = new PyFile(); - newFile.file_init(args, keywords); + newFile.file___init__(args, keywords); } else if (args[0] instanceof PyString || (args[0] instanceof PyJavaInstance && ((PyJavaInstance)args[0]).javaProxy == String.class)) { // If first arg is a PyString or String, assume // its being called as a builtin. newFile = new PyFile(); - newFile.file_init(args, keywords); + newFile.file___init__(args, keywords); newFile.closer = new Closer(newFile.file); } else { // assume it's being called as a java class @@ -184,24 +182,25 @@ return newFile; } - final void file_init(PyObject[] args,String[] kwds) { - ArgParser ap = new ArgParser("file", args, kwds, - new String[] { "name", "mode", "bufsize" }, 1); + @ExposedMethod + final void file___init__(PyObject[] args, String[] kwds) { + ArgParser ap = new ArgParser("file", args, kwds, new String[] {"name", "mode", "bufsize"}, + 1); PyObject name = ap.getPyObject(0); if (!(name instanceof PyString)) { - throw Py.TypeError("coercing to Unicode: need string, '" + - name.getType().getFullName() + "' type found"); + throw Py.TypeError("coercing to Unicode: need string, '" + name.getType().getFullName() + + "' type found"); } String mode = ap.getString(1, "r"); int bufsize = ap.getInt(2, -1); - file_init(new FileIO(name.toString(), parseMode(mode)), name, mode, bufsize); + file___init__(new FileIO(name.toString(), parseMode(mode)), name, mode, bufsize); } - private void file_init(RawIOBase raw, String name, String mode, int bufsize) { - file_init(raw, new PyString(name), mode, bufsize); + private void file___init__(RawIOBase raw, String name, String mode, int bufsize) { + file___init__(raw, new PyString(name), mode, bufsize); } - private void file_init(RawIOBase raw, PyObject name, String mode, int bufsize) { + private void file___init__(RawIOBase raw, PyObject name, String mode, int bufsize) { this.name = name; this.mode = mode; @@ -230,13 +229,9 @@ boolean lineBuffered = bufsize == 1; BufferedIOBase buffer; if (updating) { - buffer = lineBuffered ? - new LineBufferedRandom(raw) : - new BufferedRandom(raw, bufsize); + buffer = lineBuffered ? new LineBufferedRandom(raw) : new BufferedRandom(raw, bufsize); } else if (writing || appending) { - buffer = lineBuffered ? - new LineBufferedWriter(raw) : - new BufferedWriter(raw, bufsize); + buffer = lineBuffered ? new LineBufferedWriter(raw) : new BufferedWriter(raw, bufsize); } else if (reading) { // Line buffering is for output only buffer = new BufferedReader(raw, lineBuffered ? 0 : bufsize); @@ -266,13 +261,13 @@ if (mode.length() == 0) { mode = "r"; } else if ("wa+".indexOf(mode.charAt(0)) > -1) { - throw Py.ValueError("universal newline mode can only be used with " + - "modes starting with 'r'"); + throw Py.ValueError("universal newline mode can only be used with modes starting " + + "with 'r'"); } } if ("rwa".indexOf(mode.charAt(0)) == -1) { - throw Py.ValueError("mode string must begin with one of 'r', 'w', 'a' or " + - "'U', not '" + origMode + "'"); + throw Py.ValueError("mode string must begin with one of 'r', 'w', 'a' or 'U', not '" + + origMode + "'"); } binary = mode.contains("b"); @@ -281,8 +276,8 @@ appending = mode.contains("a"); updating = mode.contains("+"); - return (reading ? "r" : "") + (writing ? "w" : "") + - (appending ? "a" : "") + (updating ? "+" : ""); + return (reading ? "r" : "") + (writing ? "w" : "") + (appending ? "a" : "") + + (updating ? "+" : ""); } @ExposedMethod(defaults = {"-1"}) @@ -376,8 +371,9 @@ @ExposedMethod final PyObject file_next() { PyObject ret = __iternext__(); - if (ret == null) + if (ret == null) { throw Py.StopIteration(""); + } return ret; } @@ -425,8 +421,7 @@ PyObject item = null; while ((item = iter.__iternext__()) != null) { if (!(item instanceof PyString)) { - throw Py.TypeError("writelines() argument must be a " + - "sequence of strings"); + throw Py.TypeError("writelines() argument must be a sequence of strings"); } file.write(item.toString()); } @@ -620,7 +615,7 @@ private static void initCloser() { try { Runtime.getRuntime().addShutdownHook(new PyFileCloser()); - } catch(SecurityException e) { + } catch (SecurityException se) { Py.writeDebug("PyFile", "Can't register file closer hook"); } } @@ -631,7 +626,7 @@ * run by PyFileCloser on JVM shutdown. When a PyFile's close or * finalize methods are called, PyFile calls its Closer.close * which clears Closer out of the shutdown queue. - * + * * We use a regular object here rather than WeakReferences and * their ilk as they may be collected before the shutdown hook * runs. There's no guarantee that finalize will be called during @@ -643,7 +638,7 @@ /** The underlying file */ private TextIOBase file; - + public Closer(TextIOBase file) { this.file = file; // Add ourselves to the queue of Closers to be run on shutdown @@ -658,10 +653,10 @@ return; } } - _close(); + doClose(); } - - public void _close() { + + public void doClose() { file.close(); } } @@ -680,7 +675,7 @@ synchronized (closers) { while (closers.size() > 0) { try { - ((Closer)closers.removeFirst())._close(); + ((Closer)closers.removeFirst()).doClose(); } catch (PyException e) { // continue } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-02-18 07:46:20
|
Revision: 4148 http://jython.svn.sourceforge.net/jython/?rev=4148&view=rev Author: pjenvey Date: 2008-02-17 23:46:16 -0800 (Sun, 17 Feb 2008) Log Message: ----------- file doesn't need __nonzero__, it defaults to True since it lacks __len__. it doesn't need __cmp__ either; having it actually caused a TypeError with: tempfile.TemporaryFile() == 1 Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-02-18 07:23:06 UTC (rev 4147) +++ trunk/jython/src/org/python/core/PyFile.java 2008-02-18 07:46:16 UTC (rev 4148) @@ -553,16 +553,6 @@ return file_toString(); } - @ExposedMethod(type = MethodType.CMP) - final int file___cmp__(PyObject o) { - return super.__cmp__(o); - } - - @ExposedMethod - final boolean file___nonzero__() { - return super.__nonzero__(); - } - private void checkClosed() { file.checkClosed(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-03-17 20:45:11
|
Revision: 4214 http://jython.svn.sourceforge.net/jython/?rev=4214&view=rev Author: pjenvey Date: 2008-03-17 13:45:01 -0700 (Mon, 17 Mar 2008) Log Message: ----------- add an 'at' to file repr, more of the same of r4210 Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-03-17 20:28:32 UTC (rev 4213) +++ trunk/jython/src/org/python/core/PyFile.java 2008-03-17 20:45:01 UTC (rev 4214) @@ -543,7 +543,7 @@ s.append(name.__repr__()); s.append(", mode '"); s.append(mode); - s.append("' "); + s.append("' at "); s.append(Py.idstr(this)); s.append(">"); return s.toString(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-05-13 19:28:47
|
Revision: 4391 http://jython.svn.sourceforge.net/jython/?rev=4391&view=rev Author: pjenvey Date: 2008-05-13 12:28:35 -0700 (Tue, 13 May 2008) Log Message: ----------- whitespace Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-05-13 02:00:02 UTC (rev 4390) +++ trunk/jython/src/org/python/core/PyFile.java 2008-05-13 19:28:35 UTC (rev 4391) @@ -157,8 +157,8 @@ } @ExposedNew - static final PyObject file_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[]args, - String[]keywords) { + static final PyObject file_new(PyNewWrapper new_, boolean init, PyType subtype, + PyObject[] args, String[] keywords) { PyFile newFile; if (new_.for_type == subtype) { if (init) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-06-27 19:02:42
|
Revision: 4811 http://jython.svn.sourceforge.net/jython/?rev=4811&view=rev Author: pjenvey Date: 2008-06-27 12:02:36 -0700 (Fri, 27 Jun 2008) Log Message: ----------- __iternext__ shouldn't be exposed Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-06-27 17:47:50 UTC (rev 4810) +++ trunk/jython/src/org/python/core/PyFile.java 2008-06-27 19:02:36 UTC (rev 4811) @@ -360,11 +360,6 @@ } public PyObject __iternext__() { - return file___iternext__(); - } - - @ExposedMethod - final synchronized PyObject file___iternext__() { checkClosed(); String next = file.readline(-1); if (next.length() == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-07-07 20:58:47
|
Revision: 4858 http://jython.svn.sourceforge.net/jython/?rev=4858&view=rev Author: pjenvey Date: 2008-07-07 13:58:37 -0700 (Mon, 07 Jul 2008) Log Message: ----------- revert most of r4811: call file___iternext__ instead of __iternext__ which the deriveds override to call next (causing an endless loop) Modified Paths: -------------- trunk/jython/src/org/python/core/PyFile.java Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-07-07 19:59:32 UTC (rev 4857) +++ trunk/jython/src/org/python/core/PyFile.java 2008-07-07 20:58:37 UTC (rev 4858) @@ -360,6 +360,10 @@ } public PyObject __iternext__() { + return file___iternext__(); + } + + final synchronized PyObject file___iternext__() { checkClosed(); String next = file.readline(-1); if (next.length() == 0) { @@ -370,7 +374,7 @@ @ExposedMethod final PyObject file_next() { - PyObject ret = __iternext__(); + PyObject ret = file___iternext__(); if (ret == null) { throw Py.StopIteration(""); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |