summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-02-26 15:17:59 (GMT)
committerGuido van Rossum <guido@python.org>1992-02-26 15:17:59 (GMT)
commit7169dbb76dcd1d25f2989eb00da33d05c3d6279b (patch)
tree9daf3853dc0d7dddad0fdedeb5e80670087466de /Python
parent0f61f8a4bdd0a0871ada8e4e909e165f0e44eb6e (diff)
downloadcpython-7169dbb76dcd1d25f2989eb00da33d05c3d6279b.zip
cpython-7169dbb76dcd1d25f2989eb00da33d05c3d6279b.tar.gz
cpython-7169dbb76dcd1d25f2989eb00da33d05c3d6279b.tar.bz2
Move printing of filename and lineno to tb_displayline.
Search sys.path if the filename isn't found. Include osdefs.h.
Diffstat (limited to 'Python')
-rw-r--r--Python/traceback.c65
1 files changed, 45 insertions, 20 deletions
diff --git a/Python/traceback.c b/Python/traceback.c
index bcec490..ea99152 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -26,10 +26,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "allobjects.h"
+#include "sysmodule.h"
#include "compile.h"
#include "frameobject.h"
#include "traceback.h"
#include "structmember.h"
+#include "osdefs.h"
typedef struct _tracebackobject {
OB_HEAD
@@ -154,21 +156,56 @@ tb_displayline(fp, filename, lineno)
int lineno;
{
FILE *xfp;
- char buf[1000];
+ char linebuf[1000];
int i;
- if (filename[0] == '<' && filename[strlen(filename)-1] == '>')
- return;
xfp = fopen(filename, "r");
if (xfp == NULL) {
- fprintf(fp, " (cannot open \"%s\")\n", filename);
- return;
+ /* Search tail of filename in sys.path before giving up */
+ object *path;
+ char *tail = strrchr(filename, SEP);
+ if (tail == NULL)
+ tail = filename;
+ else
+ tail++;
+ path = sysget("path");
+ if (path != NULL && is_listobject(path)) {
+ int npath = getlistsize(path);
+ char namebuf[MAXPATHLEN+1];
+ for (i = 0; i < npath; i++) {
+ object *v = getlistitem(path, i);
+ if (is_stringobject(v)) {
+ int len;
+ strcpy(namebuf, getstringvalue(v));
+ len = getstringsize(v);
+ if (len > 0 && namebuf[len-1] != SEP)
+ namebuf[len++] = SEP;
+ strcpy(namebuf+len, tail);
+ xfp = fopen(namebuf, "r");
+ if (xfp != NULL) {
+ filename = namebuf;
+ break;
+ }
+ }
+ }
+ }
}
+ fprintf(fp, " File \"%s\"", filename);
+#ifdef applec /* MPW */
+ /* This is needed by MPW's File and Line commands */
+ fprintf(fp, "; ");
+#else
+ /* This is needed by Emacs' compile command */
+ fprintf(fp, ", ");
+#endif
+ fprintf(fp, "line %d\n", lineno);
+ if (xfp == NULL)
+ return;
for (i = 0; i < lineno; i++) {
- if (fgets(buf, sizeof buf, xfp) == NULL)
+ if (fgets(linebuf, sizeof linebuf, xfp) == NULL)
break;
}
if (i == lineno) {
- char *p = buf;
+ char *p = linebuf;
while (*p == ' ' || *p == '\t')
p++;
fprintf(fp, " %s", p);
@@ -183,19 +220,7 @@ tb_printinternal(tb, fp)
tracebackobject *tb;
FILE *fp;
{
- while (tb != NULL) {
- if (intrcheck())
- break;
- fprintf(fp, " File \"%s\"",
- getstringvalue(tb->tb_frame->f_code->co_filename));
-#ifdef applec /* MPW */
- /* This is needed by MPW's File and Line commands */
- fprintf(fp, "; ");
-#else
- /* This is needed by Emacs' compile command */
- fprintf(fp, ", ");
-#endif
- fprintf(fp, "line %d\n", tb->tb_lineno);
+ while (tb != NULL && !intrcheck()) {
tb_displayline(fp,
getstringvalue(tb->tb_frame->f_code->co_filename),
tb->tb_lineno);