blob: d35896cfd12afd94a994b16dd10659be84f0238d [file] [log] [blame]
Guido van Rossumf9888eb1995-01-07 11:50:36 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf9888eb1995-01-07 11:50:36 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf9888eb1995-01-07 11:50:36 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf9888eb1995-01-07 11:50:36 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf9888eb1995-01-07 11:50:36 +000029
30******************************************************************/
31
32/* Module new -- create new objects of various types */
33
Barry Warsawa6b7c711996-12-10 16:25:56 +000034#include "Python.h"
Guido van Rossum34162a11994-05-23 12:37:57 +000035#include "compile.h"
Guido van Rossum34162a11994-05-23 12:37:57 +000036
Guido van Rossum26b310a1996-06-17 16:56:56 +000037static char new_instance_doc[] =
38"Create an instance object from (CLASS, DICT) without calling its __init__().";
39
Barry Warsawa6b7c711996-12-10 16:25:56 +000040static PyObject *
Guido van Rossum26b310a1996-06-17 16:56:56 +000041new_instance(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +000042 PyObject* unused;
43 PyObject* args;
Guido van Rossum26b310a1996-06-17 16:56:56 +000044{
Barry Warsawa6b7c711996-12-10 16:25:56 +000045 PyObject* klass;
46 PyObject *dict;
47 PyInstanceObject *inst;
Guido van Rossum43713e52000-02-29 13:59:29 +000048 if (!PyArg_ParseTuple(args, "O!O!:instance",
Barry Warsawa6b7c711996-12-10 16:25:56 +000049 &PyClass_Type, &klass,
50 &PyDict_Type, &dict))
Guido van Rossum26b310a1996-06-17 16:56:56 +000051 return NULL;
Guido van Rossumb18618d2000-05-03 23:44:39 +000052 inst = PyObject_New(PyInstanceObject, &PyInstance_Type);
Guido van Rossum26b310a1996-06-17 16:56:56 +000053 if (inst == NULL)
54 return NULL;
Barry Warsawa6b7c711996-12-10 16:25:56 +000055 Py_INCREF(klass);
56 Py_INCREF(dict);
57 inst->in_class = (PyClassObject *)klass;
Guido van Rossum26b310a1996-06-17 16:56:56 +000058 inst->in_dict = dict;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000059 PyObject_GC_Init(inst);
Barry Warsawa6b7c711996-12-10 16:25:56 +000060 return (PyObject *)inst;
Guido van Rossum26b310a1996-06-17 16:56:56 +000061}
62
Guido van Rossumf9888eb1995-01-07 11:50:36 +000063static char new_im_doc[] =
64"Create a instance method object from (FUNCTION, INSTANCE, CLASS).";
Guido van Rossum34162a11994-05-23 12:37:57 +000065
Barry Warsawa6b7c711996-12-10 16:25:56 +000066static PyObject *
Guido van Rossum34162a11994-05-23 12:37:57 +000067new_instancemethod(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +000068 PyObject* unused;
69 PyObject* args;
Guido van Rossum34162a11994-05-23 12:37:57 +000070{
Barry Warsawa6b7c711996-12-10 16:25:56 +000071 PyObject* func;
72 PyObject* self;
73 PyObject* classObj;
Guido van Rossum34162a11994-05-23 12:37:57 +000074
Guido van Rossum43713e52000-02-29 13:59:29 +000075 if (!PyArg_ParseTuple(args, "OOO!:instancemethod",
Guido van Rossum7859f871998-07-08 14:58:16 +000076 &func,
77 &self,
Barry Warsawa6b7c711996-12-10 16:25:56 +000078 &PyClass_Type, &classObj))
Guido van Rossumf9888eb1995-01-07 11:50:36 +000079 return NULL;
Guido van Rossum7859f871998-07-08 14:58:16 +000080 if (!PyCallable_Check(func)) {
81 PyErr_SetString(PyExc_TypeError,
82 "first argument must be callable");
83 return NULL;
84 }
85 if (self == Py_None)
86 self = NULL;
87 else if (!PyInstance_Check(self)) {
88 PyErr_SetString(PyExc_TypeError,
89 "second argument must be instance or None");
90 return NULL;
91 }
Barry Warsawa6b7c711996-12-10 16:25:56 +000092 return PyMethod_New(func, self, classObj);
Guido van Rossumf9888eb1995-01-07 11:50:36 +000093}
94
95static char new_function_doc[] =
Guido van Rossumb916faf1996-11-21 16:02:12 +000096"Create a function object from (CODE, GLOBALS, [NAME, ARGDEFS]).";
Guido van Rossumf9888eb1995-01-07 11:50:36 +000097
Barry Warsawa6b7c711996-12-10 16:25:56 +000098static PyObject *
Guido van Rossum34162a11994-05-23 12:37:57 +000099new_function(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +0000100 PyObject* unused;
101 PyObject* args;
Guido van Rossum34162a11994-05-23 12:37:57 +0000102{
Barry Warsawa6b7c711996-12-10 16:25:56 +0000103 PyObject* code;
104 PyObject* globals;
105 PyObject* name = Py_None;
106 PyObject* defaults = Py_None;
107 PyFunctionObject* newfunc;
Guido van Rossum34162a11994-05-23 12:37:57 +0000108
Guido van Rossum43713e52000-02-29 13:59:29 +0000109 if (!PyArg_ParseTuple(args, "O!O!|SO!:function",
Barry Warsawa6b7c711996-12-10 16:25:56 +0000110 &PyCode_Type, &code,
111 &PyDict_Type, &globals,
112 &name,
113 &PyTuple_Type, &defaults))
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000114 return NULL;
Guido van Rossum34162a11994-05-23 12:37:57 +0000115
Barry Warsawa6b7c711996-12-10 16:25:56 +0000116 newfunc = (PyFunctionObject *)PyFunction_New(code, globals);
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000117 if (newfunc == NULL)
118 return NULL;
Guido van Rossum34162a11994-05-23 12:37:57 +0000119
Barry Warsawa6b7c711996-12-10 16:25:56 +0000120 if (name != Py_None) {
121 Py_XINCREF(name);
122 Py_XDECREF(newfunc->func_name);
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000123 newfunc->func_name = name;
124 }
Guido van Rossumb88679b1998-05-22 00:57:31 +0000125 if (defaults != Py_None) {
Barry Warsawa6b7c711996-12-10 16:25:56 +0000126 Py_XINCREF(defaults);
127 Py_XDECREF(newfunc->func_defaults);
Guido van Rossumb916faf1996-11-21 16:02:12 +0000128 newfunc->func_defaults = defaults;
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000129 }
Guido van Rossum34162a11994-05-23 12:37:57 +0000130
Barry Warsawa6b7c711996-12-10 16:25:56 +0000131 return (PyObject *)newfunc;
Guido van Rossum34162a11994-05-23 12:37:57 +0000132}
Guido van Rossum34162a11994-05-23 12:37:57 +0000133
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000134static char new_code_doc[] =
Guido van Rossum463e55a1997-01-24 03:58:52 +0000135"Create a code object from (ARGCOUNT, NLOCALS, STACKSIZE, FLAGS, CODESTRING, CONSTANTS, NAMES, VARNAMES, FILENAME, NAME, FIRSTLINENO, LNOTAB).";
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000136
Barry Warsawa6b7c711996-12-10 16:25:56 +0000137static PyObject *
Guido van Rossum34162a11994-05-23 12:37:57 +0000138new_code(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +0000139 PyObject* unused;
140 PyObject* args;
Guido van Rossum34162a11994-05-23 12:37:57 +0000141{
Guido van Rossum896fc7e1995-09-30 17:01:02 +0000142 int argcount;
143 int nlocals;
Guido van Rossume9fd28d1997-01-17 21:12:06 +0000144 int stacksize;
Guido van Rossum896fc7e1995-09-30 17:01:02 +0000145 int flags;
Barry Warsawa6b7c711996-12-10 16:25:56 +0000146 PyObject* code;
147 PyObject* consts;
148 PyObject* names;
149 PyObject* varnames;
150 PyObject* filename;
151 PyObject* name;
Guido van Rossum463e55a1997-01-24 03:58:52 +0000152 int firstlineno;
153 PyObject* lnotab;
Guido van Rossumd076c731998-10-07 19:42:25 +0000154 PyBufferProcs *pb;
155
Guido van Rossum43713e52000-02-29 13:59:29 +0000156 if (!PyArg_ParseTuple(args, "iiiiOO!O!O!SSiS:code",
Guido van Rossume9fd28d1997-01-17 21:12:06 +0000157 &argcount, &nlocals, &stacksize, &flags,
Barry Warsawa6b7c711996-12-10 16:25:56 +0000158 &code,
159 &PyTuple_Type, &consts,
160 &PyTuple_Type, &names,
Guido van Rossume9fd28d1997-01-17 21:12:06 +0000161 &PyTuple_Type, &varnames,
Guido van Rossum463e55a1997-01-24 03:58:52 +0000162 &filename, &name,
163 &firstlineno, &lnotab))
Guido van Rossum896fc7e1995-09-30 17:01:02 +0000164 return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000165
166 pb = code->ob_type->tp_as_buffer;
167 if (pb == NULL ||
168 pb->bf_getreadbuffer == NULL ||
169 pb->bf_getsegcount == NULL ||
170 (*pb->bf_getsegcount)(code, NULL) != 1)
171 {
172 PyErr_SetString(PyExc_TypeError,
173 "bytecode object must be a single-segment read-only buffer");
174 return NULL;
175 }
176
Guido van Rossume9fd28d1997-01-17 21:12:06 +0000177 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
Barry Warsawa6b7c711996-12-10 16:25:56 +0000178 code, consts, names, varnames,
Guido van Rossum463e55a1997-01-24 03:58:52 +0000179 filename, name, firstlineno, lnotab);
Guido van Rossum896fc7e1995-09-30 17:01:02 +0000180}
Guido van Rossum34162a11994-05-23 12:37:57 +0000181
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000182static char new_module_doc[] =
183"Create a module object from (NAME).";
184
Barry Warsawa6b7c711996-12-10 16:25:56 +0000185static PyObject *
Guido van Rossum34162a11994-05-23 12:37:57 +0000186new_module(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +0000187 PyObject* unused;
188 PyObject* args;
Guido van Rossum34162a11994-05-23 12:37:57 +0000189{
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000190 char *name;
Guido van Rossum34162a11994-05-23 12:37:57 +0000191
Guido van Rossum43713e52000-02-29 13:59:29 +0000192 if (!PyArg_ParseTuple(args, "s:module", &name))
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000193 return NULL;
Barry Warsawa6b7c711996-12-10 16:25:56 +0000194 return PyModule_New(name);
Guido van Rossum34162a11994-05-23 12:37:57 +0000195}
Guido van Rossum34162a11994-05-23 12:37:57 +0000196
Guido van Rossumb28911c1996-01-12 01:38:22 +0000197static char new_class_doc[] =
198"Create a class object from (NAME, BASE_CLASSES, DICT).";
199
Barry Warsawa6b7c711996-12-10 16:25:56 +0000200static PyObject *
Guido van Rossumb28911c1996-01-12 01:38:22 +0000201new_class(unused, args)
Barry Warsawa6b7c711996-12-10 16:25:56 +0000202 PyObject* unused;
203 PyObject* args;
Guido van Rossumb28911c1996-01-12 01:38:22 +0000204{
Barry Warsawa6b7c711996-12-10 16:25:56 +0000205 PyObject * name;
206 PyObject * classes;
207 PyObject * dict;
Guido van Rossumb28911c1996-01-12 01:38:22 +0000208
Guido van Rossum43713e52000-02-29 13:59:29 +0000209 if (!PyArg_ParseTuple(args, "SO!O!:class", &name, &PyTuple_Type, &classes,
Barry Warsawa6b7c711996-12-10 16:25:56 +0000210 &PyDict_Type, &dict))
Guido van Rossumb28911c1996-01-12 01:38:22 +0000211 return NULL;
Barry Warsawa6b7c711996-12-10 16:25:56 +0000212 return PyClass_New(classes, dict, name);
Guido van Rossumb28911c1996-01-12 01:38:22 +0000213}
214
Barry Warsawa6b7c711996-12-10 16:25:56 +0000215static PyMethodDef new_methods[] = {
Guido van Rossum26b310a1996-06-17 16:56:56 +0000216 {"instance", new_instance, 1, new_instance_doc},
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000217 {"instancemethod", new_instancemethod, 1, new_im_doc},
218 {"function", new_function, 1, new_function_doc},
Guido van Rossum896fc7e1995-09-30 17:01:02 +0000219 {"code", new_code, 1, new_code_doc},
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000220 {"module", new_module, 1, new_module_doc},
Guido van Rossumb28911c1996-01-12 01:38:22 +0000221 {"classobj", new_class, 1, new_class_doc},
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000222 {NULL, NULL} /* sentinel */
Guido van Rossum34162a11994-05-23 12:37:57 +0000223};
224
Guido van Rossumf9888eb1995-01-07 11:50:36 +0000225char new_doc[] =
226"Functions to create new objects used by the interpreter.\n\
227\n\
228You need to know a great deal about the interpreter to use this!";
229
Guido van Rossum3886bb61998-12-04 18:50:17 +0000230DL_EXPORT(void)
Guido van Rossum34162a11994-05-23 12:37:57 +0000231initnew()
232{
Barry Warsawa6b7c711996-12-10 16:25:56 +0000233 Py_InitModule4("new", new_methods, new_doc, (PyObject *)NULL,
234 PYTHON_API_VERSION);
Guido van Rossum34162a11994-05-23 12:37:57 +0000235}