From: Finn B. <bc...@us...> - 2001-02-01 13:17:10
|
Update of /cvsroot/jython/jython/org/python/core In directory usw-pr-cvs1:/tmp/cvs-serv26381 Modified Files: PyFunction.java PyMethod.java Log Message: Support for Function Attributes (pep-0232). Index: PyFunction.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyFunction.java,v retrieving revision 2.4 retrieving revision 2.5 diff -C2 -r2.4 -r2.5 *** PyFunction.java 2000/10/01 17:57:03 2.4 --- PyFunction.java 2001/02/01 13:17:09 2.5 *************** *** 9,12 **** --- 9,13 ---- public PyObject[] func_defaults; public PyCode func_code; + public PyObject __dict__; public PyFunction(PyObject globals, PyObject[] defaults, PyCode code, *************** *** 29,33 **** private static final String[] __members__ = { "__doc__", "func_doc", ! "__name__", "func_name", "func_globals", "func_defaults", "func_code" }; --- 30,34 ---- private static final String[] __members__ = { "__doc__", "func_doc", ! "__name__", "func_name", "__dict__", "func_globals", "func_defaults", "func_code" }; *************** *** 37,41 **** for (int i = 0; i < __members__.length; i++) members[i] = new PyString(__members__[i]); ! return new PyList(members); } --- 38,45 ---- for (int i = 0; i < __members__.length; i++) members[i] = new PyString(__members__[i]); ! PyList ret = new PyList(members); ! addKeys(ret, "__dict__"); ! ret.sort(); ! return ret; } *************** *** 56,65 **** // func_code // func_defaults ! else throwReadonly(name); } public void __delattr__(String name) { // TBD: should __doc__ be del'able? ! throwReadonly(name); } --- 60,96 ---- // func_code // func_defaults ! else if (name == "func_defaults") ! throwReadonly(name); ! else if (name == "func_code") { ! if (value instanceof PyCode) ! func_code = (PyCode) value; ! else ! throw Py.TypeError("func_code must be set to a code object"); ! } else if (name == "__dict__" || name == "func_dict") { ! if (value instanceof PyDictionary || value instanceof PyStringMap) ! __dict__ = value; ! else if (value == Py.None) ! __dict__ = null; ! else ! throw Py.TypeError("func_dict must be set to a dict object"); ! } else { ! if (__dict__ == null) ! __dict__ = new PyStringMap(); ! __dict__.__setitem__(name, value); ! } } public void __delattr__(String name) { // TBD: should __doc__ be del'able? ! if (name == "__dict__" || name == "func_dict") { ! __dict__ = null; ! return; ! } else if (name == "func_defaults") { ! func_defaults = Py.EmptyObjects; ! return; ! } ! if (__dict__ == null) ! throw Py.AttributeError(name); ! __dict__.__delitem__(name); } *************** *** 78,81 **** --- 109,122 ---- return Py.None; return new PyTuple(func_defaults); + } + if (name == "__dict__") { + if (__dict__ == null) + __dict__ = new PyStringMap(); + return __dict__; + } + if (__dict__ != null) { + PyObject ret = __dict__.__finditem__(name); + if (ret != null) + return ret; } return super.__findattr__(name); Index: PyMethod.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyMethod.java,v retrieving revision 2.8 retrieving revision 2.9 diff -C2 -r2.8 -r2.9 *** PyMethod.java 2001/01/21 16:18:56 2.8 --- PyMethod.java 2001/02/01 13:17:09 2.9 *************** *** 34,38 **** private static final String[] __members__ = { "im_self", "im_func", "im_class", ! "__doc__", "__name__" }; --- 34,38 ---- private static final String[] __members__ = { "im_self", "im_func", "im_class", ! "__doc__", "__name__", "__dict__", }; *************** *** 42,46 **** for (int i = 0; i < __members__.length; i++) members[i] = new PyString(__members__[i]); ! return new PyList(members); } --- 42,49 ---- for (int i = 0; i < __members__.length; i++) members[i] = new PyString(__members__[i]); ! PyList ret = new PyList(members); ! PyObject k = im_func.__getattr__("__dict__").invoke("keys"); ! ret.extend(k); ! return ret; } *************** *** 52,62 **** } public void __setattr__(String name, PyObject value) { ! // no writable attributes ! throwReadonly(name); } public void __delattr__(String name) { ! throwReadonly(name); } --- 55,73 ---- } + public PyObject __findattr__(String name) { + PyObject ret = super.__findattr__(name); + if (ret != null) + return ret; + return im_func.__findattr__(name); + } + public void __setattr__(String name, PyObject value) { ! if (im_self != null) ! throw Py.TypeError("cannot set attributes through bound methods"); ! im_func.__setattr__(name, value); } public void __delattr__(String name) { ! im_func.__delattr__(name); } *************** *** 67,70 **** --- 78,83 ---- public PyObject _doget(PyObject container, PyObject wherefound) { /* Only if classes are compatible */ + if (container == null) + return this; if (__builtin__.issubclass(container.__class__, (PyClass)im_class)) if (im_func instanceof PyFunction) |