Changeset 388 for python/vendor/current/Objects/funcobject.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Objects/funcobject.c
r2 r388 10 10 PyFunction_New(PyObject *code, PyObject *globals) 11 11 { 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 12 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, 13 &PyFunction_Type); 14 static PyObject *__name__ = 0; 15 if (op != NULL) { 16 PyObject *doc; 17 PyObject *consts; 18 PyObject *module; 19 op->func_weakreflist = NULL; 20 Py_INCREF(code); 21 op->func_code = code; 22 Py_INCREF(globals); 23 op->func_globals = globals; 24 op->func_name = ((PyCodeObject *)code)->co_name; 25 Py_INCREF(op->func_name); 26 op->func_defaults = NULL; /* No default arguments */ 27 op->func_closure = NULL; 28 consts = ((PyCodeObject *)code)->co_consts; 29 if (PyTuple_Size(consts) >= 1) { 30 doc = PyTuple_GetItem(consts, 0); 31 if (!PyString_Check(doc) && !PyUnicode_Check(doc)) 32 doc = Py_None; 33 } 34 else 35 doc = Py_None; 36 Py_INCREF(doc); 37 op->func_doc = doc; 38 op->func_dict = NULL; 39 op->func_module = NULL; 40 41 /* __module__: If module name is in globals, use it. 42 Otherwise, use None. 43 */ 44 if (!__name__) { 45 __name__ = PyString_InternFromString("__name__"); 46 if (!__name__) { 47 Py_DECREF(op); 48 return NULL; 49 } 50 } 51 module = PyDict_GetItem(globals, __name__); 52 if (module) { 53 Py_INCREF(module); 54 op->func_module = module; 55 } 56 } 57 else 58 return NULL; 59 _PyObject_GC_TRACK(op); 60 return (PyObject *)op; 61 61 } 62 62 … … 64 64 PyFunction_GetCode(PyObject *op) 65 65 { 66 67 68 69 70 66 if (!PyFunction_Check(op)) { 67 PyErr_BadInternalCall(); 68 return NULL; 69 } 70 return ((PyFunctionObject *) op) -> func_code; 71 71 } 72 72 … … 74 74 PyFunction_GetGlobals(PyObject *op) 75 75 { 76 77 78 79 80 76 if (!PyFunction_Check(op)) { 77 PyErr_BadInternalCall(); 78 return NULL; 79 } 80 return ((PyFunctionObject *) op) -> func_globals; 81 81 } 82 82 … … 84 84 PyFunction_GetModule(PyObject *op) 85 85 { 86 87 88 89 90 86 if (!PyFunction_Check(op)) { 87 PyErr_BadInternalCall(); 88 return NULL; 89 } 90 return ((PyFunctionObject *) op) -> func_module; 91 91 } 92 92 … … 94 94 PyFunction_GetDefaults(PyObject *op) 95 95 { 96 97 98 99 100 96 if (!PyFunction_Check(op)) { 97 PyErr_BadInternalCall(); 98 return NULL; 99 } 100 return ((PyFunctionObject *) op) -> func_defaults; 101 101 } 102 102 … … 104 104 PyFunction_SetDefaults(PyObject *op, PyObject *defaults) 105 105 { 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 106 if (!PyFunction_Check(op)) { 107 PyErr_BadInternalCall(); 108 return -1; 109 } 110 if (defaults == Py_None) 111 defaults = NULL; 112 else if (defaults && PyTuple_Check(defaults)) { 113 Py_INCREF(defaults); 114 } 115 else { 116 PyErr_SetString(PyExc_SystemError, "non-tuple default args"); 117 return -1; 118 } 119 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults); 120 ((PyFunctionObject *) op) -> func_defaults = defaults; 121 return 0; 122 122 } 123 123 … … 125 125 PyFunction_GetClosure(PyObject *op) 126 126 { 127 128 129 130 131 127 if (!PyFunction_Check(op)) { 128 PyErr_BadInternalCall(); 129 return NULL; 130 } 131 return ((PyFunctionObject *) op) -> func_closure; 132 132 } 133 133 … … 135 135 PyFunction_SetClosure(PyObject *op, PyObject *closure) 136 136 { 137 138 139 140 141 142 143 144 145 146 147 PyErr_Format(PyExc_SystemError, 148 149 150 151 152 153 154 137 if (!PyFunction_Check(op)) { 138 PyErr_BadInternalCall(); 139 return -1; 140 } 141 if (closure == Py_None) 142 closure = NULL; 143 else if (PyTuple_Check(closure)) { 144 Py_INCREF(closure); 145 } 146 else { 147 PyErr_Format(PyExc_SystemError, 148 "expected tuple for closure, got '%.100s'", 149 closure->ob_type->tp_name); 150 return -1; 151 } 152 Py_XDECREF(((PyFunctionObject *) op) -> func_closure); 153 ((PyFunctionObject *) op) -> func_closure = closure; 154 return 0; 155 155 } 156 156 … … 160 160 161 161 static PyMemberDef func_memberlist[] = { 162 163 164 165 166 167 168 169 170 171 172 173 162 {"func_closure", T_OBJECT, OFF(func_closure), 163 RESTRICTED|READONLY}, 164 {"__closure__", T_OBJECT, OFF(func_closure), 165 RESTRICTED|READONLY}, 166 {"func_doc", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED}, 167 {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED}, 168 {"func_globals", T_OBJECT, OFF(func_globals), 169 RESTRICTED|READONLY}, 170 {"__globals__", T_OBJECT, OFF(func_globals), 171 RESTRICTED|READONLY}, 172 {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED}, 173 {NULL} /* Sentinel */ 174 174 }; 175 175 … … 177 177 restricted(void) 178 178 { 179 180 181 182 183 179 if (!PyEval_GetRestricted()) 180 return 0; 181 PyErr_SetString(PyExc_RuntimeError, 182 "function attributes not accessible in restricted mode"); 183 return 1; 184 184 } 185 185 … … 187 187 func_get_dict(PyFunctionObject *op) 188 188 { 189 190 191 192 193 194 195 196 197 189 if (restricted()) 190 return NULL; 191 if (op->func_dict == NULL) { 192 op->func_dict = PyDict_New(); 193 if (op->func_dict == NULL) 194 return NULL; 195 } 196 Py_INCREF(op->func_dict); 197 return op->func_dict; 198 198 } 199 199 … … 201 201 func_set_dict(PyFunctionObject *op, PyObject *value) 202 202 { 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 203 PyObject *tmp; 204 205 if (restricted()) 206 return -1; 207 /* It is illegal to del f.func_dict */ 208 if (value == NULL) { 209 PyErr_SetString(PyExc_TypeError, 210 "function's dictionary may not be deleted"); 211 return -1; 212 } 213 /* Can only set func_dict to a dictionary */ 214 if (!PyDict_Check(value)) { 215 PyErr_SetString(PyExc_TypeError, 216 "setting function's dictionary to a non-dict"); 217 return -1; 218 } 219 tmp = op->func_dict; 220 Py_INCREF(value); 221 op->func_dict = value; 222 Py_XDECREF(tmp); 223 return 0; 224 224 } 225 225 … … 227 227 func_get_code(PyFunctionObject *op) 228 228 { 229 230 231 232 229 if (restricted()) 230 return NULL; 231 Py_INCREF(op->func_code); 232 return op->func_code; 233 233 } 234 234 … … 236 236 func_set_code(PyFunctionObject *op, PyObject *value) 237 237 { 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 238 PyObject *tmp; 239 Py_ssize_t nfree, nclosure; 240 241 if (restricted()) 242 return -1; 243 /* Not legal to del f.func_code or to set it to anything 244 * other than a code object. */ 245 if (value == NULL || !PyCode_Check(value)) { 246 PyErr_SetString(PyExc_TypeError, 247 "__code__ must be set to a code object"); 248 return -1; 249 } 250 nfree = PyCode_GetNumFree((PyCodeObject *)value); 251 nclosure = (op->func_closure == NULL ? 0 : 252 PyTuple_GET_SIZE(op->func_closure)); 253 if (nclosure != nfree) { 254 PyErr_Format(PyExc_ValueError, 255 "%s() requires a code object with %zd free vars," 256 " not %zd", 257 PyString_AsString(op->func_name), 258 nclosure, nfree); 259 return -1; 260 } 261 tmp = op->func_code; 262 Py_INCREF(value); 263 op->func_code = value; 264 Py_DECREF(tmp); 265 return 0; 266 266 } 267 267 … … 269 269 func_get_name(PyFunctionObject *op) 270 270 { 271 272 271 Py_INCREF(op->func_name); 272 return op->func_name; 273 273 } 274 274 … … 276 276 func_set_name(PyFunctionObject *op, PyObject *value) 277 277 { 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 278 PyObject *tmp; 279 280 if (restricted()) 281 return -1; 282 /* Not legal to del f.func_name or to set it to anything 283 * other than a string object. */ 284 if (value == NULL || !PyString_Check(value)) { 285 PyErr_SetString(PyExc_TypeError, 286 "__name__ must be set to a string object"); 287 return -1; 288 } 289 tmp = op->func_name; 290 Py_INCREF(value); 291 op->func_name = value; 292 Py_DECREF(tmp); 293 return 0; 294 294 } 295 295 … … 297 297 func_get_defaults(PyFunctionObject *op) 298 298 { 299 300 301 302 303 304 305 306 299 if (restricted()) 300 return NULL; 301 if (op->func_defaults == NULL) { 302 Py_INCREF(Py_None); 303 return Py_None; 304 } 305 Py_INCREF(op->func_defaults); 306 return op->func_defaults; 307 307 } 308 308 … … 310 310 func_set_defaults(PyFunctionObject *op, PyObject *value) 311 311 { 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 312 PyObject *tmp; 313 314 if (restricted()) 315 return -1; 316 /* Legal to del f.func_defaults. 317 * Can only set func_defaults to NULL or a tuple. */ 318 if (value == Py_None) 319 value = NULL; 320 if (value != NULL && !PyTuple_Check(value)) { 321 PyErr_SetString(PyExc_TypeError, 322 "__defaults__ must be set to a tuple object"); 323 return -1; 324 } 325 tmp = op->func_defaults; 326 Py_XINCREF(value); 327 op->func_defaults = value; 328 Py_XDECREF(tmp); 329 return 0; 330 330 } 331 331 332 332 static PyGetSetDef func_getsetlist[] = { 333 334 335 336 337 338 339 340 341 342 343 333 {"func_code", (getter)func_get_code, (setter)func_set_code}, 334 {"__code__", (getter)func_get_code, (setter)func_set_code}, 335 {"func_defaults", (getter)func_get_defaults, 336 (setter)func_set_defaults}, 337 {"__defaults__", (getter)func_get_defaults, 338 (setter)func_set_defaults}, 339 {"func_dict", (getter)func_get_dict, (setter)func_set_dict}, 340 {"__dict__", (getter)func_get_dict, (setter)func_set_dict}, 341 {"func_name", (getter)func_get_name, (setter)func_set_name}, 342 {"__name__", (getter)func_get_name, (setter)func_set_name}, 343 {NULL} /* Sentinel */ 344 344 }; 345 345 … … 354 354 /* func_new() maintains the following invariants for closures. The 355 355 closure must correspond to the free variables of the code object. 356 357 if len(code.co_freevars) == 0: 358 356 357 if len(code.co_freevars) == 0: 358 closure = NULL 359 359 else: 360 360 len(closure) == len(code.co_freevars) 361 361 for every elt in closure, type(elt) == cell 362 362 */ … … 365 365 func_new(PyTypeObject* type, PyObject* args, PyObject* kw) 366 366 { 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 367 PyCodeObject *code; 368 PyObject *globals; 369 PyObject *name = Py_None; 370 PyObject *defaults = Py_None; 371 PyObject *closure = Py_None; 372 PyFunctionObject *newfunc; 373 Py_ssize_t nfree, nclosure; 374 static char *kwlist[] = {"code", "globals", "name", 375 "argdefs", "closure", 0}; 376 377 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", 378 kwlist, 379 &PyCode_Type, &code, 380 &PyDict_Type, &globals, 381 &name, &defaults, &closure)) 382 return NULL; 383 if (name != Py_None && !PyString_Check(name)) { 384 PyErr_SetString(PyExc_TypeError, 385 "arg 3 (name) must be None or string"); 386 return NULL; 387 } 388 if (defaults != Py_None && !PyTuple_Check(defaults)) { 389 PyErr_SetString(PyExc_TypeError, 390 "arg 4 (defaults) must be None or tuple"); 391 return NULL; 392 } 393 nfree = PyTuple_GET_SIZE(code->co_freevars); 394 if (!PyTuple_Check(closure)) { 395 if (nfree && closure == Py_None) { 396 PyErr_SetString(PyExc_TypeError, 397 "arg 5 (closure) must be tuple"); 398 return NULL; 399 } 400 else if (closure != Py_None) { 401 PyErr_SetString(PyExc_TypeError, 402 "arg 5 (closure) must be None or tuple"); 403 return NULL; 404 } 405 } 406 407 /* check that the closure is well-formed */ 408 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure); 409 if (nfree != nclosure) 410 return PyErr_Format(PyExc_ValueError, 411 "%s requires closure of length %zd, not %zd", 412 PyString_AS_STRING(code->co_name), 413 nfree, nclosure); 414 if (nclosure) { 415 Py_ssize_t i; 416 for (i = 0; i < nclosure; i++) { 417 PyObject *o = PyTuple_GET_ITEM(closure, i); 418 if (!PyCell_Check(o)) { 419 return PyErr_Format(PyExc_TypeError, 420 "arg 5 (closure) expected cell, found %s", 421 o->ob_type->tp_name); 422 } 423 } 424 } 425 426 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, 427 globals); 428 if (newfunc == NULL) 429 return NULL; 430 431 if (name != Py_None) { 432 Py_INCREF(name); 433 Py_DECREF(newfunc->func_name); 434 newfunc->func_name = name; 435 } 436 if (defaults != Py_None) { 437 Py_INCREF(defaults); 438 newfunc->func_defaults = defaults; 439 } 440 if (closure != Py_None) { 441 Py_INCREF(closure); 442 newfunc->func_closure = closure; 443 } 444 445 return (PyObject *)newfunc; 446 446 } 447 447 … … 449 449 func_dealloc(PyFunctionObject *op) 450 450 { 451 452 453 454 455 456 457 458 459 460 461 462 451 _PyObject_GC_UNTRACK(op); 452 if (op->func_weakreflist != NULL) 453 PyObject_ClearWeakRefs((PyObject *) op); 454 Py_DECREF(op->func_code); 455 Py_DECREF(op->func_globals); 456 Py_XDECREF(op->func_module); 457 Py_DECREF(op->func_name); 458 Py_XDECREF(op->func_defaults); 459 Py_XDECREF(op->func_doc); 460 Py_XDECREF(op->func_dict); 461 Py_XDECREF(op->func_closure); 462 PyObject_GC_Del(op); 463 463 } 464 464 … … 466 466 func_repr(PyFunctionObject *op) 467 467 { 468 469 470 468 return PyString_FromFormat("<function %s at %p>", 469 PyString_AsString(op->func_name), 470 op); 471 471 } 472 472 … … 474 474 func_traverse(PyFunctionObject *f, visitproc visit, void *arg) 475 475 { 476 477 478 479 480 481 482 483 484 476 Py_VISIT(f->func_code); 477 Py_VISIT(f->func_globals); 478 Py_VISIT(f->func_module); 479 Py_VISIT(f->func_defaults); 480 Py_VISIT(f->func_doc); 481 Py_VISIT(f->func_name); 482 Py_VISIT(f->func_dict); 483 Py_VISIT(f->func_closure); 484 return 0; 485 485 } 486 486 … … 488 488 function_call(PyObject *func, PyObject *arg, PyObject *kw) 489 489 { 490 PyObject *result; 491 PyObject *argdefs; 492 PyObject **d, **k; 493 Py_ssize_t nk, nd; 494 495 argdefs = PyFunction_GET_DEFAULTS(func); 496 if (argdefs != NULL && PyTuple_Check(argdefs)) { 497 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); 498 nd = PyTuple_Size(argdefs); 499 } 500 else { 501 d = NULL; 502 nd = 0; 503 } 504 505 if (kw != NULL && PyDict_Check(kw)) { 506 Py_ssize_t pos, i; 507 nk = PyDict_Size(kw); 508 k = PyMem_NEW(PyObject *, 2*nk); 509 if (k == NULL) { 510 PyErr_NoMemory(); 511 return NULL; 512 } 513 pos = i = 0; 514 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) 515 i += 2; 516 nk = i/2; 517 /* XXX This is broken if the caller deletes dict items! */ 518 } 519 else { 520 k = NULL; 521 nk = 0; 522 } 523 524 result = PyEval_EvalCodeEx( 525 (PyCodeObject *)PyFunction_GET_CODE(func), 526 PyFunction_GET_GLOBALS(func), (PyObject *)NULL, 527 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg), 528 k, nk, d, nd, 529 PyFunction_GET_CLOSURE(func)); 530 531 if (k != NULL) 532 PyMem_DEL(k); 533 534 return result; 490 PyObject *result; 491 PyObject *argdefs; 492 PyObject *kwtuple = NULL; 493 PyObject **d, **k; 494 Py_ssize_t nk, nd; 495 496 argdefs = PyFunction_GET_DEFAULTS(func); 497 if (argdefs != NULL && PyTuple_Check(argdefs)) { 498 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); 499 nd = PyTuple_GET_SIZE(argdefs); 500 } 501 else { 502 d = NULL; 503 nd = 0; 504 } 505 506 if (kw != NULL && PyDict_Check(kw)) { 507 Py_ssize_t pos, i; 508 nk = PyDict_Size(kw); 509 kwtuple = PyTuple_New(2*nk); 510 if (kwtuple == NULL) 511 return NULL; 512 k = &PyTuple_GET_ITEM(kwtuple, 0); 513 pos = i = 0; 514 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) { 515 Py_INCREF(k[i]); 516 Py_INCREF(k[i+1]); 517 i += 2; 518 } 519 nk = i/2; 520 } 521 else { 522 k = NULL; 523 nk = 0; 524 } 525 526 result = PyEval_EvalCodeEx( 527 (PyCodeObject *)PyFunction_GET_CODE(func), 528 PyFunction_GET_GLOBALS(func), (PyObject *)NULL, 529 &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg), 530 k, nk, d, nd, 531 PyFunction_GET_CLOSURE(func)); 532 533 Py_XDECREF(kwtuple); 534 535 return result; 535 536 } 536 537 … … 539 540 func_descr_get(PyObject *func, PyObject *obj, PyObject *type) 540 541 { 541 542 543 542 if (obj == Py_None) 543 obj = NULL; 544 return PyMethod_New(func, obj, type); 544 545 } 545 546 546 547 PyTypeObject PyFunction_Type = { 547 548 549 550 551 (destructor)func_dealloc,/* tp_dealloc */552 0,/* tp_print */553 0,/* tp_getattr */554 0,/* tp_setattr */555 0,/* tp_compare */556 (reprfunc)func_repr,/* tp_repr */557 0,/* tp_as_number */558 0,/* tp_as_sequence */559 0,/* tp_as_mapping */560 0,/* tp_hash */561 function_call,/* tp_call */562 0,/* tp_str */563 PyObject_GenericGetAttr,/* tp_getattro */564 PyObject_GenericSetAttr,/* tp_setattro */565 0,/* tp_as_buffer */566 567 func_doc,/* tp_doc */568 (traverseproc)func_traverse,/* tp_traverse */569 0,/* tp_clear */570 0,/* tp_richcompare */571 572 0,/* tp_iter */573 0,/* tp_iternext */574 0,/* tp_methods */575 func_memberlist,/* tp_members */576 func_getsetlist,/* tp_getset */577 0,/* tp_base */578 0,/* tp_dict */579 func_descr_get,/* tp_descr_get */580 0,/* tp_descr_set */581 offsetof(PyFunctionObject, func_dict),/* tp_dictoffset */582 0,/* tp_init */583 0,/* tp_alloc */584 func_new,/* tp_new */548 PyVarObject_HEAD_INIT(&PyType_Type, 0) 549 "function", 550 sizeof(PyFunctionObject), 551 0, 552 (destructor)func_dealloc, /* tp_dealloc */ 553 0, /* tp_print */ 554 0, /* tp_getattr */ 555 0, /* tp_setattr */ 556 0, /* tp_compare */ 557 (reprfunc)func_repr, /* tp_repr */ 558 0, /* tp_as_number */ 559 0, /* tp_as_sequence */ 560 0, /* tp_as_mapping */ 561 0, /* tp_hash */ 562 function_call, /* tp_call */ 563 0, /* tp_str */ 564 PyObject_GenericGetAttr, /* tp_getattro */ 565 PyObject_GenericSetAttr, /* tp_setattro */ 566 0, /* tp_as_buffer */ 567 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 568 func_doc, /* tp_doc */ 569 (traverseproc)func_traverse, /* tp_traverse */ 570 0, /* tp_clear */ 571 0, /* tp_richcompare */ 572 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */ 573 0, /* tp_iter */ 574 0, /* tp_iternext */ 575 0, /* tp_methods */ 576 func_memberlist, /* tp_members */ 577 func_getsetlist, /* tp_getset */ 578 0, /* tp_base */ 579 0, /* tp_dict */ 580 func_descr_get, /* tp_descr_get */ 581 0, /* tp_descr_set */ 582 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */ 583 0, /* tp_init */ 584 0, /* tp_alloc */ 585 func_new, /* tp_new */ 585 586 }; 586 587 … … 593 594 594 595 class C: 595 596 597 596 def f(cls, arg1, arg2, ...): ... 597 f = classmethod(f) 598 598 599 It can be called either on the class (e.g. C.f()) or on an instance 599 600 (e.g. C().f()); the instance is ignored except for its class. … … 606 607 607 608 typedef struct { 608 609 609 PyObject_HEAD 610 PyObject *cm_callable; 610 611 } classmethod; 611 612 … … 613 614 cm_dealloc(classmethod *cm) 614 615 { 615 616 617 616 _PyObject_GC_UNTRACK((PyObject *)cm); 617 Py_XDECREF(cm->cm_callable); 618 Py_TYPE(cm)->tp_free((PyObject *)cm); 618 619 } 619 620 … … 621 622 cm_traverse(classmethod *cm, visitproc visit, void *arg) 622 623 { 623 624 624 Py_VISIT(cm->cm_callable); 625 return 0; 625 626 } 626 627 … … 628 629 cm_clear(classmethod *cm) 629 630 { 630 631 631 Py_CLEAR(cm->cm_callable); 632 return 0; 632 633 } 633 634 … … 636 637 cm_descr_get(PyObject *self, PyObject *obj, PyObject *type) 637 638 { 638 639 640 641 642 643 644 645 646 647 648 639 classmethod *cm = (classmethod *)self; 640 641 if (cm->cm_callable == NULL) { 642 PyErr_SetString(PyExc_RuntimeError, 643 "uninitialized classmethod object"); 644 return NULL; 645 } 646 if (type == NULL) 647 type = (PyObject *)(Py_TYPE(obj)); 648 return PyMethod_New(cm->cm_callable, 649 type, (PyObject *)(Py_TYPE(type))); 649 650 } 650 651 … … 652 653 cm_init(PyObject *self, PyObject *args, PyObject *kwds) 653 654 { 654 classmethod *cm = (classmethod *)self; 655 PyObject *callable; 656 657 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable)) 658 return -1; 659 if (!_PyArg_NoKeywords("classmethod", kwds)) 660 return -1; 661 if (!PyCallable_Check(callable)) { 662 PyErr_Format(PyExc_TypeError, "'%s' object is not callable", 663 callable->ob_type->tp_name); 664 return -1; 665 } 666 667 Py_INCREF(callable); 668 cm->cm_callable = callable; 669 return 0; 670 } 655 classmethod *cm = (classmethod *)self; 656 PyObject *callable; 657 658 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable)) 659 return -1; 660 if (!_PyArg_NoKeywords("classmethod", kwds)) 661 return -1; 662 Py_INCREF(callable); 663 cm->cm_callable = callable; 664 return 0; 665 } 666 667 static PyMemberDef cm_memberlist[] = { 668 {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY}, 669 {NULL} /* Sentinel */ 670 }; 671 671 672 672 PyDoc_STRVAR(classmethod_doc, … … 692 692 693 693 PyTypeObject PyClassMethod_Type = { 694 695 696 697 698 (destructor)cm_dealloc,/* tp_dealloc */699 0,/* tp_print */700 0,/* tp_getattr */701 0,/* tp_setattr */702 0,/* tp_compare */703 0,/* tp_repr */704 0,/* tp_as_number */705 0,/* tp_as_sequence */706 0,/* tp_as_mapping */707 0,/* tp_hash */708 0,/* tp_call */709 0,/* tp_str */710 PyObject_GenericGetAttr,/* tp_getattro */711 0,/* tp_setattro */712 0,/* tp_as_buffer */713 714 classmethod_doc,/* tp_doc */715 (traverseproc)cm_traverse,/* tp_traverse */716 (inquiry)cm_clear,/* tp_clear */717 0,/* tp_richcompare */718 0,/* tp_weaklistoffset */719 0,/* tp_iter */720 0,/* tp_iternext */721 0,/* tp_methods */722 0,/* tp_members */723 0,/* tp_getset */724 0,/* tp_base */725 0,/* tp_dict */726 cm_descr_get,/* tp_descr_get */727 0,/* tp_descr_set */728 0,/* tp_dictoffset */729 cm_init,/* tp_init */730 PyType_GenericAlloc,/* tp_alloc */731 PyType_GenericNew,/* tp_new */732 PyObject_GC_Del,/* tp_free */694 PyVarObject_HEAD_INIT(&PyType_Type, 0) 695 "classmethod", 696 sizeof(classmethod), 697 0, 698 (destructor)cm_dealloc, /* tp_dealloc */ 699 0, /* tp_print */ 700 0, /* tp_getattr */ 701 0, /* tp_setattr */ 702 0, /* tp_compare */ 703 0, /* tp_repr */ 704 0, /* tp_as_number */ 705 0, /* tp_as_sequence */ 706 0, /* tp_as_mapping */ 707 0, /* tp_hash */ 708 0, /* tp_call */ 709 0, /* tp_str */ 710 PyObject_GenericGetAttr, /* tp_getattro */ 711 0, /* tp_setattro */ 712 0, /* tp_as_buffer */ 713 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 714 classmethod_doc, /* tp_doc */ 715 (traverseproc)cm_traverse, /* tp_traverse */ 716 (inquiry)cm_clear, /* tp_clear */ 717 0, /* tp_richcompare */ 718 0, /* tp_weaklistoffset */ 719 0, /* tp_iter */ 720 0, /* tp_iternext */ 721 0, /* tp_methods */ 722 cm_memberlist, /* tp_members */ 723 0, /* tp_getset */ 724 0, /* tp_base */ 725 0, /* tp_dict */ 726 cm_descr_get, /* tp_descr_get */ 727 0, /* tp_descr_set */ 728 0, /* tp_dictoffset */ 729 cm_init, /* tp_init */ 730 PyType_GenericAlloc, /* tp_alloc */ 731 PyType_GenericNew, /* tp_new */ 732 PyObject_GC_Del, /* tp_free */ 733 733 }; 734 734 … … 736 736 PyClassMethod_New(PyObject *callable) 737 737 { 738 739 740 741 742 743 744 738 classmethod *cm = (classmethod *) 739 PyType_GenericAlloc(&PyClassMethod_Type, 0); 740 if (cm != NULL) { 741 Py_INCREF(callable); 742 cm->cm_callable = callable; 743 } 744 return (PyObject *)cm; 745 745 } 746 746 … … 752 752 753 753 class C: 754 755 754 def f(arg1, arg2, ...): ... 755 f = staticmethod(f) 756 756 757 757 It can be called either on the class (e.g. C.f()) or on an instance … … 763 763 764 764 typedef struct { 765 766 765 PyObject_HEAD 766 PyObject *sm_callable; 767 767 } staticmethod; 768 768 … … 770 770 sm_dealloc(staticmethod *sm) 771 771 { 772 773 774 772 _PyObject_GC_UNTRACK((PyObject *)sm); 773 Py_XDECREF(sm->sm_callable); 774 Py_TYPE(sm)->tp_free((PyObject *)sm); 775 775 } 776 776 … … 778 778 sm_traverse(staticmethod *sm, visitproc visit, void *arg) 779 779 { 780 781 780 Py_VISIT(sm->sm_callable); 781 return 0; 782 782 } 783 783 … … 785 785 sm_clear(staticmethod *sm) 786 786 { 787 Py_XDECREF(sm->sm_callable); 788 sm->sm_callable = NULL; 789 790 return 0; 787 Py_CLEAR(sm->sm_callable); 788 return 0; 791 789 } 792 790 … … 794 792 sm_descr_get(PyObject *self, PyObject *obj, PyObject *type) 795 793 { 796 797 798 799 800 801 802 803 804 794 staticmethod *sm = (staticmethod *)self; 795 796 if (sm->sm_callable == NULL) { 797 PyErr_SetString(PyExc_RuntimeError, 798 "uninitialized staticmethod object"); 799 return NULL; 800 } 801 Py_INCREF(sm->sm_callable); 802 return sm->sm_callable; 805 803 } 806 804 … … 808 806 sm_init(PyObject *self, PyObject *args, PyObject *kwds) 809 807 { 810 staticmethod *sm = (staticmethod *)self; 811 PyObject *callable; 812 813 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable)) 814 return -1; 815 if (!_PyArg_NoKeywords("staticmethod", kwds)) 816 return -1; 817 Py_INCREF(callable); 818 sm->sm_callable = callable; 819 return 0; 820 } 808 staticmethod *sm = (staticmethod *)self; 809 PyObject *callable; 810 811 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable)) 812 return -1; 813 if (!_PyArg_NoKeywords("staticmethod", kwds)) 814 return -1; 815 Py_INCREF(callable); 816 sm->sm_callable = callable; 817 return 0; 818 } 819 820 static PyMemberDef sm_memberlist[] = { 821 {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY}, 822 {NULL} /* Sentinel */ 823 }; 821 824 822 825 PyDoc_STRVAR(staticmethod_doc, … … 829 832 \n\ 830 833 class C:\n\ 831 832 834 def f(arg1, arg2, ...): ...\n\ 835 f = staticmethod(f)\n\ 833 836 \n\ 834 837 It can be called either on the class (e.g. C.f()) or on an instance\n\ … … 839 842 840 843 PyTypeObject PyStaticMethod_Type = { 841 842 843 844 845 (destructor)sm_dealloc,/* tp_dealloc */846 0,/* tp_print */847 0,/* tp_getattr */848 0,/* tp_setattr */849 0,/* tp_compare */850 0,/* tp_repr */851 0,/* tp_as_number */852 0,/* tp_as_sequence */853 0,/* tp_as_mapping */854 0,/* tp_hash */855 0,/* tp_call */856 0,/* tp_str */857 PyObject_GenericGetAttr,/* tp_getattro */858 0,/* tp_setattro */859 0,/* tp_as_buffer */860 861 staticmethod_doc,/* tp_doc */862 (traverseproc)sm_traverse,/* tp_traverse */863 (inquiry)sm_clear,/* tp_clear */864 0,/* tp_richcompare */865 0,/* tp_weaklistoffset */866 0,/* tp_iter */867 0,/* tp_iternext */868 0,/* tp_methods */869 0,/* tp_members */870 0,/* tp_getset */871 0,/* tp_base */872 0,/* tp_dict */873 sm_descr_get,/* tp_descr_get */874 0,/* tp_descr_set */875 0,/* tp_dictoffset */876 sm_init,/* tp_init */877 PyType_GenericAlloc,/* tp_alloc */878 PyType_GenericNew,/* tp_new */879 PyObject_GC_Del,/* tp_free */844 PyVarObject_HEAD_INIT(&PyType_Type, 0) 845 "staticmethod", 846 sizeof(staticmethod), 847 0, 848 (destructor)sm_dealloc, /* tp_dealloc */ 849 0, /* tp_print */ 850 0, /* tp_getattr */ 851 0, /* tp_setattr */ 852 0, /* tp_compare */ 853 0, /* tp_repr */ 854 0, /* tp_as_number */ 855 0, /* tp_as_sequence */ 856 0, /* tp_as_mapping */ 857 0, /* tp_hash */ 858 0, /* tp_call */ 859 0, /* tp_str */ 860 PyObject_GenericGetAttr, /* tp_getattro */ 861 0, /* tp_setattro */ 862 0, /* tp_as_buffer */ 863 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 864 staticmethod_doc, /* tp_doc */ 865 (traverseproc)sm_traverse, /* tp_traverse */ 866 (inquiry)sm_clear, /* tp_clear */ 867 0, /* tp_richcompare */ 868 0, /* tp_weaklistoffset */ 869 0, /* tp_iter */ 870 0, /* tp_iternext */ 871 0, /* tp_methods */ 872 sm_memberlist, /* tp_members */ 873 0, /* tp_getset */ 874 0, /* tp_base */ 875 0, /* tp_dict */ 876 sm_descr_get, /* tp_descr_get */ 877 0, /* tp_descr_set */ 878 0, /* tp_dictoffset */ 879 sm_init, /* tp_init */ 880 PyType_GenericAlloc, /* tp_alloc */ 881 PyType_GenericNew, /* tp_new */ 882 PyObject_GC_Del, /* tp_free */ 880 883 }; 881 884 … … 883 886 PyStaticMethod_New(PyObject *callable) 884 887 { 885 886 887 888 889 890 891 892 } 888 staticmethod *sm = (staticmethod *) 889 PyType_GenericAlloc(&PyStaticMethod_Type, 0); 890 if (sm != NULL) { 891 Py_INCREF(callable); 892 sm->sm_callable = callable; 893 } 894 return (PyObject *)sm; 895 }
Note:
See TracChangeset
for help on using the changeset viewer.