summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/classobject.c47
1 files changed, 34 insertions, 13 deletions
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 @@ PyClass_IsSubclass(PyObject *class, PyObject *base)
/* Instance objects */
PyObject *
-PyInstance_New(PyObject *class, PyObject *arg, PyObject *kw)
+PyInstance_NewRaw(PyObject *klass, PyObject *dict)
{
- register PyInstanceObject *inst;
- PyObject *init;
- static PyObject *initstr;
- if (!PyClass_Check(class)) {
+ 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)
- return NULL;
- inst->in_dict = PyDict_New();
- if (inst->in_dict == NULL) {
- inst = (PyInstanceObject *) PyObject_AS_GC(inst);
- PyObject_DEL(inst);
+ if (inst == NULL) {
+ Py_DECREF(dict);
return NULL;
}
- Py_INCREF(class);
- inst->in_class = (PyClassObject *)class;
+ 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;
+
+ inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
+ if (inst == NULL)
+ return NULL;
if (initstr == NULL)
initstr = PyString_InternFromString("__init__");
init = instance_getattr2(inst, initstr);