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