mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	Merged revisions 81706-81707 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r81706 | benjamin.peterson | 2010-06-04 19:32:50 -0500 (Fri, 04 Jun 2010) | 1 line properly lookup the __format__ special method ........ r81707 | benjamin.peterson | 2010-06-04 19:38:22 -0500 (Fri, 04 Jun 2010) | 1 line remove PyType_Ready call; float should be initialized in interpreter startup ........
This commit is contained in:
		
							parent
							
								
									2d5157eb91
								
							
						
					
					
						commit
						da2cf04c28
					
				
					 2 changed files with 18 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -1557,6 +1557,8 @@ order (MRO) for bases """
 | 
			
		|||
            self.assertEqual(key, "hi")
 | 
			
		||||
            return 4
 | 
			
		||||
        def swallow(*args): pass
 | 
			
		||||
        def format_impl(self, spec):
 | 
			
		||||
            return "hello"
 | 
			
		||||
 | 
			
		||||
        # It would be nice to have every special method tested here, but I'm
 | 
			
		||||
        # only listing the ones I can remember outside of typeobject.c, since it
 | 
			
		||||
| 
						 | 
				
			
			@ -1575,6 +1577,7 @@ order (MRO) for bases """
 | 
			
		|||
            ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
 | 
			
		||||
            ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
 | 
			
		||||
            ("__complex__", complex, complex_num, set(), {}),
 | 
			
		||||
            ("__format__", format, format_impl, set(), {}),
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
        class Checker(object):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -693,18 +693,10 @@ PyBuffer_Release(Py_buffer *view)
 | 
			
		|||
PyObject *
 | 
			
		||||
PyObject_Format(PyObject *obj, PyObject *format_spec)
 | 
			
		||||
{
 | 
			
		||||
    static PyObject * str__format__ = NULL;
 | 
			
		||||
    PyObject *meth;
 | 
			
		||||
    PyObject *empty = NULL;
 | 
			
		||||
    PyObject *result = NULL;
 | 
			
		||||
 | 
			
		||||
    /* Initialize cached value */
 | 
			
		||||
    if (str__format__ == NULL) {
 | 
			
		||||
    /* Initialize static variable needed by _PyType_Lookup */
 | 
			
		||||
    str__format__ = PyUnicode_FromString("__format__");
 | 
			
		||||
    if (str__format__ == NULL)
 | 
			
		||||
        goto done;
 | 
			
		||||
    }
 | 
			
		||||
    static PyObject *format_cache = NULL;
 | 
			
		||||
 | 
			
		||||
    /* If no format_spec is provided, use an empty string */
 | 
			
		||||
    if (format_spec == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -712,22 +704,18 @@ PyObject_Format(PyObject *obj, PyObject *format_spec)
 | 
			
		|||
        format_spec = empty;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Make sure the type is initialized.  float gets initialized late */
 | 
			
		||||
    if (Py_TYPE(obj)->tp_dict == NULL)
 | 
			
		||||
    if (PyType_Ready(Py_TYPE(obj)) < 0)
 | 
			
		||||
        goto done;
 | 
			
		||||
 | 
			
		||||
    /* Find the (unbound!) __format__ method (a borrowed reference) */
 | 
			
		||||
    meth = _PyType_Lookup(Py_TYPE(obj), str__format__);
 | 
			
		||||
    meth = _PyObject_LookupSpecial(obj, "__format__", &format_cache);
 | 
			
		||||
    if (meth == NULL) {
 | 
			
		||||
        if (!PyErr_Occurred())
 | 
			
		||||
            PyErr_Format(PyExc_TypeError,
 | 
			
		||||
                         "Type %.100s doesn't define __format__",
 | 
			
		||||
                         Py_TYPE(obj)->tp_name);
 | 
			
		||||
        goto done;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* And call it, binding it to the value */
 | 
			
		||||
    result = PyObject_CallFunctionObjArgs(meth, obj, format_spec, NULL);
 | 
			
		||||
    /* And call it. */
 | 
			
		||||
    result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
 | 
			
		||||
 | 
			
		||||
    if (result && !PyUnicode_Check(result)) {
 | 
			
		||||
        PyErr_SetString(PyExc_TypeError,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue