[Python-checkins] CVS: python/dist/src/Objects typeobject.c,2.59,2.60

Guido van Rossum gvanrossum@users.sourceforge.net
2001年9月14日 09:58:10 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv18748
Modified Files:
	typeobject.c 
Log Message:
call_method():
- Don't turn a non-tuple argument into a one-tuple. Rather, the
 caller must pass a format that causes Py_VaBuildValue() to return a
 tuple.
- Speed things up by calling PyObject_Call (which is fairly low-level
 and straightforward) rather than PyObject_CallObject (which calls
 PyEval_CallObjectWithKeywords which calls PyObject_Call, and nothing
 is really done in the mean time except some tests for NULL args and
 valid types, which are already guaranteed).
- Cosmetics.
Other places:
- Make sure that the format argument to call_method() is surrounded by
 parentheses, so it will cause a tuple to be created.
- Replace a few calls to PyEval_CallObject() with a surefire tuple for
 args to calls to PyObject_Call(). (A few calls to
 PyEval_CallObject() remain that have NULL for args.)
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.59
retrieving revision 2.60
diff -C2 -d -r2.59 -r2.60
*** typeobject.c	2001年09月13日 19:18:27	2.59
--- typeobject.c	2001年09月14日 16:58:08	2.60
***************
*** 348,352 ****
 		va_end(va);
 		PyErr_SetString(PyExc_AttributeError, name);
! 		return 0;
 	}
 
--- 348,352 ----
 		va_end(va);
 		PyErr_SetString(PyExc_AttributeError, name);
! 		return NULL;
 	}
 
***************
*** 358,376 ****
 	va_end(va);
 
! 	if (!args)
 		return NULL;
- 
- 	if (!PyTuple_Check(args)) {
- 		PyObject *a;
- 
- 		a = PyTuple_New(1);
- 		if (a == NULL)
- 			return NULL;
- 		if (PyTuple_SetItem(a, 0, args) < 0)
- 			return NULL;
- 		args = a;
- 	}
 
! 	retval = PyObject_CallObject(func, args);
 
 	Py_DECREF(args);
--- 358,366 ----
 	va_end(va);
 
! 	if (args == NULL)
 		return NULL;
 
! 	assert(PyTuple_Check(args));
! 	retval = PyObject_Call(func, args, NULL);
 
 	Py_DECREF(args);
***************
*** 2438,2442 ****
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, ""); \
 }
 
--- 2428,2432 ----
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, "()"); \
 }
 
***************
*** 2446,2450 ****
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, ARGCODES, arg1); \
 }
 
--- 2436,2440 ----
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
 }
 
***************
*** 2459,2463 ****
 		PyObject *r; \
 		r = call_method( \
! 			self, OPSTR, &cache_str, "O", other); \
 		if (r != Py_NotImplemented || \
 		 other->ob_type == self->ob_type) \
--- 2449,2453 ----
 		PyObject *r; \
 		r = call_method( \
! 			self, OPSTR, &cache_str, "(O)", other); \
 		if (r != Py_NotImplemented || \
 		 other->ob_type == self->ob_type) \
***************
*** 2468,2472 ****
 	 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
 		return call_method( \
! 			other, ROPSTR, &rcache_str, "O", self); \
 	} \
 	Py_INCREF(Py_NotImplemented); \
--- 2458,2462 ----
 	 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
 		return call_method( \
! 			other, ROPSTR, &rcache_str, "(O)", self); \
 	} \
 	Py_INCREF(Py_NotImplemented); \
***************
*** 2482,2486 ****
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, ARGCODES, arg1, arg2); \
 }
 
--- 2472,2477 ----
 { \
 	static PyObject *cache_str; \
! 	return call_method(self, OPSTR, &cache_str, \
! 			 "(" ARGCODES ")", arg1, arg2); \
 }
 
***************
*** 2489,2493 ****
 {
 	static PyObject *len_str;
! 	PyObject *res = call_method(self, "__len__", &len_str, "");
 
 	if (res == NULL)
--- 2480,2484 ----
 {
 	static PyObject *len_str;
! 	PyObject *res = call_method(self, "__len__", &len_str, "()");
 
 	if (res == NULL)
***************
*** 2509,2516 ****
 	if (value == NULL)
 		res = call_method(self, "__delitem__", &delitem_str,
! 				 "i", index);
 	else
 		res = call_method(self, "__setitem__", &setitem_str,
! 				 "iO", index, value);
 	if (res == NULL)
 		return -1;
--- 2500,2507 ----
 	if (value == NULL)
 		res = call_method(self, "__delitem__", &delitem_str,
! 				 "(i)", index);
 	else
 		res = call_method(self, "__setitem__", &setitem_str,
! 				 "(iO)", index, value);
 	if (res == NULL)
 		return -1;
***************
*** 2527,2534 ****
 	if (value == NULL)
 		res = call_method(self, "__delslice__", &delslice_str,
! 				 "ii", i, j);
 	else
 		res = call_method(self, "__setslice__", &setslice_str,
! 				 "iiO", i, j, value);
 	if (res == NULL)
 		return -1;
--- 2518,2525 ----
 	if (value == NULL)
 		res = call_method(self, "__delslice__", &delslice_str,
! 				 "(ii)", i, j);
 	else
 		res = call_method(self, "__setslice__", &setslice_str,
! 				 "(iiO)", i, j, value);
 	if (res == NULL)
 		return -1;
***************
*** 2550,2554 ****
 			res = NULL;
 		else {
! 			res = PyEval_CallObject(func, args);
 			Py_DECREF(args);
 		}
--- 2541,2545 ----
 			res = NULL;
 		else {
! 			res = PyObject_Call(func, args, NULL);
 			Py_DECREF(args);
 		}
***************
*** 2580,2587 ****
 	if (value == NULL)
 		res = call_method(self, "__delitem__", &delitem_str,
! 				 "O", key);
 	else
 		res = call_method(self, "__setitem__", &setitem_str,
! 				 "OO", key, value);
 	if (res == NULL)
 		return -1;
--- 2571,2578 ----
 	if (value == NULL)
 		res = call_method(self, "__delitem__", &delitem_str,
! 				 "(O)", key);
 	else
 		res = call_method(self, "__setitem__", &setitem_str,
! 				 "(OO)", key, value);
 	if (res == NULL)
 		return -1;
***************
*** 2611,2615 ****
 	/* Three-arg power doesn't use __rpow__ */
 	return call_method(self, "__pow__", &pow_str,
! 			 "OO", other, modulus);
 }
 
--- 2602,2606 ----
 	/* Three-arg power doesn't use __rpow__ */
 	return call_method(self, "__pow__", &pow_str,
! 			 "(OO)", other, modulus);
 }
 
***************
*** 2631,2635 ****
 
 	if (func != NULL) {
! 		res = PyEval_CallObject(func, NULL);
 		Py_DECREF(func);
 		if (res == NULL)
--- 2622,2626 ----
 
 	if (func != NULL) {
! 		res = PyObject_CallObject(func, NULL);
 		Py_DECREF(func);
 		if (res == NULL)
***************
*** 2688,2692 ****
 			res = NULL;
 		else {
! 			res = PyObject_CallObject(func, args);
 			Py_DECREF(args);
 		}
--- 2679,2683 ----
 			res = NULL;
 		else {
! 			res = PyObject_Call(func, args, NULL);
 			Py_DECREF(args);
 		}
***************
*** 2842,2849 ****
 	if (value == NULL)
 		res = call_method(self, "__delattr__", &delattr_str,
! 				 "O", name);
 	else
 		res = call_method(self, "__setattr__", &setattr_str,
! 				 "OO", name, value);
 	if (res == NULL)
 		return -1;
--- 2833,2840 ----
 	if (value == NULL)
 		res = call_method(self, "__delattr__", &delattr_str,
! 				 "(O)", name);
 	else
 		res = call_method(self, "__setattr__", &setattr_str,
! 				 "(OO)", name, value);
 	if (res == NULL)
 		return -1;
***************
*** 2878,2882 ****
 		res = NULL;
 	else {
! 		res = PyObject_CallObject(func, args);
 		Py_DECREF(args);
 	}
--- 2869,2873 ----
 		res = NULL;
 	else {
! 		res = PyObject_Call(func, args, NULL);
 		Py_DECREF(args);
 	}
***************
*** 2936,2940 ****
 {
 	static PyObject *next_str;
! 	return call_method(self, "next", &next_str, "");
 }
 
--- 2927,2931 ----
 {
 	static PyObject *next_str;
! 	return call_method(self, "next", &next_str, "()");
 }
 
***************
*** 2974,2981 ****
 	if (value == NULL)
 		res = call_method(self, "__del__", &del_str,
! 				 "O", target);
 	else
 		res = call_method(self, "__set__", &set_str,
! 				 "OO", target, value);
 	if (res == NULL)
 		return -1;
--- 2965,2972 ----
 	if (value == NULL)
 		res = call_method(self, "__del__", &del_str,
! 				 "(O)", target);
 	else
 		res = call_method(self, "__set__", &set_str,
! 				 "(OO)", target, value);
 	if (res == NULL)
 		return -1;

AltStyle によって変換されたページ (->オリジナル) /