mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00
SF patch 568629 by Oren Tirosh: types made callable.
These built-in functions are replaced by their (now callable) type: slice() buffer() and these types can also be called (but have no built-in named function named after them) classobj (type name used to be "class") code function instance instancemethod (type name used to be "instance method") The module "new" has been replaced with a small backward compatibility placeholder in Python. A large portion of the patch simply removes the new module from various platform-specific build recipes. The following binary Mac project files still have references to it: Mac/Build/PythonCore.mcp Mac/Build/PythonStandSmall.mcp Mac/Build/PythonStandalone.mcp [I've tweaked the code layout and the doc strings here and there, and added a comment to types.py about StringTypes vs. basestring. --Guido]
This commit is contained in:
parent
57454e57f8
commit
bea18ccde6
17 changed files with 287 additions and 130 deletions
|
@ -106,27 +106,6 @@ and keyword arguments taken from the optional dictionary kwargs.\n\
|
|||
Note that classes are callable, as are instances with a __call__() method.");
|
||||
|
||||
|
||||
static PyObject *
|
||||
builtin_buffer(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *ob;
|
||||
int offset = 0;
|
||||
int size = Py_END_OF_BUFFER;
|
||||
|
||||
if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
|
||||
return NULL;
|
||||
return PyBuffer_FromObject(ob, offset, size);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(buffer_doc,
|
||||
"buffer(object [, offset[, size]]) -> object\n\
|
||||
\n\
|
||||
Create a new buffer object which references the given object.\n\
|
||||
The buffer will reference a slice of the target object from the\n\
|
||||
start of the object (or at the specified offset). The slice will\n\
|
||||
extend to the end of the target object (or with the specified size).");
|
||||
|
||||
|
||||
static PyObject *
|
||||
builtin_callable(PyObject *self, PyObject *v)
|
||||
{
|
||||
|
@ -1078,31 +1057,6 @@ PyDoc_STRVAR(len_doc,
|
|||
Return the number of items of a sequence or mapping.");
|
||||
|
||||
|
||||
static PyObject *
|
||||
builtin_slice(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *start, *stop, *step;
|
||||
|
||||
start = stop = step = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
|
||||
return NULL;
|
||||
|
||||
/* This swapping of stop and start is to maintain similarity with
|
||||
range(). */
|
||||
if (stop == NULL) {
|
||||
stop = start;
|
||||
start = NULL;
|
||||
}
|
||||
return PySlice_New(start, stop, step);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(slice_doc,
|
||||
"slice([start,] stop[, step]) -> slice object\n\
|
||||
\n\
|
||||
Create a slice object. This is used for slicing by the Numeric extensions.");
|
||||
|
||||
|
||||
static PyObject *
|
||||
builtin_locals(PyObject *self)
|
||||
{
|
||||
|
@ -1775,7 +1729,6 @@ static PyMethodDef builtin_methods[] = {
|
|||
{"__import__", builtin___import__, METH_VARARGS, import_doc},
|
||||
{"abs", builtin_abs, METH_O, abs_doc},
|
||||
{"apply", builtin_apply, METH_VARARGS, apply_doc},
|
||||
{"buffer", builtin_buffer, METH_VARARGS, buffer_doc},
|
||||
{"callable", builtin_callable, METH_O, callable_doc},
|
||||
{"chr", builtin_chr, METH_VARARGS, chr_doc},
|
||||
{"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
|
||||
|
@ -1813,7 +1766,6 @@ static PyMethodDef builtin_methods[] = {
|
|||
{"repr", builtin_repr, METH_O, repr_doc},
|
||||
{"round", builtin_round, METH_VARARGS, round_doc},
|
||||
{"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
|
||||
{"slice", builtin_slice, METH_VARARGS, slice_doc},
|
||||
#ifdef Py_USING_UNICODE
|
||||
{"unichr", builtin_unichr, METH_VARARGS, unichr_doc},
|
||||
#endif
|
||||
|
@ -1849,6 +1801,7 @@ _PyBuiltin_Init(void)
|
|||
SETBUILTIN("True", Py_True);
|
||||
SETBUILTIN("basestring", &PyBaseString_Type);
|
||||
SETBUILTIN("bool", &PyBool_Type);
|
||||
SETBUILTIN("buffer", &PyBuffer_Type);
|
||||
SETBUILTIN("classmethod", &PyClassMethod_Type);
|
||||
#ifndef WITHOUT_COMPLEX
|
||||
SETBUILTIN("complex", &PyComplex_Type);
|
||||
|
@ -1861,6 +1814,7 @@ _PyBuiltin_Init(void)
|
|||
SETBUILTIN("list", &PyList_Type);
|
||||
SETBUILTIN("long", &PyLong_Type);
|
||||
SETBUILTIN("object", &PyBaseObject_Type);
|
||||
SETBUILTIN("slice", &PySlice_Type);
|
||||
SETBUILTIN("staticmethod", &PyStaticMethod_Type);
|
||||
SETBUILTIN("str", &PyString_Type);
|
||||
SETBUILTIN("super", &PySuper_Type);
|
||||
|
|
|
@ -91,6 +91,69 @@ static PyMemberDef code_memberlist[] = {
|
|||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
PyDoc_STRVAR(code_doc,
|
||||
"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
|
||||
varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
|
||||
\n\
|
||||
Create a code object. Not for the faint of heart.");
|
||||
|
||||
static PyObject *
|
||||
code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
||||
{
|
||||
int argcount;
|
||||
int nlocals;
|
||||
int stacksize;
|
||||
int flags;
|
||||
PyObject *code;
|
||||
PyObject *consts;
|
||||
PyObject *names;
|
||||
PyObject *varnames;
|
||||
PyObject *freevars = NULL;
|
||||
PyObject *cellvars = NULL;
|
||||
PyObject *filename;
|
||||
PyObject *name;
|
||||
int firstlineno;
|
||||
PyObject *lnotab;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
|
||||
&argcount, &nlocals, &stacksize, &flags,
|
||||
&code,
|
||||
&PyTuple_Type, &consts,
|
||||
&PyTuple_Type, &names,
|
||||
&PyTuple_Type, &varnames,
|
||||
&filename, &name,
|
||||
&firstlineno, &lnotab,
|
||||
&PyTuple_Type, &freevars,
|
||||
&PyTuple_Type, &cellvars))
|
||||
return NULL;
|
||||
|
||||
if (freevars == NULL || cellvars == NULL) {
|
||||
PyObject *empty = PyTuple_New(0);
|
||||
if (empty == NULL)
|
||||
return NULL;
|
||||
if (freevars == NULL) {
|
||||
freevars = empty;
|
||||
Py_INCREF(freevars);
|
||||
}
|
||||
if (cellvars == NULL) {
|
||||
cellvars = empty;
|
||||
Py_INCREF(cellvars);
|
||||
}
|
||||
Py_DECREF(empty);
|
||||
}
|
||||
|
||||
if (!PyObject_CheckReadBuffer(code)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"bytecode object must be a single-segment read-only buffer");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
|
||||
code, consts, names, varnames,
|
||||
freevars, cellvars, filename, name,
|
||||
firstlineno, lnotab);
|
||||
}
|
||||
|
||||
static void
|
||||
code_dealloc(PyCodeObject *co)
|
||||
{
|
||||
|
@ -200,7 +263,7 @@ PyTypeObject PyCode_Type = {
|
|||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
code_doc, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
|
@ -217,7 +280,7 @@ PyTypeObject PyCode_Type = {
|
|||
0, /* tp_dictoffset */
|
||||
0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
code_new, /* tp_new */
|
||||
};
|
||||
|
||||
#define NAME_CHARS \
|
||||
|
|
|
@ -104,19 +104,6 @@ aix_getoldmodules(void **modlistptr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
aix_bindnewmodule(void *newmoduleptr, void *modlistptr)
|
||||
{
|
||||
register ModulePtr modptr;
|
||||
|
||||
/*
|
||||
-- Bind the new module with the list of loaded modules.
|
||||
*/
|
||||
for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
|
||||
if (loadbind(0, modptr->entry, newmoduleptr) != 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
aix_loaderror(const char *pathname)
|
||||
|
@ -192,10 +179,6 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
|
|||
aix_loaderror(pathname);
|
||||
return NULL;
|
||||
}
|
||||
if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
|
||||
aix_loaderror(pathname);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue