static PyObject * cell_richcompare(PyObject *a, PyObject *b, int op) { int result; PyObject *v; /* neither argument should be NULL, unless something's gone wrong */ assert(a != NULL && b != NULL); /* both arguments should be instances of PyCellObject */ if (!PyCell_Check(a) || !PyCell_Check(b)) { v = Py_NotImplemented; Py_INCREF(v); return v; } /* compare cells by contents; empty cells come before anything else */ a = ((PyCellObject *)a)->ob_ref; b = ((PyCellObject *)b)->ob_ref; if (a != NULL && b != NULL) return PyObject_RichCompare(a, b, op); result = (b == NULL) - (a == NULL); switch (op) { case Py_EQ: v = TEST_COND(result == 0); break; case Py_NE: v = TEST_COND(result != 0); break; case Py_LE: v = TEST_COND(result <= 0); break; case Py_GE: v = TEST_COND(result >= 0); break; case Py_LT: v = TEST_COND(result < 0); break; case Py_GT: v = TEST_COND(result > 0); break; default: PyErr_BadArgument(); return NULL; } Py_INCREF(v); return v; }
static void dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values, int deref, int clear) { Py_ssize_t j; assert(PyTuple_Check(map)); assert(PyDict_Check(dict)); assert(PyTuple_Size(map) >= nmap); for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = PyObject_GetItem(dict, key); assert(PyString_Check(key)); /* We only care about NULLs if clear is true. */ if (value == NULL) { PyErr_Clear(); if (!clear) continue; } if (deref) { assert(PyCell_Check(values[j])); if (PyCell_GET(values[j]) != value) { if (PyCell_Set(values[j], value) < 0) PyErr_Clear(); } } else if (values[j] != value) { Py_XINCREF(value); Py_XDECREF(values[j]); values[j] = value; } Py_XDECREF(value); } }
static void map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values, int deref) { Py_ssize_t j; assert(PyTuple_Check(map)); assert(PyDict_Check(dict)); assert(PyTuple_Size(map) >= nmap); for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; assert(PyString_Check(key)); if (deref) { assert(PyCell_Check(value)); value = PyCell_GET(value); } if (value == NULL) { if (PyObject_DelItem(dict, key) != 0) PyErr_Clear(); } else { if (PyObject_SetItem(dict, key, value) != 0) PyErr_Clear(); } } }
static int map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values, int deref) { Py_ssize_t j; assert(PyTuple_Check(map)); assert(PyDict_Check(dict)); assert(PyTuple_Size(map) >= nmap); for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; assert(PyUnicode_Check(key)); if (deref) { assert(PyCell_Check(value)); value = PyCell_GET(value); } if (value == NULL) { if (PyObject_DelItem(dict, key) != 0) { if (PyErr_ExceptionMatches(PyExc_KeyError)) PyErr_Clear(); else return -1; } } else { if (PyObject_SetItem(dict, key, value) != 0) return -1; } } return 0; }
int PyCell_Set(PyObject *op, PyObject *obj) { if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return -1; } else { PyObject* oldobj; JyObject* jy; oldobj = PyCell_GET(op); Py_XINCREF(obj); PyCell_SET(op, obj); updateJyGCHeadLink(op, AS_JY_WITH_GC(op), 0, obj, obj ? AS_JY(obj) : NULL); Py_XDECREF(oldobj); jy = AS_JY_WITH_GC(op); if (JyObject_IS_INITIALIZED(jy)) { env(-1); (*env)->SetObjectField(env, jy->jy, pyCell_ob_refField, JyNI_JythonPyObject_FromPyObject(obj)); } return 0; } }
PyObject * PyCell_Get(PyObject *op) { if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return NULL; } Py_XINCREF(((PyCellObject*)op)->ob_ref); return PyCell_GET(op); }
static PyObject * cell_richcompare(PyObject *a, PyObject *b, int op) { /* neither argument should be NULL, unless something's gone wrong */ assert(a != NULL && b != NULL); /* both arguments should be instances of PyCellObject */ if (!PyCell_Check(a) || !PyCell_Check(b)) { Py_RETURN_NOTIMPLEMENTED; } /* compare cells by contents; empty cells come before anything else */ a = ((PyCellObject *)a)->ob_ref; b = ((PyCellObject *)b)->ob_ref; if (a != NULL && b != NULL) return PyObject_RichCompare(a, b, op); Py_RETURN_RICHCOMPARE(b == NULL, a == NULL, op); }
int PyCell_Set(PyObject *op, PyObject *obj) { if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return -1; } Py_XDECREF(((PyCellObject*)op)->ob_ref); Py_XINCREF(obj); PyCell_SET(op, obj); return 0; }
int PyCell_Set(PyObject *op, PyObject *obj) { PyObject* oldobj; if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return -1; } oldobj = PyCell_GET(op); Py_XINCREF(obj); PyCell_SET(op, obj); Py_XDECREF(oldobj); return 0; }
static PyObject * func_new(PyTypeObject* type, PyObject* args, PyObject* kw) { PyCodeObject *code; PyObject *globals; PyObject *name = Py_None; PyObject *defaults = Py_None; PyObject *closure = Py_None; PyFunctionObject *newfunc; Py_ssize_t nfree, nclosure; static char *kwlist[] = {"code", "globals", "name", "argdefs", "closure", 0}; if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", kwlist, &PyCode_Type, &code, &PyDict_Type, &globals, &name, &defaults, &closure)) return NULL; if (name != Py_None && !PyUnicode_Check(name)) { PyErr_SetString(PyExc_TypeError, "arg 3 (name) must be None or string"); return NULL; } if (defaults != Py_None && !PyTuple_Check(defaults)) { PyErr_SetString(PyExc_TypeError, "arg 4 (defaults) must be None or tuple"); return NULL; } nfree = PyTuple_GET_SIZE(code->co_freevars); if (!PyTuple_Check(closure)) { if (nfree && closure == Py_None) { PyErr_SetString(PyExc_TypeError, "arg 5 (closure) must be tuple"); return NULL; } else if (closure != Py_None) { PyErr_SetString(PyExc_TypeError, "arg 5 (closure) must be None or tuple"); return NULL; } } /* check that the closure is well-formed */ nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure); if (nfree != nclosure) return PyErr_Format(PyExc_ValueError, "%U requires closure of length %zd, not %zd", code->co_name, nfree, nclosure); if (nclosure) { Py_ssize_t i; for (i = 0; i < nclosure; i++) { PyObject *o = PyTuple_GET_ITEM(closure, i); if (!PyCell_Check(o)) { return PyErr_Format(PyExc_TypeError, "arg 5 (closure) expected cell, found %s", o->ob_type->tp_name); } } } newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, globals); if (newfunc == NULL) return NULL; if (name != Py_None) { Py_INCREF(name); Py_SETREF(newfunc->func_name, name); } if (defaults != Py_None) { Py_INCREF(defaults); newfunc->func_defaults = defaults; } if (closure != Py_None) { Py_INCREF(closure); newfunc->func_closure = closure; } return (PyObject *)newfunc; }
static PyObject * func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, PyObject *name, PyObject *defaults, PyObject *closure) /*[clinic end generated code: output=99c6d9da3a24e3be input=93611752fc2daf11]*/ { PyFunctionObject *newfunc; Py_ssize_t nfree, nclosure; if (name != Py_None && !PyUnicode_Check(name)) { PyErr_SetString(PyExc_TypeError, "arg 3 (name) must be None or string"); return NULL; } if (defaults != Py_None && !PyTuple_Check(defaults)) { PyErr_SetString(PyExc_TypeError, "arg 4 (defaults) must be None or tuple"); return NULL; } nfree = PyTuple_GET_SIZE(code->co_freevars); if (!PyTuple_Check(closure)) { if (nfree && closure == Py_None) { PyErr_SetString(PyExc_TypeError, "arg 5 (closure) must be tuple"); return NULL; } else if (closure != Py_None) { PyErr_SetString(PyExc_TypeError, "arg 5 (closure) must be None or tuple"); return NULL; } } /* check that the closure is well-formed */ nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure); if (nfree != nclosure) return PyErr_Format(PyExc_ValueError, "%U requires closure of length %zd, not %zd", code->co_name, nfree, nclosure); if (nclosure) { Py_ssize_t i; for (i = 0; i < nclosure; i++) { PyObject *o = PyTuple_GET_ITEM(closure, i); if (!PyCell_Check(o)) { return PyErr_Format(PyExc_TypeError, "arg 5 (closure) expected cell, found %s", o->ob_type->tp_name); } } } newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, globals); if (newfunc == NULL) return NULL; if (name != Py_None) { Py_INCREF(name); Py_SETREF(newfunc->func_name, name); } if (defaults != Py_None) { Py_INCREF(defaults); newfunc->func_defaults = defaults; } if (closure != Py_None) { Py_INCREF(closure); newfunc->func_closure = closure; } return (PyObject *)newfunc; }