|  | 
 | /* Module new -- create new objects of various types */ | 
 |  | 
 | #include "Python.h" | 
 | #include "compile.h" | 
 |  | 
 | static char new_instance_doc[] = | 
 | "Create an instance object from (CLASS [, DICT]) without calling its\n\ | 
 | __init__() method.  DICT must be a dictionary or None."; | 
 |  | 
 | static PyObject * | 
 | new_instance(PyObject* unused, PyObject* args) | 
 | { | 
 | 	PyObject *klass; | 
 | 	PyObject *dict = NULL; | 
 |  | 
 | 	if (!PyArg_ParseTuple(args, "O!|O:instance", | 
 | 			      &PyClass_Type, &klass, &dict)) | 
 | 		return NULL; | 
 |  | 
 | 	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"); | 
 | 		return NULL; | 
 | 	} | 
 | 	return PyInstance_NewRaw(klass, dict); | 
 | } | 
 |  | 
 | static char new_im_doc[] = | 
 | "Create a instance method object from (FUNCTION, INSTANCE, CLASS)."; | 
 |  | 
 | static PyObject * | 
 | new_instancemethod(PyObject* unused, PyObject* args) | 
 | { | 
 | 	PyObject* func; | 
 | 	PyObject* self; | 
 | 	PyObject* classObj; | 
 |  | 
 | 	if (!PyArg_ParseTuple(args, "OOO:instancemethod", | 
 | 			      &func, &self, &classObj)) | 
 | 		return NULL; | 
 | 	if (!PyCallable_Check(func)) { | 
 | 		PyErr_SetString(PyExc_TypeError, | 
 | 				"first argument must be callable"); | 
 | 		return NULL; | 
 | 	} | 
 | 	if (self == Py_None) | 
 | 		self = NULL; | 
 | 	return PyMethod_New(func, self, classObj); | 
 | } | 
 |  | 
 | static char new_function_doc[] = | 
 | "Create a function object from (CODE, GLOBALS, [NAME [, ARGDEFS]])."; | 
 |  | 
 | static PyObject * | 
 | new_function(PyObject* unused, PyObject* args) | 
 | { | 
 | 	PyObject* code; | 
 | 	PyObject* globals; | 
 | 	PyObject* name = Py_None; | 
 | 	PyObject* defaults = Py_None; | 
 | 	PyFunctionObject* newfunc; | 
 |  | 
 | 	if (!PyArg_ParseTuple(args, "O!O!|OO!:function", | 
 | 			      &PyCode_Type, &code, | 
 | 			      &PyDict_Type, &globals, | 
 | 			      &name, | 
 | 			      &PyTuple_Type, &defaults)) | 
 | 		return NULL; | 
 | 	if (name != Py_None && !PyString_Check(name)) { | 
 | 		PyErr_SetString(PyExc_TypeError, | 
 | 				"arg 3 (name) must be None or string"); | 
 | 		return NULL; | 
 | 	} | 
 |  | 
 | 	newfunc = (PyFunctionObject *)PyFunction_New(code, globals); | 
 | 	if (newfunc == NULL) | 
 | 		return NULL; | 
 |  | 
 | 	if (name != Py_None) { | 
 | 		Py_XINCREF(name); | 
 | 		Py_XDECREF(newfunc->func_name); | 
 | 		newfunc->func_name = name; | 
 | 	} | 
 | 	if (defaults != Py_None) { | 
 | 		Py_XINCREF(defaults); | 
 | 		Py_XDECREF(newfunc->func_defaults); | 
 | 		newfunc->func_defaults  = defaults; | 
 | 	} | 
 |  | 
 | 	return (PyObject *)newfunc; | 
 | } | 
 |  | 
 | static char new_code_doc[] = | 
 | "Create a code object from (ARGCOUNT, NLOCALS, STACKSIZE, FLAGS, CODESTRING,\n" | 
 | "CONSTANTS, NAMES, VARNAMES, FILENAME, NAME, FIRSTLINENO, LNOTAB, FREEVARS,\n" | 
 | "CELLVARS)."; | 
 |  | 
 | static PyObject * | 
 | new_code(PyObject* unused, PyObject* args) | 
 | { | 
 | 	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 char new_module_doc[] = | 
 | "Create a module object from (NAME)."; | 
 |  | 
 | static PyObject * | 
 | new_module(PyObject* unused, PyObject* args) | 
 | { | 
 | 	char *name; | 
 |    | 
 | 	if (!PyArg_ParseTuple(args, "s:module", &name)) | 
 | 		return NULL; | 
 | 	return PyModule_New(name); | 
 | } | 
 |  | 
 | static char new_class_doc[] = | 
 | "Create a class object from (NAME, BASE_CLASSES, DICT)."; | 
 |  | 
 | static PyObject * | 
 | new_class(PyObject* unused, PyObject* args) | 
 | { | 
 | 	PyObject * name; | 
 | 	PyObject * classes; | 
 | 	PyObject * dict; | 
 |    | 
 | 	if (!PyArg_ParseTuple(args, "SO!O!:class", &name, &PyTuple_Type, &classes, | 
 | 			      &PyDict_Type, &dict)) | 
 | 		return NULL; | 
 | 	return PyClass_New(classes, dict, name); | 
 | } | 
 |  | 
 | static PyMethodDef new_methods[] = { | 
 | 	{"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}, | 
 | 	{NULL,			NULL}		/* sentinel */ | 
 | }; | 
 |  | 
 | static 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!"; | 
 |  | 
 | DL_EXPORT(void) | 
 | initnew(void) | 
 | { | 
 | 	Py_InitModule4("new", new_methods, new_doc, (PyObject *)NULL, | 
 | 		       PYTHON_API_VERSION); | 
 | } |