1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 /* Compile an expression node to intermediate code */
35 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
37 XXX Generate simple jump for break/return outside 'try...finally'
38 XXX Allow 'continue' inside try-finally
39 XXX New opcode for loading the initial index for a for loop
43 #ifndef NO_PRIVATE_NAME_MANGLING
44 #define PRIVATE_NAME_MANGLING
54 #include "structmember.h"
58 /* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62 #if Py_single_input != single_input
63 #error "single_input has changed -- update Py_single_input in Python.h"
65 #if Py_file_input != file_input
66 #error "file_input has changed -- update Py_file_input in Python.h"
68 #if Py_eval_input != eval_input
69 #error "eval_input has changed -- update Py_eval_input in Python.h"
72 int Py_OptimizeFlag
= 0;
78 #define OFF(x) offsetof(PyCodeObject, x)
80 static struct memberlist code_memberlist
[] = {
81 {"co_argcount", T_INT
, OFF(co_argcount
), READONLY
},
82 {"co_nlocals", T_INT
, OFF(co_nlocals
), READONLY
},
83 {"co_stacksize",T_INT
, OFF(co_stacksize
), READONLY
},
84 {"co_flags", T_INT
, OFF(co_flags
), READONLY
},
85 {"co_code", T_OBJECT
, OFF(co_code
), READONLY
},
86 {"co_consts", T_OBJECT
, OFF(co_consts
), READONLY
},
87 {"co_names", T_OBJECT
, OFF(co_names
), READONLY
},
88 {"co_varnames", T_OBJECT
, OFF(co_varnames
), READONLY
},
89 {"co_filename", T_OBJECT
, OFF(co_filename
), READONLY
},
90 {"co_name", T_OBJECT
, OFF(co_name
), READONLY
},
91 {"co_firstlineno", T_INT
, OFF(co_firstlineno
), READONLY
},
92 {"co_lnotab", T_OBJECT
, OFF(co_lnotab
), READONLY
},
97 code_getattr(co
, name
)
101 return PyMember_Get((char *)co
, code_memberlist
, name
);
108 Py_XDECREF(co
->co_code
);
109 Py_XDECREF(co
->co_consts
);
110 Py_XDECREF(co
->co_names
);
111 Py_XDECREF(co
->co_varnames
);
112 Py_XDECREF(co
->co_filename
);
113 Py_XDECREF(co
->co_name
);
114 Py_XDECREF(co
->co_lnotab
);
125 char *filename
= "???";
128 _PyCode_GETCODEPTR(co
, &p
);
129 if (*p
== SET_LINENO
)
130 lineno
= (p
[1] & 0xff) | ((p
[2] & 0xff) << 8);
131 if (co
->co_filename
&& PyString_Check(co
->co_filename
))
132 filename
= PyString_AsString(co
->co_filename
);
133 if (co
->co_name
&& PyString_Check(co
->co_name
))
134 name
= PyString_AsString(co
->co_name
);
135 sprintf(buf
, "<code object %.100s at %lx, file \"%.300s\", line %d>",
136 name
, (long)co
, filename
, lineno
);
137 return PyString_FromString(buf
);
142 PyCodeObject
*co
, *cp
;
145 cmp
= co
->co_argcount
- cp
->co_argcount
;
147 cmp
= co
->co_nlocals
- cp
->co_nlocals
;
149 cmp
= co
->co_flags
- cp
->co_flags
;
151 cmp
= PyObject_Compare(co
->co_code
, cp
->co_code
);
153 cmp
= PyObject_Compare(co
->co_consts
, cp
->co_consts
);
155 cmp
= PyObject_Compare(co
->co_names
, cp
->co_names
);
157 cmp
= PyObject_Compare(co
->co_varnames
, cp
->co_varnames
);
165 long h
, h1
, h2
, h3
, h4
;
166 h1
= PyObject_Hash(co
->co_code
);
167 if (h1
== -1) return -1;
168 h2
= PyObject_Hash(co
->co_consts
);
169 if (h2
== -1) return -1;
170 h3
= PyObject_Hash(co
->co_names
);
171 if (h3
== -1) return -1;
172 h4
= PyObject_Hash(co
->co_varnames
);
173 if (h4
== -1) return -1;
174 h
= h1
^ h2
^ h3
^ h4
^
175 co
->co_argcount
^ co
->co_nlocals
^ co
->co_flags
;
180 PyTypeObject PyCode_Type
= {
181 PyObject_HEAD_INIT(&PyType_Type
)
184 sizeof(PyCodeObject
),
186 (destructor
)code_dealloc
, /*tp_dealloc*/
188 (getattrfunc
)code_getattr
, /*tp_getattr*/
190 (cmpfunc
)code_compare
, /*tp_compare*/
191 (reprfunc
)code_repr
, /*tp_repr*/
193 0, /*tp_as_sequence*/
195 (hashfunc
)code_hash
, /*tp_hash*/
199 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202 PyCode_New(argcount
, nlocals
, stacksize
, flags
,
203 code
, consts
, names
, varnames
, filename
, name
,
221 /* Check argument types */
222 if (argcount
< 0 || nlocals
< 0 ||
224 consts
== NULL
|| !PyTuple_Check(consts
) ||
225 names
== NULL
|| !PyTuple_Check(names
) ||
226 varnames
== NULL
|| !PyTuple_Check(varnames
) ||
227 name
== NULL
|| !PyString_Check(name
) ||
228 filename
== NULL
|| !PyString_Check(filename
) ||
229 lnotab
== NULL
|| !PyString_Check(lnotab
)) {
230 PyErr_BadInternalCall();
233 pb
= code
->ob_type
->tp_as_buffer
;
235 pb
->bf_getreadbuffer
== NULL
||
236 pb
->bf_getsegcount
== NULL
||
237 (*pb
->bf_getsegcount
)(code
, NULL
) != 1)
239 PyErr_BadInternalCall();
242 /* Make sure names and varnames are all strings, & intern them */
243 for (i
= PyTuple_Size(names
); --i
>= 0; ) {
244 PyObject
*v
= PyTuple_GetItem(names
, i
);
245 if (v
== NULL
|| !PyString_Check(v
)) {
246 PyErr_BadInternalCall();
249 PyString_InternInPlace(&PyTuple_GET_ITEM(names
, i
));
251 for (i
= PyTuple_Size(varnames
); --i
>= 0; ) {
252 PyObject
*v
= PyTuple_GetItem(varnames
, i
);
253 if (v
== NULL
|| !PyString_Check(v
)) {
254 PyErr_BadInternalCall();
257 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames
, i
));
259 /* Intern selected string constants */
260 for (i
= PyTuple_Size(consts
); --i
>= 0; ) {
261 PyObject
*v
= PyTuple_GetItem(consts
, i
);
263 if (!PyString_Check(v
))
265 p
= PyString_AsString(v
);
266 if ((int)strspn(p
, NAME_CHARS
)
269 PyString_InternInPlace(&PyTuple_GET_ITEM(consts
, i
));
271 co
= PyObject_NEW(PyCodeObject
, &PyCode_Type
);
273 co
->co_argcount
= argcount
;
274 co
->co_nlocals
= nlocals
;
275 co
->co_stacksize
= stacksize
;
276 co
->co_flags
= flags
;
280 co
->co_consts
= consts
;
282 co
->co_names
= names
;
284 co
->co_varnames
= varnames
;
286 co
->co_filename
= filename
;
289 co
->co_firstlineno
= firstlineno
;
291 co
->co_lnotab
= lnotab
;
297 /* Data structure used internally */
300 PyObject
*c_code
; /* string */
301 PyObject
*c_consts
; /* list of objects */
302 PyObject
*c_names
; /* list of strings (names) */
303 PyObject
*c_globals
; /* dictionary (value=None) */
304 PyObject
*c_locals
; /* dictionary (value=localID) */
305 PyObject
*c_varnames
; /* list (inverse of c_locals) */
306 int c_nlocals
; /* index of next local */
307 int c_argcount
; /* number of top-level arguments */
308 int c_flags
; /* same as co_flags */
309 int c_nexti
; /* index into c_code */
310 int c_errors
; /* counts errors occurred */
311 int c_infunction
; /* set when compiling a function */
312 int c_interactive
; /* generating code for interactive command */
313 int c_loops
; /* counts nested loops */
314 int c_begin
; /* begin of current loop, for 'continue' */
315 int c_block
[CO_MAXBLOCKS
]; /* stack of block types */
316 int c_nblocks
; /* current block stack level */
317 char *c_filename
; /* filename of current node */
318 char *c_name
; /* name of object (e.g. function) */
319 int c_lineno
; /* Current line number */
320 int c_stacklevel
; /* Current stack level */
321 int c_maxstacklevel
; /* Maximum stack level */
323 PyObject
*c_lnotab
; /* Table mapping address to line number */
324 int c_last_addr
, c_last_line
, c_lnotab_next
;
325 #ifdef PRIVATE_NAME_MANGLING
326 char *c_private
; /* for private name mangling */
331 /* Error message including line number */
334 com_error(c
, exc
, msg
)
344 if (c
->c_lineno
<= 1) {
345 /* Unknown line number or single interactive command */
346 PyErr_SetString(exc
, msg
);
349 sprintf(buffer
, " (line %d)", c
->c_lineno
);
350 v
= PyString_FromStringAndSize((char *)NULL
, n
+ strlen(buffer
));
352 return; /* MemoryError, too bad */
353 s
= PyString_AS_STRING((PyStringObject
*)v
);
356 PyErr_SetObject(exc
, v
);
361 /* Interface to the block stack */
368 if (c
->c_nblocks
>= CO_MAXBLOCKS
) {
369 com_error(c
, PyExc_SystemError
,
370 "too many statically nested blocks");
373 c
->c_block
[c
->c_nblocks
++] = type
;
382 if (c
->c_nblocks
> 0)
384 if (c
->c_block
[c
->c_nblocks
] != type
&& c
->c_errors
== 0) {
385 com_error(c
, PyExc_SystemError
, "bad block pop");
390 /* Prototype forward declarations */
392 static int com_init
Py_PROTO((struct compiling
*, char *));
393 static void com_free
Py_PROTO((struct compiling
*));
394 static void com_push
Py_PROTO((struct compiling
*, int));
395 static void com_pop
Py_PROTO((struct compiling
*, int));
396 static void com_done
Py_PROTO((struct compiling
*));
397 static void com_node
Py_PROTO((struct compiling
*, struct _node
*));
398 static void com_factor
Py_PROTO((struct compiling
*, struct _node
*));
399 static void com_addbyte
Py_PROTO((struct compiling
*, int));
400 static void com_addint
Py_PROTO((struct compiling
*, int));
401 static void com_addoparg
Py_PROTO((struct compiling
*, int, int));
402 static void com_addfwref
Py_PROTO((struct compiling
*, int, int *));
403 static void com_backpatch
Py_PROTO((struct compiling
*, int));
404 static int com_add
Py_PROTO((struct compiling
*, PyObject
*, PyObject
*));
405 static int com_addconst
Py_PROTO((struct compiling
*, PyObject
*));
406 static int com_addname
Py_PROTO((struct compiling
*, PyObject
*));
407 static void com_addopname
Py_PROTO((struct compiling
*, int, node
*));
408 static void com_list
Py_PROTO((struct compiling
*, node
*, int));
409 static int com_argdefs
Py_PROTO((struct compiling
*, node
*));
410 static int com_newlocal
Py_PROTO((struct compiling
*, char *));
411 static PyCodeObject
*icompile
Py_PROTO((struct _node
*, struct compiling
*));
412 static PyCodeObject
*jcompile
Py_PROTO((struct _node
*, char *,
413 struct compiling
*));
414 static PyObject
*parsestrplus
Py_PROTO((node
*));
415 static PyObject
*parsestr
Py_PROTO((char *));
418 com_init(c
, filename
)
422 if ((c
->c_code
= PyString_FromStringAndSize((char *)NULL
,
425 if ((c
->c_consts
= PyList_New(0)) == NULL
)
427 if ((c
->c_names
= PyList_New(0)) == NULL
)
429 if ((c
->c_globals
= PyDict_New()) == NULL
)
431 if ((c
->c_locals
= PyDict_New()) == NULL
)
433 if ((c
->c_varnames
= PyList_New(0)) == NULL
)
435 if ((c
->c_lnotab
= PyString_FromStringAndSize((char *)NULL
,
444 c
->c_interactive
= 0;
448 c
->c_filename
= filename
;
452 c
->c_maxstacklevel
= 0;
453 c
->c_firstlineno
= 0;
456 c
-> c_lnotab_next
= 0;
460 Py_DECREF(c
->c_varnames
);
462 Py_DECREF(c
->c_locals
);
464 Py_DECREF(c
->c_globals
);
466 Py_DECREF(c
->c_names
);
468 Py_DECREF(c
->c_consts
);
470 Py_DECREF(c
->c_code
);
479 Py_XDECREF(c
->c_code
);
480 Py_XDECREF(c
->c_consts
);
481 Py_XDECREF(c
->c_names
);
482 Py_XDECREF(c
->c_globals
);
483 Py_XDECREF(c
->c_locals
);
484 Py_XDECREF(c
->c_varnames
);
485 Py_XDECREF(c
->c_lnotab
);
493 c
->c_stacklevel
+= n
;
494 if (c
->c_stacklevel
> c
->c_maxstacklevel
)
495 c
->c_maxstacklevel
= c
->c_stacklevel
;
503 if (c
->c_stacklevel
< n
) {
505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
507 c->c_nexti, c->c_stacklevel, n); */
511 c
->c_stacklevel
-= n
;
518 if (c
->c_code
!= NULL
)
519 _PyString_Resize(&c
->c_code
, c
->c_nexti
);
520 if (c
->c_lnotab
!= NULL
)
521 _PyString_Resize(&c
->c_lnotab
, c
->c_lnotab_next
);
530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
531 if (byte
< 0 || byte
> 255) {
533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
534 fatal("com_addbyte: byte out of range");
536 com_error(c
, PyExc_SystemError
,
537 "com_addbyte: byte out of range");
539 if (c
->c_code
== NULL
)
541 len
= PyString_Size(c
->c_code
);
542 if (c
->c_nexti
>= len
) {
543 if (_PyString_Resize(&c
->c_code
, len
+1000) != 0) {
548 PyString_AsString(c
->c_code
)[c
->c_nexti
++] = byte
;
556 com_addbyte(c
, x
& 0xff);
557 com_addbyte(c
, x
>> 8); /* XXX x should be positive */
561 com_add_lnotab(c
, addr
, line
)
568 if (c
->c_lnotab
== NULL
)
570 size
= PyString_Size(c
->c_lnotab
);
571 if (c
->c_lnotab_next
+2 > size
) {
572 if (_PyString_Resize(&c
->c_lnotab
, size
+ 1000) < 0) {
577 p
= PyString_AsString(c
->c_lnotab
) + c
->c_lnotab_next
;
580 c
->c_lnotab_next
+= 2;
584 com_set_lineno(c
, lineno
)
588 c
->c_lineno
= lineno
;
589 if (c
->c_firstlineno
== 0) {
590 c
->c_firstlineno
= c
->c_last_line
= lineno
;
593 int incr_addr
= c
->c_nexti
- c
->c_last_addr
;
594 int incr_line
= lineno
- c
->c_last_line
;
595 while (incr_addr
> 0 || incr_line
> 0) {
596 int trunc_addr
= incr_addr
;
597 int trunc_line
= incr_line
;
598 if (trunc_addr
> 255)
600 if (trunc_line
> 255)
602 com_add_lnotab(c
, trunc_addr
, trunc_line
);
603 incr_addr
-= trunc_addr
;
604 incr_line
-= trunc_line
;
606 c
->c_last_addr
= c
->c_nexti
;
607 c
->c_last_line
= lineno
;
612 com_addoparg(c
, op
, arg
)
617 if (op
== SET_LINENO
) {
618 com_set_lineno(c
, arg
);
627 com_addfwref(c
, op
, p_anchor
)
632 /* Compile a forward reference for backpatching */
639 com_addint(c
, anchor
== 0 ? 0 : here
- anchor
);
643 com_backpatch(c
, anchor
)
645 int anchor
; /* Must be nonzero */
647 unsigned char *code
= (unsigned char *) PyString_AsString(c
->c_code
);
648 int target
= c
->c_nexti
;
652 /* Make the JUMP instruction at anchor point to target */
653 prev
= code
[anchor
] + (code
[anchor
+1] << 8);
654 dist
= target
- (anchor
+2);
655 code
[anchor
] = dist
& 0xff;
656 code
[anchor
+1] = dist
>> 8;
663 /* Handle literals and names uniformly */
671 int n
= PyList_Size(list
);
673 /* XXX This is quadratic in the number of names per compilation unit.
674 XXX Should use a dictionary. */
675 for (i
= n
; --i
>= 0; ) {
676 PyObject
*w
= PyList_GetItem(list
, i
);
677 if (v
->ob_type
== w
->ob_type
&& PyObject_Compare(v
, w
) == 0)
680 /* Check for error from PyObject_Compare */
681 if (PyErr_Occurred() || PyList_Append(list
, v
) != 0)
691 return com_add(c
, c
->c_consts
, v
);
699 return com_add(c
, c
->c_names
, v
);
702 #ifdef PRIVATE_NAME_MANGLING
704 com_mangle(c
, name
, buffer
, maxlen
)
710 /* Name mangling: __private becomes _classname__private.
711 This is independent from how the name is used. */
715 if (nlen
+2 >= maxlen
)
716 return 0; /* Don't mangle __extremely_long_names */
717 if (name
[nlen
-1] == '_' && name
[nlen
-2] == '_')
718 return 0; /* Don't mangle __whatever__ */
720 /* Strip leading underscores from class name */
724 return 0; /* Don't mangle if class is just underscores */
726 if (plen
+ nlen
>= maxlen
)
727 plen
= maxlen
-nlen
-2; /* Truncate class name if too long */
728 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
730 strncpy(buffer
+1, p
, plen
);
731 strcpy(buffer
+1+plen
, name
);
732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
738 com_addopnamestr(c
, op
, name
)
745 #ifdef PRIVATE_NAME_MANGLING
747 if (name
!= NULL
&& name
[0] == '_' && name
[1] == '_' &&
748 c
->c_private
!= NULL
&&
749 com_mangle(c
, name
, buffer
, (int)sizeof(buffer
)))
752 if (name
== NULL
|| (v
= PyString_InternFromString(name
)) == NULL
) {
757 i
= com_addname(c
, v
);
760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
765 if (PyDict_GetItemString(c
->c_globals
, name
) != NULL
) {
767 case LOAD_NAME
: op
= LOAD_GLOBAL
; break;
768 case STORE_NAME
: op
= STORE_GLOBAL
; break;
769 case DELETE_NAME
: op
= DELETE_GLOBAL
; break;
773 com_addoparg(c
, op
, i
);
777 com_addopname(c
, op
, n
)
784 /* XXX it is possible to write this code without the 1000
785 chars on the total length of dotted names, I just can't be
786 bothered right now */
789 else if (TYPE(n
) == dotted_name
) {
793 for (i
= 0; i
< NCH(n
); i
+= 2) {
794 char *s
= STR(CHILD(n
, i
));
795 if (p
+ strlen(s
) > buffer
+ (sizeof buffer
) - 2) {
796 com_error(c
, PyExc_MemoryError
,
797 "dotted_name too long");
811 com_addopnamestr(c
, op
, name
);
816 struct compiling
*co
;
819 extern double atof
Py_PROTO((const char *));
823 #ifndef WITHOUT_COMPLEX
829 end
= s
+ strlen(s
) - 1;
830 #ifndef WITHOUT_COMPLEX
831 imflag
= *end
== 'j' || *end
== 'J';
833 if (*end
== 'l' || *end
== 'L')
834 return PyLong_FromString(s
, (char **)0, 0);
836 x
= (long) PyOS_strtoul(s
, &end
, 0);
838 x
= PyOS_strtol(s
, &end
, 0);
841 com_error(co
, PyExc_OverflowError
,
842 "integer literal too large");
845 return PyInt_FromLong(x
);
847 /* XXX Huge floats may silently fail */
848 #ifndef WITHOUT_COMPLEX
851 PyFPE_START_PROTECT("atof", return 0)
854 return PyComplex_FromCComplex(c
);
859 PyFPE_START_PROTECT("atof", return 0)
861 PyFPE_END_PROTECT(dx
)
862 return PyFloat_FromDouble(dx
);
880 if (isalpha(quote
) || quote
== '_') {
881 if (quote
== 'u' || quote
== 'U') {
885 if (quote
== 'r' || quote
== 'R') {
890 if (quote
!= '\'' && quote
!= '\"') {
891 PyErr_BadInternalCall();
896 if (s
[--len
] != quote
) {
897 PyErr_BadInternalCall();
900 if (len
>= 4 && s
[0] == quote
&& s
[1] == quote
) {
903 if (s
[--len
] != quote
|| s
[--len
] != quote
) {
904 PyErr_BadInternalCall();
910 return PyUnicode_DecodeRawUnicodeEscape(
913 return PyUnicode_DecodeUnicodeEscape(
916 else if (rawmode
|| strchr(s
, '\\') == NULL
) {
917 return PyString_FromStringAndSize(s
, len
);
919 v
= PyString_FromStringAndSize((char *)NULL
, len
);
920 p
= buf
= PyString_AsString(v
);
929 /* XXX This assumes ASCII! */
931 case '\\': *p
++ = '\\'; break;
932 case '\'': *p
++ = '\''; break;
933 case '\"': *p
++ = '\"'; break;
934 case 'b': *p
++ = '\b'; break;
935 case 'f': *p
++ = '\014'; break; /* FF */
936 case 't': *p
++ = '\t'; break;
937 case 'n': *p
++ = '\n'; break;
938 case 'r': *p
++ = '\r'; break;
939 case 'v': *p
++ = '\013'; break; /* VT */
940 case 'a': *p
++ = '\007'; break; /* BEL, not classic C */
941 case '0': case '1': case '2': case '3':
942 case '4': case '5': case '6': case '7':
944 if ('0' <= *s
&& *s
<= '7') {
945 c
= (c
<<3) + *s
++ - '0';
946 if ('0' <= *s
&& *s
<= '7')
947 c
= (c
<<3) + *s
++ - '0';
952 if (isxdigit(Py_CHARMASK(*s
))) {
964 } while (isxdigit(Py_CHARMASK(*s
)));
969 default: *p
++ = '\\'; *p
++ = s
[-1]; break;
972 _PyString_Resize(&v
, (int)(p
- buf
));
982 REQ(CHILD(n
, 0), STRING
);
983 if ((v
= parsestr(STR(CHILD(n
, 0)))) != NULL
) {
984 /* String literal concatenation */
985 for (i
= 1; i
< NCH(n
) && v
!= NULL
; i
++) {
986 PyString_ConcatAndDel(&v
, parsestr(STR(CHILD(n
, i
))));
993 com_list_constructor(c
, n
)
999 if (TYPE(n
) != testlist
)
1001 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1002 len
= (NCH(n
) + 1) / 2;
1003 for (i
= 0; i
< NCH(n
); i
+= 2)
1004 com_node(c
, CHILD(n
, i
));
1005 com_addoparg(c
, BUILD_LIST
, len
);
1011 struct compiling
*c
;
1015 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1016 for (i
= 0; i
+2 < NCH(n
); i
+= 4) {
1017 /* We must arrange things just right for STORE_SUBSCR.
1018 It wants the stack to look like (value) (dict) (key) */
1019 com_addbyte(c
, DUP_TOP
);
1021 com_node(c
, CHILD(n
, i
+2)); /* value */
1022 com_addbyte(c
, ROT_TWO
);
1023 com_node(c
, CHILD(n
, i
)); /* key */
1024 com_addbyte(c
, STORE_SUBSCR
);
1031 struct compiling
*c
;
1041 if (TYPE(CHILD(n
, 1)) == RPAR
) {
1042 com_addoparg(c
, BUILD_TUPLE
, 0);
1046 com_node(c
, CHILD(n
, 1));
1049 if (TYPE(CHILD(n
, 1)) == RSQB
) {
1050 com_addoparg(c
, BUILD_LIST
, 0);
1054 com_list_constructor(c
, CHILD(n
, 1));
1056 case LBRACE
: /* '{' [dictmaker] '}' */
1057 com_addoparg(c
, BUILD_MAP
, 0);
1059 if (TYPE(CHILD(n
, 1)) != RBRACE
)
1060 com_dictmaker(c
, CHILD(n
, 1));
1063 com_node(c
, CHILD(n
, 1));
1064 com_addbyte(c
, UNARY_CONVERT
);
1067 if ((v
= parsenumber(c
, STR(ch
))) == NULL
) {
1071 i
= com_addconst(c
, v
);
1074 com_addoparg(c
, LOAD_CONST
, i
);
1078 v
= parsestrplus(n
);
1084 i
= com_addconst(c
, v
);
1087 com_addoparg(c
, LOAD_CONST
, i
);
1091 com_addopname(c
, LOAD_NAME
, ch
);
1095 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
1096 com_error(c
, PyExc_SystemError
,
1097 "com_atom: unexpected node type");
1103 struct compiling
*c
;
1110 else if (NCH(n
) == 2) {
1111 if (TYPE(CHILD(n
, 0)) != COLON
) {
1112 com_node(c
, CHILD(n
, 0));
1113 com_addbyte(c
, op
+1);
1116 com_node(c
, CHILD(n
, 1));
1117 com_addbyte(c
, op
+2);
1122 com_node(c
, CHILD(n
, 0));
1123 com_node(c
, CHILD(n
, 2));
1124 com_addbyte(c
, op
+3);
1130 com_argument(c
, n
, pkeywords
)
1131 struct compiling
*c
;
1132 node
*n
; /* argument */
1133 PyObject
**pkeywords
;
1136 REQ(n
, argument
); /* [test '='] test; really [keyword '='] test */
1138 if (*pkeywords
!= NULL
) {
1139 com_error(c
, PyExc_SyntaxError
,
1140 "non-keyword arg after keyword arg");
1143 com_node(c
, CHILD(n
, 0));
1150 } while (NCH(m
) == 1);
1151 if (TYPE(m
) != NAME
) {
1152 com_error(c
, PyExc_SyntaxError
,
1153 "keyword can't be an expression");
1156 PyObject
*v
= PyString_InternFromString(STR(m
));
1157 if (v
!= NULL
&& *pkeywords
== NULL
)
1158 *pkeywords
= PyDict_New();
1159 if (v
== NULL
|| *pkeywords
== NULL
)
1162 if (PyDict_GetItem(*pkeywords
, v
) != NULL
)
1163 com_error(c
, PyExc_SyntaxError
,
1164 "duplicate keyword argument");
1166 if (PyDict_SetItem(*pkeywords
, v
, v
) != 0)
1168 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, v
));
1173 com_node(c
, CHILD(n
, 2));
1177 com_call_function(c
, n
)
1178 struct compiling
*c
;
1179 node
*n
; /* EITHER arglist OR ')' */
1181 if (TYPE(n
) == RPAR
) {
1182 com_addoparg(c
, CALL_FUNCTION
, 0);
1185 PyObject
*keywords
= NULL
;
1187 int lineno
= n
->n_lineno
;
1189 int starstar_flag
= 0;
1194 for (i
= 0; i
< NCH(n
); i
+= 2) {
1195 node
*ch
= CHILD(n
, i
);
1196 if (TYPE(ch
) == STAR
||
1197 TYPE(ch
) == DOUBLESTAR
)
1199 if (ch
->n_lineno
!= lineno
) {
1200 lineno
= ch
->n_lineno
;
1201 com_addoparg(c
, SET_LINENO
, lineno
);
1203 com_argument(c
, ch
, &keywords
);
1204 if (keywords
== NULL
)
1209 Py_XDECREF(keywords
);
1210 while (i
< NCH(n
)) {
1211 node
*tok
= CHILD(n
, i
);
1212 node
*ch
= CHILD(n
, i
+1);
1214 switch (TYPE(tok
)) {
1215 case STAR
: star_flag
= 1; break;
1216 case DOUBLESTAR
: starstar_flag
= 1; break;
1220 if (na
> 255 || nk
> 255) {
1221 com_error(c
, PyExc_SyntaxError
,
1222 "more than 255 arguments");
1224 if (star_flag
|| starstar_flag
)
1225 opcode
= CALL_FUNCTION_VAR
- 1 +
1226 star_flag
+ (starstar_flag
<< 1);
1228 opcode
= CALL_FUNCTION
;
1229 com_addoparg(c
, opcode
, na
| (nk
<< 8));
1230 com_pop(c
, na
+ 2*nk
+ star_flag
+ starstar_flag
);
1235 com_select_member(c
, n
)
1236 struct compiling
*c
;
1239 com_addopname(c
, LOAD_ATTR
, n
);
1244 struct compiling
*c
;
1248 int ns
=2; /* number of slice arguments */
1251 /* first argument */
1252 if (TYPE(CHILD(n
,i
)) == COLON
) {
1253 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
1258 com_node(c
, CHILD(n
,i
));
1260 REQ(CHILD(n
,i
),COLON
);
1263 /* second argument */
1264 if (i
< NCH(n
) && TYPE(CHILD(n
,i
)) == test
) {
1265 com_node(c
, CHILD(n
,i
));
1269 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
1272 /* remaining arguments */
1273 for (; i
< NCH(n
); i
++) {
1278 /* right argument of ':' missing */
1279 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
1283 com_node(c
, CHILD(ch
,1));
1285 com_addoparg(c
, BUILD_SLICE
, ns
);
1286 com_pop(c
, 1 + (ns
== 3));
1291 struct compiling
*c
;
1297 /* check for rubber index */
1298 if (TYPE(ch
) == DOT
&& TYPE(CHILD(n
,1)) == DOT
) {
1299 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_Ellipsis
));
1303 /* check for slice */
1304 if ((TYPE(ch
) == COLON
|| NCH(n
) > 1))
1314 com_subscriptlist(c
, n
, assigning
)
1315 struct compiling
*c
;
1320 REQ(n
, subscriptlist
);
1321 /* Check to make backward compatible slice behavior for '[i:j]' */
1323 node
*sub
= CHILD(n
, 0); /* subscript */
1324 /* Make it is a simple slice.
1325 Should have exactly one colon. */
1326 if ((TYPE(CHILD(sub
, 0)) == COLON
1327 || (NCH(sub
) > 1 && TYPE(CHILD(sub
, 1)) == COLON
))
1328 && (TYPE(CHILD(sub
,NCH(sub
)-1)) != sliceop
))
1330 if (assigning
== OP_APPLY
)
1333 op
= ((assigning
== OP_ASSIGN
) ?
1334 STORE_SLICE
: DELETE_SLICE
);
1335 com_slice(c
, sub
, op
);
1336 if (op
== STORE_SLICE
)
1338 else if (op
== DELETE_SLICE
)
1343 /* Else normal subscriptlist. Compile each subscript. */
1344 for (i
= 0; i
< NCH(n
); i
+= 2)
1345 com_subscript(c
, CHILD(n
, i
));
1346 /* Put multiple subscripts into a tuple */
1349 com_addoparg(c
, BUILD_TUPLE
, i
);
1352 if (assigning
== OP_APPLY
) {
1356 else if (assigning
== OP_ASSIGN
) {
1369 com_apply_trailer(c
, n
)
1370 struct compiling
*c
;
1374 switch (TYPE(CHILD(n
, 0))) {
1376 com_call_function(c
, CHILD(n
, 1));
1379 com_select_member(c
, CHILD(n
, 1));
1382 com_subscriptlist(c
, CHILD(n
, 1), OP_APPLY
);
1385 com_error(c
, PyExc_SystemError
,
1386 "com_apply_trailer: unknown trailer type");
1392 struct compiling
*c
;
1397 com_atom(c
, CHILD(n
, 0));
1398 for (i
= 1; i
< NCH(n
); i
++) {
1399 if (TYPE(CHILD(n
, i
)) == DOUBLESTAR
) {
1400 com_factor(c
, CHILD(n
, i
+1));
1401 com_addbyte(c
, BINARY_POWER
);
1406 com_apply_trailer(c
, CHILD(n
, i
));
1412 struct compiling
*c
;
1416 if (TYPE(CHILD(n
, 0)) == PLUS
) {
1417 com_factor(c
, CHILD(n
, 1));
1418 com_addbyte(c
, UNARY_POSITIVE
);
1420 else if (TYPE(CHILD(n
, 0)) == MINUS
) {
1421 com_factor(c
, CHILD(n
, 1));
1422 com_addbyte(c
, UNARY_NEGATIVE
);
1424 else if (TYPE(CHILD(n
, 0)) == TILDE
) {
1425 com_factor(c
, CHILD(n
, 1));
1426 com_addbyte(c
, UNARY_INVERT
);
1429 com_power(c
, CHILD(n
, 0));
1435 struct compiling
*c
;
1441 com_factor(c
, CHILD(n
, 0));
1442 for (i
= 2; i
< NCH(n
); i
+= 2) {
1443 com_factor(c
, CHILD(n
, i
));
1444 switch (TYPE(CHILD(n
, i
-1))) {
1446 op
= BINARY_MULTIPLY
;
1455 com_error(c
, PyExc_SystemError
,
1456 "com_term: operator not *, / or %");
1465 com_arith_expr(c
, n
)
1466 struct compiling
*c
;
1472 com_term(c
, CHILD(n
, 0));
1473 for (i
= 2; i
< NCH(n
); i
+= 2) {
1474 com_term(c
, CHILD(n
, i
));
1475 switch (TYPE(CHILD(n
, i
-1))) {
1480 op
= BINARY_SUBTRACT
;
1483 com_error(c
, PyExc_SystemError
,
1484 "com_arith_expr: operator not + or -");
1493 com_shift_expr(c
, n
)
1494 struct compiling
*c
;
1500 com_arith_expr(c
, CHILD(n
, 0));
1501 for (i
= 2; i
< NCH(n
); i
+= 2) {
1502 com_arith_expr(c
, CHILD(n
, i
));
1503 switch (TYPE(CHILD(n
, i
-1))) {
1511 com_error(c
, PyExc_SystemError
,
1512 "com_shift_expr: operator not << or >>");
1522 struct compiling
*c
;
1528 com_shift_expr(c
, CHILD(n
, 0));
1529 for (i
= 2; i
< NCH(n
); i
+= 2) {
1530 com_shift_expr(c
, CHILD(n
, i
));
1531 if (TYPE(CHILD(n
, i
-1)) == AMPER
) {
1535 com_error(c
, PyExc_SystemError
,
1536 "com_and_expr: operator not &");
1546 struct compiling
*c
;
1552 com_and_expr(c
, CHILD(n
, 0));
1553 for (i
= 2; i
< NCH(n
); i
+= 2) {
1554 com_and_expr(c
, CHILD(n
, i
));
1555 if (TYPE(CHILD(n
, i
-1)) == CIRCUMFLEX
) {
1559 com_error(c
, PyExc_SystemError
,
1560 "com_xor_expr: operator not ^");
1570 struct compiling
*c
;
1576 com_xor_expr(c
, CHILD(n
, 0));
1577 for (i
= 2; i
< NCH(n
); i
+= 2) {
1578 com_xor_expr(c
, CHILD(n
, i
));
1579 if (TYPE(CHILD(n
, i
-1)) == VBAR
) {
1583 com_error(c
, PyExc_SystemError
,
1584 "com_expr: expr operator not |");
1597 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
1598 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1602 case LESS
: return LT
;
1603 case GREATER
: return GT
;
1604 case EQEQUAL
: /* == */
1605 case EQUAL
: return EQ
;
1606 case LESSEQUAL
: return LE
;
1607 case GREATEREQUAL
: return GE
;
1608 case NOTEQUAL
: return NE
; /* <> or != */
1609 case NAME
: if (strcmp(STR(n
), "in") == 0) return IN
;
1610 if (strcmp(STR(n
), "is") == 0) return IS
;
1613 else if (NCH(n
) == 2) {
1614 switch (TYPE(CHILD(n
, 0))) {
1615 case NAME
: if (strcmp(STR(CHILD(n
, 1)), "in") == 0)
1617 if (strcmp(STR(CHILD(n
, 0)), "is") == 0)
1625 com_comparison(c
, n
)
1626 struct compiling
*c
;
1632 REQ(n
, comparison
); /* comparison: expr (comp_op expr)* */
1633 com_expr(c
, CHILD(n
, 0));
1637 /****************************************************************
1638 The following code is generated for all but the last
1639 comparison in a chain:
1641 label: on stack: opcode: jump to:
1647 b, 0-or-1 JUMP_IF_FALSE L1
1651 We are now ready to repeat this sequence for the next
1652 comparison in the chain.
1654 For the last we generate:
1660 If there were any jumps to L1 (i.e., there was more than one
1661 comparison), we generate:
1663 0-or-1 JUMP_FORWARD L2
1668 ****************************************************************/
1672 for (i
= 2; i
< NCH(n
); i
+= 2) {
1673 com_expr(c
, CHILD(n
, i
));
1675 com_addbyte(c
, DUP_TOP
);
1677 com_addbyte(c
, ROT_THREE
);
1679 op
= cmp_type(CHILD(n
, i
-1));
1681 com_error(c
, PyExc_SystemError
,
1682 "com_comparison: unknown comparison op");
1684 com_addoparg(c
, COMPARE_OP
, op
);
1687 com_addfwref(c
, JUMP_IF_FALSE
, &anchor
);
1688 com_addbyte(c
, POP_TOP
);
1695 com_addfwref(c
, JUMP_FORWARD
, &anchor2
);
1696 com_backpatch(c
, anchor
);
1697 com_addbyte(c
, ROT_TWO
);
1698 com_addbyte(c
, POP_TOP
);
1699 com_backpatch(c
, anchor2
);
1705 struct compiling
*c
;
1708 REQ(n
, not_test
); /* 'not' not_test | comparison */
1710 com_comparison(c
, CHILD(n
, 0));
1713 com_not_test(c
, CHILD(n
, 1));
1714 com_addbyte(c
, UNARY_NOT
);
1720 struct compiling
*c
;
1725 REQ(n
, and_test
); /* not_test ('and' not_test)* */
1729 com_not_test(c
, CHILD(n
, i
));
1730 if ((i
+= 2) >= NCH(n
))
1732 com_addfwref(c
, JUMP_IF_FALSE
, &anchor
);
1733 com_addbyte(c
, POP_TOP
);
1737 com_backpatch(c
, anchor
);
1742 struct compiling
*c
;
1745 REQ(n
, test
); /* and_test ('or' and_test)* | lambdef */
1746 if (NCH(n
) == 1 && TYPE(CHILD(n
, 0)) == lambdef
) {
1749 int ndefs
= com_argdefs(c
, CHILD(n
, 0));
1750 v
= (PyObject
*) icompile(CHILD(n
, 0), c
);
1756 i
= com_addconst(c
, v
);
1759 com_addoparg(c
, LOAD_CONST
, i
);
1761 com_addoparg(c
, MAKE_FUNCTION
, ndefs
);
1768 com_and_test(c
, CHILD(n
, i
));
1769 if ((i
+= 2) >= NCH(n
))
1771 com_addfwref(c
, JUMP_IF_TRUE
, &anchor
);
1772 com_addbyte(c
, POP_TOP
);
1776 com_backpatch(c
, anchor
);
1781 com_list(c
, n
, toplevel
)
1782 struct compiling
*c
;
1784 int toplevel
; /* If nonzero, *always* build a tuple */
1786 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1787 if (NCH(n
) == 1 && !toplevel
) {
1788 com_node(c
, CHILD(n
, 0));
1793 len
= (NCH(n
) + 1) / 2;
1794 for (i
= 0; i
< NCH(n
); i
+= 2)
1795 com_node(c
, CHILD(n
, i
));
1796 com_addoparg(c
, BUILD_TUPLE
, len
);
1802 /* Begin of assignment compilation */
1804 static void com_assign_name
Py_PROTO((struct compiling
*, node
*, int));
1805 static void com_assign
Py_PROTO((struct compiling
*, node
*, int));
1808 com_assign_attr(c
, n
, assigning
)
1809 struct compiling
*c
;
1813 com_addopname(c
, assigning
? STORE_ATTR
: DELETE_ATTR
, n
);
1814 com_pop(c
, assigning
? 2 : 1);
1818 com_assign_trailer(c
, n
, assigning
)
1819 struct compiling
*c
;
1824 switch (TYPE(CHILD(n
, 0))) {
1825 case LPAR
: /* '(' [exprlist] ')' */
1826 com_error(c
, PyExc_SyntaxError
,
1827 "can't assign to function call");
1829 case DOT
: /* '.' NAME */
1830 com_assign_attr(c
, CHILD(n
, 1), assigning
);
1832 case LSQB
: /* '[' subscriptlist ']' */
1833 com_subscriptlist(c
, CHILD(n
, 1), assigning
);
1836 com_error(c
, PyExc_SystemError
, "unknown trailer type");
1841 com_assign_tuple(c
, n
, assigning
)
1842 struct compiling
*c
;
1847 if (TYPE(n
) != testlist
)
1851 com_addoparg(c
, UNPACK_TUPLE
, i
);
1854 for (i
= 0; i
< NCH(n
); i
+= 2)
1855 com_assign(c
, CHILD(n
, i
), assigning
);
1859 com_assign_list(c
, n
, assigning
)
1860 struct compiling
*c
;
1867 com_addoparg(c
, UNPACK_LIST
, i
);
1870 for (i
= 0; i
< NCH(n
); i
+= 2)
1871 com_assign(c
, CHILD(n
, i
), assigning
);
1875 com_assign_name(c
, n
, assigning
)
1876 struct compiling
*c
;
1881 com_addopname(c
, assigning
? STORE_NAME
: DELETE_NAME
, n
);
1887 com_assign(c
, n
, assigning
)
1888 struct compiling
*c
;
1892 /* Loop to avoid trivial recursion */
1899 com_assign_tuple(c
, n
, assigning
);
1917 com_error(c
, PyExc_SyntaxError
,
1918 "can't assign to operator");
1924 case power
: /* atom trailer* ('**' power)* */
1925 /* ('+'|'-'|'~') factor | atom trailer* */
1926 if (TYPE(CHILD(n
, 0)) != atom
) {
1927 com_error(c
, PyExc_SyntaxError
,
1928 "can't assign to operator");
1931 if (NCH(n
) > 1) { /* trailer or exponent present */
1933 com_node(c
, CHILD(n
, 0));
1934 for (i
= 1; i
+1 < NCH(n
); i
++) {
1935 if (TYPE(CHILD(n
, i
)) == DOUBLESTAR
) {
1936 com_error(c
, PyExc_SyntaxError
,
1937 "can't assign to operator");
1940 com_apply_trailer(c
, CHILD(n
, i
));
1941 } /* NB i is still alive */
1942 com_assign_trailer(c
,
1943 CHILD(n
, i
), assigning
);
1950 switch (TYPE(CHILD(n
, 0))) {
1953 if (TYPE(n
) == RPAR
) {
1954 /* XXX Should allow () = () ??? */
1955 com_error(c
, PyExc_SyntaxError
,
1956 "can't assign to ()");
1962 if (TYPE(n
) == RSQB
) {
1963 com_error(c
, PyExc_SyntaxError
,
1964 "can't assign to []");
1967 com_assign_list(c
, n
, assigning
);
1970 com_assign_name(c
, CHILD(n
, 0), assigning
);
1973 com_error(c
, PyExc_SyntaxError
,
1974 "can't assign to literal");
1980 com_error(c
, PyExc_SyntaxError
,
1981 "can't assign to lambda");
1985 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
1986 com_error(c
, PyExc_SystemError
,
1987 "com_assign: bad node");
1994 /* Forward */ static node
*get_rawdocstring
Py_PROTO((node
*));
1998 struct compiling
*c
;
2001 REQ(n
, expr_stmt
); /* testlist ('=' testlist)* */
2002 /* Forget it if we have just a doc string here */
2003 if (!c
->c_interactive
&& NCH(n
) == 1 && get_rawdocstring(n
) != NULL
)
2005 com_node(c
, CHILD(n
, NCH(n
)-1));
2007 if (c
->c_interactive
)
2008 com_addbyte(c
, PRINT_EXPR
);
2010 com_addbyte(c
, POP_TOP
);
2015 for (i
= 0; i
< NCH(n
)-2; i
+=2) {
2016 if (i
+2 < NCH(n
)-2) {
2017 com_addbyte(c
, DUP_TOP
);
2020 com_assign(c
, CHILD(n
, i
), OP_ASSIGN
);
2026 com_assert_stmt(c
, n
)
2027 struct compiling
*c
;
2032 REQ(n
, assert_stmt
); /* 'assert' test [',' test] */
2033 /* Generate code like for
2037 raise AssertionError [, <message>]
2039 where <message> is the second test, if present.
2041 if (Py_OptimizeFlag
)
2043 com_addopnamestr(c
, LOAD_GLOBAL
, "__debug__");
2045 com_addfwref(c
, JUMP_IF_FALSE
, &a
);
2046 com_addbyte(c
, POP_TOP
);
2048 com_node(c
, CHILD(n
, 1));
2049 com_addfwref(c
, JUMP_IF_TRUE
, &b
);
2050 com_addbyte(c
, POP_TOP
);
2052 /* Raise that exception! */
2053 com_addopnamestr(c
, LOAD_GLOBAL
, "AssertionError");
2055 i
= NCH(n
)/2; /* Either 2 or 4 */
2057 com_node(c
, CHILD(n
, 3));
2058 com_addoparg(c
, RAISE_VARARGS
, i
);
2060 /* The interpreter does not fall through */
2061 /* All jumps converge here */
2062 com_backpatch(c
, a
);
2063 com_backpatch(c
, b
);
2064 com_addbyte(c
, POP_TOP
);
2068 com_print_stmt(c
, n
)
2069 struct compiling
*c
;
2073 REQ(n
, print_stmt
); /* 'print' (test ',')* [test] */
2074 for (i
= 1; i
< NCH(n
); i
+= 2) {
2075 com_node(c
, CHILD(n
, i
));
2076 com_addbyte(c
, PRINT_ITEM
);
2079 if (TYPE(CHILD(n
, NCH(n
)-1)) != COMMA
)
2080 com_addbyte(c
, PRINT_NEWLINE
);
2081 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
2085 com_return_stmt(c
, n
)
2086 struct compiling
*c
;
2089 REQ(n
, return_stmt
); /* 'return' [testlist] */
2090 if (!c
->c_infunction
) {
2091 com_error(c
, PyExc_SyntaxError
, "'return' outside function");
2094 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
2098 com_node(c
, CHILD(n
, 1));
2099 com_addbyte(c
, RETURN_VALUE
);
2104 com_raise_stmt(c
, n
)
2105 struct compiling
*c
;
2109 REQ(n
, raise_stmt
); /* 'raise' [test [',' test [',' test]]] */
2111 com_node(c
, CHILD(n
, 1));
2113 com_node(c
, CHILD(n
, 3));
2115 com_node(c
, CHILD(n
, 5));
2119 com_addoparg(c
, RAISE_VARARGS
, i
);
2124 com_import_stmt(c
, n
)
2125 struct compiling
*c
;
2129 REQ(n
, import_stmt
);
2130 /* 'import' dotted_name (',' dotted_name)* |
2131 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
2132 if (STR(CHILD(n
, 0))[0] == 'f') {
2133 /* 'from' dotted_name 'import' ... */
2134 REQ(CHILD(n
, 1), dotted_name
);
2135 com_addopname(c
, IMPORT_NAME
, CHILD(n
, 1));
2137 for (i
= 3; i
< NCH(n
); i
+= 2)
2138 com_addopname(c
, IMPORT_FROM
, CHILD(n
, i
));
2139 com_addbyte(c
, POP_TOP
);
2144 for (i
= 1; i
< NCH(n
); i
+= 2) {
2145 REQ(CHILD(n
, i
), dotted_name
);
2146 com_addopname(c
, IMPORT_NAME
, CHILD(n
, i
));
2148 com_addopname(c
, STORE_NAME
, CHILD(CHILD(n
, i
), 0));
2155 com_global_stmt(c
, n
)
2156 struct compiling
*c
;
2160 REQ(n
, global_stmt
);
2161 /* 'global' NAME (',' NAME)* */
2162 for (i
= 1; i
< NCH(n
); i
+= 2) {
2163 char *s
= STR(CHILD(n
, i
));
2164 #ifdef PRIVATE_NAME_MANGLING
2166 if (s
!= NULL
&& s
[0] == '_' && s
[1] == '_' &&
2167 c
->c_private
!= NULL
&&
2168 com_mangle(c
, s
, buffer
, (int)sizeof(buffer
)))
2171 if (PyDict_GetItemString(c
->c_locals
, s
) != NULL
) {
2172 com_error(c
, PyExc_SyntaxError
,
2173 "name is local and global");
2175 else if (PyDict_SetItemString(c
->c_globals
, s
, Py_None
) != 0)
2181 com_newlocal_o(c
, nameval
)
2182 struct compiling
*c
;
2187 if (PyList_Size(c
->c_varnames
) != c
->c_nlocals
) {
2188 /* This is usually caused by an error on a previous call */
2189 if (c
->c_errors
== 0) {
2190 com_error(c
, PyExc_SystemError
,
2191 "mixed up var name/index");
2195 ival
= PyInt_FromLong(i
= c
->c_nlocals
++);
2198 else if (PyDict_SetItem(c
->c_locals
, nameval
, ival
) != 0)
2200 else if (PyList_Append(c
->c_varnames
, nameval
) != 0)
2207 com_addlocal_o(c
, nameval
)
2208 struct compiling
*c
;
2211 PyObject
*ival
= PyDict_GetItem(c
->c_locals
, nameval
);
2213 return PyInt_AsLong(ival
);
2214 return com_newlocal_o(c
, nameval
);
2218 com_newlocal(c
, name
)
2219 struct compiling
*c
;
2222 PyObject
*nameval
= PyString_InternFromString(name
);
2224 if (nameval
== NULL
) {
2228 i
= com_newlocal_o(c
, nameval
);
2235 struct compiling
*c
;
2239 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2240 com_node(c
, CHILD(n
, 1));
2242 com_node(c
, CHILD(n
, 3));
2244 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
2248 com_node(c
, CHILD(n
, 5));
2250 com_addbyte(c
, DUP_TOP
);
2253 com_addbyte(c
, EXEC_STMT
);
2258 is_constant_false(c
, n
)
2259 struct compiling
*c
;
2265 /* Label to avoid tail recursion */
2276 for (i
= 0; i
< NCH(n
); i
++) {
2277 node
*ch
= CHILD(n
, i
);
2278 if (TYPE(ch
) == stmt
) {
2313 if (Py_OptimizeFlag
&& strcmp(STR(n
), "__debug__") == 0)
2318 v
= parsenumber(c
, STR(n
));
2323 i
= PyObject_IsTrue(v
);
2328 v
= parsestr(STR(n
));
2333 i
= PyObject_IsTrue(v
);
2343 struct compiling
*c
;
2349 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2350 for (i
= 0; i
+3 < NCH(n
); i
+=4) {
2352 node
*ch
= CHILD(n
, i
+1);
2353 if (is_constant_false(c
, ch
))
2356 com_addoparg(c
, SET_LINENO
, ch
->n_lineno
);
2358 com_addfwref(c
, JUMP_IF_FALSE
, &a
);
2359 com_addbyte(c
, POP_TOP
);
2361 com_node(c
, CHILD(n
, i
+3));
2362 com_addfwref(c
, JUMP_FORWARD
, &anchor
);
2363 com_backpatch(c
, a
);
2364 /* We jump here with an extra entry which we now pop */
2365 com_addbyte(c
, POP_TOP
);
2368 com_node(c
, CHILD(n
, i
+2));
2370 com_backpatch(c
, anchor
);
2374 com_while_stmt(c
, n
)
2375 struct compiling
*c
;
2378 int break_anchor
= 0;
2380 int save_begin
= c
->c_begin
;
2381 REQ(n
, while_stmt
); /* 'while' test ':' suite ['else' ':' suite] */
2382 com_addfwref(c
, SETUP_LOOP
, &break_anchor
);
2383 block_push(c
, SETUP_LOOP
);
2384 c
->c_begin
= c
->c_nexti
;
2385 com_addoparg(c
, SET_LINENO
, n
->n_lineno
);
2386 com_node(c
, CHILD(n
, 1));
2387 com_addfwref(c
, JUMP_IF_FALSE
, &anchor
);
2388 com_addbyte(c
, POP_TOP
);
2391 com_node(c
, CHILD(n
, 3));
2393 com_addoparg(c
, JUMP_ABSOLUTE
, c
->c_begin
);
2394 c
->c_begin
= save_begin
;
2395 com_backpatch(c
, anchor
);
2396 /* We jump here with one entry more on the stack */
2397 com_addbyte(c
, POP_TOP
);
2398 com_addbyte(c
, POP_BLOCK
);
2399 block_pop(c
, SETUP_LOOP
);
2401 com_node(c
, CHILD(n
, 6));
2402 com_backpatch(c
, break_anchor
);
2407 struct compiling
*c
;
2411 int break_anchor
= 0;
2413 int save_begin
= c
->c_begin
;
2415 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2416 com_addfwref(c
, SETUP_LOOP
, &break_anchor
);
2417 block_push(c
, SETUP_LOOP
);
2418 com_node(c
, CHILD(n
, 3));
2419 v
= PyInt_FromLong(0L);
2422 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, v
));
2425 c
->c_begin
= c
->c_nexti
;
2426 com_addoparg(c
, SET_LINENO
, n
->n_lineno
);
2427 com_addfwref(c
, FOR_LOOP
, &anchor
);
2429 com_assign(c
, CHILD(n
, 1), OP_ASSIGN
);
2431 com_node(c
, CHILD(n
, 5));
2433 com_addoparg(c
, JUMP_ABSOLUTE
, c
->c_begin
);
2434 c
->c_begin
= save_begin
;
2435 com_backpatch(c
, anchor
);
2436 com_pop(c
, 2); /* FOR_LOOP has popped these */
2437 com_addbyte(c
, POP_BLOCK
);
2438 block_pop(c
, SETUP_LOOP
);
2440 com_node(c
, CHILD(n
, 8));
2441 com_backpatch(c
, break_anchor
);
2444 /* Code generated for "try: S finally: Sf" is as follows:
2453 The special instructions use the block stack. Each block
2454 stack entry contains the instruction that created it (here
2455 SETUP_FINALLY), the level of the value stack at the time the
2456 block stack entry was created, and a label (here L).
2459 Pushes the current value stack level and the label
2460 onto the block stack.
2462 Pops en entry from the block stack, and pops the value
2463 stack until its level is the same as indicated on the
2464 block stack. (The label is ignored.)
2466 Pops a variable number of entries from the *value* stack
2467 and re-raises the exception they specify. The number of
2468 entries popped depends on the (pseudo) exception type.
2470 The block stack is unwound when an exception is raised:
2471 when a SETUP_FINALLY entry is found, the exception is pushed
2472 onto the value stack (and the exception condition is cleared),
2473 and the interpreter jumps to the label gotten from the block
2476 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2477 (The contents of the value stack is shown in [], with the top
2478 at the right; 'tb' is trace-back info, 'val' the exception's
2479 associated value, and 'exc' the exception.)
2481 Value stack Label Instruction Argument
2487 [tb, val, exc] L1: DUP )
2488 [tb, val, exc, exc] <evaluate E1> )
2489 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2490 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2491 [tb, val, exc, 1] POP )
2493 [tb, val] <assign to V1> (or POP if no V1)
2498 [tb, val, exc, 0] L2: POP
2500 .............................etc.......................
2502 [tb, val, exc, 0] Ln+1: POP
2503 [tb, val, exc] END_FINALLY # re-raise exception
2505 [] L0: <next statement>
2507 Of course, parts are not generated if Vi or Ei is not present.
2511 com_try_except(c
, n
)
2512 struct compiling
*c
;
2515 int except_anchor
= 0;
2517 int else_anchor
= 0;
2521 com_addfwref(c
, SETUP_EXCEPT
, &except_anchor
);
2522 block_push(c
, SETUP_EXCEPT
);
2523 com_node(c
, CHILD(n
, 2));
2524 com_addbyte(c
, POP_BLOCK
);
2525 block_pop(c
, SETUP_EXCEPT
);
2526 com_addfwref(c
, JUMP_FORWARD
, &else_anchor
);
2527 com_backpatch(c
, except_anchor
);
2529 i
< NCH(n
) && TYPE(ch
= CHILD(n
, i
)) == except_clause
;
2531 /* except_clause: 'except' [expr [',' var]] */
2532 if (except_anchor
== 0) {
2533 com_error(c
, PyExc_SyntaxError
,
2534 "default 'except:' must be last");
2538 com_push(c
, 3); /* tb, val, exc pushed by exception */
2539 com_addoparg(c
, SET_LINENO
, ch
->n_lineno
);
2541 com_addbyte(c
, DUP_TOP
);
2543 com_node(c
, CHILD(ch
, 1));
2544 com_addoparg(c
, COMPARE_OP
, EXC_MATCH
);
2546 com_addfwref(c
, JUMP_IF_FALSE
, &except_anchor
);
2547 com_addbyte(c
, POP_TOP
);
2550 com_addbyte(c
, POP_TOP
);
2553 com_assign(c
, CHILD(ch
, 3), OP_ASSIGN
);
2555 com_addbyte(c
, POP_TOP
);
2558 com_addbyte(c
, POP_TOP
);
2560 com_node(c
, CHILD(n
, i
+2));
2561 com_addfwref(c
, JUMP_FORWARD
, &end_anchor
);
2562 if (except_anchor
) {
2563 com_backpatch(c
, except_anchor
);
2564 /* We come in with [tb, val, exc, 0] on the
2565 stack; one pop and it's the same as
2566 expected at the start of the loop */
2567 com_addbyte(c
, POP_TOP
);
2570 /* We actually come in here with [tb, val, exc] but the
2571 END_FINALLY will zap those and jump around.
2572 The c_stacklevel does not reflect them so we need not pop
2574 com_addbyte(c
, END_FINALLY
);
2575 com_backpatch(c
, else_anchor
);
2577 com_node(c
, CHILD(n
, i
+2));
2578 com_backpatch(c
, end_anchor
);
2582 com_try_finally(c
, n
)
2583 struct compiling
*c
;
2586 int finally_anchor
= 0;
2589 com_addfwref(c
, SETUP_FINALLY
, &finally_anchor
);
2590 block_push(c
, SETUP_FINALLY
);
2591 com_node(c
, CHILD(n
, 2));
2592 com_addbyte(c
, POP_BLOCK
);
2593 block_pop(c
, SETUP_FINALLY
);
2594 block_push(c
, END_FINALLY
);
2595 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
2596 /* While the generated code pushes only one item,
2597 the try-finally handling can enter here with
2598 up to three items. OK, here are the details:
2599 3 for an exception, 2 for RETURN, 1 for BREAK. */
2601 com_backpatch(c
, finally_anchor
);
2602 ch
= CHILD(n
, NCH(n
)-1);
2603 com_addoparg(c
, SET_LINENO
, ch
->n_lineno
);
2605 com_addbyte(c
, END_FINALLY
);
2606 block_pop(c
, END_FINALLY
);
2607 com_pop(c
, 3); /* Matches the com_push above */
2612 struct compiling
*c
;
2616 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2617 | 'try' ':' suite 'finally' ':' suite */
2618 if (TYPE(CHILD(n
, 3)) != except_clause
)
2619 com_try_finally(c
, n
);
2621 com_try_except(c
, n
);
2630 /* Label to avoid tail recursion */
2641 for (i
= 0; i
< NCH(n
); i
++) {
2642 node
*ch
= CHILD(n
, i
);
2643 if (TYPE(ch
) == stmt
) {
2677 if (TYPE(CHILD(n
, 0)) == STRING
)
2689 /* Don't generate doc-strings if run with -OO */
2690 if (Py_OptimizeFlag
> 1)
2692 n
= get_rawdocstring(n
);
2695 return parsestrplus(n
);
2700 struct compiling
*c
;
2704 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2706 com_node(c
, CHILD(n
, 0));
2710 for (i
= 0; i
< NCH(n
); i
++) {
2711 node
*ch
= CHILD(n
, i
);
2712 if (TYPE(ch
) == stmt
)
2720 com_continue_stmt(c
, n
)
2721 struct compiling
*c
;
2722 node
*n
; /* Not used, but passed for consistency */
2724 int i
= c
->c_nblocks
;
2725 if (i
-- > 0 && c
->c_block
[i
] == SETUP_LOOP
) {
2726 com_addoparg(c
, JUMP_ABSOLUTE
, c
->c_begin
);
2729 com_error(c
, PyExc_SyntaxError
,
2730 "'continue' not properly in loop");
2732 /* XXX Could allow it inside a 'finally' clause
2733 XXX if we could pop the exception still on the stack */
2738 struct compiling
*c
;
2741 int i
, nch
, nargs
, ndefs
;
2742 if (TYPE(n
) == lambdef
) {
2743 /* lambdef: 'lambda' [varargslist] ':' test */
2747 REQ(n
, funcdef
); /* funcdef: 'def' NAME parameters ... */
2749 REQ(n
, parameters
); /* parameters: '(' [varargslist] ')' */
2752 if (TYPE(n
) != varargslist
)
2755 (fpdef ['=' test] ',')* '*' ....... |
2756 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2760 for (i
= 0; i
< nch
; i
++) {
2762 if (TYPE(CHILD(n
, i
)) == STAR
||
2763 TYPE(CHILD(n
, i
)) == DOUBLESTAR
)
2768 t
= RPAR
; /* Anything except EQUAL or COMMA */
2770 t
= TYPE(CHILD(n
, i
));
2774 com_node(c
, CHILD(n
, i
));
2778 t
= TYPE(CHILD(n
, i
));
2781 /* Treat "(a=1, b)" as an error */
2783 com_error(c
, PyExc_SyntaxError
,
2784 "non-default argument follows default argument");
2794 struct compiling
*c
;
2798 REQ(n
, funcdef
); /* funcdef: 'def' NAME parameters ':' suite */
2799 v
= (PyObject
*)icompile(n
, c
);
2803 int i
= com_addconst(c
, v
);
2804 int ndefs
= com_argdefs(c
, n
);
2805 com_addoparg(c
, LOAD_CONST
, i
);
2807 com_addoparg(c
, MAKE_FUNCTION
, ndefs
);
2809 com_addopname(c
, STORE_NAME
, CHILD(n
, 1));
2817 struct compiling
*c
;
2822 /* testlist: test (',' test)* [','] */
2823 for (i
= 0; i
< NCH(n
); i
+= 2)
2824 com_node(c
, CHILD(n
, i
));
2826 com_addoparg(c
, BUILD_TUPLE
, i
);
2832 struct compiling
*c
;
2838 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2839 if ((v
= PyString_InternFromString(STR(CHILD(n
, 1)))) == NULL
) {
2843 /* Push the class name on the stack */
2844 i
= com_addconst(c
, v
);
2845 com_addoparg(c
, LOAD_CONST
, i
);
2848 /* Push the tuple of base classes on the stack */
2849 if (TYPE(CHILD(n
, 2)) != LPAR
) {
2850 com_addoparg(c
, BUILD_TUPLE
, 0);
2854 com_bases(c
, CHILD(n
, 3));
2855 v
= (PyObject
*)icompile(n
, c
);
2859 i
= com_addconst(c
, v
);
2860 com_addoparg(c
, LOAD_CONST
, i
);
2862 com_addoparg(c
, MAKE_FUNCTION
, 0);
2863 com_addoparg(c
, CALL_FUNCTION
, 0);
2864 com_addbyte(c
, BUILD_CLASS
);
2866 com_addopname(c
, STORE_NAME
, CHILD(n
, 1));
2873 struct compiling
*c
;
2878 /* Definition nodes */
2887 /* Trivial parse tree nodes */
2892 com_node(c
, CHILD(n
, 0));
2896 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2897 com_addoparg(c
, SET_LINENO
, n
->n_lineno
);
2900 for (i
= 0; i
< NCH(n
)-1; i
+= 2)
2901 com_node(c
, CHILD(n
, i
));
2906 com_addoparg(c
, SET_LINENO
, n
->n_lineno
);
2907 com_node(c
, CHILD(n
, 0));
2910 /* Statement nodes */
2913 com_expr_stmt(c
, n
);
2916 com_print_stmt(c
, n
);
2918 case del_stmt
: /* 'del' exprlist */
2919 com_assign(c
, CHILD(n
, 1), OP_DELETE
);
2924 if (c
->c_loops
== 0) {
2925 com_error(c
, PyExc_SyntaxError
,
2926 "'break' outside loop");
2928 com_addbyte(c
, BREAK_LOOP
);
2931 com_continue_stmt(c
, n
);
2934 com_return_stmt(c
, n
);
2937 com_raise_stmt(c
, n
);
2940 com_import_stmt(c
, n
);
2943 com_global_stmt(c
, n
);
2946 com_exec_stmt(c
, n
);
2949 com_assert_stmt(c
, n
);
2955 com_while_stmt(c
, n
);
2967 /* Expression nodes */
2982 com_comparison(c
, n
);
2997 com_shift_expr(c
, n
);
3000 com_arith_expr(c
, n
);
3016 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
3017 com_error(c
, PyExc_SystemError
,
3018 "com_node: unexpected node type");
3022 static void com_fplist
Py_PROTO((struct compiling
*, node
*));
3026 struct compiling
*c
;
3029 REQ(n
, fpdef
); /* fpdef: NAME | '(' fplist ')' */
3030 if (TYPE(CHILD(n
, 0)) == LPAR
)
3031 com_fplist(c
, CHILD(n
, 1));
3033 com_addoparg(c
, STORE_FAST
, com_newlocal(c
, STR(CHILD(n
, 0))));
3040 struct compiling
*c
;
3043 REQ(n
, fplist
); /* fplist: fpdef (',' fpdef)* [','] */
3045 com_fpdef(c
, CHILD(n
, 0));
3048 int i
= (NCH(n
)+1)/2;
3049 com_addoparg(c
, UNPACK_TUPLE
, i
);
3051 for (i
= 0; i
< NCH(n
); i
+= 2)
3052 com_fpdef(c
, CHILD(n
, i
));
3058 struct compiling
*c
;
3064 REQ(n
, varargslist
);
3066 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
3068 /* Enter all arguments in table of locals */
3069 for (i
= 0; i
< nch
; i
++) {
3070 node
*ch
= CHILD(n
, i
);
3073 if (TYPE(ch
) == STAR
|| TYPE(ch
) == DOUBLESTAR
)
3075 REQ(ch
, fpdef
); /* fpdef: NAME | '(' fplist ')' */
3077 if (TYPE(fp
) == NAME
)
3081 sprintf(nbuf
, ".%d", i
);
3084 com_newlocal(c
, name
);
3089 if (TYPE(ch
) == EQUAL
)
3094 /* Handle *arguments */
3098 if (TYPE(ch
) != DOUBLESTAR
) {
3101 if (TYPE(ch
) == NAME
) {
3102 c
->c_flags
|= CO_VARARGS
;
3104 com_newlocal(c
, STR(ch
));
3108 /* Handle **keywords */
3112 if (TYPE(ch
) != DOUBLESTAR
) {
3121 c
->c_flags
|= CO_VARKEYWORDS
;
3122 com_newlocal(c
, STR(ch
));
3125 /* Generate code for complex arguments only after
3126 having counted the simple arguments */
3128 for (i
= 0; i
< nch
; i
++) {
3129 node
*ch
= CHILD(n
, i
);
3131 if (TYPE(ch
) == STAR
|| TYPE(ch
) == DOUBLESTAR
)
3133 REQ(ch
, fpdef
); /* fpdef: NAME | '(' fplist ')' */
3135 if (TYPE(fp
) != NAME
) {
3136 com_addoparg(c
, LOAD_FAST
, ilocal
);
3144 if (TYPE(ch
) == EQUAL
)
3153 com_file_input(c
, n
)
3154 struct compiling
*c
;
3159 REQ(n
, file_input
); /* (NEWLINE | stmt)* ENDMARKER */
3160 doc
= get_docstring(n
);
3162 int i
= com_addconst(c
, doc
);
3164 com_addoparg(c
, LOAD_CONST
, i
);
3166 com_addopnamestr(c
, STORE_NAME
, "__doc__");
3169 for (i
= 0; i
< NCH(n
); i
++) {
3170 node
*ch
= CHILD(n
, i
);
3171 if (TYPE(ch
) != ENDMARKER
&& TYPE(ch
) != NEWLINE
)
3176 /* Top-level compile-node interface */
3179 compile_funcdef(c
, n
)
3180 struct compiling
*c
;
3185 REQ(n
, funcdef
); /* funcdef: 'def' NAME parameters ':' suite */
3186 c
->c_name
= STR(CHILD(n
, 1));
3187 doc
= get_docstring(CHILD(n
, 4));
3189 (void) com_addconst(c
, doc
);
3193 (void) com_addconst(c
, Py_None
); /* No docstring */
3194 ch
= CHILD(n
, 2); /* parameters: '(' [varargslist] ')' */
3195 ch
= CHILD(ch
, 1); /* ')' | varargslist */
3196 if (TYPE(ch
) == varargslist
)
3198 c
->c_infunction
= 1;
3199 com_node(c
, CHILD(n
, 4));
3200 c
->c_infunction
= 0;
3201 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
3203 com_addbyte(c
, RETURN_VALUE
);
3208 compile_lambdef(c
, n
)
3209 struct compiling
*c
;
3213 REQ(n
, lambdef
); /* lambdef: 'lambda' [varargslist] ':' test */
3214 c
->c_name
= "<lambda>";
3217 (void) com_addconst(c
, Py_None
); /* No docstring */
3218 if (TYPE(ch
) == varargslist
) {
3225 com_addbyte(c
, RETURN_VALUE
);
3230 compile_classdef(c
, n
)
3231 struct compiling
*c
;
3237 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3238 c
->c_name
= STR(CHILD(n
, 1));
3239 #ifdef PRIVATE_NAME_MANGLING
3240 c
->c_private
= c
->c_name
;
3242 ch
= CHILD(n
, NCH(n
)-1); /* The suite */
3243 doc
= get_docstring(ch
);
3245 int i
= com_addconst(c
, doc
);
3247 com_addoparg(c
, LOAD_CONST
, i
);
3249 com_addopnamestr(c
, STORE_NAME
, "__doc__");
3253 (void) com_addconst(c
, Py_None
);
3255 com_addbyte(c
, LOAD_LOCALS
);
3257 com_addbyte(c
, RETURN_VALUE
);
3263 struct compiling
*c
;
3266 com_addoparg(c
, SET_LINENO
, n
->n_lineno
);
3270 case single_input
: /* One interactive command */
3271 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
3274 if (TYPE(n
) != NEWLINE
)
3276 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
3278 com_addbyte(c
, RETURN_VALUE
);
3283 case file_input
: /* A whole file, or built-in function exec() */
3284 com_file_input(c
, n
);
3285 com_addoparg(c
, LOAD_CONST
, com_addconst(c
, Py_None
));
3287 com_addbyte(c
, RETURN_VALUE
);
3291 case eval_input
: /* Built-in function input() */
3292 com_node(c
, CHILD(n
, 0));
3293 com_addbyte(c
, RETURN_VALUE
);
3297 case lambdef
: /* anonymous function definition */
3298 compile_lambdef(c
, n
);
3301 case funcdef
: /* A function definition */
3302 compile_funcdef(c
, n
);
3305 case classdef
: /* A class definition */
3306 compile_classdef(c
, n
);
3310 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
3311 com_error(c
, PyExc_SystemError
,
3312 "compile_node: unexpected node type");
3316 /* Optimization for local variables in functions (and *only* functions).
3318 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3319 instructions that refer to local variables with LOAD_FAST etc.
3320 The latter instructions are much faster because they don't need to
3321 look up the variable name in a dictionary.
3323 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3324 and DELETE_NAME instructions. This yields all local variables,
3325 function definitions, class definitions and import statements.
3326 Argument names have already been entered into the list by the
3327 special processing for the argument list.
3329 All remaining LOAD_NAME instructions must refer to non-local (global
3330 or builtin) variables, so are replaced by LOAD_GLOBAL.
3332 There are two problems: 'from foo import *' and 'exec' may introduce
3333 local variables that we can't know while compiling. If this is the
3334 case, we can still optimize bona fide locals (since those
3335 statements will be surrounded by fast_2_locals() and
3336 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
3338 NB: this modifies the string object c->c_code! */
3342 struct compiling
*c
;
3344 unsigned char *next_instr
, *cur_instr
;
3348 PyObject
*error_type
, *error_value
, *error_traceback
;
3350 #define NEXTOP() (*next_instr++)
3351 #define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3352 #define GETITEM(v, i) (PyList_GetItem((v), (i)))
3353 #define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3355 PyErr_Fetch(&error_type
, &error_value
, &error_traceback
);
3357 c
->c_flags
|= CO_OPTIMIZED
;
3359 next_instr
= (unsigned char *) PyString_AsString(c
->c_code
);
3362 if (opcode
== STOP_CODE
)
3364 if (HAS_ARG(opcode
))
3370 com_addlocal_o(c
, GETNAMEOBJ(oparg
));
3373 c
->c_flags
&= ~CO_OPTIMIZED
;
3378 if (PyDict_GetItemString(c
->c_locals
, "*") != NULL
)
3379 c
->c_flags
&= ~CO_OPTIMIZED
;
3381 next_instr
= (unsigned char *) PyString_AsString(c
->c_code
);
3383 cur_instr
= next_instr
;
3385 if (opcode
== STOP_CODE
)
3387 if (HAS_ARG(opcode
))
3389 if (opcode
== LOAD_NAME
||
3390 opcode
== STORE_NAME
||
3391 opcode
== DELETE_NAME
) {
3394 name
= GETNAMEOBJ(oparg
);
3395 v
= PyDict_GetItem(c
->c_locals
, name
);
3397 if (opcode
== LOAD_NAME
&&
3398 (c
->c_flags
&CO_OPTIMIZED
))
3399 cur_instr
[0] = LOAD_GLOBAL
;
3402 i
= PyInt_AsLong(v
);
3404 case LOAD_NAME
: cur_instr
[0] = LOAD_FAST
; break;
3405 case STORE_NAME
: cur_instr
[0] = STORE_FAST
; break;
3406 case DELETE_NAME
: cur_instr
[0] = DELETE_FAST
; break;
3408 cur_instr
[1] = i
& 0xff;
3409 cur_instr
[2] = (i
>>8) & 0xff;
3413 if (c
->c_errors
== 0)
3414 PyErr_Restore(error_type
, error_value
, error_traceback
);
3418 PyNode_Compile(n
, filename
)
3422 return jcompile(n
, filename
, NULL
);
3425 static PyCodeObject
*
3428 struct compiling
*base
;
3430 return jcompile(n
, base
->c_filename
, base
);
3433 static PyCodeObject
*
3434 jcompile(n
, filename
, base
)
3437 struct compiling
*base
;
3439 struct compiling sc
;
3441 if (!com_init(&sc
, filename
))
3443 #ifdef PRIVATE_NAME_MANGLING
3445 sc
.c_private
= base
->c_private
;
3447 sc
.c_private
= NULL
;
3449 compile_node(&sc
, n
);
3451 if ((TYPE(n
) == funcdef
|| TYPE(n
) == lambdef
) && sc
.c_errors
== 0) {
3453 sc
.c_flags
|= CO_NEWLOCALS
;
3455 else if (TYPE(n
) == classdef
)
3456 sc
.c_flags
|= CO_NEWLOCALS
;
3458 if (sc
.c_errors
== 0) {
3459 PyObject
*consts
, *names
, *varnames
, *filename
, *name
;
3460 consts
= PyList_AsTuple(sc
.c_consts
);
3461 names
= PyList_AsTuple(sc
.c_names
);
3462 varnames
= PyList_AsTuple(sc
.c_varnames
);
3463 filename
= PyString_InternFromString(sc
.c_filename
);
3464 name
= PyString_InternFromString(sc
.c_name
);
3465 if (!PyErr_Occurred())
3466 co
= PyCode_New(sc
.c_argcount
,
3480 Py_XDECREF(varnames
);
3481 Py_XDECREF(filename
);
3489 PyCode_Addr2Line(co
, addrq
)
3493 int size
= PyString_Size(co
->co_lnotab
) / 2;
3494 unsigned char *p
= (unsigned char*)PyString_AsString(co
->co_lnotab
);
3495 int line
= co
->co_firstlineno
;
3497 while (--size
>= 0) {