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

Skip to content

Commit 8d617a6

Browse files
committed
various tuple related optimizations; remove unused b/w compat code from ceval.c
1 parent 53e8d44 commit 8d617a6

2 files changed

Lines changed: 44 additions & 83 deletions

File tree

Python/ceval.c

Lines changed: 26 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ eval_code(co, globals, locals, owner, arg)
782782
/* A tuple is equivalent to its first element here */
783783
while (is_tupleobject(w) && gettuplesize(w) > 0) {
784784
u = w;
785-
w = gettupleitem(u, 0);
785+
w = GETTUPLEITEM(u, 0);
786786
INCREF(w);
787787
DECREF(u);
788788
}
@@ -977,7 +977,7 @@ eval_code(co, globals, locals, owner, arg)
977977
break;
978978
}
979979
for (; --oparg >= 0; ) {
980-
w = gettupleitem(v, oparg);
980+
w = GETTUPLEITEM(v, oparg);
981981
INCREF(w);
982982
PUSH(w);
983983
}
@@ -1003,54 +1003,6 @@ eval_code(co, globals, locals, owner, arg)
10031003
break;
10041004
}
10051005
n = gettuplesize(v);
1006-
#ifdef COMPAT_HACKS
1007-
/* Implement various compatibility hacks (for 0.9.4 or earlier):
1008-
(a) f(a,b,...) accepts f((1,2,...))
1009-
(b) f((a,b,...)) accepts f(1,2,...)
1010-
(c) f(self,(a,b,...)) accepts f(x,1,2,...)
1011-
*/
1012-
if (n == 1 && oparg != 1) {
1013-
/* Rule (a) */
1014-
w = gettupleitem(v, 0);
1015-
if (is_tupleobject(w)) {
1016-
INCREF(w);
1017-
DECREF(v);
1018-
v = w;
1019-
n = gettuplesize(v);
1020-
}
1021-
}
1022-
else if (n != 1 && oparg == 1) {
1023-
/* Rule (b) */
1024-
PUSH(v);
1025-
break;
1026-
/* Don't fall through */
1027-
}
1028-
else if (n > 2 && oparg == 2) {
1029-
/* Rule (c) */
1030-
int i;
1031-
w = newtupleobject(n-1);
1032-
u = newtupleobject(2);
1033-
if (u == NULL || w == NULL) {
1034-
XDECREF(w);
1035-
XDECREF(u);
1036-
DECREF(v);
1037-
why = WHY_EXCEPTION;
1038-
break;
1039-
}
1040-
t = gettupleitem(v, 0);
1041-
INCREF(t);
1042-
settupleitem(u, 0, t);
1043-
for (i = 1; i < n; i++) {
1044-
t = gettupleitem(v, i);
1045-
INCREF(t);
1046-
settupleitem(w, i-1, t);
1047-
}
1048-
settupleitem(u, 1, w);
1049-
DECREF(v);
1050-
v = u;
1051-
n = 2;
1052-
}
1053-
#endif /* Disabled compatibility hacks */
10541006
if (n != oparg) {
10551007
err_setstr(TypeError,
10561008
"arg count mismatch");
@@ -1078,7 +1030,7 @@ eval_code(co, globals, locals, owner, arg)
10781030
break;
10791031
}
10801032
for (; --oparg >= 0; ) {
1081-
w = gettupleitem(v, oparg);
1033+
w = GETTUPLEITEM(v, oparg);
10821034
INCREF(w);
10831035
PUSH(w);
10841036
}
@@ -1288,9 +1240,7 @@ eval_code(co, globals, locals, owner, arg)
12881240
if (x != NULL) {
12891241
for (; --oparg >= 0;) {
12901242
w = POP();
1291-
err = settupleitem(x, oparg, w);
1292-
if (err != 0)
1293-
break;
1243+
SETTUPLEITEM(x, oparg, w);
12941244
}
12951245
PUSH(x);
12961246
}
@@ -1683,12 +1633,12 @@ call_trace(p_trace, p_newtrace, f, msg, arg)
16831633
if (what == NULL)
16841634
goto cleanup;
16851635
INCREF(f);
1686-
settupleitem(arglist, 0, (object *)f);
1687-
settupleitem(arglist, 1, what);
1636+
SETTUPLEITEM(arglist, 0, (object *)f);
1637+
SETTUPLEITEM(arglist, 1, what);
16881638
if (arg == NULL)
16891639
arg = None;
16901640
INCREF(arg);
1691-
settupleitem(arglist, 2, arg);
1641+
SETTUPLEITEM(arglist, 2, arg);
16921642
tracing++;
16931643
fast_2_locals(f);
16941644
res = call_object(*p_trace, arglist); /* May clear *p_trace! */
@@ -2074,14 +2024,17 @@ call_object(func, arg)
20742024
object *result;
20752025

20762026
if (call = func->ob_type->tp_call) {
2027+
#if 0
2028+
/* XXX Why is this here??? */
20772029
int size = gettuplesize(arg);
20782030
if (arg) {
20792031
size = gettuplesize(arg);
20802032
if (size == 1)
2081-
arg = gettupleitem(arg, 0);
2033+
arg = GETTUPLEITEM(arg, 0);
20822034
else if (size == 0)
20832035
arg = NULL;
2084-
}
2036+
}
2037+
#endif
20852038
result = (*call)(func, arg);
20862039
}
20872040
else if (is_instancemethodobject(func) || is_funcobject(func))
@@ -2106,7 +2059,7 @@ call_builtin(func, arg)
21062059
if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
21072060
int size = gettuplesize(arg);
21082061
if (size == 1)
2109-
arg = gettupleitem(arg, 0);
2062+
arg = GETTUPLEITEM(arg, 0);
21102063
else if (size == 0)
21112064
arg = NULL;
21122065
}
@@ -2151,7 +2104,7 @@ call_function(func, arg)
21512104
the class (or a derived class) as first argument */
21522105
if (arg != NULL && is_tupleobject(arg) &&
21532106
gettuplesize(arg) >= 1) {
2154-
self = gettupleitem(arg, 0);
2107+
self = GETTUPLEITEM(arg, 0);
21552108
if (self != NULL &&
21562109
is_instanceobject(self) &&
21572110
issubclass((object *)
@@ -2178,18 +2131,18 @@ call_function(func, arg)
21782131
if (newarg == NULL)
21792132
return NULL;
21802133
INCREF(self);
2181-
settupleitem(newarg, 0, self);
2134+
SETTUPLEITEM(newarg, 0, self);
21822135
if (arg != NULL && !is_tupleobject(arg)) {
21832136
INCREF(arg);
2184-
settupleitem(newarg, 1, arg);
2137+
SETTUPLEITEM(newarg, 1, arg);
21852138
}
21862139
else {
21872140
int i;
21882141
object *v;
21892142
for (i = 0; i < argcount; i++) {
2190-
v = gettupleitem(arg, i);
2143+
v = GETTUPLEITEM(arg, i);
21912144
XINCREF(v);
2192-
settupleitem(newarg, i+1, v);
2145+
SETTUPLEITEM(newarg, i+1, v);
21932146
}
21942147
}
21952148
arg = newarg;
@@ -2221,14 +2174,14 @@ call_function(func, arg)
22212174
return NULL;
22222175
}
22232176
for (i = 0; i < actualcount; i++) {
2224-
v = gettupleitem(arg, i);
2177+
v = GETTUPLEITEM(arg, i);
22252178
XINCREF(v);
2226-
settupleitem(newarg, i, v);
2179+
SETTUPLEITEM(newarg, i, v);
22272180
}
22282181
for (; i < argcount; i++, j++) {
2229-
v = gettupleitem(argdefs, j);
2182+
v = GETTUPLEITEM(argdefs, j);
22302183
XINCREF(v);
2231-
settupleitem(newarg, i, v);
2184+
SETTUPLEITEM(newarg, i, v);
22322185
}
22332186
DECREF(arg);
22342187
arg = newarg;
@@ -2422,7 +2375,7 @@ cmp_exception(err, v)
24222375
n = gettuplesize(v);
24232376
for (i = 0; i < n; i++) {
24242377
/* Test recursively */
2425-
if (cmp_exception(err, gettupleitem(v, i)))
2378+
if (cmp_exception(err, GETTUPLEITEM(v, i)))
24262379
return 1;
24272380
}
24282381
return 0;
@@ -2586,7 +2539,7 @@ build_class(methods, bases, name)
25862539
}
25872540
if (gettuplesize(bases) > 0) {
25882541
object *base;
2589-
base = gettupleitem(bases, 0);
2542+
base = GETTUPLEITEM(bases, 0);
25902543
/* Call the base's *type*, if it is callable.
25912544
This code is a hook for Donald Beaudry's type extensions.
25922545
In unexended Python it will never be triggered since its
@@ -2609,7 +2562,7 @@ build_class(methods, bases, name)
26092562
return NULL;
26102563
}
26112564
for (i = gettuplesize(bases); --i >= 0; ) {
2612-
object *base = gettupleitem(bases, i);
2565+
object *base = GETTUPLEITEM(bases, i);
26132566
if (!is_classobject(base)) {
26142567
err_setstr(TypeError,
26152568
"base is not a class object");
@@ -2636,7 +2589,7 @@ access_statement(name, vmode, f)
26362589
object *map = f->f_localmap;
26372590
value = NULL;
26382591
for (fastind = gettuplesize(map); --fastind >= 0; ) {
2639-
object *fname = gettupleitem(map, fastind);
2592+
object *fname = GETTUPLEITEM(map, fastind);
26402593
if (cmpobject(name, fname) == 0) {
26412594
value = getlistitem(f->f_fastlocals, fastind);
26422595
break;
@@ -2741,7 +2694,6 @@ find_from_args(f, nexti)
27412694
next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
27422695
opcode = (*next_instr++);
27432696
if (opcode != IMPORT_FROM) {
2744-
printf("next opcode: %d\n", opcode);
27452697
INCREF(None);
27462698
return None;
27472699
}

Python/marshal.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ w_object(v, p)
161161
n = gettuplesize(v);
162162
w_long((long)n, p);
163163
for (i = 0; i < n; i++) {
164-
w_object(gettupleitem(v, i), p);
164+
w_object(GETTUPLEITEM(v, i), p);
165165
}
166166
}
167167
else if (is_listobject(v)) {
@@ -220,9 +220,9 @@ wr_object(x, fp)
220220

221221
typedef WFILE RFILE; /* Same struct with different invariants */
222222

223-
#define r_byte(p) ((p)->fp ? getc((p)->fp) \
224-
: ((p)->ptr != (p)->end) ? \
225-
(unsigned char)*(p)->ptr++ : EOF)
223+
#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
224+
225+
#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
226226

227227
static int
228228
r_string(s, n, p)
@@ -255,10 +255,19 @@ r_long(p)
255255
RFILE *p;
256256
{
257257
register long x;
258-
x = r_byte(p);
259-
x |= (long)r_byte(p) << 8;
260-
x |= (long)r_byte(p) << 16;
261-
x |= (long)r_byte(p) << 24;
258+
register FILE *fp = p->fp;
259+
if (fp) {
260+
x = getc(fp);
261+
x |= (long)getc(fp) << 8;
262+
x |= (long)getc(fp) << 16;
263+
x |= (long)getc(fp) << 24;
264+
}
265+
else {
266+
x = rs_byte(p);
267+
x |= (long)rs_byte(p) << 8;
268+
x |= (long)rs_byte(p) << 16;
269+
x |= (long)rs_byte(p) << 24;
270+
}
262271
/* XXX If your long is > 32 bits, add sign-extension here!!! */
263272
return x;
264273
}
@@ -335,7 +344,7 @@ r_object(p)
335344
if (v == NULL)
336345
return v;
337346
for (i = 0; i < n; i++)
338-
settupleitem(v, (int)i, r_object(p));
347+
SETTUPLEITEM(v, (int)i, r_object(p));
339348
return v;
340349

341350
case TYPE_LIST:

0 commit comments

Comments
 (0)