[Python-checkins] r51668 - in python/branches/bcannon-objcap: BRANCHNEWS Include/fileobject.h Lib/test/test_descr.py Modules/bz2module.c Objects/fileobject.c Python/bltinmodule.c
brett.cannon
python-checkins at python.org
Thu Aug 31 20:48:47 CEST 2006
Author: brett.cannon
Date: Thu Aug 31 20:48:46 2006
New Revision: 51668
Modified:
python/branches/bcannon-objcap/BRANCHNEWS
python/branches/bcannon-objcap/Include/fileobject.h
python/branches/bcannon-objcap/Lib/test/test_descr.py
python/branches/bcannon-objcap/Modules/bz2module.c
python/branches/bcannon-objcap/Objects/fileobject.c
python/branches/bcannon-objcap/Python/bltinmodule.c
Log:
Revert back to rev. 51655 state to start from scratch for new approach to
removing the 'file' objects initializer.
Modified: python/branches/bcannon-objcap/BRANCHNEWS
==============================================================================
--- python/branches/bcannon-objcap/BRANCHNEWS (original)
+++ python/branches/bcannon-objcap/BRANCHNEWS Thu Aug 31 20:48:46 2006
@@ -5,17 +5,5 @@
Core and builtins
-----------------
-* rev. 51656: Remove initializer from 'file'. By leaving tp_new alone you can
- still subclass 'file' (although its usefulness as a subclass is doubtful when
- its tp_init is empty and that is what actually opens the file descriptor).
- Created a new function, PyFile_UnsafeOpen() which is what the built-in open()
- function is now set to. Also changed the bz2 module to use it.
-
- Still need to decide how to handle subclasses of 'file' so they are not
- totally useless (special function that calls the needed initializer on a
- 'file' object?). Also need to come up with C API that opens files through
- the built-in open() instead of doing it directly so as to not bypass
- security.
-
* rev. 51392: Introduce objcap module to hold removed functions/methods. Begin
with moving object.__subclasses__().
Modified: python/branches/bcannon-objcap/Include/fileobject.h
==============================================================================
--- python/branches/bcannon-objcap/Include/fileobject.h (original)
+++ python/branches/bcannon-objcap/Include/fileobject.h Thu Aug 31 20:48:46 2006
@@ -45,8 +45,6 @@
PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *);
PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *);
-PyAPI_FUNC(PyObject *) PyFile_UnsafeOpen(PyObject *, PyObject *, PyObject *);
-
/* The default encoding used by the platform file system APIs
If non-NULL, this is different than the default encoding for strings
*/
Modified: python/branches/bcannon-objcap/Lib/test/test_descr.py
==============================================================================
--- python/branches/bcannon-objcap/Lib/test/test_descr.py (original)
+++ python/branches/bcannon-objcap/Lib/test/test_descr.py Thu Aug 31 20:48:46 2006
@@ -2452,14 +2452,10 @@
lineno = 0
ateof = 0
-
- def __init__(self, path):
- self.__file = open(path)
-
def readline(self):
if self.ateof:
return ""
- s = file.readline(self.__file)
+ s = file.readline(self)
# Next line works too.
# s = super(CountedInput, self).readline()
self.lineno += 1
@@ -2504,7 +2500,7 @@
# note: as of Python 2.3, dict() no longer has an "items" keyword arg
for constructor in (int, float, long, complex, str, unicode,
- tuple, list):
+ tuple, list, file):
try:
constructor(bogus_keyword_arg=1)
except TypeError:
Modified: python/branches/bcannon-objcap/Modules/bz2module.c
==============================================================================
--- python/branches/bcannon-objcap/Modules/bz2module.c (original)
+++ python/branches/bcannon-objcap/Modules/bz2module.c Thu Aug 31 20:48:46 2006
@@ -1293,7 +1293,6 @@
static char *kwlist[] = {"filename", "mode", "buffering",
"compresslevel", 0};
PyObject *name;
- PyObject *file_open_args;
char *mode = "r";
int buffering = -1;
int compresslevel = 9;
@@ -1354,10 +1353,8 @@
mode = (mode_char == 'r') ? "rb" : "wb";
- file_open_args = Py_BuildValue("Osi", name, mode, buffering);
- if (!file_open_args)
- goto error;
- self->file = PyFile_UnsafeOpen(NULL, file_open_args, NULL);
+ self->file = PyObject_CallFunction((PyObject*)&PyFile_Type, "(Osi)",
+ name, mode, buffering);
if (self->file == NULL)
return -1;
Modified: python/branches/bcannon-objcap/Objects/fileobject.c
==============================================================================
--- python/branches/bcannon-objcap/Objects/fileobject.c (original)
+++ python/branches/bcannon-objcap/Objects/fileobject.c Thu Aug 31 20:48:46 2006
@@ -273,7 +273,6 @@
return (PyObject *)f;
}
-
PyObject *
PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *))
{
@@ -1967,28 +1966,25 @@
return self;
}
-/*
- Open a file with no regards to whether it should be allowed.
-
- Used as the implementation of built-in open().
-*/
-PyObject *
-PyFile_UnsafeOpen(PyObject *self, PyObject *args, PyObject *kwds)
+static int
+file_init(PyObject *self, PyObject *args, PyObject *kwds)
{
- PyFileObject *foself;
- PyObject *ret = NULL;
+ PyFileObject *foself = (PyFileObject *)self;
+ int ret = 0;
static char *kwlist[] = {"name", "mode", "buffering", 0};
char *name = NULL;
char *mode = "r";
int bufsize = -1;
int wideargument = 0;
- self = file_new(&PyFile_Type, args, kwds);
- if (!self)
- return NULL;
- foself = (PyFileObject *)self;
-
assert(PyFile_Check(self));
+ if (foself->f_fp != NULL) {
+ /* Have to close the existing file first. */
+ PyObject *closeresult = file_close(foself);
+ if (closeresult == NULL)
+ return -1;
+ Py_DECREF(closeresult);
+ }
#ifdef Py_WIN_WIDE_FILENAMES
if (GetVersion() < 0x80000000) { /* On NT, so wide API available */
@@ -2014,13 +2010,13 @@
Py_FileSystemDefaultEncoding,
&name,
&mode, &bufsize))
- return NULL;
+ return -1;
/* We parse again to get the name as a PyObject */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:file",
kwlist, &o_name, &mode,
&bufsize))
- return NULL;
+ return -1;
if (fill_file_fields(foself, NULL, o_name, mode,
fclose) == NULL)
@@ -2030,11 +2026,10 @@
goto Error;
foself->f_setbuf = NULL;
PyFile_SetBufSize(self, bufsize);
- ret = self;
goto Done;
Error:
- ret = NULL;
+ ret = -1;
/* fall through */
Done:
PyMem_Free(name); /* free the encoded string */
@@ -2101,7 +2096,7 @@
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
- 0, /* tp_init */
+ file_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
file_new, /* tp_new */
PyObject_Del, /* tp_free */
Modified: python/branches/bcannon-objcap/Python/bltinmodule.c
==============================================================================
--- python/branches/bcannon-objcap/Python/bltinmodule.c (original)
+++ python/branches/bcannon-objcap/Python/bltinmodule.c Thu Aug 31 20:48:46 2006
@@ -1341,29 +1341,16 @@
Return the octal representation of an integer or long integer.");
-/* PyFile_UnsafeOpen() used as open(). */
+static PyObject *
+builtin_open(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ return PyObject_Call((PyObject*)&PyFile_Type, args, kwds);
+}
-PyDoc_VAR(open_doc) =
-PyDoc_STR(
-"file(name[, mode[, buffering]]) -> file object\n"
-"\n"
-"Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n"
-"writing or appending. The file will be created if it doesn't exist\n"
-"when opened for writing or appending; it will be truncated when\n"
-"opened for writing. Add a 'b' to the mode for binary files.\n"
-"Add a '+' to the mode to allow simultaneous reading and writing.\n"
-"If the buffering argument is given, 0 means unbuffered, 1 means line\n"
-"buffered, and larger numbers specify the buffer size.\n"
-)
-PyDoc_STR(
-"Add a 'U' to mode to open the file for input with universal newline\n"
-"support. Any line ending in the input file will be seen as a '\\n'\n"
-"in Python. Also, a file so opened gains the attribute 'newlines';\n"
-"the value for this attribute is one of None (no newline read yet),\n"
-"'\\r', '\\n', '\\r\\n' or a tuple containing all the newline types seen.\n"
-"\n"
-"'U' cannot be combined with 'w' or '+' mode.\n"
-);
+PyDoc_STRVAR(open_doc,
+"open(name[, mode[, buffering]]) -> file object\n\
+\n\
+Open a file using the file() type, returns a file object.");
static PyObject *
@@ -2272,7 +2259,7 @@
{"max", (PyCFunction)builtin_max, METH_VARARGS | METH_KEYWORDS, max_doc},
{"min", (PyCFunction)builtin_min, METH_VARARGS | METH_KEYWORDS, min_doc},
{"oct", builtin_oct, METH_O, oct_doc},
- {"open", (PyCFunction)PyFile_UnsafeOpen, METH_VARARGS | METH_KEYWORDS, open_doc},
+ {"open", (PyCFunction)builtin_open, METH_VARARGS | METH_KEYWORDS, open_doc},
{"ord", builtin_ord, METH_O, ord_doc},
{"pow", builtin_pow, METH_VARARGS, pow_doc},
{"range", builtin_range, METH_VARARGS, range_doc},
More information about the Python-checkins
mailing list