11/* Range object implementation */
22
33#include "Python.h"
4- #include "frameobject.h"
54#include "opcode.h"
65
76typedef struct {
@@ -11,48 +10,6 @@ typedef struct {
1110 long len ;
1211} rangeobject ;
1312
14- static int
15- py3kwarn_next_opcode (void )
16- {
17- PyFrameObject * frame ;
18- char * code ;
19- Py_ssize_t n ;
20- int offset ;
21- int op ;
22- int steps ;
23-
24- frame = PyEval_GetFrame ();
25- if (frame == NULL || frame -> f_code == NULL )
26- return -1 ;
27- if (PyString_AsStringAndSize (frame -> f_code -> co_code , & code , & n ) < 0 ) {
28- PyErr_Clear ();
29- return -1 ;
30- }
31-
32- offset = frame -> f_lasti ;
33- if (offset < 0 || offset >= n )
34- return -1 ;
35-
36- op = (unsigned char )code [offset ];
37- offset += 1 ;
38- if (HAS_ARG (op ))
39- offset += 2 ;
40-
41- for (steps = 0 ; steps < 8 && offset >= 0 && offset < n ; steps ++ ) {
42- op = (unsigned char )code [offset ];
43- if (op == BINARY_ADD || op == INPLACE_ADD || op == GET_ITER ||
44- op == BINARY_SUBSCR || op == STORE_SUBSCR )
45- return op ;
46- if (op == RETURN_VALUE || op == STORE_NAME || op == STORE_FAST ||
47- op == STORE_GLOBAL || op == STORE_ATTR || op == POP_TOP )
48- return -1 ;
49- offset += 1 ;
50- if (HAS_ARG (op ))
51- offset += 2 ;
52- }
53- return -1 ;
54- }
55-
5613/* Return number of items in range (lo, hi, step). step != 0
5714 * required. The result always fits in an unsigned long.
5815 */
@@ -113,16 +70,14 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
11370 unsigned long n ;
11471 int nextop ;
11572
116- nextop = py3kwarn_next_opcode ();
117- if (nextop == GET_ITER ) {
118- if ( PyErr_WarnPy3k_WithFix ("xrange() is not supported in 3.x" ,
73+ nextop = _Py3kWarn_NextOpcode ();
74+ if (nextop == GET_ITER &&
75+ PyErr_WarnPy3k_WithFix ("xrange() is not supported in 3.x" ,
11976 "use range() instead" , 1 ) < 0 )
120- return NULL ;
121- }
122- else {
123- if (PyErr_WarnPy3k ("xrange() may require list materialization in 3.x" , 1 ) < 0 )
124- return NULL ;
125- }
77+ return NULL ;
78+ if (nextop != GET_ITER &&
79+ PyErr_WarnPy3k ("xrange() may require list materialization in 3.x" , 1 ) < 0 )
80+ return NULL ;
12681
12782 if (!_PyArg_NoKeywords ("xrange()" , kw ))
12883 return NULL ;
0 commit comments