extern DL_IMPORT(PyObject *) PyMethod_Self(PyObject *);
extern DL_IMPORT(PyObject *) PyMethod_Class(PyObject *);
+/* Look up attribute with name (a string) on instance object pinst, using
+ * only the instance and base class dicts. If a descriptor is found in
+ * a class dict, the descriptor is returned without calling it.
+ * Returns NULL if nothing found, else a borrowed reference to the
+ * value associated with name in the dict in which name was found.
+ * The point of this routine is that it never calls arbitrary Python
+ * code, so is always "safe": all it does is dict lookups. The function
+ * can't fail, never sets an exception, and NULL is not an error (it just
+ * means "not found").
+ */
+PyAPI_FUNC(PyObject *) _PyInstance_Lookup(PyObject *pinst, PyObject *name);
+
/* Macros for direct access to these values. Type checks are *not*
done, so use with care. */
#define PyMethod_GET_FUNCTION(meth) \
return res;
}
+/* See classobject.h comments: this only does dict lookups, and is always
+ * safe to call.
+ */
+PyObject *
+_PyInstance_Lookup(PyObject *pinst, PyObject *name)
+{
+ PyObject *v;
+ PyClassObject *class;
+ PyInstanceObject *inst; /* pinst cast to the right type */
+
+ assert(PyInstance_Check(pinst));
+ inst = (PyInstanceObject *)pinst;
+
+ assert(PyString_Check(name));
+
+ v = PyDict_GetItem(inst->in_dict, name);
+ if (v == NULL)
+ v = class_lookup(inst->in_class, name, &class);
+ return v;
+}
+
static int
instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
{
start = PyInt_FromLong((long)i);
if (!start)
return NULL;
-
+
end = PyInt_FromLong((long)j);
if (!end) {
Py_DECREF(start);
if (func == NULL)
return NULL;
arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
- } else
+ } else
arg = Py_BuildValue("(ii)", i, j);
-
+
if (arg == NULL) {
Py_DECREF(func);
return NULL;
res = PyEval_CallObject(func, arg);
Py_DECREF(func);
Py_DECREF(arg);
- if(res == NULL)
+ if(res == NULL)
return -1;
ret = PyObject_IsTrue(res);
Py_DECREF(res);
/* Try one half of a binary operator involving a class instance. */
static PyObject *
-half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
+half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
int swapped)
{
PyObject *args;
PyObject *coerced = NULL;
PyObject *v1;
PyObject *result;
-
+
if (!PyInstance_Check(v)) {
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
/* This version is for ternary calls only (z != None) */
static PyObject *
instance_pow(PyObject *v, PyObject *w, PyObject *z)
-{
+{
if (z == Py_None) {
return do_binop(v, w, "__pow__", "__rpow__", bin_power);
}
#define NAME_OPS 6
static PyObject **name_op = NULL;
-static int
+static int
init_name_op(void)
{
int i;