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

Skip to content

Commit 2586bf0

Browse files
committed
* rangeobject.{c,h}, bltinmodule.c: removed non-essential ops from range
object.
1 parent 0667626 commit 2586bf0

3 files changed

Lines changed: 42 additions & 121 deletions

File tree

Include/rangeobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ extern typeobject Rangetype;
3838

3939
#define is_rangeobject(op) ((op)->ob_type == &Rangetype)
4040

41-
extern object *newrangeobject PROTO((long, long, long, int));
41+
extern object *newrangeobject PROTO((long, long, long));

Objects/rangeobject.c

Lines changed: 28 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,18 @@ typedef struct {
3131
long start;
3232
long step;
3333
long len;
34-
int reps;
3534
} rangeobject;
3635

3736

3837
object *
39-
newrangeobject(start, len, step, reps)
38+
newrangeobject(start, len, step)
4039
long start, len, step;
41-
int reps;
4240
{
4341
rangeobject *obj = (rangeobject *) newobject(&Rangetype);
4442

4543
obj->start = start;
4644
obj->len = len;
4745
obj->step = step;
48-
obj->reps = reps;
4946

5047
return (object *) obj;
5148
}
@@ -62,77 +59,31 @@ range_item(r, i)
6259
rangeobject *r;
6360
int i;
6461
{
65-
if (i < 0 || i >= r->len * r->reps) {
62+
if (i < 0 || i >= r->len) {
6663
err_setstr(IndexError, "range object index out of range");
6764
return NULL;
6865
}
6966

70-
return newintobject(r->start + (i % r->len) * r->step);
67+
return newintobject(r->start + i * r->step);
7168
}
7269

7370
static int
7471
range_length(r)
7572
rangeobject *r;
7673
{
77-
return r->len * r->reps;
74+
return r->len;
7875
}
7976

8077
static object *
8178
range_repr(r)
8279
rangeobject *r;
8380
{
8481
char buf[80];
85-
if (r->reps != 1)
86-
sprintf(buf, "(xrange(%ld, %ld, %ld) * %d)",
87-
r->start,
88-
r->start + r->len * r->step,
89-
r->step,
90-
r->reps);
91-
else
92-
sprintf(buf, "xrange(%ld, %ld, %ld)",
93-
r->start,
94-
r->start + r->len * r->step,
95-
r->step);
82+
sprintf(buf, "xrange(%ld, %ld, %ld)",
83+
r->start, r->start + r->len * r->step, r->step);
9684
return newstringobject(buf);
9785
}
9886

99-
object *
100-
range_concat(r, obj)
101-
rangeobject *r;
102-
object *obj;
103-
{
104-
if (is_rangeobject(obj)) {
105-
rangeobject *s = (rangeobject *)obj;
106-
if (r->start == s->start && r->len == s->len &&
107-
r->step == s->step)
108-
return newrangeobject(r->start, r->len, r->step,
109-
r->reps + s->reps);
110-
}
111-
err_setstr(TypeError, "cannot concatenate different range objects");
112-
return NULL;
113-
}
114-
115-
object *
116-
range_repeat(r, n)
117-
rangeobject *r;
118-
int n;
119-
{
120-
if (n < 0)
121-
return (object *) newrangeobject(0, 0, 1, 1);
122-
123-
else if (n == 1) {
124-
INCREF(r);
125-
return (object *) r;
126-
}
127-
128-
else
129-
return (object *) newrangeobject(
130-
r->start,
131-
r->len,
132-
r->step,
133-
r->reps * n);
134-
}
135-
13687
static int
13788
range_compare(r1, r2)
13889
rangeobject *r1, *r2;
@@ -145,36 +96,33 @@ range_compare(r1, r2)
14596

14697
else if (r1->len != r2->len)
14798
return r1->len - r2->len;
99+
}
148100

149-
else
150-
return r1->reps - r2->reps;
101+
static object *
102+
range_concat(r, s)
103+
rangeobject *r;
104+
object *s;
105+
{
106+
err_setstr(TypeError, "concat not supported by xrange object");
107+
return NULL;
151108
}
152109

153110
static object *
154-
range_slice(r, low, high)
111+
range_repeat(r, n)
155112
rangeobject *r;
156-
int low, high;
113+
int n;
157114
{
158-
if (r->reps != 1) {
159-
err_setstr(TypeError, "cannot slice a replicated range");
160-
return NULL;
161-
}
162-
if (low < 0)
163-
low = 0;
164-
else if (low > r->len)
165-
low = r->len;
166-
if (high < 0)
167-
high = 0;
168-
if (high < low)
169-
high = low;
170-
else if (high > r->len)
171-
high = r->len;
172-
173-
return (object *) newrangeobject(
174-
low * r->step + r->start,
175-
high - low,
176-
r->step,
177-
1);
115+
err_setstr(TypeError, "repeat not supported by xrange object");
116+
return NULL;
117+
}
118+
119+
static object *
120+
range_slice(r, i, j)
121+
rangeobject *r;
122+
int i, j;
123+
{
124+
err_setstr(TypeError, "slice not supported by xrange object");
125+
return NULL;
178126
}
179127

180128
static sequence_methods range_as_sequence = {
@@ -190,7 +138,7 @@ static sequence_methods range_as_sequence = {
190138
typeobject Rangetype = {
191139
OB_HEAD_INIT(&Typetype)
192140
0, /* Number of items for varobject */
193-
"range", /* Name of this type */
141+
"xrange", /* Name of this type */
194142
sizeof(rangeobject), /* Basic object size */
195143
0, /* Item size for varobject */
196144
range_dealloc, /*tp_dealloc*/

Python/bltinmodule.c

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ builtin_xrange(self, v)
922922
if (len < 0)
923923
len = 0;
924924

925-
return newrangeobject(start, len, step, 1);
925+
return newrangeobject(start, len, step);
926926
}
927927

928928
static object *
@@ -1280,16 +1280,10 @@ filtertuple(func, tuple)
12801280
{
12811281
object *result;
12821282
register int i, j;
1283-
int len = gettuplesize(tuple), shared = 0;
1283+
int len = gettuplesize(tuple);
12841284

1285-
if (tuple->ob_refcnt == 1) {
1286-
result = tuple;
1287-
shared = 1;
1288-
/* defer INCREF (resizetuple wants it to be one) */
1289-
}
1290-
else
1291-
if ((result = newtupleobject(len)) == NULL)
1292-
return NULL;
1285+
if ((result = newtupleobject(len)) == NULL)
1286+
return NULL;
12931287

12941288
for (i = j = 0; i < len; ++i) {
12951289
object *item, *good;
@@ -1322,14 +1316,10 @@ filtertuple(func, tuple)
13221316
if (resizetuple(&result, j, 0) < 0)
13231317
return NULL;
13241318

1325-
if (shared)
1326-
INCREF(result);
1327-
13281319
return result;
13291320

13301321
Fail_1:
1331-
if (!shared)
1332-
DECREF(result);
1322+
DECREF(result);
13331323
return NULL;
13341324
}
13351325

@@ -1343,28 +1333,15 @@ filterstring(func, strobj)
13431333
{
13441334
object *result;
13451335
register int i, j;
1346-
int len = getstringsize(strobj), shared = 0;
1347-
1348-
if (strobj->ob_refcnt == 1) {
1349-
result = strobj;
1350-
shared = 1;
1351-
/* defer INCREF (resizestring wants it to be one) */
1336+
int len = getstringsize(strobj);
13521337

1353-
if (func == None) {
1354-
INCREF(result);
1355-
return result;
1356-
}
1357-
}
1358-
else {
1359-
if ((result = newsizedstringobject(NULL, len)) == NULL)
1360-
return NULL;
1361-
1362-
if (func == None) {
1363-
strcpy(GETSTRINGVALUE((stringobject *)result),
1364-
GETSTRINGVALUE((stringobject *)strobj));
1365-
return result;
1366-
}
1338+
if (func == None) {
1339+
/* No character is ever false -- share input string */
1340+
INCREF(result);
1341+
return result;
13671342
}
1343+
if ((result = newsizedstringobject(NULL, len)) == NULL)
1344+
return NULL;
13681345

13691346
for (i = j = 0; i < len; ++i) {
13701347
object *item, *arg, *good;
@@ -1391,13 +1368,9 @@ filterstring(func, strobj)
13911368
if (resizestring(&result, j) < 0)
13921369
return NULL;
13931370

1394-
if (shared)
1395-
INCREF(result);
1396-
13971371
return result;
13981372

13991373
Fail_1:
1400-
if (!shared)
1401-
DECREF(result);
1374+
DECREF(result);
14021375
return NULL;
14031376
}

0 commit comments

Comments
 (0)