Re-factored PyInstance_New() into PyInstance_New() and PyInstance_NewRaw().
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 40ff983..60214a4 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -428,27 +428,48 @@
/* Instance objects */
PyObject *
-PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
+PyInstance_NewRaw(PyObject *klass, PyObject *dict)
+{
+ PyInstanceObject *inst;
+
+ if (!PyClass_Check(klass)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ if (dict == NULL) {
+ dict = PyDict_New();
+ if (dict == NULL)
+ return NULL;
+ }
+ else {
+ if (!PyDict_Check(dict)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ Py_INCREF(dict);
+ }
+ inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+ if (inst == NULL) {
+ Py_DECREF(dict);
+ return NULL;
+ }
+ Py_INCREF(klass);
+ inst->in_class = (PyClassObject *)klass;
+ inst->in_dict = dict;
+ PyObject_GC_Init(inst);
+ return (PyObject *)inst;
+}
+
+PyObject *
+PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
{
register PyInstanceObject *inst;
PyObject *init;
static PyObject *initstr;
- if (!PyClass_Check(class)) {
- PyErr_BadInternalCall();
- return NULL;
- }
- inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+
+ inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
if (inst == NULL)
return NULL;
- inst->in_dict = PyDict_New();
- if (inst->in_dict == NULL) {
- inst = (PyInstanceObject *) PyObject_AS_GC(inst);
- PyObject_DEL(inst);
- return NULL;
- }
- Py_INCREF(class);
- inst->in_class = (PyClassObject *)class;
- PyObject_GC_Init(inst);
if (initstr == NULL)
initstr = PyString_InternFromString("__init__");
init = instance_getattr2(inst, initstr);