mirror of https://github.com/python/cpython.git
#3342: In tracebacks, printed source lines were not indented since r62555.
#3343: Py_DisplaySourceLine should be a private function. Rename it to _Py_DisplaySourceLine.
This commit is contained in:
parent
ae6d2b9175
commit
2252d11c08
|
@ -19,7 +19,7 @@ typedef struct _traceback {
|
|||
|
||||
PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *);
|
||||
PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *);
|
||||
PyAPI_FUNC(int) Py_DisplaySourceLine(PyObject *, const char *, int);
|
||||
PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, const char *, int, int);
|
||||
|
||||
/* Reveal traceback type so we can typecheck traceback objects */
|
||||
PyAPI_DATA(PyTypeObject) PyTraceBack_Type;
|
||||
|
|
|
@ -177,7 +177,7 @@ def test_traceback_indentation(self):
|
|||
banner, location, source_line = tb_lines
|
||||
self.assert_(banner.startswith('Traceback'))
|
||||
self.assert_(location.startswith(' File'))
|
||||
self.assert_(source_line.startswith('raise'))
|
||||
self.assert_(source_line.startswith(' raise'))
|
||||
|
||||
|
||||
def test_main():
|
||||
|
|
|
@ -256,7 +256,6 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject
|
|||
Py_XDECREF(name);
|
||||
|
||||
/* Print " source_line\n" */
|
||||
PyFile_WriteString(" ", f_stderr);
|
||||
if (sourceline) {
|
||||
char *source_line_str = PyString_AS_STRING(sourceline);
|
||||
while (*source_line_str == ' ' || *source_line_str == '\t' ||
|
||||
|
@ -267,7 +266,8 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject
|
|||
PyFile_WriteString("\n", f_stderr);
|
||||
}
|
||||
else
|
||||
Py_DisplaySourceLine(f_stderr, PyString_AS_STRING(filename), lineno);
|
||||
_Py_DisplaySourceLine(f_stderr, PyString_AS_STRING(filename),
|
||||
lineno, 2);
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ PyTraceBack_Here(PyFrameObject *frame)
|
|||
}
|
||||
|
||||
int
|
||||
Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno)
|
||||
_Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno, int indent)
|
||||
{
|
||||
int err = 0;
|
||||
FILE *xfp = NULL;
|
||||
|
@ -197,12 +197,27 @@ Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno)
|
|||
} while (*pLastChar != '\0' && *pLastChar != '\n');
|
||||
}
|
||||
if (i == lineno) {
|
||||
char buf[11];
|
||||
char *p = linebuf;
|
||||
while (*p == ' ' || *p == '\t' || *p == '\014')
|
||||
p++;
|
||||
err = PyFile_WriteString(p, f);
|
||||
if (err == 0 && strchr(p, '\n') == NULL)
|
||||
err = PyFile_WriteString("\n", f);
|
||||
|
||||
/* Write some spaces before the line */
|
||||
strcpy(buf, " ");
|
||||
assert (strlen(buf) == 10);
|
||||
while (indent > 0) {
|
||||
if(indent < 10)
|
||||
buf[indent] = '\0';
|
||||
err = PyFile_WriteString(buf, f);
|
||||
if (err != 0)
|
||||
break;
|
||||
indent -= 10;
|
||||
}
|
||||
|
||||
if (err == 0)
|
||||
err = PyFile_WriteString(p, f);
|
||||
if (err == 0 && strchr(p, '\n') == NULL)
|
||||
err = PyFile_WriteString("\n", f);
|
||||
}
|
||||
fclose(xfp);
|
||||
return err;
|
||||
|
@ -222,7 +237,7 @@ tb_displayline(PyObject *f, const char *filename, int lineno, const char *name)
|
|||
err = PyFile_WriteString(linebuf, f);
|
||||
if (err != 0)
|
||||
return err;
|
||||
return Py_DisplaySourceLine(f, filename, lineno);
|
||||
return _Py_DisplaySourceLine(f, filename, lineno, 4);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Loading…
Reference in New Issue