Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6ac258d

Browse files
committed
* pythonrun.c: Print exception type+arg *after* stack trace instead of
before it. * ceval.c, object.c: moved testbool() to object.c (now extern visible) * stringobject.c: fix bugs in and rationalize string resize in formatstring() * tokenizer.[ch]: fix non-working code for lines longer than BUFSIZ
1 parent ad4fcd4 commit 6ac258d

7 files changed

Lines changed: 95 additions & 81 deletions

File tree

Objects/object.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,29 @@ setattr(v, name, w)
213213
}
214214
}
215215

216+
/* Test a value used as condition, e.g., in a for or if statement.
217+
Return -1 if an error occurred */
218+
219+
int
220+
testbool(v)
221+
object *v;
222+
{
223+
int res;
224+
if (v == None)
225+
res = 0;
226+
else if (v->ob_type->tp_as_number != NULL)
227+
res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
228+
else if (v->ob_type->tp_as_mapping != NULL)
229+
res = (*v->ob_type->tp_as_mapping->mp_length)(v);
230+
else if (v->ob_type->tp_as_sequence != NULL)
231+
res = (*v->ob_type->tp_as_sequence->sq_length)(v);
232+
else
233+
res = 1;
234+
if (res > 0)
235+
res = 1;
236+
return res;
237+
}
238+
216239

217240
/*
218241
NoObject is usable as a non-NULL undefined value, used by the macro None.

Objects/stringobject.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -491,13 +491,13 @@ formatstring(format, args)
491491
err_badcall();
492492
return NULL;
493493
}
494-
reslen = rescnt = 100;
494+
fmt = getstringvalue(format);
495+
fmtcnt = getstringsize(format);
496+
reslen = rescnt = fmtcnt + 100;
495497
result = newsizedstringobject((char *)NULL, reslen);
496498
if (result == NULL)
497499
return NULL;
498500
res = getstringvalue(result);
499-
fmt = getstringvalue(format);
500-
fmtcnt = getstringsize(format);
501501
if (is_tupleobject(args)) {
502502
arglen = gettuplesize(args);
503503
argidx = 0;
@@ -509,12 +509,11 @@ formatstring(format, args)
509509
while (--fmtcnt >= 0) {
510510
if (*fmt != '%') {
511511
if (--rescnt < 0) {
512-
rescnt = reslen;
513-
reslen = reslen * 2; /* Maybe less when big? */
512+
rescnt = fmtcnt + 100;
513+
reslen += rescnt;
514514
if (resizestring(&result, reslen) < 0)
515515
return NULL;
516-
res = getstringvalue(result) + rescnt;
517-
rescnt = reslen - rescnt;
516+
res = getstringvalue(result) + reslen - rescnt;
518517
}
519518
*res++ = *fmt++;
520519
}
@@ -692,12 +691,12 @@ formatstring(format, args)
692691
if (width < len)
693692
width = len;
694693
if (rescnt < width + (sign != '\0')) {
695-
rescnt = reslen;
696-
reslen = reslen + width + 100;
694+
reslen -= rescnt;
695+
rescnt = width + fmtcnt + 100;
696+
reslen += rescnt;
697697
if (resizestring(&result, reslen) < 0)
698698
return NULL;
699-
res = getstringvalue(result) + rescnt;
700-
rescnt = reslen - rescnt;
699+
res = getstringvalue(result) + reslen - rescnt;
701700
}
702701
if (sign) {
703702
*res++ = sign;

Objects/xxobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,5 @@ static typeobject Xxtype = {
137137
0, /*tp_as_number*/
138138
0, /*tp_as_sequence*/
139139
0, /*tp_as_mapping*/
140+
0, /*tp_hash*/
140141
};

Parser/tokenizer.c

Lines changed: 55 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -170,31 +170,15 @@ static int
170170
tok_nextc(tok)
171171
register struct tok_state *tok;
172172
{
173-
if (tok->done != E_OK)
174-
return EOF;
175-
176173
for (;;) {
177-
if (tok->cur < tok->inp)
178-
return *tok->cur++;
174+
if (tok->cur != tok->inp)
175+
return *tok->cur++; /* Fast path */
176+
if (tok->done != E_OK)
177+
return EOF;
179178
if (tok->fp == NULL) {
180179
tok->done = E_EOF;
181180
return EOF;
182181
}
183-
if (tok->inp > tok->buf && tok->inp[-1] == '\n')
184-
tok->inp = tok->buf;
185-
if (tok->inp == tok->end) {
186-
int n = tok->end - tok->buf;
187-
char *new = tok->buf;
188-
RESIZE(new, char, n+n);
189-
if (new == NULL) {
190-
fprintf(stderr, "tokenizer out of mem\n");
191-
tok->done = E_NOMEM;
192-
return EOF;
193-
}
194-
tok->buf = new;
195-
tok->inp = tok->buf + n;
196-
tok->end = tok->inp + n;
197-
}
198182
#ifdef USE_READLINE
199183
if (tok->prompt != NULL) {
200184
extern char *readline PROTO((char *prompt));
@@ -211,46 +195,71 @@ tok_nextc(tok)
211195
(void) intrcheck(); /* Clear pending interrupt */
212196
if (tok->nextprompt != NULL)
213197
tok->prompt = tok->nextprompt;
214-
/* XXX different semantics w/o readline()! */
215198
if (tok->buf == NULL) {
216199
tok->done = E_EOF;
217200
}
218201
else {
219-
unsigned int n = strlen(tok->buf);
220-
if (n > 0)
202+
tok->end = strchr(tok->buf, '\0');
203+
if (tok->end > tok->buf)
221204
add_history(tok->buf);
222-
/* Append the '\n' that readline()
223-
doesn't give us, for the tokenizer... */
224-
tok->buf = realloc(tok->buf, n+2);
225-
if (tok->buf == NULL)
226-
tok->done = E_NOMEM;
227-
else {
228-
tok->end = tok->buf + n;
229-
*tok->end++ = '\n';
230-
*tok->end = '\0';
231-
tok->inp = tok->end;
232-
tok->cur = tok->buf;
233-
}
205+
/* Replace trailing '\n' by '\0'
206+
(we don't need a '\0', but the
207+
tokenizer wants a '\n'...) */
208+
*tok->end++ = '\n';
209+
tok->inp = tok->end;
210+
tok->cur = tok->buf;
234211
}
235212
}
236213
else
237214
#endif
238215
{
239-
tok->cur = tok->inp;
240-
if (tok->prompt != NULL && tok->inp == tok->buf) {
216+
if (tok->prompt != NULL) {
241217
fprintf(stderr, "%s", tok->prompt);
242-
tok->prompt = tok->nextprompt;
218+
if (tok->nextprompt != NULL)
219+
tok->prompt = tok->nextprompt;
243220
}
244-
tok->done = fgets_intr(tok->inp,
245-
(int)(tok->end - tok->inp), tok->fp);
221+
if (tok->buf == NULL) {
222+
tok->buf = NEW(char, BUFSIZ);
223+
if (tok->buf == NULL) {
224+
tok->done = E_NOMEM;
225+
return EOF;
226+
}
227+
tok->end = tok->buf + BUFSIZ;
228+
}
229+
tok->done = fgets_intr(tok->buf,
230+
(int)(tok->end - tok->buf), tok->fp);
231+
tok->inp = strchr(tok->buf, '\0');
232+
/* Read until '\n' or EOF */
233+
while (tok->inp+1==tok->end && tok->inp[-1]!='\n') {
234+
int curvalid = tok->inp - tok->buf;
235+
int cursize = tok->end - tok->buf;
236+
int newsize = cursize + BUFSIZ;
237+
char *newbuf = tok->buf;
238+
RESIZE(newbuf, char, newsize);
239+
if (newbuf == NULL) {
240+
tok->done = E_NOMEM;
241+
tok->cur = tok->inp;
242+
return EOF;
243+
}
244+
tok->buf = newbuf;
245+
tok->inp = tok->buf + curvalid;
246+
tok->end = tok->buf + newsize;
247+
if (fgets_intr(tok->inp,
248+
(int)(tok->end - tok->inp),
249+
tok->fp) != E_OK)
250+
break;
251+
tok->inp = strchr(tok->inp, '\0');
252+
}
253+
tok->cur = tok->buf;
246254
}
247255
if (tok->done != E_OK) {
248256
if (tok->prompt != NULL)
249257
fprintf(stderr, "\n");
258+
tok->cur = tok->inp;
250259
return EOF;
251260
}
252-
tok->inp = strchr(tok->inp, '\0');
253261
}
262+
/*NOTREACHED*/
254263
}
255264

256265

@@ -390,6 +399,7 @@ tok_get(tok, p_start, p_end)
390399
if (tok->indent+1 >= MAXINDENT) {
391400
fprintf(stderr, "excessive indent\n");
392401
tok->done = E_TOKEN;
402+
tok->cur = tok->inp;
393403
return ERRORTOKEN;
394404
}
395405
tok->pendin++;
@@ -405,6 +415,7 @@ tok_get(tok, p_start, p_end)
405415
if (col != tok->indstack[tok->indent]) {
406416
fprintf(stderr, "inconsistent dedent\n");
407417
tok->done = E_TOKEN;
418+
tok->cur = tok->inp;
408419
return ERRORTOKEN;
409420
}
410421
}
@@ -558,13 +569,15 @@ tok_get(tok, p_start, p_end)
558569
c = tok_nextc(tok);
559570
if (c == '\n' || c == EOF) {
560571
tok->done = E_TOKEN;
572+
tok->cur = tok->inp;
561573
return ERRORTOKEN;
562574
}
563575
if (c == '\\') {
564576
c = tok_nextc(tok);
565577
*p_end = tok->cur;
566578
if (c == '\n' || c == EOF) {
567579
tok->done = E_TOKEN;
580+
tok->cur = tok->inp;
568581
return ERRORTOKEN;
569582
}
570583
continue;
@@ -581,6 +594,7 @@ tok_get(tok, p_start, p_end)
581594
c = tok_nextc(tok);
582595
if (c != '\n') {
583596
tok->done = E_TOKEN;
597+
tok->cur = tok->inp;
584598
return ERRORTOKEN;
585599
}
586600
tok->lineno++;

Parser/tokenizer.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3131
/* Tokenizer state */
3232
struct tok_state {
3333
/* Input state; buf <= cur <= inp <= end */
34-
/* NB an entire token must fit in the buffer */
35-
char *buf; /* Input buffer */
34+
/* NB an entire line is held in the buffer */
35+
char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL */
3636
char *cur; /* Next character in buffer */
3737
char *inp; /* End of data in buffer */
38-
char *end; /* End of input buffer */
39-
int done; /* 0 normally, 1 at EOF, -1 after error */
38+
char *end; /* End of input buffer if buf != NULL */
39+
int done; /* E_OK normally, E_EOF at EOF, otherwise error code */
40+
/* NB If done != E_OK, cur must be == inp!!! */
4041
FILE *fp; /* Rest of input; NULL if tokenizing a string */
4142
int tabsize; /* Tab spacing */
4243
int indent; /* Current indentation index */

Python/ceval.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ static int prtrace PROTO((object *, char *));
5858
static void call_exc_trace PROTO((object **, object**, frameobject *));
5959
static int call_trace
6060
PROTO((object **, object **, frameobject *, char *, object *));
61-
static int testbool PROTO((object *));
6261
static object *add PROTO((object *, object *));
6362
static object *sub PROTO((object *, object *));
6463
static object *mul PROTO((object *, object *));
@@ -1612,29 +1611,6 @@ flushline()
16121611
}
16131612

16141613

1615-
/* Test a value used as condition, e.g., in a for or if statement.
1616-
Return -1 if an error occurred */
1617-
1618-
static int
1619-
testbool(v)
1620-
object *v;
1621-
{
1622-
int res;
1623-
if (v == None)
1624-
res = 0;
1625-
else if (v->ob_type->tp_as_number != NULL)
1626-
res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1627-
else if (v->ob_type->tp_as_mapping != NULL)
1628-
res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1629-
else if (v->ob_type->tp_as_sequence != NULL)
1630-
res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1631-
else
1632-
res = 1;
1633-
if (res > 0)
1634-
res = 1;
1635-
return res;
1636-
}
1637-
16381614
static object *
16391615
or(v, w)
16401616
object *v, *w;

Python/pythonrun.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ print_error()
245245
if (f == NULL)
246246
fprintf(stderr, "lost sys.stderr\n");
247247
else {
248+
printtraceback(f);
248249
if (writeobject(exception, f, PRINT_RAW) != 0)
249250
err_clear();
250251
if (v != NULL && v != None) {
@@ -253,7 +254,6 @@ print_error()
253254
err_clear();
254255
}
255256
writestring("\n", f);
256-
printtraceback(f);
257257
}
258258
XDECREF(exception);
259259
XDECREF(v);

0 commit comments

Comments
 (0)