symbian-qemu-0.9.1-12/python-2.6.1/Objects/classobject.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* Class object implementation */
       
     3 
       
     4 #include "Python.h"
       
     5 #include "structmember.h"
       
     6 
       
     7 /* Free list for method objects to safe malloc/free overhead
       
     8  * The im_self element is used to chain the elements.
       
     9  */
       
    10 static PyMethodObject *free_list;
       
    11 static int numfree = 0;
       
    12 #ifndef PyMethod_MAXFREELIST
       
    13 #define PyMethod_MAXFREELIST 256
       
    14 #endif
       
    15 
       
    16 #define TP_DESCR_GET(t) \
       
    17     (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
       
    18 
       
    19 /* Forward */
       
    20 static PyObject *class_lookup(PyClassObject *, PyObject *,
       
    21 			      PyClassObject **);
       
    22 static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
       
    23 static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
       
    24 
       
    25 static PyObject *getattrstr, *setattrstr, *delattrstr;
       
    26 
       
    27 
       
    28 PyObject *
       
    29 PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
       
    30      /* bases is NULL or tuple of classobjects! */
       
    31 {
       
    32 	PyClassObject *op, *dummy;
       
    33 	static PyObject *docstr, *modstr, *namestr;
       
    34 	if (docstr == NULL) {
       
    35 		docstr= PyString_InternFromString("__doc__");
       
    36 		if (docstr == NULL)
       
    37 			return NULL;
       
    38 	}
       
    39 	if (modstr == NULL) {
       
    40 		modstr= PyString_InternFromString("__module__");
       
    41 		if (modstr == NULL)
       
    42 			return NULL;
       
    43 	}
       
    44 	if (namestr == NULL) {
       
    45 		namestr= PyString_InternFromString("__name__");
       
    46 		if (namestr == NULL)
       
    47 			return NULL;
       
    48 	}
       
    49 	if (name == NULL || !PyString_Check(name)) {
       
    50 		PyErr_SetString(PyExc_TypeError,
       
    51 				"PyClass_New: name must be a string");
       
    52 		return NULL;
       
    53 	}
       
    54 	if (dict == NULL || !PyDict_Check(dict)) {
       
    55 		PyErr_SetString(PyExc_TypeError,
       
    56 				"PyClass_New: dict must be a dictionary");
       
    57 		return NULL;
       
    58 	}
       
    59 	if (PyDict_GetItem(dict, docstr) == NULL) {
       
    60 		if (PyDict_SetItem(dict, docstr, Py_None) < 0)
       
    61 			return NULL;
       
    62 	}
       
    63 	if (PyDict_GetItem(dict, modstr) == NULL) {
       
    64 		PyObject *globals = PyEval_GetGlobals();
       
    65 		if (globals != NULL) {
       
    66 			PyObject *modname = PyDict_GetItem(globals, namestr);
       
    67 			if (modname != NULL) {
       
    68 				if (PyDict_SetItem(dict, modstr, modname) < 0)
       
    69 					return NULL;
       
    70 			}
       
    71 		}
       
    72 	}
       
    73 	if (bases == NULL) {
       
    74 		bases = PyTuple_New(0);
       
    75 		if (bases == NULL)
       
    76 			return NULL;
       
    77 	}
       
    78 	else {
       
    79 		Py_ssize_t i, n;
       
    80 		PyObject *base;
       
    81 		if (!PyTuple_Check(bases)) {
       
    82 			PyErr_SetString(PyExc_TypeError,
       
    83 					"PyClass_New: bases must be a tuple");
       
    84 			return NULL;
       
    85 		}
       
    86 		n = PyTuple_Size(bases);
       
    87 		for (i = 0; i < n; i++) {
       
    88 			base = PyTuple_GET_ITEM(bases, i);
       
    89 			if (!PyClass_Check(base)) {
       
    90 				if (PyCallable_Check(
       
    91 					(PyObject *) base->ob_type))
       
    92 					return PyObject_CallFunctionObjArgs(
       
    93 						(PyObject *) base->ob_type,
       
    94 						name, bases, dict, NULL);
       
    95 				PyErr_SetString(PyExc_TypeError,
       
    96 					"PyClass_New: base must be a class");
       
    97 				return NULL;
       
    98 			}
       
    99 		}
       
   100 		Py_INCREF(bases);
       
   101 	}
       
   102 
       
   103 	if (getattrstr == NULL) {
       
   104 		getattrstr = PyString_InternFromString("__getattr__");
       
   105 		if (getattrstr == NULL)
       
   106 			goto alloc_error;
       
   107 		setattrstr = PyString_InternFromString("__setattr__");
       
   108 		if (setattrstr == NULL)
       
   109 			goto alloc_error;
       
   110 		delattrstr = PyString_InternFromString("__delattr__");
       
   111 		if (delattrstr == NULL)
       
   112 			goto alloc_error;
       
   113 	}
       
   114 
       
   115 	op = PyObject_GC_New(PyClassObject, &PyClass_Type);
       
   116 	if (op == NULL) {
       
   117 alloc_error:
       
   118 		Py_DECREF(bases);
       
   119 		return NULL;
       
   120 	}
       
   121 	op->cl_bases = bases;
       
   122 	Py_INCREF(dict);
       
   123 	op->cl_dict = dict;
       
   124 	Py_XINCREF(name);
       
   125 	op->cl_name = name;
       
   126 
       
   127 	op->cl_getattr = class_lookup(op, getattrstr, &dummy);
       
   128 	op->cl_setattr = class_lookup(op, setattrstr, &dummy);
       
   129 	op->cl_delattr = class_lookup(op, delattrstr, &dummy);
       
   130 	Py_XINCREF(op->cl_getattr);
       
   131 	Py_XINCREF(op->cl_setattr);
       
   132 	Py_XINCREF(op->cl_delattr);
       
   133 	_PyObject_GC_TRACK(op);
       
   134 	return (PyObject *) op;
       
   135 }
       
   136 
       
   137 PyObject *
       
   138 PyMethod_Function(PyObject *im)
       
   139 {
       
   140 	if (!PyMethod_Check(im)) {
       
   141 		PyErr_BadInternalCall();
       
   142 		return NULL;
       
   143 	}
       
   144 	return ((PyMethodObject *)im)->im_func;
       
   145 }
       
   146 
       
   147 PyObject *
       
   148 PyMethod_Self(PyObject *im)
       
   149 {
       
   150 	if (!PyMethod_Check(im)) {
       
   151 		PyErr_BadInternalCall();
       
   152 		return NULL;
       
   153 	}
       
   154 	return ((PyMethodObject *)im)->im_self;
       
   155 }
       
   156 
       
   157 PyObject *
       
   158 PyMethod_Class(PyObject *im)
       
   159 {
       
   160 	if (!PyMethod_Check(im)) {
       
   161 		PyErr_BadInternalCall();
       
   162 		return NULL;
       
   163 	}
       
   164 	return ((PyMethodObject *)im)->im_class;
       
   165 }
       
   166 
       
   167 PyDoc_STRVAR(class_doc,
       
   168 "classobj(name, bases, dict)\n\
       
   169 \n\
       
   170 Create a class object.  The name must be a string; the second argument\n\
       
   171 a tuple of classes, and the third a dictionary.");
       
   172 
       
   173 static PyObject *
       
   174 class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
       
   175 {
       
   176 	PyObject *name, *bases, *dict;
       
   177 	static char *kwlist[] = {"name", "bases", "dict", 0};
       
   178 
       
   179 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
       
   180 					 &name, &bases, &dict))
       
   181 		return NULL;
       
   182 	return PyClass_New(bases, dict, name);
       
   183 }
       
   184 
       
   185 /* Class methods */
       
   186 
       
   187 static void
       
   188 class_dealloc(PyClassObject *op)
       
   189 {
       
   190 	_PyObject_GC_UNTRACK(op);
       
   191 	Py_DECREF(op->cl_bases);
       
   192 	Py_DECREF(op->cl_dict);
       
   193 	Py_XDECREF(op->cl_name);
       
   194 	Py_XDECREF(op->cl_getattr);
       
   195 	Py_XDECREF(op->cl_setattr);
       
   196 	Py_XDECREF(op->cl_delattr);
       
   197 	PyObject_GC_Del(op);
       
   198 }
       
   199 
       
   200 static PyObject *
       
   201 class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
       
   202 {
       
   203 	Py_ssize_t i, n;
       
   204 	PyObject *value = PyDict_GetItem(cp->cl_dict, name);
       
   205 	if (value != NULL) {
       
   206 		*pclass = cp;
       
   207 		return value;
       
   208 	}
       
   209 	n = PyTuple_Size(cp->cl_bases);
       
   210 	for (i = 0; i < n; i++) {
       
   211 		/* XXX What if one of the bases is not a class? */
       
   212 		PyObject *v = class_lookup(
       
   213 			(PyClassObject *)
       
   214 			PyTuple_GetItem(cp->cl_bases, i), name, pclass);
       
   215 		if (v != NULL)
       
   216 			return v;
       
   217 	}
       
   218 	return NULL;
       
   219 }
       
   220 
       
   221 static PyObject *
       
   222 class_getattr(register PyClassObject *op, PyObject *name)
       
   223 {
       
   224 	register PyObject *v;
       
   225 	register char *sname = PyString_AsString(name);
       
   226 	PyClassObject *klass;
       
   227 	descrgetfunc f;
       
   228 
       
   229 	if (sname[0] == '_' && sname[1] == '_') {
       
   230 		if (strcmp(sname, "__dict__") == 0) {
       
   231 			if (PyEval_GetRestricted()) {
       
   232 				PyErr_SetString(PyExc_RuntimeError,
       
   233 			   "class.__dict__ not accessible in restricted mode");
       
   234 				return NULL;
       
   235 			}
       
   236 			Py_INCREF(op->cl_dict);
       
   237 			return op->cl_dict;
       
   238 		}
       
   239 		if (strcmp(sname, "__bases__") == 0) {
       
   240 			Py_INCREF(op->cl_bases);
       
   241 			return op->cl_bases;
       
   242 		}
       
   243 		if (strcmp(sname, "__name__") == 0) {
       
   244 			if (op->cl_name == NULL)
       
   245 				v = Py_None;
       
   246 			else
       
   247 				v = op->cl_name;
       
   248 			Py_INCREF(v);
       
   249 			return v;
       
   250 		}
       
   251 	}
       
   252 	v = class_lookup(op, name, &klass);
       
   253 	if (v == NULL) {
       
   254 		PyErr_Format(PyExc_AttributeError,
       
   255 			     "class %.50s has no attribute '%.400s'",
       
   256 			     PyString_AS_STRING(op->cl_name), sname);
       
   257 		return NULL;
       
   258 	}
       
   259 	f = TP_DESCR_GET(v->ob_type);
       
   260 	if (f == NULL)
       
   261 		Py_INCREF(v);
       
   262 	else
       
   263 		v = f(v, (PyObject *)NULL, (PyObject *)op);
       
   264 	return v;
       
   265 }
       
   266 
       
   267 static void
       
   268 set_slot(PyObject **slot, PyObject *v)
       
   269 {
       
   270 	PyObject *temp = *slot;
       
   271 	Py_XINCREF(v);
       
   272 	*slot = v;
       
   273 	Py_XDECREF(temp);
       
   274 }
       
   275 
       
   276 static void
       
   277 set_attr_slots(PyClassObject *c)
       
   278 {
       
   279 	PyClassObject *dummy;
       
   280 
       
   281 	set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
       
   282 	set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
       
   283 	set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
       
   284 }
       
   285 
       
   286 static char *
       
   287 set_dict(PyClassObject *c, PyObject *v)
       
   288 {
       
   289 	if (v == NULL || !PyDict_Check(v))
       
   290 		return "__dict__ must be a dictionary object";
       
   291 	set_slot(&c->cl_dict, v);
       
   292 	set_attr_slots(c);
       
   293 	return "";
       
   294 }
       
   295 
       
   296 static char *
       
   297 set_bases(PyClassObject *c, PyObject *v)
       
   298 {
       
   299 	Py_ssize_t i, n;
       
   300 
       
   301 	if (v == NULL || !PyTuple_Check(v))
       
   302 		return "__bases__ must be a tuple object";
       
   303 	n = PyTuple_Size(v);
       
   304 	for (i = 0; i < n; i++) {
       
   305 		PyObject *x = PyTuple_GET_ITEM(v, i);
       
   306 		if (!PyClass_Check(x))
       
   307 			return "__bases__ items must be classes";
       
   308 		if (PyClass_IsSubclass(x, (PyObject *)c))
       
   309 			return "a __bases__ item causes an inheritance cycle";
       
   310 	}
       
   311 	set_slot(&c->cl_bases, v);
       
   312 	set_attr_slots(c);
       
   313 	return "";
       
   314 }
       
   315 
       
   316 static char *
       
   317 set_name(PyClassObject *c, PyObject *v)
       
   318 {
       
   319 	if (v == NULL || !PyString_Check(v))
       
   320 		return "__name__ must be a string object";
       
   321 	if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
       
   322 		return "__name__ must not contain null bytes";
       
   323 	set_slot(&c->cl_name, v);
       
   324 	return "";
       
   325 }
       
   326 
       
   327 static int
       
   328 class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
       
   329 {
       
   330 	char *sname;
       
   331 	if (PyEval_GetRestricted()) {
       
   332 		PyErr_SetString(PyExc_RuntimeError,
       
   333 			   "classes are read-only in restricted mode");
       
   334 		return -1;
       
   335 	}
       
   336 	sname = PyString_AsString(name);
       
   337 	if (sname[0] == '_' && sname[1] == '_') {
       
   338 		Py_ssize_t n = PyString_Size(name);
       
   339 		if (sname[n-1] == '_' && sname[n-2] == '_') {
       
   340 			char *err = NULL;
       
   341 			if (strcmp(sname, "__dict__") == 0)
       
   342 				err = set_dict(op, v);
       
   343 			else if (strcmp(sname, "__bases__") == 0)
       
   344 				err = set_bases(op, v);
       
   345 			else if (strcmp(sname, "__name__") == 0)
       
   346 				err = set_name(op, v);
       
   347 			else if (strcmp(sname, "__getattr__") == 0)
       
   348 				set_slot(&op->cl_getattr, v);
       
   349 			else if (strcmp(sname, "__setattr__") == 0)
       
   350 				set_slot(&op->cl_setattr, v);
       
   351 			else if (strcmp(sname, "__delattr__") == 0)
       
   352 				set_slot(&op->cl_delattr, v);
       
   353 			/* For the last three, we fall through to update the
       
   354 			   dictionary as well. */
       
   355 			if (err != NULL) {
       
   356 				if (*err == '\0')
       
   357 					return 0;
       
   358 				PyErr_SetString(PyExc_TypeError, err);
       
   359 				return -1;
       
   360 			}
       
   361 		}
       
   362 	}
       
   363 	if (v == NULL) {
       
   364 		int rv = PyDict_DelItem(op->cl_dict, name);
       
   365 		if (rv < 0)
       
   366 			PyErr_Format(PyExc_AttributeError,
       
   367 				     "class %.50s has no attribute '%.400s'",
       
   368 				     PyString_AS_STRING(op->cl_name), sname);
       
   369 		return rv;
       
   370 	}
       
   371 	else
       
   372 		return PyDict_SetItem(op->cl_dict, name, v);
       
   373 }
       
   374 
       
   375 static PyObject *
       
   376 class_repr(PyClassObject *op)
       
   377 {
       
   378 	PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
       
   379 	char *name;
       
   380 	if (op->cl_name == NULL || !PyString_Check(op->cl_name))
       
   381 		name = "?";
       
   382 	else
       
   383 		name = PyString_AsString(op->cl_name);
       
   384 	if (mod == NULL || !PyString_Check(mod))
       
   385 		return PyString_FromFormat("<class ?.%s at %p>", name, op);
       
   386 	else
       
   387 		return PyString_FromFormat("<class %s.%s at %p>",
       
   388 					   PyString_AsString(mod),
       
   389 					   name, op);
       
   390 }
       
   391 
       
   392 static PyObject *
       
   393 class_str(PyClassObject *op)
       
   394 {
       
   395 	PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
       
   396 	PyObject *name = op->cl_name;
       
   397 	PyObject *res;
       
   398 	Py_ssize_t m, n;
       
   399 
       
   400 	if (name == NULL || !PyString_Check(name))
       
   401 		return class_repr(op);
       
   402 	if (mod == NULL || !PyString_Check(mod)) {
       
   403 		Py_INCREF(name);
       
   404 		return name;
       
   405 	}
       
   406 	m = PyString_GET_SIZE(mod);
       
   407 	n = PyString_GET_SIZE(name);
       
   408 	res = PyString_FromStringAndSize((char *)NULL, m+1+n);
       
   409 	if (res != NULL) {
       
   410 		char *s = PyString_AS_STRING(res);
       
   411 		memcpy(s, PyString_AS_STRING(mod), m);
       
   412 		s += m;
       
   413 		*s++ = '.';
       
   414 		memcpy(s, PyString_AS_STRING(name), n);
       
   415 	}
       
   416 	return res;
       
   417 }
       
   418 
       
   419 static int
       
   420 class_traverse(PyClassObject *o, visitproc visit, void *arg)
       
   421 {
       
   422 	Py_VISIT(o->cl_bases);
       
   423 	Py_VISIT(o->cl_dict);
       
   424 	Py_VISIT(o->cl_name);
       
   425 	Py_VISIT(o->cl_getattr);
       
   426 	Py_VISIT(o->cl_setattr);
       
   427 	Py_VISIT(o->cl_delattr);
       
   428 	return 0;
       
   429 }
       
   430 
       
   431 PyTypeObject PyClass_Type = {
       
   432 	PyObject_HEAD_INIT(&PyType_Type)
       
   433 	0,
       
   434 	"classobj",
       
   435 	sizeof(PyClassObject),
       
   436 	0,
       
   437 	(destructor)class_dealloc,		/* tp_dealloc */
       
   438 	0,					/* tp_print */
       
   439 	0,					/* tp_getattr */
       
   440 	0,					/* tp_setattr */
       
   441 	0,					/* tp_compare */
       
   442 	(reprfunc)class_repr,			/* tp_repr */
       
   443 	0,					/* tp_as_number */
       
   444 	0,					/* tp_as_sequence */
       
   445 	0,					/* tp_as_mapping */
       
   446 	0,					/* tp_hash */
       
   447 	PyInstance_New,				/* tp_call */
       
   448 	(reprfunc)class_str,			/* tp_str */
       
   449 	(getattrofunc)class_getattr,		/* tp_getattro */
       
   450 	(setattrofunc)class_setattr,		/* tp_setattro */
       
   451 	0,					/* tp_as_buffer */
       
   452 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
       
   453 	class_doc,				/* tp_doc */
       
   454 	(traverseproc)class_traverse,		/* tp_traverse */
       
   455  	0,					/* tp_clear */
       
   456 	0,					/* tp_richcompare */
       
   457 	0,					/* tp_weaklistoffset */
       
   458 	0,					/* tp_iter */
       
   459 	0,					/* tp_iternext */
       
   460 	0,					/* tp_methods */
       
   461 	0,					/* tp_members */
       
   462 	0,					/* tp_getset */
       
   463 	0,					/* tp_base */
       
   464 	0,					/* tp_dict */
       
   465 	0,					/* tp_descr_get */
       
   466 	0,					/* tp_descr_set */
       
   467 	0,					/* tp_dictoffset */
       
   468 	0,					/* tp_init */
       
   469 	0,					/* tp_alloc */
       
   470 	class_new,				/* tp_new */
       
   471 };
       
   472 
       
   473 int
       
   474 PyClass_IsSubclass(PyObject *klass, PyObject *base)
       
   475 {
       
   476 	Py_ssize_t i, n;
       
   477 	PyClassObject *cp;
       
   478 	if (klass == base)
       
   479 		return 1;
       
   480 	if (PyTuple_Check(base)) {
       
   481 		n = PyTuple_GET_SIZE(base);
       
   482 		for (i = 0; i < n; i++) {
       
   483 			if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
       
   484 				return 1;
       
   485 		}
       
   486 		return 0;
       
   487 	}
       
   488 	if (klass == NULL || !PyClass_Check(klass))
       
   489 		return 0;
       
   490 	cp = (PyClassObject *)klass;
       
   491 	n = PyTuple_Size(cp->cl_bases);
       
   492 	for (i = 0; i < n; i++) {
       
   493 		if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
       
   494 			return 1;
       
   495 	}
       
   496 	return 0;
       
   497 }
       
   498 
       
   499 
       
   500 /* Instance objects */
       
   501 
       
   502 PyObject *
       
   503 PyInstance_NewRaw(PyObject *klass, PyObject *dict)
       
   504 {
       
   505 	PyInstanceObject *inst;
       
   506 
       
   507 	if (!PyClass_Check(klass)) {
       
   508 		PyErr_BadInternalCall();
       
   509 		return NULL;
       
   510 	}
       
   511 	if (dict == NULL) {
       
   512 		dict = PyDict_New();
       
   513 		if (dict == NULL)
       
   514 			return NULL;
       
   515 	}
       
   516 	else {
       
   517 		if (!PyDict_Check(dict)) {
       
   518 			PyErr_BadInternalCall();
       
   519 			return NULL;
       
   520 		}
       
   521 		Py_INCREF(dict);
       
   522 	}
       
   523 	inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
       
   524 	if (inst == NULL) {
       
   525 		Py_DECREF(dict);
       
   526 		return NULL;
       
   527 	}
       
   528 	inst->in_weakreflist = NULL;
       
   529 	Py_INCREF(klass);
       
   530 	inst->in_class = (PyClassObject *)klass;
       
   531 	inst->in_dict = dict;
       
   532 	_PyObject_GC_TRACK(inst);
       
   533 	return (PyObject *)inst;
       
   534 }
       
   535 
       
   536 PyObject *
       
   537 PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
       
   538 {
       
   539 	register PyInstanceObject *inst;
       
   540 	PyObject *init;
       
   541 	static PyObject *initstr;
       
   542 
       
   543 	if (initstr == NULL) {
       
   544 		initstr = PyString_InternFromString("__init__");
       
   545 		if (initstr == NULL)
       
   546 			return NULL;
       
   547 	}
       
   548 	inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
       
   549 	if (inst == NULL)
       
   550 		return NULL;
       
   551 	init = instance_getattr2(inst, initstr);
       
   552 	if (init == NULL) {
       
   553 		if (PyErr_Occurred()) {
       
   554 			Py_DECREF(inst);
       
   555 			return NULL;
       
   556 		}
       
   557 		if ((arg != NULL && (!PyTuple_Check(arg) ||
       
   558 				     PyTuple_Size(arg) != 0))
       
   559 		    || (kw != NULL && (!PyDict_Check(kw) ||
       
   560 				      PyDict_Size(kw) != 0))) {
       
   561 			PyErr_SetString(PyExc_TypeError,
       
   562 				   "this constructor takes no arguments");
       
   563 			Py_DECREF(inst);
       
   564 			inst = NULL;
       
   565 		}
       
   566 	}
       
   567 	else {
       
   568 		PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
       
   569 		Py_DECREF(init);
       
   570 		if (res == NULL) {
       
   571 			Py_DECREF(inst);
       
   572 			inst = NULL;
       
   573 		}
       
   574 		else {
       
   575 			if (res != Py_None) {
       
   576 				PyErr_SetString(PyExc_TypeError,
       
   577 					   "__init__() should return None");
       
   578 				Py_DECREF(inst);
       
   579 				inst = NULL;
       
   580 			}
       
   581 			Py_DECREF(res);
       
   582 		}
       
   583 	}
       
   584 	return (PyObject *)inst;
       
   585 }
       
   586 
       
   587 /* Instance methods */
       
   588 
       
   589 PyDoc_STRVAR(instance_doc,
       
   590 "instance(class[, dict])\n\
       
   591 \n\
       
   592 Create an instance without calling its __init__() method.\n\
       
   593 The class must be a classic class.\n\
       
   594 If present, dict must be a dictionary or None.");
       
   595 
       
   596 static PyObject *
       
   597 instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
       
   598 {
       
   599 	PyObject *klass;
       
   600 	PyObject *dict = Py_None;
       
   601 
       
   602 	if (!PyArg_ParseTuple(args, "O!|O:instance",
       
   603 			      &PyClass_Type, &klass, &dict))
       
   604 		return NULL;
       
   605 
       
   606 	if (dict == Py_None)
       
   607 		dict = NULL;
       
   608 	else if (!PyDict_Check(dict)) {
       
   609 		PyErr_SetString(PyExc_TypeError,
       
   610 		      "instance() second arg must be dictionary or None");
       
   611 		return NULL;
       
   612 	}
       
   613 	return PyInstance_NewRaw(klass, dict);
       
   614 }
       
   615 
       
   616 
       
   617 static void
       
   618 instance_dealloc(register PyInstanceObject *inst)
       
   619 {
       
   620 	PyObject *error_type, *error_value, *error_traceback;
       
   621 	PyObject *del;
       
   622 	static PyObject *delstr;
       
   623 
       
   624 	_PyObject_GC_UNTRACK(inst);
       
   625 	if (inst->in_weakreflist != NULL)
       
   626 		PyObject_ClearWeakRefs((PyObject *) inst);
       
   627 
       
   628 	/* Temporarily resurrect the object. */
       
   629 	assert(inst->ob_type == &PyInstance_Type);
       
   630 	assert(inst->ob_refcnt == 0);
       
   631 	inst->ob_refcnt = 1;
       
   632 
       
   633 	/* Save the current exception, if any. */
       
   634 	PyErr_Fetch(&error_type, &error_value, &error_traceback);
       
   635 	/* Execute __del__ method, if any. */
       
   636 	if (delstr == NULL) {
       
   637 		delstr = PyString_InternFromString("__del__");
       
   638 		if (delstr == NULL)
       
   639 			PyErr_WriteUnraisable((PyObject*)inst);
       
   640 	}
       
   641 	if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
       
   642 		PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
       
   643 		if (res == NULL)
       
   644 			PyErr_WriteUnraisable(del);
       
   645 		else
       
   646 			Py_DECREF(res);
       
   647 		Py_DECREF(del);
       
   648 	}
       
   649 	/* Restore the saved exception. */
       
   650 	PyErr_Restore(error_type, error_value, error_traceback);
       
   651 
       
   652 	/* Undo the temporary resurrection; can't use DECREF here, it would
       
   653 	 * cause a recursive call.
       
   654 	 */
       
   655 	assert(inst->ob_refcnt > 0);
       
   656 	if (--inst->ob_refcnt == 0) {
       
   657 
       
   658 		/* New weakrefs could be created during the finalizer call.
       
   659 		    If this occurs, clear them out without calling their
       
   660 		    finalizers since they might rely on part of the object
       
   661 		    being finalized that has already been destroyed. */
       
   662 		while (inst->in_weakreflist != NULL) {
       
   663 			_PyWeakref_ClearRef((PyWeakReference *)
       
   664                                             (inst->in_weakreflist));
       
   665 		}
       
   666 
       
   667 		Py_DECREF(inst->in_class);
       
   668 		Py_XDECREF(inst->in_dict);
       
   669 		PyObject_GC_Del(inst);
       
   670 	}
       
   671 	else {
       
   672 		Py_ssize_t refcnt = inst->ob_refcnt;
       
   673 		/* __del__ resurrected it!  Make it look like the original
       
   674 		 * Py_DECREF never happened.
       
   675 		 */
       
   676 		_Py_NewReference((PyObject *)inst);
       
   677 		inst->ob_refcnt = refcnt;
       
   678 		_PyObject_GC_TRACK(inst);
       
   679 		/* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
       
   680 		 * we need to undo that. */
       
   681 		_Py_DEC_REFTOTAL;
       
   682 		/* If Py_TRACE_REFS, _Py_NewReference re-added self to the
       
   683 		 * object chain, so no more to do there.
       
   684 		 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
       
   685 		 * _Py_NewReference bumped tp_allocs: both of those need to be
       
   686 		 * undone.
       
   687 		 */
       
   688 #ifdef COUNT_ALLOCS
       
   689 		--inst->ob_type->tp_frees;
       
   690 		--inst->ob_type->tp_allocs;
       
   691 #endif
       
   692 	}
       
   693 }
       
   694 
       
   695 static PyObject *
       
   696 instance_getattr1(register PyInstanceObject *inst, PyObject *name)
       
   697 {
       
   698 	register PyObject *v;
       
   699 	register char *sname = PyString_AsString(name);
       
   700 	if (sname[0] == '_' && sname[1] == '_') {
       
   701 		if (strcmp(sname, "__dict__") == 0) {
       
   702 			if (PyEval_GetRestricted()) {
       
   703 				PyErr_SetString(PyExc_RuntimeError,
       
   704 			"instance.__dict__ not accessible in restricted mode");
       
   705 				return NULL;
       
   706 			}
       
   707 			Py_INCREF(inst->in_dict);
       
   708 			return inst->in_dict;
       
   709 		}
       
   710 		if (strcmp(sname, "__class__") == 0) {
       
   711 			Py_INCREF(inst->in_class);
       
   712 			return (PyObject *)inst->in_class;
       
   713 		}
       
   714 	}
       
   715 	v = instance_getattr2(inst, name);
       
   716 	if (v == NULL && !PyErr_Occurred()) {
       
   717 		PyErr_Format(PyExc_AttributeError,
       
   718 			     "%.50s instance has no attribute '%.400s'",
       
   719 			     PyString_AS_STRING(inst->in_class->cl_name), sname);
       
   720 	}
       
   721 	return v;
       
   722 }
       
   723 
       
   724 static PyObject *
       
   725 instance_getattr2(register PyInstanceObject *inst, PyObject *name)
       
   726 {
       
   727 	register PyObject *v;
       
   728 	PyClassObject *klass;
       
   729 	descrgetfunc f;
       
   730 
       
   731 	v = PyDict_GetItem(inst->in_dict, name);
       
   732 	if (v != NULL) {
       
   733 		Py_INCREF(v);
       
   734 		return v;
       
   735 	}
       
   736 	v = class_lookup(inst->in_class, name, &klass);
       
   737 	if (v != NULL) {
       
   738 		Py_INCREF(v);
       
   739 		f = TP_DESCR_GET(v->ob_type);
       
   740 		if (f != NULL) {
       
   741 			PyObject *w = f(v, (PyObject *)inst,
       
   742 					(PyObject *)(inst->in_class));
       
   743 			Py_DECREF(v);
       
   744 			v = w;
       
   745 		}
       
   746 	}
       
   747 	return v;
       
   748 }
       
   749 
       
   750 static PyObject *
       
   751 instance_getattr(register PyInstanceObject *inst, PyObject *name)
       
   752 {
       
   753 	register PyObject *func, *res;
       
   754 	res = instance_getattr1(inst, name);
       
   755 	if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
       
   756 		PyObject *args;
       
   757 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
   758 			return NULL;
       
   759 		PyErr_Clear();
       
   760 		args = PyTuple_Pack(2, inst, name);
       
   761 		if (args == NULL)
       
   762 			return NULL;
       
   763 		res = PyEval_CallObject(func, args);
       
   764 		Py_DECREF(args);
       
   765 	}
       
   766 	return res;
       
   767 }
       
   768 
       
   769 /* See classobject.h comments:  this only does dict lookups, and is always
       
   770  * safe to call.
       
   771  */
       
   772 PyObject *
       
   773 _PyInstance_Lookup(PyObject *pinst, PyObject *name)
       
   774 {
       
   775 	PyObject *v;
       
   776 	PyClassObject *klass;
       
   777 	PyInstanceObject *inst;	/* pinst cast to the right type */
       
   778 
       
   779 	assert(PyInstance_Check(pinst));
       
   780 	inst = (PyInstanceObject *)pinst;
       
   781 
       
   782 	assert(PyString_Check(name));
       
   783 
       
   784  	v = PyDict_GetItem(inst->in_dict, name);
       
   785 	if (v == NULL)
       
   786 		v = class_lookup(inst->in_class, name, &klass);
       
   787 	return v;
       
   788 }
       
   789 
       
   790 static int
       
   791 instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
       
   792 {
       
   793 	if (v == NULL) {
       
   794 		int rv = PyDict_DelItem(inst->in_dict, name);
       
   795 		if (rv < 0)
       
   796 			PyErr_Format(PyExc_AttributeError,
       
   797 				     "%.50s instance has no attribute '%.400s'",
       
   798 				     PyString_AS_STRING(inst->in_class->cl_name),
       
   799 				     PyString_AS_STRING(name));
       
   800 		return rv;
       
   801 	}
       
   802 	else
       
   803 		return PyDict_SetItem(inst->in_dict, name, v);
       
   804 }
       
   805 
       
   806 static int
       
   807 instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
       
   808 {
       
   809 	PyObject *func, *args, *res, *tmp;
       
   810 	char *sname = PyString_AsString(name);
       
   811 	if (sname[0] == '_' && sname[1] == '_') {
       
   812 		Py_ssize_t n = PyString_Size(name);
       
   813 		if (sname[n-1] == '_' && sname[n-2] == '_') {
       
   814 			if (strcmp(sname, "__dict__") == 0) {
       
   815 				if (PyEval_GetRestricted()) {
       
   816 					PyErr_SetString(PyExc_RuntimeError,
       
   817 				 "__dict__ not accessible in restricted mode");
       
   818 					return -1;
       
   819 				}
       
   820 				if (v == NULL || !PyDict_Check(v)) {
       
   821 				    PyErr_SetString(PyExc_TypeError,
       
   822 				       "__dict__ must be set to a dictionary");
       
   823 				    return -1;
       
   824 				}
       
   825 				tmp = inst->in_dict;
       
   826 				Py_INCREF(v);
       
   827 				inst->in_dict = v;
       
   828 				Py_DECREF(tmp);
       
   829 				return 0;
       
   830 			}
       
   831 			if (strcmp(sname, "__class__") == 0) {
       
   832 				if (PyEval_GetRestricted()) {
       
   833 					PyErr_SetString(PyExc_RuntimeError,
       
   834 				"__class__ not accessible in restricted mode");
       
   835 					return -1;
       
   836 				}
       
   837 				if (v == NULL || !PyClass_Check(v)) {
       
   838 					PyErr_SetString(PyExc_TypeError,
       
   839 					   "__class__ must be set to a class");
       
   840 					return -1;
       
   841 				}
       
   842 				tmp = (PyObject *)(inst->in_class);
       
   843 				Py_INCREF(v);
       
   844 				inst->in_class = (PyClassObject *)v;
       
   845 				Py_DECREF(tmp);
       
   846 				return 0;
       
   847 			}
       
   848 		}
       
   849 	}
       
   850 	if (v == NULL)
       
   851 		func = inst->in_class->cl_delattr;
       
   852 	else
       
   853 		func = inst->in_class->cl_setattr;
       
   854 	if (func == NULL)
       
   855 		return instance_setattr1(inst, name, v);
       
   856 	if (v == NULL)
       
   857 		args = PyTuple_Pack(2, inst, name);
       
   858 	else
       
   859 		args = PyTuple_Pack(3, inst, name, v);
       
   860 	if (args == NULL)
       
   861 		return -1;
       
   862 	res = PyEval_CallObject(func, args);
       
   863 	Py_DECREF(args);
       
   864 	if (res == NULL)
       
   865 		return -1;
       
   866 	Py_DECREF(res);
       
   867 	return 0;
       
   868 }
       
   869 
       
   870 static PyObject *
       
   871 instance_repr(PyInstanceObject *inst)
       
   872 {
       
   873 	PyObject *func;
       
   874 	PyObject *res;
       
   875 	static PyObject *reprstr;
       
   876 
       
   877 	if (reprstr == NULL) {
       
   878 		reprstr = PyString_InternFromString("__repr__");
       
   879 		if (reprstr == NULL)
       
   880 			return NULL;
       
   881 	}
       
   882 	func = instance_getattr(inst, reprstr);
       
   883 	if (func == NULL) {
       
   884 		PyObject *classname, *mod;
       
   885 		char *cname;
       
   886 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
   887 			return NULL;
       
   888 		PyErr_Clear();
       
   889 		classname = inst->in_class->cl_name;
       
   890 		mod = PyDict_GetItemString(inst->in_class->cl_dict,
       
   891 					   "__module__");
       
   892 		if (classname != NULL && PyString_Check(classname))
       
   893 			cname = PyString_AsString(classname);
       
   894 		else
       
   895 			cname = "?";
       
   896 		if (mod == NULL || !PyString_Check(mod))
       
   897 			return PyString_FromFormat("<?.%s instance at %p>",
       
   898 						   cname, inst);
       
   899 		else
       
   900 			return PyString_FromFormat("<%s.%s instance at %p>",
       
   901 						   PyString_AsString(mod),
       
   902 						   cname, inst);
       
   903 	}
       
   904 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
   905 	Py_DECREF(func);
       
   906 	return res;
       
   907 }
       
   908 
       
   909 static PyObject *
       
   910 instance_str(PyInstanceObject *inst)
       
   911 {
       
   912 	PyObject *func;
       
   913 	PyObject *res;
       
   914 	static PyObject *strstr;
       
   915 
       
   916 	if (strstr == NULL) {
       
   917 		strstr = PyString_InternFromString("__str__");
       
   918 		if (strstr == NULL)
       
   919 			return NULL;
       
   920 	}
       
   921 	func = instance_getattr(inst, strstr);
       
   922 	if (func == NULL) {
       
   923 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
   924 			return NULL;
       
   925 		PyErr_Clear();
       
   926 		return instance_repr(inst);
       
   927 	}
       
   928 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
   929 	Py_DECREF(func);
       
   930 	return res;
       
   931 }
       
   932 
       
   933 static long
       
   934 instance_hash(PyInstanceObject *inst)
       
   935 {
       
   936 	PyObject *func;
       
   937 	PyObject *res;
       
   938 	long outcome;
       
   939 	static PyObject *hashstr, *eqstr, *cmpstr;
       
   940 
       
   941 	if (hashstr == NULL) {
       
   942 		hashstr = PyString_InternFromString("__hash__");
       
   943 		if (hashstr == NULL)
       
   944 			return -1;
       
   945 	}
       
   946 	func = instance_getattr(inst, hashstr);
       
   947 	if (func == NULL) {
       
   948 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
   949 			return -1;
       
   950 		PyErr_Clear();
       
   951 		/* If there is no __eq__ and no __cmp__ method, we hash on the
       
   952 		   address.  If an __eq__ or __cmp__ method exists, there must
       
   953 		   be a __hash__. */
       
   954 		if (eqstr == NULL) {
       
   955 			eqstr = PyString_InternFromString("__eq__");
       
   956 			if (eqstr == NULL)
       
   957 				return -1;
       
   958 		}
       
   959 		func = instance_getattr(inst, eqstr);
       
   960 		if (func == NULL) {
       
   961 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
   962 				return -1;
       
   963 			PyErr_Clear();
       
   964 			if (cmpstr == NULL) {
       
   965 				cmpstr = PyString_InternFromString("__cmp__");
       
   966 				if (cmpstr == NULL)
       
   967 					return -1;
       
   968 			}
       
   969 			func = instance_getattr(inst, cmpstr);
       
   970 			if (func == NULL) {
       
   971 				if (!PyErr_ExceptionMatches(
       
   972 					PyExc_AttributeError))
       
   973 					return -1;
       
   974 				PyErr_Clear();
       
   975 				return _Py_HashPointer(inst);
       
   976 			}
       
   977 		}
       
   978 		Py_XDECREF(func);
       
   979 		PyErr_SetString(PyExc_TypeError, "unhashable instance");
       
   980 		return -1;
       
   981 	}
       
   982 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
   983 	Py_DECREF(func);
       
   984 	if (res == NULL)
       
   985 		return -1;
       
   986 	if (PyInt_Check(res) || PyLong_Check(res))
       
   987 		/* This already converts a -1 result to -2. */
       
   988 		outcome = res->ob_type->tp_hash(res);
       
   989 	else {
       
   990 		PyErr_SetString(PyExc_TypeError,
       
   991 				"__hash__() should return an int");
       
   992 		outcome = -1;
       
   993 	}
       
   994 	Py_DECREF(res);
       
   995 	return outcome;
       
   996 }
       
   997 
       
   998 static int
       
   999 instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
       
  1000 {
       
  1001 	Py_VISIT(o->in_class);
       
  1002 	Py_VISIT(o->in_dict);
       
  1003 	return 0;
       
  1004 }
       
  1005 
       
  1006 static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
       
  1007 static PyObject *iterstr, *nextstr;
       
  1008 
       
  1009 static Py_ssize_t
       
  1010 instance_length(PyInstanceObject *inst)
       
  1011 {
       
  1012 	PyObject *func;
       
  1013 	PyObject *res;
       
  1014 	Py_ssize_t outcome;
       
  1015 
       
  1016 	if (lenstr == NULL) {
       
  1017 		lenstr = PyString_InternFromString("__len__");
       
  1018 		if (lenstr == NULL)
       
  1019 			return -1;
       
  1020 	}
       
  1021 	func = instance_getattr(inst, lenstr);
       
  1022 	if (func == NULL)
       
  1023 		return -1;
       
  1024 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
  1025 	Py_DECREF(func);
       
  1026 	if (res == NULL)
       
  1027 		return -1;
       
  1028 	if (PyInt_Check(res)) {
       
  1029 		outcome = PyInt_AsSsize_t(res);
       
  1030 		if (outcome == -1 && PyErr_Occurred()) {
       
  1031 			Py_DECREF(res);
       
  1032 			return -1;
       
  1033 		}
       
  1034 #if SIZEOF_SIZE_T < SIZEOF_INT
       
  1035 		/* Overflow check -- range of PyInt is more than C int */
       
  1036 		if (outcome != (int)outcome) {
       
  1037 			PyErr_SetString(PyExc_OverflowError,
       
  1038 			 "__len__() should return 0 <= outcome < 2**31");
       
  1039 			outcome = -1;
       
  1040 		}
       
  1041 		else
       
  1042 #endif
       
  1043 		if (outcome < 0) {
       
  1044 			PyErr_SetString(PyExc_ValueError,
       
  1045 					"__len__() should return >= 0");
       
  1046 			outcome = -1;
       
  1047 		}
       
  1048 	}
       
  1049 	else {
       
  1050 		PyErr_SetString(PyExc_TypeError,
       
  1051 				"__len__() should return an int");
       
  1052 		outcome = -1;
       
  1053 	}
       
  1054 	Py_DECREF(res);
       
  1055 	return outcome;
       
  1056 }
       
  1057 
       
  1058 static PyObject *
       
  1059 instance_subscript(PyInstanceObject *inst, PyObject *key)
       
  1060 {
       
  1061 	PyObject *func;
       
  1062 	PyObject *arg;
       
  1063 	PyObject *res;
       
  1064 
       
  1065 	if (getitemstr == NULL) {
       
  1066 		getitemstr = PyString_InternFromString("__getitem__");
       
  1067 		if (getitemstr == NULL)
       
  1068 			return NULL;
       
  1069 	}
       
  1070 	func = instance_getattr(inst, getitemstr);
       
  1071 	if (func == NULL)
       
  1072 		return NULL;
       
  1073 	arg = PyTuple_Pack(1, key);
       
  1074 	if (arg == NULL) {
       
  1075 		Py_DECREF(func);
       
  1076 		return NULL;
       
  1077 	}
       
  1078 	res = PyEval_CallObject(func, arg);
       
  1079 	Py_DECREF(func);
       
  1080 	Py_DECREF(arg);
       
  1081 	return res;
       
  1082 }
       
  1083 
       
  1084 static int
       
  1085 instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
       
  1086 {
       
  1087 	PyObject *func;
       
  1088 	PyObject *arg;
       
  1089 	PyObject *res;
       
  1090 
       
  1091 	if (value == NULL) {
       
  1092 		if (delitemstr == NULL) {
       
  1093 			delitemstr = PyString_InternFromString("__delitem__");
       
  1094 			if (delitemstr == NULL)
       
  1095 				return -1;
       
  1096 		}
       
  1097 		func = instance_getattr(inst, delitemstr);
       
  1098 	}
       
  1099 	else {
       
  1100 		if (setitemstr == NULL) {
       
  1101 			setitemstr = PyString_InternFromString("__setitem__");
       
  1102 			if (setitemstr == NULL)
       
  1103 				return -1;
       
  1104 		}
       
  1105 		func = instance_getattr(inst, setitemstr);
       
  1106 	}
       
  1107 	if (func == NULL)
       
  1108 		return -1;
       
  1109 	if (value == NULL)
       
  1110 		arg = PyTuple_Pack(1, key);
       
  1111 	else
       
  1112 		arg = PyTuple_Pack(2, key, value);
       
  1113 	if (arg == NULL) {
       
  1114 		Py_DECREF(func);
       
  1115 		return -1;
       
  1116 	}
       
  1117 	res = PyEval_CallObject(func, arg);
       
  1118 	Py_DECREF(func);
       
  1119 	Py_DECREF(arg);
       
  1120 	if (res == NULL)
       
  1121 		return -1;
       
  1122 	Py_DECREF(res);
       
  1123 	return 0;
       
  1124 }
       
  1125 
       
  1126 static PyMappingMethods instance_as_mapping = {
       
  1127 	(lenfunc)instance_length,		/* mp_length */
       
  1128 	(binaryfunc)instance_subscript,		/* mp_subscript */
       
  1129 	(objobjargproc)instance_ass_subscript,	/* mp_ass_subscript */
       
  1130 };
       
  1131 
       
  1132 static PyObject *
       
  1133 instance_item(PyInstanceObject *inst, Py_ssize_t i)
       
  1134 {
       
  1135 	PyObject *func, *res;
       
  1136 
       
  1137 	if (getitemstr == NULL) {
       
  1138 		getitemstr = PyString_InternFromString("__getitem__");
       
  1139 		if (getitemstr == NULL)
       
  1140 			return NULL;
       
  1141 	}
       
  1142 	func = instance_getattr(inst, getitemstr);
       
  1143 	if (func == NULL)
       
  1144 		return NULL;
       
  1145 	res = PyObject_CallFunction(func, "n", i);
       
  1146 	Py_DECREF(func);
       
  1147 	return res;
       
  1148 }
       
  1149 
       
  1150 static PyObject *
       
  1151 instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
       
  1152 {
       
  1153 	PyObject *func, *arg, *res;
       
  1154 	static PyObject *getslicestr;
       
  1155 
       
  1156 	if (getslicestr == NULL) {
       
  1157 		getslicestr = PyString_InternFromString("__getslice__");
       
  1158 		if (getslicestr == NULL)
       
  1159 			return NULL;
       
  1160 	}
       
  1161 	func = instance_getattr(inst, getslicestr);
       
  1162 
       
  1163 	if (func == NULL) {
       
  1164 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1165 			return NULL;
       
  1166 		PyErr_Clear();
       
  1167 
       
  1168 		if (getitemstr == NULL) {
       
  1169 			getitemstr = PyString_InternFromString("__getitem__");
       
  1170 			if (getitemstr == NULL)
       
  1171 				return NULL;
       
  1172 		}
       
  1173 		func = instance_getattr(inst, getitemstr);
       
  1174 		if (func == NULL)
       
  1175 			return NULL;
       
  1176 		arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
       
  1177 	}
       
  1178 	else {
       
  1179 		if (PyErr_WarnPy3k("in 3.x, __getslice__ has been removed; "
       
  1180 				   "use __getitem__", 1) < 0) {
       
  1181 			Py_DECREF(func);
       
  1182 			return NULL;
       
  1183 		}
       
  1184 		arg = Py_BuildValue("(nn)", i, j);
       
  1185 	}
       
  1186 
       
  1187 	if (arg == NULL) {
       
  1188 		Py_DECREF(func);
       
  1189 		return NULL;
       
  1190 	}
       
  1191 	res = PyEval_CallObject(func, arg);
       
  1192 	Py_DECREF(func);
       
  1193 	Py_DECREF(arg);
       
  1194 	return res;
       
  1195 }
       
  1196 
       
  1197 static int
       
  1198 instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
       
  1199 {
       
  1200 	PyObject *func, *arg, *res;
       
  1201 
       
  1202 	if (item == NULL) {
       
  1203 		if (delitemstr == NULL) {
       
  1204 			delitemstr = PyString_InternFromString("__delitem__");
       
  1205 			if (delitemstr == NULL)
       
  1206 				return -1;
       
  1207 		}
       
  1208 		func = instance_getattr(inst, delitemstr);
       
  1209 	}
       
  1210 	else {
       
  1211 		if (setitemstr == NULL) {
       
  1212 			setitemstr = PyString_InternFromString("__setitem__");
       
  1213 			if (setitemstr == NULL)
       
  1214 				return -1;
       
  1215 		}
       
  1216 		func = instance_getattr(inst, setitemstr);
       
  1217 	}
       
  1218 	if (func == NULL)
       
  1219 		return -1;
       
  1220 	if (item == NULL)
       
  1221 		arg = PyInt_FromSsize_t(i);
       
  1222 	else
       
  1223 		arg = Py_BuildValue("(nO)", i, item);
       
  1224 	if (arg == NULL) {
       
  1225 		Py_DECREF(func);
       
  1226 		return -1;
       
  1227 	}
       
  1228 	res = PyEval_CallObject(func, arg);
       
  1229 	Py_DECREF(func);
       
  1230 	Py_DECREF(arg);
       
  1231 	if (res == NULL)
       
  1232 		return -1;
       
  1233 	Py_DECREF(res);
       
  1234 	return 0;
       
  1235 }
       
  1236 
       
  1237 static int
       
  1238 instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
       
  1239 {
       
  1240 	PyObject *func, *arg, *res;
       
  1241 	static PyObject *setslicestr, *delslicestr;
       
  1242 
       
  1243 	if (value == NULL) {
       
  1244 		if (delslicestr == NULL) {
       
  1245 			delslicestr =
       
  1246 				PyString_InternFromString("__delslice__");
       
  1247 			if (delslicestr == NULL)
       
  1248 				return -1;
       
  1249 		}
       
  1250 		func = instance_getattr(inst, delslicestr);
       
  1251 		if (func == NULL) {
       
  1252 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1253 				return -1;
       
  1254 			PyErr_Clear();
       
  1255 			if (delitemstr == NULL) {
       
  1256 				delitemstr =
       
  1257 				    PyString_InternFromString("__delitem__");
       
  1258 				if (delitemstr == NULL)
       
  1259 					return -1;
       
  1260 			}
       
  1261 			func = instance_getattr(inst, delitemstr);
       
  1262 			if (func == NULL)
       
  1263 				return -1;
       
  1264 
       
  1265 			arg = Py_BuildValue("(N)",
       
  1266 					    _PySlice_FromIndices(i, j));
       
  1267 		}
       
  1268 		else {
       
  1269 			if (PyErr_WarnPy3k("in 3.x, __delslice__ has been "
       
  1270 				            "removed; use __delitem__", 1) < 0) {
       
  1271 				Py_DECREF(func);
       
  1272 				return -1;
       
  1273 			}
       
  1274 			arg = Py_BuildValue("(nn)", i, j);
       
  1275 		}
       
  1276 	}
       
  1277 	else {
       
  1278 		if (setslicestr == NULL) {
       
  1279 			setslicestr =
       
  1280 				PyString_InternFromString("__setslice__");
       
  1281 			if (setslicestr == NULL)
       
  1282 				return -1;
       
  1283 		}
       
  1284 		func = instance_getattr(inst, setslicestr);
       
  1285 		if (func == NULL) {
       
  1286 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1287 				return -1;
       
  1288 			PyErr_Clear();
       
  1289 			if (setitemstr == NULL) {
       
  1290 				setitemstr =
       
  1291 				    PyString_InternFromString("__setitem__");
       
  1292 				if (setitemstr == NULL)
       
  1293 					return -1;
       
  1294 			}
       
  1295 			func = instance_getattr(inst, setitemstr);
       
  1296 			if (func == NULL)
       
  1297 				return -1;
       
  1298 
       
  1299 			arg = Py_BuildValue("(NO)",
       
  1300 					    _PySlice_FromIndices(i, j), value);
       
  1301 		}
       
  1302 		else {
       
  1303 			if (PyErr_WarnPy3k("in 3.x, __setslice__ has been "
       
  1304 					   "removed; use __setitem__", 1) < 0) {
       
  1305 				Py_DECREF(func);
       
  1306 				return -1;
       
  1307 			}
       
  1308 			arg = Py_BuildValue("(nnO)", i, j, value);
       
  1309 		}
       
  1310 	}
       
  1311 	if (arg == NULL) {
       
  1312 		Py_DECREF(func);
       
  1313 		return -1;
       
  1314 	}
       
  1315 	res = PyEval_CallObject(func, arg);
       
  1316 	Py_DECREF(func);
       
  1317 	Py_DECREF(arg);
       
  1318 	if (res == NULL)
       
  1319 		return -1;
       
  1320 	Py_DECREF(res);
       
  1321 	return 0;
       
  1322 }
       
  1323 
       
  1324 static int
       
  1325 instance_contains(PyInstanceObject *inst, PyObject *member)
       
  1326 {
       
  1327 	static PyObject *__contains__;
       
  1328 	PyObject *func;
       
  1329 
       
  1330 	/* Try __contains__ first.
       
  1331 	 * If that can't be done, try iterator-based searching.
       
  1332 	 */
       
  1333 
       
  1334 	if(__contains__ == NULL) {
       
  1335 		__contains__ = PyString_InternFromString("__contains__");
       
  1336 		if(__contains__ == NULL)
       
  1337 			return -1;
       
  1338 	}
       
  1339 	func = instance_getattr(inst, __contains__);
       
  1340 	if (func) {
       
  1341 		PyObject *res;
       
  1342 		int ret;
       
  1343 		PyObject *arg = PyTuple_Pack(1, member);
       
  1344 		if(arg == NULL) {
       
  1345 			Py_DECREF(func);
       
  1346 			return -1;
       
  1347 		}
       
  1348 		res = PyEval_CallObject(func, arg);
       
  1349 		Py_DECREF(func);
       
  1350 		Py_DECREF(arg);
       
  1351 		if(res == NULL)
       
  1352 			return -1;
       
  1353 		ret = PyObject_IsTrue(res);
       
  1354 		Py_DECREF(res);
       
  1355 		return ret;
       
  1356 	}
       
  1357 
       
  1358 	/* Couldn't find __contains__. */
       
  1359 	if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
       
  1360 		Py_ssize_t rc;
       
  1361 		/* Assume the failure was simply due to that there is no
       
  1362 		 * __contains__ attribute, and try iterating instead.
       
  1363 		 */
       
  1364 		PyErr_Clear();
       
  1365 		rc = _PySequence_IterSearch((PyObject *)inst, member,
       
  1366 					    PY_ITERSEARCH_CONTAINS);
       
  1367 		if (rc >= 0)
       
  1368 			return rc > 0;
       
  1369 	}
       
  1370 	return -1;
       
  1371 }
       
  1372 
       
  1373 static PySequenceMethods
       
  1374 instance_as_sequence = {
       
  1375 	(lenfunc)instance_length,		/* sq_length */
       
  1376 	0,					/* sq_concat */
       
  1377 	0,					/* sq_repeat */
       
  1378 	(ssizeargfunc)instance_item,		/* sq_item */
       
  1379 	(ssizessizeargfunc)instance_slice,	/* sq_slice */
       
  1380 	(ssizeobjargproc)instance_ass_item,	/* sq_ass_item */
       
  1381 	(ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
       
  1382 	(objobjproc)instance_contains,		/* sq_contains */
       
  1383 };
       
  1384 
       
  1385 static PyObject *
       
  1386 generic_unary_op(PyInstanceObject *self, PyObject *methodname)
       
  1387 {
       
  1388 	PyObject *func, *res;
       
  1389 
       
  1390 	if ((func = instance_getattr(self, methodname)) == NULL)
       
  1391 		return NULL;
       
  1392 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
  1393 	Py_DECREF(func);
       
  1394 	return res;
       
  1395 }
       
  1396 
       
  1397 static PyObject *
       
  1398 generic_binary_op(PyObject *v, PyObject *w, char *opname)
       
  1399 {
       
  1400 	PyObject *result;
       
  1401 	PyObject *args;
       
  1402 	PyObject *func = PyObject_GetAttrString(v, opname);
       
  1403 	if (func == NULL) {
       
  1404 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1405 			return NULL;
       
  1406 		PyErr_Clear();
       
  1407 		Py_INCREF(Py_NotImplemented);
       
  1408 		return Py_NotImplemented;
       
  1409 	}
       
  1410 	args = PyTuple_Pack(1, w);
       
  1411 	if (args == NULL) {
       
  1412 		Py_DECREF(func);
       
  1413 		return NULL;
       
  1414 	}
       
  1415 	result = PyEval_CallObject(func, args);
       
  1416 	Py_DECREF(args);
       
  1417 	Py_DECREF(func);
       
  1418 	return result;
       
  1419 }
       
  1420 
       
  1421 
       
  1422 static PyObject *coerce_obj;
       
  1423 
       
  1424 /* Try one half of a binary operator involving a class instance. */
       
  1425 static PyObject *
       
  1426 half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
       
  1427 		int swapped)
       
  1428 {
       
  1429 	PyObject *args;
       
  1430 	PyObject *coercefunc;
       
  1431 	PyObject *coerced = NULL;
       
  1432 	PyObject *v1;
       
  1433 	PyObject *result;
       
  1434 
       
  1435 	if (!PyInstance_Check(v)) {
       
  1436 		Py_INCREF(Py_NotImplemented);
       
  1437 		return Py_NotImplemented;
       
  1438 	}
       
  1439 
       
  1440 	if (coerce_obj == NULL) {
       
  1441 		coerce_obj = PyString_InternFromString("__coerce__");
       
  1442 		if (coerce_obj == NULL)
       
  1443 			return NULL;
       
  1444 	}
       
  1445 	coercefunc = PyObject_GetAttr(v, coerce_obj);
       
  1446 	if (coercefunc == NULL) {
       
  1447 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1448 			return NULL;
       
  1449 		PyErr_Clear();
       
  1450 		return generic_binary_op(v, w, opname);
       
  1451 	}
       
  1452 
       
  1453 	args = PyTuple_Pack(1, w);
       
  1454 	if (args == NULL) {
       
  1455 		Py_DECREF(coercefunc);
       
  1456 		return NULL;
       
  1457 	}
       
  1458 	coerced = PyEval_CallObject(coercefunc, args);
       
  1459 	Py_DECREF(args);
       
  1460 	Py_DECREF(coercefunc);
       
  1461 	if (coerced == NULL) {
       
  1462 		return NULL;
       
  1463 	}
       
  1464 	if (coerced == Py_None || coerced == Py_NotImplemented) {
       
  1465 		Py_DECREF(coerced);
       
  1466 		return generic_binary_op(v, w, opname);
       
  1467 	}
       
  1468 	if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
       
  1469 		Py_DECREF(coerced);
       
  1470 		PyErr_SetString(PyExc_TypeError,
       
  1471 				"coercion should return None or 2-tuple");
       
  1472 		return NULL;
       
  1473 	}
       
  1474 	v1 = PyTuple_GetItem(coerced, 0);
       
  1475 	w = PyTuple_GetItem(coerced, 1);
       
  1476 	if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
       
  1477 		/* prevent recursion if __coerce__ returns self as the first
       
  1478 		 * argument */
       
  1479 		result = generic_binary_op(v1, w, opname);
       
  1480 	} else {
       
  1481 		if (Py_EnterRecursiveCall(" after coercion"))
       
  1482 		    return NULL;
       
  1483 		if (swapped)
       
  1484 			result = (thisfunc)(w, v1);
       
  1485 		else
       
  1486 			result = (thisfunc)(v1, w);
       
  1487 		Py_LeaveRecursiveCall();
       
  1488 	}
       
  1489 	Py_DECREF(coerced);
       
  1490 	return result;
       
  1491 }
       
  1492 
       
  1493 /* Implement a binary operator involving at least one class instance. */
       
  1494 static PyObject *
       
  1495 do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
       
  1496                    binaryfunc thisfunc)
       
  1497 {
       
  1498 	PyObject *result = half_binop(v, w, opname, thisfunc, 0);
       
  1499 	if (result == Py_NotImplemented) {
       
  1500 		Py_DECREF(result);
       
  1501 		result = half_binop(w, v, ropname, thisfunc, 1);
       
  1502 	}
       
  1503 	return result;
       
  1504 }
       
  1505 
       
  1506 static PyObject *
       
  1507 do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
       
  1508 			char *ropname, binaryfunc thisfunc)
       
  1509 {
       
  1510 	PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
       
  1511 	if (result == Py_NotImplemented) {
       
  1512 		Py_DECREF(result);
       
  1513 		result = do_binop(v, w, opname, ropname, thisfunc);
       
  1514 	}
       
  1515 	return result;
       
  1516 }
       
  1517 
       
  1518 static int
       
  1519 instance_coerce(PyObject **pv, PyObject **pw)
       
  1520 {
       
  1521 	PyObject *v = *pv;
       
  1522 	PyObject *w = *pw;
       
  1523 	PyObject *coercefunc;
       
  1524 	PyObject *args;
       
  1525 	PyObject *coerced;
       
  1526 
       
  1527 	if (coerce_obj == NULL) {
       
  1528 		coerce_obj = PyString_InternFromString("__coerce__");
       
  1529 		if (coerce_obj == NULL)
       
  1530 			return -1;
       
  1531 	}
       
  1532 	coercefunc = PyObject_GetAttr(v, coerce_obj);
       
  1533 	if (coercefunc == NULL) {
       
  1534 		/* No __coerce__ method */
       
  1535 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1536 			return -1;
       
  1537 		PyErr_Clear();
       
  1538 		return 1;
       
  1539 	}
       
  1540 	/* Has __coerce__ method: call it */
       
  1541 	args = PyTuple_Pack(1, w);
       
  1542 	if (args == NULL) {
       
  1543 		return -1;
       
  1544 	}
       
  1545 	coerced = PyEval_CallObject(coercefunc, args);
       
  1546 	Py_DECREF(args);
       
  1547 	Py_DECREF(coercefunc);
       
  1548 	if (coerced == NULL) {
       
  1549 		/* __coerce__ call raised an exception */
       
  1550 		return -1;
       
  1551 	}
       
  1552 	if (coerced == Py_None || coerced == Py_NotImplemented) {
       
  1553 		/* __coerce__ says "I can't do it" */
       
  1554 		Py_DECREF(coerced);
       
  1555 		return 1;
       
  1556 	}
       
  1557 	if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
       
  1558 		/* __coerce__ return value is malformed */
       
  1559 		Py_DECREF(coerced);
       
  1560 		PyErr_SetString(PyExc_TypeError,
       
  1561 			   "coercion should return None or 2-tuple");
       
  1562 		return -1;
       
  1563 	}
       
  1564 	/* __coerce__ returned two new values */
       
  1565 	*pv = PyTuple_GetItem(coerced, 0);
       
  1566 	*pw = PyTuple_GetItem(coerced, 1);
       
  1567 	Py_INCREF(*pv);
       
  1568 	Py_INCREF(*pw);
       
  1569 	Py_DECREF(coerced);
       
  1570 	return 0;
       
  1571 }
       
  1572 
       
  1573 #define UNARY(funcname, methodname) \
       
  1574 static PyObject *funcname(PyInstanceObject *self) { \
       
  1575 	static PyObject *o; \
       
  1576 	if (o == NULL) { o = PyString_InternFromString(methodname); \
       
  1577 			 if (o == NULL) return NULL; } \
       
  1578 	return generic_unary_op(self, o); \
       
  1579 }
       
  1580 
       
  1581 /* unary function with a fallback */
       
  1582 #define UNARY_FB(funcname, methodname, funcname_fb) \
       
  1583 static PyObject *funcname(PyInstanceObject *self) { \
       
  1584 	static PyObject *o; \
       
  1585 	if (o == NULL) { o = PyString_InternFromString(methodname); \
       
  1586 			 if (o == NULL) return NULL; } \
       
  1587 	if (PyObject_HasAttr((PyObject*)self, o)) \
       
  1588 		return generic_unary_op(self, o); \
       
  1589 	else \
       
  1590 		return funcname_fb(self); \
       
  1591 }
       
  1592 
       
  1593 #define BINARY(f, m, n) \
       
  1594 static PyObject *f(PyObject *v, PyObject *w) { \
       
  1595 	return do_binop(v, w, "__" m "__", "__r" m "__", n); \
       
  1596 }
       
  1597 
       
  1598 #define BINARY_INPLACE(f, m, n) \
       
  1599 static PyObject *f(PyObject *v, PyObject *w) { \
       
  1600 	return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
       
  1601 			"__r" m "__", n); \
       
  1602 }
       
  1603 
       
  1604 UNARY(instance_neg, "__neg__")
       
  1605 UNARY(instance_pos, "__pos__")
       
  1606 UNARY(instance_abs, "__abs__")
       
  1607 
       
  1608 BINARY(instance_or, "or", PyNumber_Or)
       
  1609 BINARY(instance_and, "and", PyNumber_And)
       
  1610 BINARY(instance_xor, "xor", PyNumber_Xor)
       
  1611 BINARY(instance_lshift, "lshift", PyNumber_Lshift)
       
  1612 BINARY(instance_rshift, "rshift", PyNumber_Rshift)
       
  1613 BINARY(instance_add, "add", PyNumber_Add)
       
  1614 BINARY(instance_sub, "sub", PyNumber_Subtract)
       
  1615 BINARY(instance_mul, "mul", PyNumber_Multiply)
       
  1616 BINARY(instance_div, "div", PyNumber_Divide)
       
  1617 BINARY(instance_mod, "mod", PyNumber_Remainder)
       
  1618 BINARY(instance_divmod, "divmod", PyNumber_Divmod)
       
  1619 BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
       
  1620 BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
       
  1621 
       
  1622 BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
       
  1623 BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
       
  1624 BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
       
  1625 BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
       
  1626 BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
       
  1627 BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
       
  1628 BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
       
  1629 BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
       
  1630 BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
       
  1631 BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
       
  1632 BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
       
  1633 BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
       
  1634 
       
  1635 /* Try a 3-way comparison, returning an int; v is an instance.  Return:
       
  1636    -2 for an exception;
       
  1637    -1 if v < w;
       
  1638    0 if v == w;
       
  1639    1 if v > w;
       
  1640    2 if this particular 3-way comparison is not implemented or undefined.
       
  1641 */
       
  1642 static int
       
  1643 half_cmp(PyObject *v, PyObject *w)
       
  1644 {
       
  1645 	static PyObject *cmp_obj;
       
  1646 	PyObject *args;
       
  1647 	PyObject *cmp_func;
       
  1648 	PyObject *result;
       
  1649 	long l;
       
  1650 
       
  1651 	assert(PyInstance_Check(v));
       
  1652 
       
  1653 	if (cmp_obj == NULL) {
       
  1654 		cmp_obj = PyString_InternFromString("__cmp__");
       
  1655 		if (cmp_obj == NULL)
       
  1656 			return -2;
       
  1657 	}
       
  1658 
       
  1659 	cmp_func = PyObject_GetAttr(v, cmp_obj);
       
  1660 	if (cmp_func == NULL) {
       
  1661 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1662 			return -2;
       
  1663 		PyErr_Clear();
       
  1664 		return 2;
       
  1665 	}
       
  1666 
       
  1667 	args = PyTuple_Pack(1, w);
       
  1668 	if (args == NULL) {
       
  1669 		Py_DECREF(cmp_func);
       
  1670 		return -2;
       
  1671 	}
       
  1672 
       
  1673 	result = PyEval_CallObject(cmp_func, args);
       
  1674 	Py_DECREF(args);
       
  1675 	Py_DECREF(cmp_func);
       
  1676 
       
  1677 	if (result == NULL)
       
  1678 		return -2;
       
  1679 
       
  1680 	if (result == Py_NotImplemented) {
       
  1681 		Py_DECREF(result);
       
  1682 		return 2;
       
  1683 	}
       
  1684 
       
  1685 	l = PyInt_AsLong(result);
       
  1686 	Py_DECREF(result);
       
  1687 	if (l == -1 && PyErr_Occurred()) {
       
  1688 		PyErr_SetString(PyExc_TypeError,
       
  1689 			     "comparison did not return an int");
       
  1690 		return -2;
       
  1691 	}
       
  1692 
       
  1693 	return l < 0 ? -1 : l > 0 ? 1 : 0;
       
  1694 }
       
  1695 
       
  1696 /* Try a 3-way comparison, returning an int; either v or w is an instance.
       
  1697    We first try a coercion.  Return:
       
  1698    -2 for an exception;
       
  1699    -1 if v < w;
       
  1700    0 if v == w;
       
  1701    1 if v > w;
       
  1702    2 if this particular 3-way comparison is not implemented or undefined.
       
  1703    THIS IS ONLY CALLED FROM object.c!
       
  1704 */
       
  1705 static int
       
  1706 instance_compare(PyObject *v, PyObject *w)
       
  1707 {
       
  1708 	int c;
       
  1709 
       
  1710 	c = PyNumber_CoerceEx(&v, &w);
       
  1711 	if (c < 0)
       
  1712 		return -2;
       
  1713 	if (c == 0) {
       
  1714 		/* If neither is now an instance, use regular comparison */
       
  1715 		if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
       
  1716 			c = PyObject_Compare(v, w);
       
  1717 			Py_DECREF(v);
       
  1718 			Py_DECREF(w);
       
  1719 			if (PyErr_Occurred())
       
  1720 				return -2;
       
  1721 			return c < 0 ? -1 : c > 0 ? 1 : 0;
       
  1722 		}
       
  1723 	}
       
  1724 	else {
       
  1725 		/* The coercion didn't do anything.
       
  1726 		   Treat this the same as returning v and w unchanged. */
       
  1727 		Py_INCREF(v);
       
  1728 		Py_INCREF(w);
       
  1729 	}
       
  1730 
       
  1731 	if (PyInstance_Check(v)) {
       
  1732 		c = half_cmp(v, w);
       
  1733 		if (c <= 1) {
       
  1734 			Py_DECREF(v);
       
  1735 			Py_DECREF(w);
       
  1736 			return c;
       
  1737 		}
       
  1738 	}
       
  1739 	if (PyInstance_Check(w)) {
       
  1740 		c = half_cmp(w, v);
       
  1741 		if (c <= 1) {
       
  1742 			Py_DECREF(v);
       
  1743 			Py_DECREF(w);
       
  1744 			if (c >= -1)
       
  1745 				c = -c;
       
  1746 			return c;
       
  1747 		}
       
  1748 	}
       
  1749 	Py_DECREF(v);
       
  1750 	Py_DECREF(w);
       
  1751 	return 2;
       
  1752 }
       
  1753 
       
  1754 static int
       
  1755 instance_nonzero(PyInstanceObject *self)
       
  1756 {
       
  1757 	PyObject *func, *res;
       
  1758 	long outcome;
       
  1759 	static PyObject *nonzerostr;
       
  1760 
       
  1761 	if (nonzerostr == NULL) {
       
  1762 		nonzerostr = PyString_InternFromString("__nonzero__");
       
  1763 		if (nonzerostr == NULL)
       
  1764 			return -1;
       
  1765 	}
       
  1766 	if ((func = instance_getattr(self, nonzerostr)) == NULL) {
       
  1767 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1768 			return -1;
       
  1769 		PyErr_Clear();
       
  1770 		if (lenstr == NULL) {
       
  1771 			lenstr = PyString_InternFromString("__len__");
       
  1772 			if (lenstr == NULL)
       
  1773 				return -1;
       
  1774 		}
       
  1775 		if ((func = instance_getattr(self, lenstr)) == NULL) {
       
  1776 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1777 				return -1;
       
  1778 			PyErr_Clear();
       
  1779 			/* Fall back to the default behavior:
       
  1780 			   all instances are nonzero */
       
  1781 			return 1;
       
  1782 		}
       
  1783 	}
       
  1784 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
  1785 	Py_DECREF(func);
       
  1786 	if (res == NULL)
       
  1787 		return -1;
       
  1788 	if (!PyInt_Check(res)) {
       
  1789 		Py_DECREF(res);
       
  1790 		PyErr_SetString(PyExc_TypeError,
       
  1791 				"__nonzero__ should return an int");
       
  1792 		return -1;
       
  1793 	}
       
  1794 	outcome = PyInt_AsLong(res);
       
  1795 	Py_DECREF(res);
       
  1796 	if (outcome < 0) {
       
  1797 		PyErr_SetString(PyExc_ValueError,
       
  1798 				"__nonzero__ should return >= 0");
       
  1799 		return -1;
       
  1800 	}
       
  1801 	return outcome > 0;
       
  1802 }
       
  1803 
       
  1804 static PyObject *
       
  1805 instance_index(PyInstanceObject *self)
       
  1806 {
       
  1807 	PyObject *func, *res;
       
  1808 	static PyObject *indexstr = NULL;
       
  1809 
       
  1810 	if (indexstr == NULL) {
       
  1811 		indexstr = PyString_InternFromString("__index__");
       
  1812 		if (indexstr == NULL)
       
  1813 			return NULL;
       
  1814 	}	
       
  1815 	if ((func = instance_getattr(self, indexstr)) == NULL) {
       
  1816 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1817 			return NULL;
       
  1818 		PyErr_Clear();
       
  1819 		PyErr_SetString(PyExc_TypeError, 
       
  1820 				"object cannot be interpreted as an index");
       
  1821 		return NULL;
       
  1822 	}
       
  1823 	res = PyEval_CallObject(func, (PyObject *)NULL);
       
  1824 	Py_DECREF(func);
       
  1825 	return res;
       
  1826 }
       
  1827 
       
  1828 
       
  1829 UNARY(instance_invert, "__invert__")
       
  1830 UNARY(_instance_trunc, "__trunc__")
       
  1831 
       
  1832 static PyObject *
       
  1833 instance_int(PyInstanceObject *self)
       
  1834 {
       
  1835 	PyObject *truncated;
       
  1836 	static PyObject *int_name;
       
  1837 	if (int_name == NULL) {
       
  1838 		int_name = PyString_InternFromString("__int__");
       
  1839 		if (int_name == NULL)
       
  1840 			return NULL;
       
  1841 	}
       
  1842 	if (PyObject_HasAttr((PyObject*)self, int_name))
       
  1843 		return generic_unary_op(self, int_name);
       
  1844 
       
  1845 	truncated = _instance_trunc(self);
       
  1846 	/* __trunc__ is specified to return an Integral type, but
       
  1847 	   int() needs to return an int. */
       
  1848 	return _PyNumber_ConvertIntegralToInt(
       
  1849 		truncated,
       
  1850 		"__trunc__ returned non-Integral (type %.200s)");
       
  1851 }
       
  1852 
       
  1853 UNARY_FB(instance_long, "__long__", instance_int)
       
  1854 UNARY(instance_float, "__float__")
       
  1855 UNARY(instance_oct, "__oct__")
       
  1856 UNARY(instance_hex, "__hex__")
       
  1857 
       
  1858 static PyObject *
       
  1859 bin_power(PyObject *v, PyObject *w)
       
  1860 {
       
  1861 	return PyNumber_Power(v, w, Py_None);
       
  1862 }
       
  1863 
       
  1864 /* This version is for ternary calls only (z != None) */
       
  1865 static PyObject *
       
  1866 instance_pow(PyObject *v, PyObject *w, PyObject *z)
       
  1867 {
       
  1868 	if (z == Py_None) {
       
  1869 		return do_binop(v, w, "__pow__", "__rpow__", bin_power);
       
  1870 	}
       
  1871 	else {
       
  1872 		PyObject *func;
       
  1873 		PyObject *args;
       
  1874 		PyObject *result;
       
  1875 
       
  1876 		/* XXX Doesn't do coercions... */
       
  1877 		func = PyObject_GetAttrString(v, "__pow__");
       
  1878 		if (func == NULL)
       
  1879 			return NULL;
       
  1880 		args = PyTuple_Pack(2, w, z);
       
  1881 		if (args == NULL) {
       
  1882 			Py_DECREF(func);
       
  1883 			return NULL;
       
  1884 		}
       
  1885 		result = PyEval_CallObject(func, args);
       
  1886 		Py_DECREF(func);
       
  1887 		Py_DECREF(args);
       
  1888 		return result;
       
  1889 	}
       
  1890 }
       
  1891 
       
  1892 static PyObject *
       
  1893 bin_inplace_power(PyObject *v, PyObject *w)
       
  1894 {
       
  1895 	return PyNumber_InPlacePower(v, w, Py_None);
       
  1896 }
       
  1897 
       
  1898 
       
  1899 static PyObject *
       
  1900 instance_ipow(PyObject *v, PyObject *w, PyObject *z)
       
  1901 {
       
  1902 	if (z == Py_None) {
       
  1903 		return do_binop_inplace(v, w, "__ipow__", "__pow__",
       
  1904 			"__rpow__", bin_inplace_power);
       
  1905 	}
       
  1906 	else {
       
  1907 		/* XXX Doesn't do coercions... */
       
  1908 		PyObject *func;
       
  1909 		PyObject *args;
       
  1910 		PyObject *result;
       
  1911 
       
  1912 		func = PyObject_GetAttrString(v, "__ipow__");
       
  1913 		if (func == NULL) {
       
  1914 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1915 				return NULL;
       
  1916 			PyErr_Clear();
       
  1917 			return instance_pow(v, w, z);
       
  1918 		}
       
  1919 		args = PyTuple_Pack(2, w, z);
       
  1920 		if (args == NULL) {
       
  1921 			Py_DECREF(func);
       
  1922 			return NULL;
       
  1923 		}
       
  1924 		result = PyEval_CallObject(func, args);
       
  1925 		Py_DECREF(func);
       
  1926 		Py_DECREF(args);
       
  1927 		return result;
       
  1928 	}
       
  1929 }
       
  1930 
       
  1931 
       
  1932 /* Map rich comparison operators to their __xx__ namesakes */
       
  1933 #define NAME_OPS 6
       
  1934 static PyObject **name_op = NULL;
       
  1935 
       
  1936 static int
       
  1937 init_name_op(void)
       
  1938 {
       
  1939 	int i;
       
  1940 	char *_name_op[] = {
       
  1941 		"__lt__",
       
  1942 		"__le__",
       
  1943 		"__eq__",
       
  1944 		"__ne__",
       
  1945 		"__gt__",
       
  1946 		"__ge__",
       
  1947 	};
       
  1948 
       
  1949 	name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
       
  1950 	if (name_op == NULL)
       
  1951 		return -1;
       
  1952 	for (i = 0; i < NAME_OPS; ++i) {
       
  1953 		name_op[i] = PyString_InternFromString(_name_op[i]);
       
  1954 		if (name_op[i] == NULL)
       
  1955 			return -1;
       
  1956 	}
       
  1957 	return 0;
       
  1958 }
       
  1959 
       
  1960 static PyObject *
       
  1961 half_richcompare(PyObject *v, PyObject *w, int op)
       
  1962 {
       
  1963 	PyObject *method;
       
  1964 	PyObject *args;
       
  1965 	PyObject *res;
       
  1966 
       
  1967 	assert(PyInstance_Check(v));
       
  1968 
       
  1969 	if (name_op == NULL) {
       
  1970 		if (init_name_op() < 0)
       
  1971 			return NULL;
       
  1972 	}
       
  1973 	/* If the instance doesn't define an __getattr__ method, use
       
  1974 	   instance_getattr2 directly because it will not set an
       
  1975 	   exception on failure. */
       
  1976 	if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
       
  1977 		method = instance_getattr2((PyInstanceObject *)v,
       
  1978 					   name_op[op]);
       
  1979 	else
       
  1980 		method = PyObject_GetAttr(v, name_op[op]);
       
  1981 	if (method == NULL) {
       
  1982 		if (PyErr_Occurred()) {
       
  1983 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  1984 				return NULL;
       
  1985 			PyErr_Clear();
       
  1986 		}
       
  1987 		res = Py_NotImplemented;
       
  1988 		Py_INCREF(res);
       
  1989 		return res;
       
  1990 	}
       
  1991 
       
  1992 	args = PyTuple_Pack(1, w);
       
  1993 	if (args == NULL) {
       
  1994 		Py_DECREF(method);
       
  1995 		return NULL;
       
  1996 	}
       
  1997 
       
  1998 	res = PyEval_CallObject(method, args);
       
  1999 	Py_DECREF(args);
       
  2000 	Py_DECREF(method);
       
  2001 
       
  2002 	return res;
       
  2003 }
       
  2004 
       
  2005 static PyObject *
       
  2006 instance_richcompare(PyObject *v, PyObject *w, int op)
       
  2007 {
       
  2008 	PyObject *res;
       
  2009 
       
  2010 	if (PyInstance_Check(v)) {
       
  2011 		res = half_richcompare(v, w, op);
       
  2012 		if (res != Py_NotImplemented)
       
  2013 			return res;
       
  2014 		Py_DECREF(res);
       
  2015 	}
       
  2016 
       
  2017 	if (PyInstance_Check(w)) {
       
  2018 		res = half_richcompare(w, v, _Py_SwappedOp[op]);
       
  2019 		if (res != Py_NotImplemented)
       
  2020 			return res;
       
  2021 		Py_DECREF(res);
       
  2022 	}
       
  2023 
       
  2024 	Py_INCREF(Py_NotImplemented);
       
  2025 	return Py_NotImplemented;
       
  2026 }
       
  2027 
       
  2028 
       
  2029 /* Get the iterator */
       
  2030 static PyObject *
       
  2031 instance_getiter(PyInstanceObject *self)
       
  2032 {
       
  2033 	PyObject *func;
       
  2034 
       
  2035 	if (iterstr == NULL) {
       
  2036 		iterstr = PyString_InternFromString("__iter__");
       
  2037 		if (iterstr == NULL)
       
  2038 			return NULL;
       
  2039 	}
       
  2040 	if (getitemstr == NULL) {
       
  2041 		getitemstr = PyString_InternFromString("__getitem__");
       
  2042 		if (getitemstr == NULL)
       
  2043 			return NULL;
       
  2044 	}
       
  2045 
       
  2046 	if ((func = instance_getattr(self, iterstr)) != NULL) {
       
  2047 		PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
       
  2048 		Py_DECREF(func);
       
  2049 		if (res != NULL && !PyIter_Check(res)) {
       
  2050 			PyErr_Format(PyExc_TypeError,
       
  2051 				     "__iter__ returned non-iterator "
       
  2052 				     "of type '%.100s'",
       
  2053 				     res->ob_type->tp_name);
       
  2054 			Py_DECREF(res);
       
  2055 			res = NULL;
       
  2056 		}
       
  2057 		return res;
       
  2058 	}
       
  2059 	if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  2060 		return NULL;
       
  2061 	PyErr_Clear();
       
  2062 	if ((func = instance_getattr(self, getitemstr)) == NULL) {
       
  2063 		PyErr_SetString(PyExc_TypeError,
       
  2064 				"iteration over non-sequence");
       
  2065 		return NULL;
       
  2066 	}
       
  2067 	Py_DECREF(func);
       
  2068 	return PySeqIter_New((PyObject *)self);
       
  2069 }
       
  2070 
       
  2071 
       
  2072 /* Call the iterator's next */
       
  2073 static PyObject *
       
  2074 instance_iternext(PyInstanceObject *self)
       
  2075 {
       
  2076 	PyObject *func;
       
  2077 
       
  2078 	if (nextstr == NULL) {
       
  2079 		nextstr = PyString_InternFromString("next");
       
  2080 		if (nextstr == NULL)
       
  2081 			return NULL;
       
  2082 	}
       
  2083 
       
  2084 	if ((func = instance_getattr(self, nextstr)) != NULL) {
       
  2085 		PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
       
  2086 		Py_DECREF(func);
       
  2087 		if (res != NULL) {
       
  2088 			return res;
       
  2089 		}
       
  2090 		if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
       
  2091 			PyErr_Clear();
       
  2092 			return NULL;
       
  2093 		}
       
  2094 		return NULL;
       
  2095 	}
       
  2096 	PyErr_SetString(PyExc_TypeError, "instance has no next() method");
       
  2097 	return NULL;
       
  2098 }
       
  2099 
       
  2100 static PyObject *
       
  2101 instance_call(PyObject *func, PyObject *arg, PyObject *kw)
       
  2102 {
       
  2103 	PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
       
  2104 	if (call == NULL) {
       
  2105 		PyInstanceObject *inst = (PyInstanceObject*) func;
       
  2106 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  2107 			return NULL;
       
  2108 		PyErr_Clear();
       
  2109 		PyErr_Format(PyExc_AttributeError,
       
  2110 			     "%.200s instance has no __call__ method",
       
  2111 			     PyString_AsString(inst->in_class->cl_name));
       
  2112 		return NULL;
       
  2113 	}
       
  2114 	/* We must check and increment the recursion depth here. Scenario:
       
  2115 	       class A:
       
  2116 	           pass
       
  2117 	       A.__call__ = A() # that's right
       
  2118 	       a = A() # ok
       
  2119 	       a() # infinite recursion
       
  2120 	   This bounces between instance_call() and PyObject_Call() without
       
  2121 	   ever hitting eval_frame() (which has the main recursion check). */
       
  2122 	if (Py_EnterRecursiveCall(" in __call__")) {
       
  2123 		res = NULL;
       
  2124 	}
       
  2125 	else {
       
  2126 		res = PyObject_Call(call, arg, kw);
       
  2127 		Py_LeaveRecursiveCall();
       
  2128 	}
       
  2129 	Py_DECREF(call);
       
  2130 	return res;
       
  2131 }
       
  2132 
       
  2133 
       
  2134 static PyNumberMethods instance_as_number = {
       
  2135 	instance_add,			/* nb_add */
       
  2136 	instance_sub,			/* nb_subtract */
       
  2137 	instance_mul,			/* nb_multiply */
       
  2138 	instance_div,			/* nb_divide */
       
  2139 	instance_mod,			/* nb_remainder */
       
  2140 	instance_divmod,		/* nb_divmod */
       
  2141 	instance_pow,			/* nb_power */
       
  2142 	(unaryfunc)instance_neg,	/* nb_negative */
       
  2143 	(unaryfunc)instance_pos,	/* nb_positive */
       
  2144 	(unaryfunc)instance_abs,	/* nb_absolute */
       
  2145 	(inquiry)instance_nonzero,	/* nb_nonzero */
       
  2146 	(unaryfunc)instance_invert,	/* nb_invert */
       
  2147 	instance_lshift,		/* nb_lshift */
       
  2148 	instance_rshift,		/* nb_rshift */
       
  2149 	instance_and,			/* nb_and */
       
  2150 	instance_xor,			/* nb_xor */
       
  2151 	instance_or,			/* nb_or */
       
  2152 	instance_coerce,		/* nb_coerce */
       
  2153 	(unaryfunc)instance_int,	/* nb_int */
       
  2154 	(unaryfunc)instance_long,	/* nb_long */
       
  2155 	(unaryfunc)instance_float,	/* nb_float */
       
  2156 	(unaryfunc)instance_oct,	/* nb_oct */
       
  2157 	(unaryfunc)instance_hex,	/* nb_hex */
       
  2158 	instance_iadd,			/* nb_inplace_add */
       
  2159 	instance_isub,			/* nb_inplace_subtract */
       
  2160 	instance_imul,			/* nb_inplace_multiply */
       
  2161 	instance_idiv,			/* nb_inplace_divide */
       
  2162 	instance_imod,			/* nb_inplace_remainder */
       
  2163 	instance_ipow,			/* nb_inplace_power */
       
  2164 	instance_ilshift,		/* nb_inplace_lshift */
       
  2165 	instance_irshift,		/* nb_inplace_rshift */
       
  2166 	instance_iand,			/* nb_inplace_and */
       
  2167 	instance_ixor,			/* nb_inplace_xor */
       
  2168 	instance_ior,			/* nb_inplace_or */
       
  2169 	instance_floordiv,		/* nb_floor_divide */
       
  2170 	instance_truediv,		/* nb_true_divide */
       
  2171 	instance_ifloordiv,		/* nb_inplace_floor_divide */
       
  2172 	instance_itruediv,		/* nb_inplace_true_divide */
       
  2173 	(unaryfunc)instance_index,	/* nb_index */
       
  2174 };
       
  2175 
       
  2176 PyTypeObject PyInstance_Type = {
       
  2177 	PyObject_HEAD_INIT(&PyType_Type)
       
  2178 	0,
       
  2179 	"instance",
       
  2180 	sizeof(PyInstanceObject),
       
  2181 	0,
       
  2182 	(destructor)instance_dealloc,		/* tp_dealloc */
       
  2183 	0,					/* tp_print */
       
  2184 	0,					/* tp_getattr */
       
  2185 	0,					/* tp_setattr */
       
  2186 	instance_compare,			/* tp_compare */
       
  2187 	(reprfunc)instance_repr,		/* tp_repr */
       
  2188 	&instance_as_number,			/* tp_as_number */
       
  2189 	&instance_as_sequence,			/* tp_as_sequence */
       
  2190 	&instance_as_mapping,			/* tp_as_mapping */
       
  2191 	(hashfunc)instance_hash,		/* tp_hash */
       
  2192 	instance_call,				/* tp_call */
       
  2193 	(reprfunc)instance_str,			/* tp_str */
       
  2194 	(getattrofunc)instance_getattr,		/* tp_getattro */
       
  2195 	(setattrofunc)instance_setattr,		/* tp_setattro */
       
  2196 	0,					/* tp_as_buffer */
       
  2197 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
       
  2198 	instance_doc,				/* tp_doc */
       
  2199 	(traverseproc)instance_traverse,	/* tp_traverse */
       
  2200 	0,					/* tp_clear */
       
  2201 	instance_richcompare,			/* tp_richcompare */
       
  2202  	offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
       
  2203 	(getiterfunc)instance_getiter,		/* tp_iter */
       
  2204 	(iternextfunc)instance_iternext,	/* tp_iternext */
       
  2205 	0,					/* tp_methods */
       
  2206 	0,					/* tp_members */
       
  2207 	0,					/* tp_getset */
       
  2208 	0,					/* tp_base */
       
  2209 	0,					/* tp_dict */
       
  2210 	0,					/* tp_descr_get */
       
  2211 	0,					/* tp_descr_set */
       
  2212 	0,					/* tp_dictoffset */
       
  2213 	0,					/* tp_init */
       
  2214 	0,					/* tp_alloc */
       
  2215 	instance_new,				/* tp_new */
       
  2216 };
       
  2217 
       
  2218 
       
  2219 /* Instance method objects are used for two purposes:
       
  2220    (a) as bound instance methods (returned by instancename.methodname)
       
  2221    (b) as unbound methods (returned by ClassName.methodname)
       
  2222    In case (b), im_self is NULL
       
  2223 */
       
  2224 
       
  2225 PyObject *
       
  2226 PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
       
  2227 {
       
  2228 	register PyMethodObject *im;
       
  2229 	if (!PyCallable_Check(func)) {
       
  2230 		PyErr_BadInternalCall();
       
  2231 		return NULL;
       
  2232 	}
       
  2233 	im = free_list;
       
  2234 	if (im != NULL) {
       
  2235 		free_list = (PyMethodObject *)(im->im_self);
       
  2236 		PyObject_INIT(im, &PyMethod_Type);
       
  2237 		numfree--;
       
  2238 	}
       
  2239 	else {
       
  2240 		im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
       
  2241 		if (im == NULL)
       
  2242 			return NULL;
       
  2243 	}
       
  2244 	im->im_weakreflist = NULL;
       
  2245 	Py_INCREF(func);
       
  2246 	im->im_func = func;
       
  2247 	Py_XINCREF(self);
       
  2248 	im->im_self = self;
       
  2249 	Py_XINCREF(klass);
       
  2250 	im->im_class = klass;
       
  2251 	_PyObject_GC_TRACK(im);
       
  2252 	return (PyObject *)im;
       
  2253 }
       
  2254 
       
  2255 /* Descriptors for PyMethod attributes */
       
  2256 
       
  2257 /* im_class, im_func and im_self are stored in the PyMethod object */
       
  2258 
       
  2259 #define OFF(x) offsetof(PyMethodObject, x)
       
  2260 
       
  2261 static PyMemberDef instancemethod_memberlist[] = {
       
  2262 	{"im_class",	T_OBJECT,	OFF(im_class),	READONLY|RESTRICTED,
       
  2263 	 "the class associated with a method"},
       
  2264 	{"im_func",	T_OBJECT,	OFF(im_func),	READONLY|RESTRICTED,
       
  2265 	 "the function (or other callable) implementing a method"},
       
  2266 	{"__func__",	T_OBJECT,	OFF(im_func),	READONLY|RESTRICTED,
       
  2267 	 "the function (or other callable) implementing a method"},
       
  2268 	{"im_self",	T_OBJECT,	OFF(im_self),	READONLY|RESTRICTED,
       
  2269 	 "the instance to which a method is bound; None for unbound methods"},
       
  2270 	{"__self__",	T_OBJECT,	OFF(im_self),	READONLY|RESTRICTED,
       
  2271 	 "the instance to which a method is bound; None for unbound methods"},
       
  2272 	{NULL}	/* Sentinel */
       
  2273 };
       
  2274 
       
  2275 /* Christian Tismer argued convincingly that method attributes should
       
  2276    (nearly) always override function attributes.
       
  2277    The one exception is __doc__; there's a default __doc__ which
       
  2278    should only be used for the class, not for instances */
       
  2279 
       
  2280 static PyObject *
       
  2281 instancemethod_get_doc(PyMethodObject *im, void *context)
       
  2282 {
       
  2283 	static PyObject *docstr;
       
  2284 	if (docstr == NULL) {
       
  2285 		docstr= PyString_InternFromString("__doc__");
       
  2286 		if (docstr == NULL)
       
  2287 			return NULL;
       
  2288 	}
       
  2289 	return PyObject_GetAttr(im->im_func, docstr);
       
  2290 }
       
  2291 
       
  2292 static PyGetSetDef instancemethod_getset[] = {
       
  2293 	{"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
       
  2294 	{0}
       
  2295 };
       
  2296 
       
  2297 static PyObject *
       
  2298 instancemethod_getattro(PyObject *obj, PyObject *name)
       
  2299 {
       
  2300 	PyMethodObject *im = (PyMethodObject *)obj;
       
  2301 	PyTypeObject *tp = obj->ob_type;
       
  2302 	PyObject *descr = NULL;
       
  2303 
       
  2304 	if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
       
  2305 		if (tp->tp_dict == NULL) {
       
  2306 			if (PyType_Ready(tp) < 0)
       
  2307 				return NULL;
       
  2308 		}
       
  2309 		descr = _PyType_Lookup(tp, name);
       
  2310 	}
       
  2311 
       
  2312 	if (descr != NULL) {
       
  2313 		descrgetfunc f = TP_DESCR_GET(descr->ob_type);
       
  2314 		if (f != NULL)
       
  2315 			return f(descr, obj, (PyObject *)obj->ob_type);
       
  2316 		else {
       
  2317 			Py_INCREF(descr);
       
  2318 			return descr;
       
  2319 		}
       
  2320 	}
       
  2321 
       
  2322 	return PyObject_GetAttr(im->im_func, name);
       
  2323 }
       
  2324 
       
  2325 PyDoc_STRVAR(instancemethod_doc,
       
  2326 "instancemethod(function, instance, class)\n\
       
  2327 \n\
       
  2328 Create an instance method object.");
       
  2329 
       
  2330 static PyObject *
       
  2331 instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
       
  2332 {
       
  2333 	PyObject *func;
       
  2334 	PyObject *self;
       
  2335 	PyObject *classObj = NULL;
       
  2336 
       
  2337 	if (!_PyArg_NoKeywords("instancemethod", kw))
       
  2338 		return NULL;
       
  2339 	if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
       
  2340 			      &func, &self, &classObj))
       
  2341 		return NULL;
       
  2342 	if (!PyCallable_Check(func)) {
       
  2343 		PyErr_SetString(PyExc_TypeError,
       
  2344 				"first argument must be callable");
       
  2345 		return NULL;
       
  2346 	}
       
  2347 	if (self == Py_None)
       
  2348 		self = NULL;
       
  2349 	if (self == NULL && classObj == NULL) {
       
  2350 		PyErr_SetString(PyExc_TypeError,
       
  2351 			"unbound methods must have non-NULL im_class");
       
  2352 		return NULL;
       
  2353 	}
       
  2354 
       
  2355 	return PyMethod_New(func, self, classObj);
       
  2356 }
       
  2357 
       
  2358 static void
       
  2359 instancemethod_dealloc(register PyMethodObject *im)
       
  2360 {
       
  2361 	_PyObject_GC_UNTRACK(im);
       
  2362 	if (im->im_weakreflist != NULL)
       
  2363 		PyObject_ClearWeakRefs((PyObject *)im);
       
  2364 	Py_DECREF(im->im_func);
       
  2365 	Py_XDECREF(im->im_self);
       
  2366 	Py_XDECREF(im->im_class);
       
  2367 	if (numfree < PyMethod_MAXFREELIST) {
       
  2368 		im->im_self = (PyObject *)free_list;
       
  2369 		free_list = im;
       
  2370 		numfree++;
       
  2371 	}
       
  2372 	else {
       
  2373 		PyObject_GC_Del(im);
       
  2374 	}
       
  2375 }
       
  2376 
       
  2377 static int
       
  2378 instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
       
  2379 {
       
  2380 	int cmp;
       
  2381 	cmp = PyObject_Compare(a->im_func, b->im_func);
       
  2382 	if (cmp)
       
  2383 		return cmp;
       
  2384 
       
  2385 	if (a->im_self == b->im_self)
       
  2386 		return 0;
       
  2387 	if (a->im_self == NULL || b->im_self == NULL)
       
  2388 		return (a->im_self < b->im_self) ? -1 : 1;
       
  2389 	else
       
  2390 		return PyObject_Compare(a->im_self, b->im_self);
       
  2391 }
       
  2392 
       
  2393 static PyObject *
       
  2394 instancemethod_repr(PyMethodObject *a)
       
  2395 {
       
  2396 	PyObject *self = a->im_self;
       
  2397 	PyObject *func = a->im_func;
       
  2398 	PyObject *klass = a->im_class;
       
  2399 	PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
       
  2400 	char *sfuncname = "?", *sklassname = "?";
       
  2401 
       
  2402 	funcname = PyObject_GetAttrString(func, "__name__");
       
  2403 	if (funcname == NULL) {
       
  2404 		if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  2405 			return NULL;
       
  2406 		PyErr_Clear();
       
  2407 	}
       
  2408 	else if (!PyString_Check(funcname)) {
       
  2409 		Py_DECREF(funcname);
       
  2410 		funcname = NULL;
       
  2411 	}
       
  2412 	else
       
  2413 		sfuncname = PyString_AS_STRING(funcname);
       
  2414 	if (klass == NULL)
       
  2415 		klassname = NULL;
       
  2416 	else {
       
  2417 		klassname = PyObject_GetAttrString(klass, "__name__");
       
  2418 		if (klassname == NULL) {
       
  2419 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
       
  2420 				return NULL;
       
  2421 			PyErr_Clear();
       
  2422 		}
       
  2423 		else if (!PyString_Check(klassname)) {
       
  2424 			Py_DECREF(klassname);
       
  2425 			klassname = NULL;
       
  2426 		}
       
  2427 		else
       
  2428 			sklassname = PyString_AS_STRING(klassname);
       
  2429 	}
       
  2430 	if (self == NULL)
       
  2431 		result = PyString_FromFormat("<unbound method %s.%s>",
       
  2432 					     sklassname, sfuncname);
       
  2433 	else {
       
  2434 		/* XXX Shouldn't use repr() here! */
       
  2435 		PyObject *selfrepr = PyObject_Repr(self);
       
  2436 		if (selfrepr == NULL)
       
  2437 			goto fail;
       
  2438 		if (!PyString_Check(selfrepr)) {
       
  2439 			Py_DECREF(selfrepr);
       
  2440 			goto fail;
       
  2441 		}
       
  2442 		result = PyString_FromFormat("<bound method %s.%s of %s>",
       
  2443 					     sklassname, sfuncname,
       
  2444 					     PyString_AS_STRING(selfrepr));
       
  2445 		Py_DECREF(selfrepr);
       
  2446 	}
       
  2447   fail:
       
  2448 	Py_XDECREF(funcname);
       
  2449 	Py_XDECREF(klassname);
       
  2450 	return result;
       
  2451 }
       
  2452 
       
  2453 static long
       
  2454 instancemethod_hash(PyMethodObject *a)
       
  2455 {
       
  2456 	long x, y;
       
  2457 	if (a->im_self == NULL)
       
  2458 		x = PyObject_Hash(Py_None);
       
  2459 	else
       
  2460 		x = PyObject_Hash(a->im_self);
       
  2461 	if (x == -1)
       
  2462 		return -1;
       
  2463 	y = PyObject_Hash(a->im_func);
       
  2464 	if (y == -1)
       
  2465 		return -1;
       
  2466 	x = x ^ y;
       
  2467 	if (x == -1)
       
  2468 		x = -2;
       
  2469 	return x;
       
  2470 }
       
  2471 
       
  2472 static int
       
  2473 instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
       
  2474 {
       
  2475 	Py_VISIT(im->im_func);
       
  2476 	Py_VISIT(im->im_self);
       
  2477 	Py_VISIT(im->im_class);
       
  2478 	return 0;
       
  2479 }
       
  2480 
       
  2481 static void
       
  2482 getclassname(PyObject *klass, char *buf, int bufsize)
       
  2483 {
       
  2484 	PyObject *name;
       
  2485 
       
  2486 	assert(bufsize > 1);
       
  2487 	strcpy(buf, "?"); /* Default outcome */
       
  2488 	if (klass == NULL)
       
  2489 		return;
       
  2490 	name = PyObject_GetAttrString(klass, "__name__");
       
  2491 	if (name == NULL) {
       
  2492 		/* This function cannot return an exception */
       
  2493 		PyErr_Clear();
       
  2494 		return;
       
  2495 	}
       
  2496 	if (PyString_Check(name)) {
       
  2497 		strncpy(buf, PyString_AS_STRING(name), bufsize);
       
  2498 		buf[bufsize-1] = '\0';
       
  2499 	}
       
  2500 	Py_DECREF(name);
       
  2501 }
       
  2502 
       
  2503 static void
       
  2504 getinstclassname(PyObject *inst, char *buf, int bufsize)
       
  2505 {
       
  2506 	PyObject *klass;
       
  2507 
       
  2508 	if (inst == NULL) {
       
  2509 		assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
       
  2510 		strcpy(buf, "nothing");
       
  2511 		return;
       
  2512 	}
       
  2513 
       
  2514 	klass = PyObject_GetAttrString(inst, "__class__");
       
  2515 	if (klass == NULL) {
       
  2516 		/* This function cannot return an exception */
       
  2517 		PyErr_Clear();
       
  2518 		klass = (PyObject *)(inst->ob_type);
       
  2519 		Py_INCREF(klass);
       
  2520 	}
       
  2521 	getclassname(klass, buf, bufsize);
       
  2522 	Py_XDECREF(klass);
       
  2523 }
       
  2524 
       
  2525 static PyObject *
       
  2526 instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
       
  2527 {
       
  2528 	PyObject *self = PyMethod_GET_SELF(func);
       
  2529 	PyObject *klass = PyMethod_GET_CLASS(func);
       
  2530 	PyObject *result;
       
  2531 
       
  2532 	func = PyMethod_GET_FUNCTION(func);
       
  2533 	if (self == NULL) {
       
  2534 		/* Unbound methods must be called with an instance of
       
  2535 		   the class (or a derived class) as first argument */
       
  2536 		int ok;
       
  2537 		if (PyTuple_Size(arg) >= 1)
       
  2538 			self = PyTuple_GET_ITEM(arg, 0);
       
  2539 		if (self == NULL)
       
  2540 			ok = 0;
       
  2541 		else {
       
  2542 			ok = PyObject_IsInstance(self, klass);
       
  2543 			if (ok < 0)
       
  2544 				return NULL;
       
  2545 		}
       
  2546 		if (!ok) {
       
  2547 			char clsbuf[256];
       
  2548 			char instbuf[256];
       
  2549 			getclassname(klass, clsbuf, sizeof(clsbuf));
       
  2550 			getinstclassname(self, instbuf, sizeof(instbuf));
       
  2551 			PyErr_Format(PyExc_TypeError,
       
  2552 				     "unbound method %s%s must be called with "
       
  2553 				     "%s instance as first argument "
       
  2554 				     "(got %s%s instead)",
       
  2555 				     PyEval_GetFuncName(func),
       
  2556 				     PyEval_GetFuncDesc(func),
       
  2557 				     clsbuf,
       
  2558 				     instbuf,
       
  2559 				     self == NULL ? "" : " instance");
       
  2560 			return NULL;
       
  2561 		}
       
  2562 		Py_INCREF(arg);
       
  2563 	}
       
  2564 	else {
       
  2565 		Py_ssize_t argcount = PyTuple_Size(arg);
       
  2566 		PyObject *newarg = PyTuple_New(argcount + 1);
       
  2567 		int i;
       
  2568 		if (newarg == NULL)
       
  2569 			return NULL;
       
  2570 		Py_INCREF(self);
       
  2571 		PyTuple_SET_ITEM(newarg, 0, self);
       
  2572 		for (i = 0; i < argcount; i++) {
       
  2573 			PyObject *v = PyTuple_GET_ITEM(arg, i);
       
  2574 			Py_XINCREF(v);
       
  2575 			PyTuple_SET_ITEM(newarg, i+1, v);
       
  2576 		}
       
  2577 		arg = newarg;
       
  2578 	}
       
  2579 	result = PyObject_Call((PyObject *)func, arg, kw);
       
  2580 	Py_DECREF(arg);
       
  2581 	return result;
       
  2582 }
       
  2583 
       
  2584 static PyObject *
       
  2585 instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
       
  2586 {
       
  2587 	/* Don't rebind an already bound method, or an unbound method
       
  2588 	   of a class that's not a base class of cls. */
       
  2589 
       
  2590 	if (PyMethod_GET_SELF(meth) != NULL) {
       
  2591 		/* Already bound */
       
  2592 		Py_INCREF(meth);
       
  2593 		return meth;
       
  2594 	}
       
  2595 	/* No, it is an unbound method */
       
  2596 	if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
       
  2597 		/* Do subclass test.  If it fails, return meth unchanged. */
       
  2598 		int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
       
  2599 		if (ok < 0)
       
  2600 			return NULL;
       
  2601 		if (!ok) {
       
  2602 			Py_INCREF(meth);
       
  2603 			return meth;
       
  2604 		}
       
  2605 	}
       
  2606 	/* Bind it to obj */
       
  2607 	return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
       
  2608 }
       
  2609 
       
  2610 PyTypeObject PyMethod_Type = {
       
  2611 	PyObject_HEAD_INIT(&PyType_Type)
       
  2612 	0,
       
  2613 	"instancemethod",
       
  2614 	sizeof(PyMethodObject),
       
  2615 	0,
       
  2616 	(destructor)instancemethod_dealloc,	/* tp_dealloc */
       
  2617 	0,					/* tp_print */
       
  2618 	0,					/* tp_getattr */
       
  2619 	0,					/* tp_setattr */
       
  2620 	(cmpfunc)instancemethod_compare,	/* tp_compare */
       
  2621 	(reprfunc)instancemethod_repr,		/* tp_repr */
       
  2622 	0,					/* tp_as_number */
       
  2623 	0,					/* tp_as_sequence */
       
  2624 	0,					/* tp_as_mapping */
       
  2625 	(hashfunc)instancemethod_hash,		/* tp_hash */
       
  2626 	instancemethod_call,			/* tp_call */
       
  2627 	0,					/* tp_str */
       
  2628 	instancemethod_getattro,		/* tp_getattro */
       
  2629 	PyObject_GenericSetAttr,		/* tp_setattro */
       
  2630 	0,					/* tp_as_buffer */
       
  2631 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC  | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
       
  2632 	instancemethod_doc,			/* tp_doc */
       
  2633 	(traverseproc)instancemethod_traverse,	/* tp_traverse */
       
  2634 	0,					/* tp_clear */
       
  2635 	0,					/* tp_richcompare */
       
  2636  	offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
       
  2637 	0,					/* tp_iter */
       
  2638 	0,					/* tp_iternext */
       
  2639 	0,					/* tp_methods */
       
  2640 	instancemethod_memberlist,		/* tp_members */
       
  2641 	instancemethod_getset,			/* tp_getset */
       
  2642 	0,					/* tp_base */
       
  2643 	0,					/* tp_dict */
       
  2644 	instancemethod_descr_get,		/* tp_descr_get */
       
  2645 	0,					/* tp_descr_set */
       
  2646 	0,					/* tp_dictoffset */
       
  2647 	0,					/* tp_init */
       
  2648 	0,					/* tp_alloc */
       
  2649 	instancemethod_new,			/* tp_new */
       
  2650 };
       
  2651 
       
  2652 /* Clear out the free list */
       
  2653 
       
  2654 int
       
  2655 PyMethod_ClearFreeList(void)
       
  2656 {
       
  2657 	int freelist_size = numfree;
       
  2658 	
       
  2659 	while (free_list) {
       
  2660 		PyMethodObject *im = free_list;
       
  2661 		free_list = (PyMethodObject *)(im->im_self);
       
  2662 		PyObject_GC_Del(im);
       
  2663 		numfree--;
       
  2664 	}
       
  2665 	assert(numfree == 0);
       
  2666 	return freelist_size;
       
  2667 }
       
  2668 
       
  2669 void
       
  2670 PyMethod_Fini(void)
       
  2671 {
       
  2672 	(void)PyMethod_ClearFreeList();
       
  2673 }