From: Tim Peters Date: Mon, 7 Apr 2003 17:51:59 +0000 (+0000) Subject: New private API function _PyInstance_Lookup. gc will use this to figure X-Git-Tag: v2.3c1~1272 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df875b99fcb69c18168fb761ddaa722a034175dd;p=python New private API function _PyInstance_Lookup. gc will use this to figure out whether __del__ exists, without executing any Python-level code. --- diff --git a/Include/classobject.h b/Include/classobject.h index b071e98f04..1328c274d5 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -51,6 +51,18 @@ PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); PyAPI_FUNC(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 exceptionm, 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) \ diff --git a/Objects/classobject.c b/Objects/classobject.c index 80aabbf6c2..89a3673d96 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -759,6 +759,27 @@ instance_getattr(register PyInstanceObject *inst, PyObject *name) 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) {