mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	new.instancemethod() -- the instancemethod object is now a perfectly general container. This fixes SF bug ##503091 (Pedro Rodriquez): new.instancemethod fails for new classes This is a 2.2.1 candidate.
		
			
				
	
	
		
			215 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
/* 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);
 | 
						|
}
 |