[Python-checkins] CVS: python/dist/src/Objects descrobject.c,1.1.2.11,1.1.2.12 funcobject.c,2.37.4.5,2.37.4.6 object.c,2.124.4.19,2.124.4.20 typeobject.c,2.16.8.54,2.16.8.55

Guido van Rossum gvanrossum@users.sourceforge.net
Mon, 02 Jul 2001 10:08:35 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv3345/Objects

Modified Files:
      Tag: descr-branch
	descrobject.c funcobject.c object.c typeobject.c 
Log Message:
Change the tp_descr_get slot to take three arguments: (self, obj,
type).  The type is useful to create unbound methods, and I think I
have a way to make class methods work that needs this.



Index: descrobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/Attic/descrobject.c,v
retrieving revision 1.1.2.11
retrieving revision 1.1.2.12
diff -C2 -r1.1.2.11 -r1.1.2.12
*** descrobject.c	2001/06/29 14:31:11	1.1.2.11
--- descrobject.c	2001/07/02 17:08:33	1.1.2.12
***************
*** 98,102 ****
  
  static PyObject *
! descr_get(PyDescrObject *descr, PyObject *obj)
  {
  	if (obj == NULL) {
--- 98,102 ----
  
  static PyObject *
! descr_get(PyDescrObject *descr, PyObject *obj, PyTypeObject *type)
  {
  	if (obj == NULL) {
***************
*** 252,256 ****
  
  	if (argc == 1)
! 		return descr_get(descr, self);
  	if (argc == 2) {
  		PyObject *value = PyTuple_GET_ITEM(args, 1);
--- 252,256 ----
  
  	if (argc == 1)
! 		return descr_get(descr, self, self->ob_type);
  	if (argc == 2) {
  		PyObject *value = PyTuple_GET_ITEM(args, 1);
***************
*** 270,277 ****
  {
  	PyObject *obj;
  
! 	if (!PyArg_ParseTuple(args, "O:get", &obj))
  		return NULL;
! 	return descr_get(descr, obj);
  }
  
--- 270,280 ----
  {
  	PyObject *obj;
+ 	PyTypeObject *type = NULL;
  
! 	if (!PyArg_ParseTuple(args, "O|O!:get", &obj, &PyType_Type, &type))
  		return NULL;
! 	if (type == NULL)
! 		type = obj->ob_type;
! 	return descr_get(descr, obj, type);
  }
  

Index: funcobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v
retrieving revision 2.37.4.5
retrieving revision 2.37.4.6
diff -C2 -r2.37.4.5 -r2.37.4.6
*** funcobject.c	2001/06/06 14:27:54	2.37.4.5
--- funcobject.c	2001/07/02 17:08:33	2.37.4.6
***************
*** 331,342 ****
  /* Bind a function to an object */
  static PyObject *
! func_descr_get(PyObject *func, PyObject *obj)
  {
! 	if (obj == NULL) {
! 		Py_INCREF(func);
! 		return func;
! 	}
! 	else
! 		return PyMethod_New(func, obj, (PyObject *)obj->ob_type);
  }
  
--- 331,337 ----
  /* Bind a function to an object */
  static PyObject *
! func_descr_get(PyObject *func, PyObject *obj, PyTypeObject *type)
  {
! 	return PyMethod_New(func, obj, (PyObject *)type);
  }
  

Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.124.4.19
retrieving revision 2.124.4.20
diff -C2 -r2.124.4.19 -r2.124.4.20
*** object.c	2001/06/29 20:46:51	2.124.4.19
--- object.c	2001/07/02 17:08:33	2.124.4.20
***************
*** 1128,1132 ****
  		f = descr->ob_type->tp_descr_get;
  		if (f != NULL && PyDescr_IsData(descr))
! 			return f(descr, obj);
  	}
  
--- 1128,1132 ----
  		f = descr->ob_type->tp_descr_get;
  		if (f != NULL && PyDescr_IsData(descr))
! 			return f(descr, obj, obj->ob_type);
  	}
  
***************
*** 1144,1148 ****
  
  	if (f != NULL)
! 		return f(descr, obj);
  
  	if (descr != NULL) {
--- 1144,1148 ----
  
  	if (f != NULL)
! 		return f(descr, obj, obj->ob_type);
  
  	if (descr != NULL) {

Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.16.8.54
retrieving revision 2.16.8.55
diff -C2 -r2.16.8.54 -r2.16.8.55
*** typeobject.c	2001/06/29 20:46:51	2.16.8.54
--- typeobject.c	2001/07/02 17:08:33	2.16.8.55
***************
*** 633,637 ****
  		f = descr->ob_type->tp_descr_get;
  		if (f != NULL && PyDescr_IsData(descr))
! 			return f(descr, (PyObject *)type);
  	}
  
--- 633,637 ----
  		f = descr->ob_type->tp_descr_get;
  		if (f != NULL && PyDescr_IsData(descr))
! 			return f(descr, (PyObject *)type, metatype);
  	}
  
***************
*** 645,649 ****
  	/* Use the descriptor from the metatype */
  	if (f != NULL) {
! 		res = f(descr, NULL);
  		return res;
  	}
--- 645,649 ----
  	/* Use the descriptor from the metatype */
  	if (f != NULL) {
! 		res = f(descr, NULL, metatype);
  		return res;
  	}
***************
*** 1636,1641 ****
  
  static struct wrapperbase tab_descr_get[] = {
! 	{"__get__", (wrapperfunc)wrap_binaryfunc,
! 	 "descr.__get__(obj) -> value"},
  	{0}
  };
--- 1636,1641 ----
  
  static struct wrapperbase tab_descr_get[] = {
! 	{"__get__", (wrapperfunc)wrap_ternaryfunc,
! 	 "descr.__get__(obj, type) -> value"},
  	{0}
  };
***************
*** 2026,2030 ****
  }
  
! SLOT1(tp_descr_get, get, PyObject *, O);
  
  static int
--- 2026,2030 ----
  }
  
! SLOT2(tp_descr_get, get, PyObject *, PyTypeObject *, OO);
  
  static int