1995-01-07 07:50:36 -04:00
|
|
|
|
|
|
|
/* Module new -- create new objects of various types */
|
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
#include "Python.h"
|
1994-05-23 09:37:57 -03:00
|
|
|
#include "compile.h"
|
|
|
|
|
1996-06-17 13:56:56 -03:00
|
|
|
static char new_instance_doc[] =
|
2001-01-27 23:55:09 -04:00
|
|
|
"Create an instance object from (CLASS [, DICT]) without calling its\n\
|
|
|
|
__init__() method. DICT must be a dictionary or None.";
|
1996-06-17 13:56:56 -03:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_instance(PyObject* unused, PyObject* args)
|
1996-06-17 13:56:56 -03:00
|
|
|
{
|
2001-01-27 23:55:09 -04:00
|
|
|
PyObject *klass;
|
|
|
|
PyObject *dict = NULL;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "O!|O:instance",
|
|
|
|
&PyClass_Type, &klass, &dict))
|
1996-06-17 13:56:56 -03:00
|
|
|
return NULL;
|
2001-01-27 23:55:09 -04:00
|
|
|
|
|
|
|
if (dict == Py_None)
|
|
|
|
dict = NULL;
|
|
|
|
else if (dict == NULL)
|
|
|
|
/* do nothing */;
|
|
|
|
else if (!PyDict_Check(dict)) {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"new.instance() second arg must be dictionary or None");
|
1996-06-17 13:56:56 -03:00
|
|
|
return NULL;
|
2001-01-27 23:55:09 -04:00
|
|
|
}
|
|
|
|
return PyInstance_NewRaw(klass, dict);
|
1996-06-17 13:56:56 -03:00
|
|
|
}
|
|
|
|
|
1995-01-07 07:50:36 -04:00
|
|
|
static char new_im_doc[] =
|
|
|
|
"Create a instance method object from (FUNCTION, INSTANCE, CLASS).";
|
1994-05-23 09:37:57 -03:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_instancemethod(PyObject* unused, PyObject* args)
|
1994-05-23 09:37:57 -03:00
|
|
|
{
|
1996-12-10 12:25:56 -04:00
|
|
|
PyObject* func;
|
|
|
|
PyObject* self;
|
|
|
|
PyObject* classObj;
|
|
|
|
|
2000-02-29 09:59:29 -04:00
|
|
|
if (!PyArg_ParseTuple(args, "OOO!:instancemethod",
|
1998-07-08 11:58:16 -03:00
|
|
|
&func,
|
|
|
|
&self,
|
1996-12-10 12:25:56 -04:00
|
|
|
&PyClass_Type, &classObj))
|
1995-01-07 07:50:36 -04:00
|
|
|
return NULL;
|
1998-07-08 11:58:16 -03:00
|
|
|
if (!PyCallable_Check(func)) {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"first argument must be callable");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (self == Py_None)
|
|
|
|
self = NULL;
|
|
|
|
else if (!PyInstance_Check(self)) {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"second argument must be instance or None");
|
|
|
|
return NULL;
|
|
|
|
}
|
1996-12-10 12:25:56 -04:00
|
|
|
return PyMethod_New(func, self, classObj);
|
1994-05-23 09:37:57 -03:00
|
|
|
}
|
|
|
|
|
1995-01-07 07:50:36 -04:00
|
|
|
static char new_function_doc[] =
|
2000-10-10 19:07:18 -03:00
|
|
|
"Create a function object from (CODE, GLOBALS, [NAME [, ARGDEFS]]).";
|
1995-01-07 07:50:36 -04:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_function(PyObject* unused, PyObject* args)
|
1994-05-23 09:37:57 -03:00
|
|
|
{
|
1996-12-10 12:25:56 -04:00
|
|
|
PyObject* code;
|
|
|
|
PyObject* globals;
|
|
|
|
PyObject* name = Py_None;
|
|
|
|
PyObject* defaults = Py_None;
|
|
|
|
PyFunctionObject* newfunc;
|
|
|
|
|
2000-11-13 16:29:20 -04:00
|
|
|
if (!PyArg_ParseTuple(args, "O!O!|OO!:function",
|
1996-12-10 12:25:56 -04:00
|
|
|
&PyCode_Type, &code,
|
|
|
|
&PyDict_Type, &globals,
|
|
|
|
&name,
|
|
|
|
&PyTuple_Type, &defaults))
|
1995-01-07 07:50:36 -04:00
|
|
|
return NULL;
|
2000-11-13 16:29:20 -04:00
|
|
|
if (name != Py_None && !PyString_Check(name)) {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"arg 3 (name) must be None or string");
|
|
|
|
return NULL;
|
|
|
|
}
|
1994-05-23 09:37:57 -03:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
newfunc = (PyFunctionObject *)PyFunction_New(code, globals);
|
1995-01-07 07:50:36 -04:00
|
|
|
if (newfunc == NULL)
|
|
|
|
return NULL;
|
1994-05-23 09:37:57 -03:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
if (name != Py_None) {
|
|
|
|
Py_XINCREF(name);
|
|
|
|
Py_XDECREF(newfunc->func_name);
|
1995-01-07 07:50:36 -04:00
|
|
|
newfunc->func_name = name;
|
|
|
|
}
|
1998-05-21 21:57:31 -03:00
|
|
|
if (defaults != Py_None) {
|
1996-12-10 12:25:56 -04:00
|
|
|
Py_XINCREF(defaults);
|
|
|
|
Py_XDECREF(newfunc->func_defaults);
|
1996-11-21 12:02:12 -04:00
|
|
|
newfunc->func_defaults = defaults;
|
1995-01-07 07:50:36 -04:00
|
|
|
}
|
1994-05-23 09:37:57 -03:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
return (PyObject *)newfunc;
|
1994-05-23 09:37:57 -03:00
|
|
|
}
|
|
|
|
|
1995-01-07 07:50:36 -04:00
|
|
|
static char new_code_doc[] =
|
2001-02-01 15:50:29 -04:00
|
|
|
"Create a code object from (ARGCOUNT, NLOCALS, STACKSIZE, FLAGS, CODESTRING,\n"
|
|
|
|
"CONSTANTS, NAMES, VARNAMES, FILENAME, NAME, FIRSTLINENO, LNOTAB, FREEVARS,\n"
|
|
|
|
"CELLVARS).";
|
1995-01-07 07:50:36 -04:00
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_code(PyObject* unused, PyObject* args)
|
1994-05-23 09:37:57 -03:00
|
|
|
{
|
1995-09-30 14:01:02 -03:00
|
|
|
int argcount;
|
|
|
|
int nlocals;
|
1997-01-17 17:12:06 -04:00
|
|
|
int stacksize;
|
1995-09-30 14:01:02 -03:00
|
|
|
int flags;
|
1996-12-10 12:25:56 -04:00
|
|
|
PyObject* code;
|
|
|
|
PyObject* consts;
|
|
|
|
PyObject* names;
|
|
|
|
PyObject* varnames;
|
2001-02-01 15:50:29 -04:00
|
|
|
PyObject* freevars = NULL;
|
|
|
|
PyObject* cellvars = NULL;
|
1996-12-10 12:25:56 -04:00
|
|
|
PyObject* filename;
|
|
|
|
PyObject* name;
|
1997-01-23 23:58:52 -04:00
|
|
|
int firstlineno;
|
|
|
|
PyObject* lnotab;
|
1998-10-07 16:42:25 -03:00
|
|
|
PyBufferProcs *pb;
|
|
|
|
|
2001-02-01 15:50:29 -04:00
|
|
|
if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
|
1997-01-17 17:12:06 -04:00
|
|
|
&argcount, &nlocals, &stacksize, &flags,
|
1996-12-10 12:25:56 -04:00
|
|
|
&code,
|
|
|
|
&PyTuple_Type, &consts,
|
|
|
|
&PyTuple_Type, &names,
|
1997-01-17 17:12:06 -04:00
|
|
|
&PyTuple_Type, &varnames,
|
1997-01-23 23:58:52 -04:00
|
|
|
&filename, &name,
|
2001-02-01 15:50:29 -04:00
|
|
|
&firstlineno, &lnotab,
|
|
|
|
&PyTuple_Type, &freevars,
|
|
|
|
&PyTuple_Type, &cellvars))
|
1995-09-30 14:01:02 -03:00
|
|
|
return NULL;
|
1998-10-07 16:42:25 -03:00
|
|
|
|
2001-02-01 15:50:29 -04:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
1998-10-07 16:42:25 -03:00
|
|
|
pb = code->ob_type->tp_as_buffer;
|
|
|
|
if (pb == NULL ||
|
|
|
|
pb->bf_getreadbuffer == NULL ||
|
|
|
|
pb->bf_getsegcount == NULL ||
|
|
|
|
(*pb->bf_getsegcount)(code, NULL) != 1)
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"bytecode object must be a single-segment read-only buffer");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1997-01-17 17:12:06 -04:00
|
|
|
return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
|
1996-12-10 12:25:56 -04:00
|
|
|
code, consts, names, varnames,
|
2001-01-25 16:07:56 -04:00
|
|
|
freevars, cellvars, filename, name,
|
|
|
|
firstlineno, lnotab);
|
1995-09-30 14:01:02 -03:00
|
|
|
}
|
1994-05-23 09:37:57 -03:00
|
|
|
|
1995-01-07 07:50:36 -04:00
|
|
|
static char new_module_doc[] =
|
|
|
|
"Create a module object from (NAME).";
|
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_module(PyObject* unused, PyObject* args)
|
1994-05-23 09:37:57 -03:00
|
|
|
{
|
1995-01-07 07:50:36 -04:00
|
|
|
char *name;
|
1994-05-23 09:37:57 -03:00
|
|
|
|
2000-02-29 09:59:29 -04:00
|
|
|
if (!PyArg_ParseTuple(args, "s:module", &name))
|
1995-01-07 07:50:36 -04:00
|
|
|
return NULL;
|
1996-12-10 12:25:56 -04:00
|
|
|
return PyModule_New(name);
|
1994-05-23 09:37:57 -03:00
|
|
|
}
|
|
|
|
|
1996-01-11 21:38:22 -04:00
|
|
|
static char new_class_doc[] =
|
|
|
|
"Create a class object from (NAME, BASE_CLASSES, DICT).";
|
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyObject *
|
2000-07-10 08:56:03 -03:00
|
|
|
new_class(PyObject* unused, PyObject* args)
|
1996-01-11 21:38:22 -04:00
|
|
|
{
|
1996-12-10 12:25:56 -04:00
|
|
|
PyObject * name;
|
|
|
|
PyObject * classes;
|
|
|
|
PyObject * dict;
|
1996-01-11 21:38:22 -04:00
|
|
|
|
2000-02-29 09:59:29 -04:00
|
|
|
if (!PyArg_ParseTuple(args, "SO!O!:class", &name, &PyTuple_Type, &classes,
|
1996-12-10 12:25:56 -04:00
|
|
|
&PyDict_Type, &dict))
|
1996-01-11 21:38:22 -04:00
|
|
|
return NULL;
|
1996-12-10 12:25:56 -04:00
|
|
|
return PyClass_New(classes, dict, name);
|
1996-01-11 21:38:22 -04:00
|
|
|
}
|
|
|
|
|
1996-12-10 12:25:56 -04:00
|
|
|
static PyMethodDef new_methods[] = {
|
2000-08-02 23:06:16 -03:00
|
|
|
{"instance", new_instance,
|
|
|
|
METH_VARARGS, new_instance_doc},
|
|
|
|
{"instancemethod", new_instancemethod,
|
|
|
|
METH_VARARGS, new_im_doc},
|
|
|
|
{"function", new_function,
|
|
|
|
METH_VARARGS, new_function_doc},
|
|
|
|
{"code", new_code,
|
|
|
|
METH_VARARGS, new_code_doc},
|
|
|
|
{"module", new_module,
|
|
|
|
METH_VARARGS, new_module_doc},
|
|
|
|
{"classobj", new_class,
|
|
|
|
METH_VARARGS, new_class_doc},
|
1995-01-07 07:50:36 -04:00
|
|
|
{NULL, NULL} /* sentinel */
|
1994-05-23 09:37:57 -03:00
|
|
|
};
|
|
|
|
|
1995-01-07 07:50:36 -04:00
|
|
|
char new_doc[] =
|
|
|
|
"Functions to create new objects used by the interpreter.\n\
|
|
|
|
\n\
|
|
|
|
You need to know a great deal about the interpreter to use this!";
|
|
|
|
|
1998-12-04 14:50:17 -04:00
|
|
|
DL_EXPORT(void)
|
2000-07-21 03:00:07 -03:00
|
|
|
initnew(void)
|
1994-05-23 09:37:57 -03:00
|
|
|
{
|
2001-08-24 03:29:12 -03:00
|
|
|
Py_InitModule4("new", new_methods, new_doc, (PyObject *)NULL,
|
|
|
|
PYTHON_API_VERSION);
|
1994-05-23 09:37:57 -03:00
|
|
|
}
|