[Python-checkins] CVS: python/dist/src/Objects object.c,2.156,2.157 stringobject.c,2.138,2.139

Tim Peters tim_one@users.sourceforge.net
2001年10月16日 13:18:26 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv11274/python/Objects
Modified Files:
	object.c stringobject.c 
Log Message:
SF bug [#468061] __str__ ignored in str subclass.
object.c, PyObject_Str: Don't try to optimize anything except exact
string objects here; in particular, let str subclasses go thru tp_str,
same as non-str objects. This allows overrides of tp_str to take
effect.
stringobject.c:
+ string_print (str's tp_print): If the argument isn't an exact string
 object, get one from PyObject_Str.
+ string_str (str's tp_str): Make a genuine-string copy of the object if
 it's of a proper str subclass type. str() applied to a str subclass
 that doesn't override __str__ ends up here.
test_descr.py: New str_of_str_subclass() test.
Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.156
retrieving revision 2.157
diff -C2 -d -r2.156 -r2.157
*** object.c	2001年10月07日 03:54:51	2.156
--- object.c	2001年10月16日 20:18:24	2.157
***************
*** 262,271 ****
 		return v;
 	}
- 	if (PyString_Check(v)) {
- 		/* For a string subtype that's not a string, return a true
- 		 string with the same string data. */
- 		PyStringObject *s = (PyStringObject *)v;
- 		return PyString_FromStringAndSize(s->ob_sval, s->ob_size);
- 	}
 	if (v->ob_type->tp_str == NULL)
 		return PyObject_Repr(v);
--- 262,265 ----
Index: stringobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.138
retrieving revision 2.139
diff -C2 -d -r2.138 -r2.139
*** stringobject.c	2001年10月13日 15:57:55	2.138
--- stringobject.c	2001年10月16日 20:18:24	2.139
***************
*** 567,571 ****
--- 567,582 ----
 	char c;
 	int quote;
+ 
 	/* XXX Ought to check for interrupts when writing long strings */
+ 	if (! PyString_CheckExact(op)) {
+ 		int ret;
+ 		/* A str subclass may have its own __str__ method. */
+ 		op = (PyStringObject *) PyObject_Str((PyObject *)op);
+ 		if (op == NULL)
+ 			return -1;
+ 		ret = string_print(op, fp, flags);
+ 		Py_DECREF(op);
+ 		return ret;
+ 	}
 	if (flags & Py_PRINT_RAW) {
 		fwrite(op->ob_sval, 1, (int) op->ob_size, fp);
***************
*** 652,657 ****
 string_str(PyObject *s)
 {
! 	Py_INCREF(s);
! 	return s;
 }
 
--- 663,676 ----
 string_str(PyObject *s)
 {
! 	assert(PyString_Check(s));
! 	if (PyString_CheckExact(s)) {
! 		Py_INCREF(s);
! 		return s;
! 	}
! 	else {
! 		/* Subtype -- return genuine string with the same value. */
! 		PyStringObject *t = (PyStringObject *) s;
! 		return PyString_FromStringAndSize(t->ob_sval, t->ob_size);
! 	}
 }
 

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