From ceb2bff09ee06304ce4d2c49ecd79bac7fd84298 Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Sun, 28 Jan 2001 03:55:09 +0000 Subject: [PATCH] new_instance(): Use PyInstance_NewRaw() instead of knowing too much about the internal initialization of instance objects. Make the dict parameter optional, and allow None as equivalent to omission. --- Modules/newmodule.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Modules/newmodule.c b/Modules/newmodule.c index 06b7d823b8c..7c7bee713bc 100644 --- a/Modules/newmodule.c +++ b/Modules/newmodule.c @@ -5,27 +5,29 @@ #include "compile.h" static char new_instance_doc[] = -"Create an instance object from (CLASS, DICT) without calling its __init__()."; +"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; - PyInstanceObject *inst; - if (!PyArg_ParseTuple(args, "O!O!:instance", - &PyClass_Type, &klass, - &PyDict_Type, &dict)) + PyObject *klass; + PyObject *dict = NULL; + + if (!PyArg_ParseTuple(args, "O!|O:instance", + &PyClass_Type, &klass, &dict)) return NULL; - inst = PyObject_New(PyInstanceObject, &PyInstance_Type); - if (inst == 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; - Py_INCREF(klass); - Py_INCREF(dict); - inst->in_class = (PyClassObject *)klass; - inst->in_dict = dict; - PyObject_GC_Init(inst); - return (PyObject *)inst; + } + return PyInstance_NewRaw(klass, dict); } static char new_im_doc[] =