annotate Python/compile.c @ 16845:09dcf5ebcd80 legacy-trunk

Now that Jeremy is asking about this code, it looks really bogus to me, so let's rip it out. The constructor for SyntaxError does the right thing, so we do not need to do it again.
author Fred Drake <fdrake@acm.org>
date Wed, 28 Feb 2001 20:58:04 +0000
parents 09f6c1372056
children 05785bdf289c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
1
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Compile an expression node to intermediate code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
4 /* XXX TO DO:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
5 XXX add __doc__ attribute == co_doc to code object attributes?
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
6 XXX (it's currently the first item of the co_const tuple)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
7 XXX Generate simple jump for break/return outside 'try...finally'
16398
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
8 XXX Allow 'continue' inside finally clause of try-finally
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
9 XXX New opcode for loading the initial index for a for loop
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
10 XXX other JAR tricks?
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
11 */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
13 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
14
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #include "node.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #include "token.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 #include "graminit.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #include "compile.h"
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
19 #include "symtable.h"
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #include "opcode.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
21 #include "structmember.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
22
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
23 #include <ctype.h>
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
24
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
25 /* Three symbols from graminit.h are also defined in Python.h, with
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
26 Py_ prefixes to their names. Python.h can't include graminit.h
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
27 (which defines too many confusing symbols), but we can check here
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
28 that they haven't changed (which is very unlikely, but possible). */
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
29 #if Py_single_input != single_input
5566
19d4a2874645 Indent the #error directives so a classic K&R cpp doesn't see them.
Guido van Rossum <guido@python.org>
parents: 5453
diff changeset
30 #error "single_input has changed -- update Py_single_input in Python.h"
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
31 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
32 #if Py_file_input != file_input
5566
19d4a2874645 Indent the #error directives so a classic K&R cpp doesn't see them.
Guido van Rossum <guido@python.org>
parents: 5453
diff changeset
33 #error "file_input has changed -- update Py_file_input in Python.h"
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
34 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
35 #if Py_eval_input != eval_input
5566
19d4a2874645 Indent the #error directives so a classic K&R cpp doesn't see them.
Guido van Rossum <guido@python.org>
parents: 5453
diff changeset
36 #error "eval_input has changed -- update Py_eval_input in Python.h"
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
37 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
38
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
39 int Py_OptimizeFlag = 0;
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
40
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
41 #define OP_DELETE 0
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
42 #define OP_ASSIGN 1
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
43 #define OP_APPLY 2
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
44
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
45 #define VAR_LOAD 0
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
46 #define VAR_STORE 1
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
47 #define VAR_DELETE 2
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
48
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
49 #define DEL_CLOSURE_ERROR \
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
50 "can not delete variable '%.400s' referenced in nested scope"
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
51
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
52 #define DUPLICATE_ARGUMENT \
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
53 "duplicate argument '%s' in function definition"
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
54
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
55 #define ILLEGAL_DYNAMIC_SCOPE \
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
56 "%.100s: exec or 'import *' makes names ambiguous in nested scope"
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
57
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
58 #define GLOBAL_AFTER_ASSIGN \
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
59 "name '%.400s' is assigned to before global declaration"
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
60
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
61 #define GLOBAL_AFTER_USE \
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
62 "name '%.400s' is used prior to global declaration"
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
63
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
64 #define LOCAL_GLOBAL \
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
65 "name '%.400s' is a function paramter and declared global"
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
66
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
67 #define LATE_FUTURE \
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
68 "from __future__ imports must occur at the beginning of the file"
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
69
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
70 #define MANGLE_LEN 256
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
71
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
72 #define OFF(x) offsetof(PyCodeObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
73
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
74 static struct memberlist code_memberlist[] = {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
75 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
76 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
77 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
78 {"co_flags", T_INT, OFF(co_flags), READONLY},
568
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
79 {"co_code", T_OBJECT, OFF(co_code), READONLY},
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
80 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
81 {"co_names", T_OBJECT, OFF(co_names), READONLY},
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
82 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
83 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
84 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
568
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
85 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
86 {"co_name", T_OBJECT, OFF(co_name), READONLY},
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
87 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
88 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
89 {NULL} /* Sentinel */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
90 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
91
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
92 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
93 code_getattr(PyCodeObject *co, char *name)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
94 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
95 return PyMember_Get((char *)co, code_memberlist, name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
96 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
99 code_dealloc(PyCodeObject *co)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
101 Py_XDECREF(co->co_code);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
102 Py_XDECREF(co->co_consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
103 Py_XDECREF(co->co_names);
5901
ba49a6ef7214 Plug a leak in code_dealloc() (and reordered the deallocs to match the
Guido van Rossum <guido@python.org>
parents: 5754
diff changeset
104 Py_XDECREF(co->co_varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
105 Py_XDECREF(co->co_freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
106 Py_XDECREF(co->co_cellvars);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
107 Py_XDECREF(co->co_filename);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
108 Py_XDECREF(co->co_name);
5901
ba49a6ef7214 Plug a leak in code_dealloc() (and reordered the deallocs to match the
Guido van Rossum <guido@python.org>
parents: 5754
diff changeset
109 Py_XDECREF(co->co_lnotab);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12538
diff changeset
110 PyObject_DEL(co);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
113 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
114 code_repr(PyCodeObject *co)
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
115 {
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
116 char buf[500];
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
117 int lineno = -1;
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
118 char *filename = "???";
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
119 char *name = "???";
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
120
12278
647bf71912f0 Vladimir Marangozov: This fixes the line number in the string
Guido van Rossum <guido@python.org>
parents: 12086
diff changeset
121 if (co->co_firstlineno != 0)
647bf71912f0 Vladimir Marangozov: This fixes the line number in the string
Guido van Rossum <guido@python.org>
parents: 12086
diff changeset
122 lineno = co->co_firstlineno;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
123 if (co->co_filename && PyString_Check(co->co_filename))
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
124 filename = PyString_AS_STRING(co->co_filename);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
125 if (co->co_name && PyString_Check(co->co_name))
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
126 name = PyString_AS_STRING(co->co_name);
13227
c2df5d28034d Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13096
diff changeset
127 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
c2df5d28034d Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13096
diff changeset
128 name, co, filename, lineno);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
129 return PyString_FromString(buf);
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
130 }
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
131
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
132 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
133 code_compare(PyCodeObject *co, PyCodeObject *cp)
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
134 {
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
135 int cmp;
12333
525b2358721e Patch by Vladimir Marangozov to include the function name when
Guido van Rossum <guido@python.org>
parents: 12278
diff changeset
136 cmp = PyObject_Compare(co->co_name, cp->co_name);
525b2358721e Patch by Vladimir Marangozov to include the function name when
Guido van Rossum <guido@python.org>
parents: 12278
diff changeset
137 if (cmp) return cmp;
6186
2e755d1ff661 Cprrect stuoid tyops -- was comparing variabes with themselves because
Guido van Rossum <guido@python.org>
parents: 5901
diff changeset
138 cmp = co->co_argcount - cp->co_argcount;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
139 if (cmp) return cmp;
6186
2e755d1ff661 Cprrect stuoid tyops -- was comparing variabes with themselves because
Guido van Rossum <guido@python.org>
parents: 5901
diff changeset
140 cmp = co->co_nlocals - cp->co_nlocals;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
141 if (cmp) return cmp;
6186
2e755d1ff661 Cprrect stuoid tyops -- was comparing variabes with themselves because
Guido van Rossum <guido@python.org>
parents: 5901
diff changeset
142 cmp = co->co_flags - cp->co_flags;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
143 if (cmp) return cmp;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
144 cmp = PyObject_Compare(co->co_code, cp->co_code);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
145 if (cmp) return cmp;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
146 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
147 if (cmp) return cmp;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
148 cmp = PyObject_Compare(co->co_names, cp->co_names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
149 if (cmp) return cmp;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
150 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
151 if (cmp) return cmp;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
152 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
153 if (cmp) return cmp;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
154 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
155 return cmp;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
156 }
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
157
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
158 static long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
159 code_hash(PyCodeObject *co)
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
160 {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
161 long h, h0, h1, h2, h3, h4, h5, h6;
12333
525b2358721e Patch by Vladimir Marangozov to include the function name when
Guido van Rossum <guido@python.org>
parents: 12278
diff changeset
162 h0 = PyObject_Hash(co->co_name);
525b2358721e Patch by Vladimir Marangozov to include the function name when
Guido van Rossum <guido@python.org>
parents: 12278
diff changeset
163 if (h0 == -1) return -1;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
164 h1 = PyObject_Hash(co->co_code);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
165 if (h1 == -1) return -1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
166 h2 = PyObject_Hash(co->co_consts);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
167 if (h2 == -1) return -1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
168 h3 = PyObject_Hash(co->co_names);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
169 if (h3 == -1) return -1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
170 h4 = PyObject_Hash(co->co_varnames);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
171 if (h4 == -1) return -1;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
172 h5 = PyObject_Hash(co->co_freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
173 if (h5 == -1) return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
174 h6 = PyObject_Hash(co->co_cellvars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
175 if (h6 == -1) return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
178 if (h == -1) h = -2;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
179 return h;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
180 }
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
181
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
182 PyTypeObject PyCode_Type = {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
183 PyObject_HEAD_INIT(&PyType_Type)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 "code",
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
186 sizeof(PyCodeObject),
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 0,
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
188 (destructor)code_dealloc, /*tp_dealloc*/
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
189 0, /*tp_print*/
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
190 (getattrfunc)code_getattr, /*tp_getattr*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 0, /*tp_setattr*/
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
192 (cmpfunc)code_compare, /*tp_compare*/
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
193 (reprfunc)code_repr, /*tp_repr*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 0, /*tp_as_number*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 0, /*tp_as_sequence*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 0, /*tp_as_mapping*/
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
197 (hashfunc)code_hash, /*tp_hash*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199
5287
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
200 #define NAME_CHARS \
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
202
16006
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
203 /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
204
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
205 static int
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
206 all_name_chars(unsigned char *s)
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
207 {
16523
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
208 static char ok_name_char[256];
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
209 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
210
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
211 if (ok_name_char[*name_chars] == 0) {
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
212 unsigned char *p;
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
213 for (p = name_chars; *p; p++)
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
214 ok_name_char[*p] = 1;
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
215 }
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
216 while (*s) {
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
217 if (ok_name_char[*s++] == 0)
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
218 return 0;
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
219 }
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
220 return 1;
16006
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
221 }
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
222
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
223 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
224 intern_strings(PyObject *tuple)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
225 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
226 int i;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
227
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
228 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
229 PyObject *v = PyTuple_GET_ITEM(tuple, i);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
230 if (v == NULL || !PyString_Check(v)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
231 Py_FatalError("non-string found in code slot");
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
232 PyErr_BadInternalCall();
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
233 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
234 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
235 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
236 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
237 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
238 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
239
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
240 PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
241 PyCode_New(int argcount, int nlocals, int stacksize, int flags,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
242 PyObject *code, PyObject *consts, PyObject *names,
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
243 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
244 PyObject *filename, PyObject *name, int firstlineno,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
245 PyObject *lnotab)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
247 PyCodeObject *co;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 int i;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
249 PyBufferProcs *pb;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 /* Check argument types */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
251 if (argcount < 0 || nlocals < 0 ||
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
252 code == NULL ||
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
253 consts == NULL || !PyTuple_Check(consts) ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
254 names == NULL || !PyTuple_Check(names) ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
255 varnames == NULL || !PyTuple_Check(varnames) ||
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
256 freevars == NULL || !PyTuple_Check(freevars) ||
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
257 cellvars == NULL || !PyTuple_Check(cellvars) ||
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
258 name == NULL || !PyString_Check(name) ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
259 filename == NULL || !PyString_Check(filename) ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
260 lnotab == NULL || !PyString_Check(lnotab)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
261 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
264 pb = code->ob_type->tp_as_buffer;
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
265 if (pb == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
266 pb->bf_getreadbuffer == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
267 pb->bf_getsegcount == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
268 (*pb->bf_getsegcount)(code, NULL) != 1)
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
269 {
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
270 PyErr_BadInternalCall();
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
271 return NULL;
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
272 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
273 intern_strings(names);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
274 intern_strings(varnames);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
275 if (freevars == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
276 freevars = PyTuple_New(0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
277 intern_strings(freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
278 if (cellvars == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
279 cellvars = PyTuple_New(0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
280 intern_strings(cellvars);
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
281 /* Intern selected string constants */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
282 for (i = PyTuple_Size(consts); --i >= 0; ) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
283 PyObject *v = PyTuple_GetItem(consts, i);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
284 if (!PyString_Check(v))
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
285 continue;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
286 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
287 continue;
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
288 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
290 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 if (co != NULL) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
292 co->co_argcount = argcount;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
293 co->co_nlocals = nlocals;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
294 co->co_stacksize = stacksize;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
295 co->co_flags = flags;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
296 Py_INCREF(code);
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
297 co->co_code = code;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
298 Py_INCREF(consts);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 co->co_consts = consts;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
300 Py_INCREF(names);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 co->co_names = names;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
302 Py_INCREF(varnames);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
303 co->co_varnames = varnames;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
304 Py_INCREF(freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
305 co->co_freevars = freevars;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
306 Py_INCREF(cellvars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
307 co->co_cellvars = cellvars;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
308 Py_INCREF(filename);
266
b5826bf29677 Changed and exported newcodeobject() interface, for ".pyc" files.
Guido van Rossum <guido@python.org>
parents: 238
diff changeset
309 co->co_filename = filename;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
310 Py_INCREF(name);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
311 co->co_name = name;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
312 co->co_firstlineno = firstlineno;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
313 Py_INCREF(lnotab);
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
314 co->co_lnotab = lnotab;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
315 /* PyObject_Print((PyObject *)co, stderr, 0); */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 /* Data structure used internally */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
322
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
323 /* The compiler uses two passes to generate bytecodes. The first pass
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
324 builds the symbol table. The second pass generates the bytecode.
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
325
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
326 The first pass uses a single symtable struct. The second pass uses
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
327 a compiling struct for each code block. The compiling structs
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
328 share a reference to the symtable.
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
329
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
330 The two passes communicate via symtable_load_symbols() and via
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
331 is_local() and is_global(). The former initializes several slots
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
332 in the compiling struct: c_varnames, c_locals, c_nlocals,
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
333 c_argcount, c_globals, and c_flags.
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
334 */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
335
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 struct compiling {
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
337 PyObject *c_code; /* string */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
338 PyObject *c_consts; /* list of objects */
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
339 PyObject *c_const_dict; /* inverse of c_consts */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
340 PyObject *c_names; /* list of strings (names) */
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
341 PyObject *c_name_dict; /* inverse of c_names */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
342 PyObject *c_globals; /* dictionary (value=None) */
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
343 PyObject *c_locals; /* dictionary (value=localID) */
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
344 PyObject *c_varnames; /* list (inverse of c_locals) */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
345 PyObject *c_freevars; /* dictionary (value=None) */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
346 PyObject *c_cellvars; /* list */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
347 int c_nlocals; /* index of next local */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
348 int c_argcount; /* number of top-level arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
349 int c_flags; /* same as co_flags */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 int c_nexti; /* index into c_code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 int c_errors; /* counts errors occurred */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
352 int c_infunction; /* set when compiling a function */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
353 int c_interactive; /* generating code for interactive command */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
354 int c_loops; /* counts nested loops */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
355 int c_begin; /* begin of current loop, for 'continue' */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
356 int c_block[CO_MAXBLOCKS]; /* stack of block types */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
357 int c_nblocks; /* current block stack level */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
358 char *c_filename; /* filename of current node */
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
359 char *c_name; /* name of object (e.g. function) */
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
360 int c_lineno; /* Current line number */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
361 int c_stacklevel; /* Current stack level */
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
362 int c_maxstacklevel; /* Maximum stack level */
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
363 int c_firstlineno;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
364 PyObject *c_lnotab; /* Table mapping address to line number */
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
365 int c_last_addr, c_last_line, c_lnotab_next;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
366 char *c_private; /* for private name mangling */
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
367 int c_tmpname; /* temporary local name counter */
16523
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
368 int c_nested; /* Is block nested funcdef or lamdef? */
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
369 int c_closure; /* Is nested w/freevars? */
9d625303f914 Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents: 16428
diff changeset
370 struct symtable *c_symtable; /* pointer to module symbol table */
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16783
diff changeset
371 PyFutureFeatures *c_future; /* pointer to module's __future__ */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
374 int is_free(int v)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
375 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
376 if ((v & (USE | DEF_FREE))
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
377 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
378 return 1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
379 if (v & DEF_FREE_CLASS)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
380 return 1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
381 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
382 }
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
383
16428
6496844c4a42 Fix symbol table pass to generation SyntaxError exceptions that
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16421
diff changeset
384 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
385 com_error(struct compiling *c, PyObject *exc, char *msg)
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
386 {
16831
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
387 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
388
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
389 if (c == NULL) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
390 /* Error occurred via symtable call to
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
391 is_constant_false */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
392 PyErr_SetString(exc, msg);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
393 return;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
394 }
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
395 c->c_errors++;
16831
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
396 if (c->c_lineno < 1 || c->c_interactive) {
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
397 /* Unknown line number or interactive input */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
398 PyErr_SetString(exc, msg);
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
399 return;
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
400 }
13993
716e1c4e3f78 When raising a SyntaxError, make a best-effort attempt to set the
Fred Drake <fdrake@acm.org>
parents: 13956
diff changeset
401 v = PyString_FromString(msg);
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
402 if (v == NULL)
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
403 return; /* MemoryError, too bad */
16831
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
404
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
405 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
16831
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
406 if (line == NULL) {
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
407 Py_INCREF(Py_None);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
408 line = Py_None;
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
409 }
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
410 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
411 Py_None, line);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
412 if (t == NULL)
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
413 goto exit;
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
414 w = Py_BuildValue("(OO)", v, t);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
415 if (w == NULL)
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
416 goto exit;
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
417 PyErr_SetObject(exc, w);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
418 exit:
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
419 Py_XDECREF(t);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
420 Py_XDECREF(v);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
421 Py_XDECREF(w);
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
422 Py_XDECREF(line);
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
423 }
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
424
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
425 /* Interface to the block stack */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
426
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
427 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
428 block_push(struct compiling *c, int type)
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
429 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
430 if (c->c_nblocks >= CO_MAXBLOCKS) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
431 com_error(c, PyExc_SystemError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
432 "too many statically nested blocks");
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
433 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
434 else {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
435 c->c_block[c->c_nblocks++] = type;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
436 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
437 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
438
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
439 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
440 block_pop(struct compiling *c, int type)
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
441 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
442 if (c->c_nblocks > 0)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
443 c->c_nblocks--;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
444 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
445 com_error(c, PyExc_SystemError, "bad block pop");
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
446 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
447 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
448
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
449 /* Prototype forward declarations */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
450
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
451 static int com_init(struct compiling *, char *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
452 static void com_free(struct compiling *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
453 static void com_push(struct compiling *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
454 static void com_pop(struct compiling *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
455 static void com_done(struct compiling *);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
456 static void com_node(struct compiling *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
457 static void com_factor(struct compiling *, node *);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
458 static void com_addbyte(struct compiling *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
459 static void com_addint(struct compiling *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
460 static void com_addoparg(struct compiling *, int, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
461 static void com_addfwref(struct compiling *, int, int *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
462 static void com_backpatch(struct compiling *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
463 static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
464 static int com_addconst(struct compiling *, PyObject *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
465 static int com_addname(struct compiling *, PyObject *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
466 static void com_addopname(struct compiling *, int, node *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
467 static void com_list(struct compiling *, node *, int);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
468 static void com_list_iter(struct compiling *, node *, node *, char *);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
469 static int com_argdefs(struct compiling *, node *);
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
470 static void com_assign(struct compiling *, node *, int, node *);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
471 static void com_assign_name(struct compiling *, node *, int);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
472 static PyCodeObject *icompile(node *, struct compiling *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
473 static PyCodeObject *jcompile(node *, char *, struct compiling *);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
474 static PyObject *parsestrplus(node *);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
475 static PyObject *parsestr(char *);
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
476 static node *get_rawdocstring(node *);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
478 static int get_ref_type(struct compiling *, char *);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
479
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
480 /* symtable operations */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
481 static int symtable_build(struct compiling *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
482 static int symtable_load_symbols(struct compiling *);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
483 static struct symtable *symtable_init(void);
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
484 static void symtable_enter_scope(struct symtable *, char *, int, int);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
485 static int symtable_exit_scope(struct symtable *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
486 static int symtable_add_def(struct symtable *, char *, int);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
487 static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
488
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
489 static void symtable_node(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
490 static void symtable_funcdef(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
491 static void symtable_default_args(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
492 static void symtable_params(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
493 static void symtable_params_fplist(struct symtable *, node *n);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
494 static void symtable_global(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
495 static void symtable_import(struct symtable *, node *);
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
496 static void symtable_assign(struct symtable *, node *, int);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
497 static void symtable_list_comprehension(struct symtable *, node *);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
498
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
499 static int symtable_update_free_vars(struct symtable *);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
500 static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
501 static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
502
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
503 /* helper */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
504 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
505 do_pad(int pad)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
506 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
507 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
508 for (i = 0; i < pad; ++i)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
509 fprintf(stderr, " ");
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
510 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
511
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
512 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
513 dump(node *n, int pad, int depth)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
514 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
515 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
516 if (depth == 0)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
517 return;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
518 do_pad(pad);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
519 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
520 if (depth > 0)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
521 depth--;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
522 for (i = 0; i < NCH(n); ++i)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
523 dump(CHILD(n, i), pad + 1, depth);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
524 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
525
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
526 #define DUMP(N) dump(N, 0, -1)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
527
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
529 com_init(struct compiling *c, char *filename)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 {
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
531 memset((void *)c, '\0', sizeof(struct compiling));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
532 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
533 1000)) == NULL)
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
534 goto fail;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
535 if ((c->c_consts = PyList_New(0)) == NULL)
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
536 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
537 if ((c->c_const_dict = PyDict_New()) == NULL)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
538 goto fail;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
539 if ((c->c_names = PyList_New(0)) == NULL)
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
540 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
541 if ((c->c_name_dict = PyDict_New()) == NULL)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
542 goto fail;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
543 if ((c->c_locals = PyDict_New()) == NULL)
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
544 goto fail;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
545 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
546 1000)) == NULL)
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
547 goto fail;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
548 c->c_globals = NULL;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
549 c->c_varnames = NULL;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
550 c->c_freevars = NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
551 c->c_cellvars = NULL;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
552 c->c_nlocals = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
553 c->c_argcount = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
554 c->c_flags = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 c->c_nexti = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 c->c_errors = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
557 c->c_infunction = 0;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
558 c->c_interactive = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
559 c->c_loops = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
560 c->c_begin = 0;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
561 c->c_nblocks = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
562 c->c_filename = filename;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
563 c->c_name = "?";
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
564 c->c_lineno = 0;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
565 c->c_stacklevel = 0;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
566 c->c_maxstacklevel = 0;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
567 c->c_firstlineno = 0;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
568 c->c_last_addr = 0;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
569 c->c_last_line = 0;
16096
fb67122e5c1e com_init(): My entry into the smallest patch possible category.
Barry Warsaw <barry@python.org>
parents: 16060
diff changeset
570 c->c_lnotab_next = 0;
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
571 c->c_tmpname = 0;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
572 c->c_nested = 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
573 c->c_closure = 0;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
574 c->c_symtable = NULL;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 return 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
576
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
577 fail:
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
578 com_free(c);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 return 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
583 com_free(struct compiling *c)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
585 Py_XDECREF(c->c_code);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
586 Py_XDECREF(c->c_consts);
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
587 Py_XDECREF(c->c_const_dict);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
588 Py_XDECREF(c->c_names);
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
589 Py_XDECREF(c->c_name_dict);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
590 Py_XDECREF(c->c_globals);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
591 Py_XDECREF(c->c_locals);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
592 Py_XDECREF(c->c_varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
593 Py_XDECREF(c->c_freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
594 Py_XDECREF(c->c_cellvars);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
595 Py_XDECREF(c->c_lnotab);
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
596 if (c->c_future)
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
597 PyMem_Free((void *)c->c_future);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
601 com_push(struct compiling *c, int n)
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
602 {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
603 c->c_stacklevel += n;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
604 if (c->c_stacklevel > c->c_maxstacklevel)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
605 c->c_maxstacklevel = c->c_stacklevel;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
606 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
607
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
608 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
609 com_pop(struct compiling *c, int n)
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
610 {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
611 if (c->c_stacklevel < n) {
9049
cbf72b2210ae Comment out the print statement about underflow. (This only seems to
Guido van Rossum <guido@python.org>
parents: 8328
diff changeset
612 /* fprintf(stderr,
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
613 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
614 c->c_filename, c->c_lineno,
9049
cbf72b2210ae Comment out the print statement about underflow. (This only seems to
Guido van Rossum <guido@python.org>
parents: 8328
diff changeset
615 c->c_nexti, c->c_stacklevel, n); */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
616 c->c_stacklevel = 0;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
617 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
618 else
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
619 c->c_stacklevel -= n;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
620 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
621
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
622 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
623 com_done(struct compiling *c)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 if (c->c_code != NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
626 _PyString_Resize(&c->c_code, c->c_nexti);
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
627 if (c->c_lnotab != NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
628 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
632 com_addbyte(struct compiling *c, int byte)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 int len;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
635 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
636 assert(byte >= 0 && byte <= 255);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 if (byte < 0 || byte > 255) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
638 com_error(c, PyExc_SystemError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
639 "com_addbyte: byte out of range");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 if (c->c_code == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 return;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
643 len = PyString_Size(c->c_code);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 if (c->c_nexti >= len) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
645 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
650 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
654 com_addint(struct compiling *c, int x)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
656 com_addbyte(c, x & 0xff);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
657 com_addbyte(c, x >> 8); /* XXX x should be positive */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
661 com_add_lnotab(struct compiling *c, int addr, int line)
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
662 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
663 int size;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
664 char *p;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
665 if (c->c_lnotab == NULL)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
666 return;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
667 size = PyString_Size(c->c_lnotab);
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
668 if (c->c_lnotab_next+2 > size) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
669 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
670 c->c_errors++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
671 return;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
672 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
673 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
674 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
675 *p++ = addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
676 *p++ = line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
677 c->c_lnotab_next += 2;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
678 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
679
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
680 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
681 com_set_lineno(struct compiling *c, int lineno)
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
682 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
683 c->c_lineno = lineno;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
684 if (c->c_firstlineno == 0) {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
685 c->c_firstlineno = c->c_last_line = lineno;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
686 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
687 else {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
688 int incr_addr = c->c_nexti - c->c_last_addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
689 int incr_line = lineno - c->c_last_line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
690 while (incr_addr > 0 || incr_line > 0) {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
691 int trunc_addr = incr_addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
692 int trunc_line = incr_line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
693 if (trunc_addr > 255)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
694 trunc_addr = 255;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
695 if (trunc_line > 255)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
696 trunc_line = 255;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
697 com_add_lnotab(c, trunc_addr, trunc_line);
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
698 incr_addr -= trunc_addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
699 incr_line -= trunc_line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
700 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
701 c->c_last_addr = c->c_nexti;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
702 c->c_last_line = lineno;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
703 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
704 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
705
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
706 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
707 com_addoparg(struct compiling *c, int op, int arg)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
708 {
14147
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
709 int extended_arg = arg >> 16;
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
710 if (op == SET_LINENO) {
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
711 com_set_lineno(c, arg);
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
712 if (Py_OptimizeFlag)
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
713 return;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
714 }
14147
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
715 if (extended_arg){
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
716 com_addbyte(c, EXTENDED_ARG);
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
717 com_addint(c, extended_arg);
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
718 arg &= 0xffff;
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
719 }
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
720 com_addbyte(c, op);
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
721 com_addint(c, arg);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
722 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
725 com_addfwref(struct compiling *c, int op, int *p_anchor)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 /* Compile a forward reference for backpatching */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 int here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 here = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
732 anchor = *p_anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
733 *p_anchor = here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734 com_addint(c, anchor == 0 ? 0 : here - anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
735 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
736
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
738 com_backpatch(struct compiling *c, int anchor)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
740 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
741 int target = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742 int dist;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
743 int prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 /* Make the JUMP instruction at anchor point to target */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
746 prev = code[anchor] + (code[anchor+1] << 8);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
747 dist = target - (anchor+2);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
748 code[anchor] = dist & 0xff;
14147
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
749 dist >>= 8;
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
750 code[anchor+1] = dist;
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
751 dist >>= 8;
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
752 if (dist) {
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
753 com_error(c, PyExc_SystemError,
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
754 "com_backpatch: offset too large");
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
755 break;
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
756 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 if (!prev)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 anchor -= prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
760 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
762
544
d0baa8300005 Minor changes.
Guido van Rossum <guido@python.org>
parents: 493
diff changeset
763 /* Handle literals and names uniformly */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
764
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
766 com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 {
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
768 PyObject *w, *t, *np=NULL;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
769 long n;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
770
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
771 t = Py_BuildValue("(OO)", v, v->ob_type);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
772 if (t == NULL)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
773 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
774 w = PyDict_GetItem(dict, t);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
775 if (w != NULL) {
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
776 n = PyInt_AsLong(w);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
777 } else {
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
778 n = PyList_Size(list);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
779 np = PyInt_FromLong(n);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
780 if (np == NULL)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
781 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
782 if (PyList_Append(list, v) != 0)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
783 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
784 if (PyDict_SetItem(dict, t, np) != 0)
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
785 goto fail;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
786 Py_DECREF(np);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
787 }
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
788 Py_DECREF(t);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
789 return n;
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
790 fail:
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
791 Py_XDECREF(np);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
792 Py_XDECREF(t);
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
793 c->c_errors++;
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
794 return 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
798 com_addconst(struct compiling *c, PyObject *v)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
799 {
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
800 return com_add(c, c->c_consts, c->c_const_dict, v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
802
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
803 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
804 com_addname(struct compiling *c, PyObject *v)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 {
12522
0c28c9cabbda Charles G Waldman:
Guido van Rossum <guido@python.org>
parents: 12388
diff changeset
806 return com_add(c, c->c_names, c->c_name_dict, v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
807 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
808
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
809 static int
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
810 mangle(char *p, char *name, char *buffer, size_t maxlen)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
811 {
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
812 /* Name mangling: __private becomes _classname__private.
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
813 This is independent from how the name is used. */
13096
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
814 size_t nlen, plen;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
815 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
816 return 0;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
817 nlen = strlen(name);
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
818 if (nlen+2 >= maxlen)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
819 return 0; /* Don't mangle __extremely_long_names */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
820 if (name[nlen-1] == '_' && name[nlen-2] == '_')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
821 return 0; /* Don't mangle __whatever__ */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
822 /* Strip leading underscores from class name */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
823 while (*p == '_')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
824 p++;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
825 if (*p == '\0')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
826 return 0; /* Don't mangle if class is just underscores */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
827 plen = strlen(p);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
828 if (plen + nlen >= maxlen)
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
829 plen = maxlen-nlen-2; /* Truncate class name if too long */
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
830 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
831 buffer[0] = '_';
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
832 strncpy(buffer+1, p, plen);
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
833 strcpy(buffer+1+plen, name);
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
834 return 1;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
835 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
836
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
837 static void
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
838 com_addop_name(struct compiling *c, int op, char *name)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
840 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 int i;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
842 char buffer[MANGLE_LEN];
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
843
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
844 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
845 name = buffer;
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
846 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 i = com_addname(c, v);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
852 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
854 com_addoparg(c, op, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
855 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
856
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
857 #define NAME_LOCAL 0
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
858 #define NAME_GLOBAL 1
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
859 #define NAME_DEFAULT 2
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
860 #define NAME_CLOSURE 3
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
861
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
862 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
863 com_lookup_arg(PyObject *dict, PyObject *name)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
864 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
865 PyObject *v = PyDict_GetItem(dict, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
866 if (v == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
867 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
868 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
869 return PyInt_AS_LONG(v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
870 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
871
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
872 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
873 com_addop_varname(struct compiling *c, int kind, char *name)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
874 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
875 PyObject *v;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
876 int i, reftype;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
877 int scope = NAME_DEFAULT;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
878 int op = STOP_CODE;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
879 char buffer[MANGLE_LEN];
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
880
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
881 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
882 name = buffer;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
883 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
884 c->c_errors++;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
885 i = 255;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
886 goto done;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
887 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
888
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
889 reftype = get_ref_type(c, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
890 switch (reftype) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
891 case LOCAL:
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
892 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
893 scope = NAME_LOCAL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
894 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
895 case GLOBAL_EXPLICIT:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
896 scope = NAME_GLOBAL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
897 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
898 case GLOBAL_IMPLICIT:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
899 if (c->c_flags & CO_OPTIMIZED)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
900 scope = NAME_GLOBAL;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
901 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
902 case FREE:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
903 case CELL:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
904 scope = NAME_CLOSURE;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
905 break;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
906 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
907
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
908 i = com_addname(c, v);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
909 if (scope == NAME_LOCAL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
910 i = com_lookup_arg(c->c_locals, v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
911 else if (reftype == FREE)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
912 i = com_lookup_arg(c->c_freevars, v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
913 else if (reftype == CELL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
914 i = com_lookup_arg(c->c_cellvars, v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
915 if (i == -1) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
916 c->c_errors++; /* XXX no exception set */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
917 i = 255;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
918 goto done;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
919 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
920 Py_DECREF(v);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
921
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
922 switch (kind) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
923 case VAR_LOAD:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
924 switch (scope) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
925 case NAME_LOCAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
926 op = LOAD_FAST;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
927 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
928 case NAME_GLOBAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
929 op = LOAD_GLOBAL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
930 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
931 case NAME_DEFAULT:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
932 op = LOAD_NAME;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
933 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
934 case NAME_CLOSURE:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
935 op = LOAD_DEREF;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
936 break;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
937 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
938 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
939 case VAR_STORE:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
940 switch (scope) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
941 case NAME_LOCAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
942 op = STORE_FAST;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
943 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
944 case NAME_GLOBAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
945 op = STORE_GLOBAL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
946 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
947 case NAME_DEFAULT:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
948 op = STORE_NAME;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
949 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
950 case NAME_CLOSURE:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
951 op = STORE_DEREF;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
952 break;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
953 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
954 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
955 case VAR_DELETE:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
956 switch (scope) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
957 case NAME_LOCAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
958 op = DELETE_FAST;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
959 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
960 case NAME_GLOBAL:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
961 op = DELETE_GLOBAL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
962 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
963 case NAME_DEFAULT:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
964 op = DELETE_NAME;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
965 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
966 case NAME_CLOSURE: {
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
967 char buf[500];
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
968 sprintf(buf, DEL_CLOSURE_ERROR, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
969 com_error(c, PyExc_SyntaxError, buf);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
970 i = 255;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
971 break;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
972 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
973 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
974 break;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
975 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
976 done:
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 com_addoparg(c, op, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
980 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
981 com_addopname(struct compiling *c, int op, node *n)
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
982 {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
983 char *name;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
984 char buffer[1000];
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
985 /* XXX it is possible to write this code without the 1000
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
986 chars on the total length of dotted names, I just can't be
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
987 bothered right now */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
988 if (TYPE(n) == STAR)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
989 name = "*";
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
990 else if (TYPE(n) == dotted_name) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
991 char *p = buffer;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
992 int i;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
993 name = buffer;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
994 for (i = 0; i < NCH(n); i += 2) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
995 char *s = STR(CHILD(n, i));
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
996 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
997 com_error(c, PyExc_MemoryError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
998 "dotted_name too long");
2367
915fabec64a3 fix typo (== for =) in assignment
Guido van Rossum <guido@python.org>
parents: 2310
diff changeset
999 name = NULL;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1000 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1001 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1002 if (p != buffer)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1003 *p++ = '.';
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1004 strcpy(p, s);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1005 p = strchr(p, '\0');
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1006 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1007 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1008 else {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1009 REQ(n, NAME);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1010 name = STR(n);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1011 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1012 com_addop_name(c, op, name);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1013 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1014
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1015 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1016 parsenumber(struct compiling *co, char *s)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017 {
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
1018 char *end;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 long x;
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
1020 double dx;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1021 #ifndef WITHOUT_COMPLEX
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3366
diff changeset
1022 Py_complex c;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1023 int imflag;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1024 #endif
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1025
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1026 errno = 0;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
1027 end = s + strlen(s) - 1;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1028 #ifndef WITHOUT_COMPLEX
3366
c25865884649 only use 'j' for imaginary constants
Guido van Rossum <guido@python.org>
parents: 3349
diff changeset
1029 imflag = *end == 'j' || *end == 'J';
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1030 #endif
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
1031 if (*end == 'l' || *end == 'L')
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1032 return PyLong_FromString(s, (char **)0, 0);
617
755bb8efcc2d Use strtoul() for oct/hex constants.
Guido van Rossum <guido@python.org>
parents: 584
diff changeset
1033 if (s[0] == '0')
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1034 x = (long) PyOS_strtoul(s, &end, 0);
617
755bb8efcc2d Use strtoul() for oct/hex constants.
Guido van Rossum <guido@python.org>
parents: 584
diff changeset
1035 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1036 x = PyOS_strtol(s, &end, 0);
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1037 if (*end == '\0') {
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1038 if (errno != 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1039 com_error(co, PyExc_OverflowError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1040 "integer literal too large");
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1041 return NULL;
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1042 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1043 return PyInt_FromLong(x);
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
1044 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1045 /* XXX Huge floats may silently fail */
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1046 #ifndef WITHOUT_COMPLEX
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1047 if (imflag) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1048 c.real = 0.;
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
1049 PyFPE_START_PROTECT("atof", return 0)
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1050 c.imag = atof(s);
5197
74c12704a0bd New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents: 5183
diff changeset
1051 PyFPE_END_PROTECT(c)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1052 return PyComplex_FromCComplex(c);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1053 }
6453
c9b139b9c5ff Fixed for WITHOUT_COMPLEX compilation (Jack)
Guido van Rossum <guido@python.org>
parents: 6186
diff changeset
1054 else
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1055 #endif
6453
c9b139b9c5ff Fixed for WITHOUT_COMPLEX compilation (Jack)
Guido van Rossum <guido@python.org>
parents: 6186
diff changeset
1056 {
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
1057 PyFPE_START_PROTECT("atof", return 0)
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
1058 dx = atof(s);
5197
74c12704a0bd New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents: 5183
diff changeset
1059 PyFPE_END_PROTECT(dx)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1060 return PyFloat_FromDouble(dx);
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
1061 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1064 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1065 parsestr(char *s)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1066 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1067 PyObject *v;
13096
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
1068 size_t len;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069 char *buf;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1070 char *p;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1071 char *end;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 int c;
5264
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
1073 int first = *s;
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
1074 int quote = first;
11974
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1075 int rawmode = 0;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1076 int unicode = 0;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1077 if (isalpha(quote) || quote == '_') {
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1078 if (quote == 'u' || quote == 'U') {
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1079 quote = *++s;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1080 unicode = 1;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1081 }
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1082 if (quote == 'r' || quote == 'R') {
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1083 quote = *++s;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1084 rawmode = 1;
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1085 }
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1086 }
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1087 if (quote != '\'' && quote != '\"') {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1088 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 len = strlen(s);
13096
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
1093 if (len > INT_MAX) {
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
1094 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
1095 return NULL;
8c8de5b736dc Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
1096 }
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1097 if (s[--len] != quote) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1098 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1100 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1101 if (len >= 4 && s[0] == quote && s[1] == quote) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1102 s += 2;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1103 len -= 2;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1104 if (s[--len] != quote || s[--len] != quote) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1105 PyErr_BadInternalCall();
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1106 return NULL;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1107 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1108 }
12538
859e500f0760 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12522
diff changeset
1109 if (unicode || Py_UnicodeFlag) {
11974
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1110 if (rawmode)
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1111 return PyUnicode_DecodeRawUnicodeEscape(
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1112 s, len, NULL);
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1113 else
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1114 return PyUnicode_DecodeUnicodeEscape(
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1115 s, len, NULL);
28003afa1a2f Marc-Andre Lemburg: support for Unicode string literals (u"...", ur"...").
Guido van Rossum <guido@python.org>
parents: 11598
diff changeset
1116 }
14382
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1117 if (rawmode || strchr(s, '\\') == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1118 return PyString_FromStringAndSize(s, len);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1119 v = PyString_FromStringAndSize((char *)NULL, len);
14382
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1120 if (v == NULL)
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1121 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1122 p = buf = PyString_AsString(v);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1123 end = s + len;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1124 while (s < end) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 if (*s != '\\') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126 *p++ = *s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 continue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1129 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130 switch (*s++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131 /* XXX This assumes ASCII! */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1132 case '\n': break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1133 case '\\': *p++ = '\\'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1134 case '\'': *p++ = '\''; break;
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1135 case '\"': *p++ = '\"'; break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1136 case 'b': *p++ = '\b'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1137 case 'f': *p++ = '\014'; break; /* FF */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138 case 't': *p++ = '\t'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 case 'n': *p++ = '\n'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140 case 'r': *p++ = '\r'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1141 case 'v': *p++ = '\013'; break; /* VT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1142 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 case '0': case '1': case '2': case '3':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 case '4': case '5': case '6': case '7':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 c = s[-1] - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1146 if ('0' <= *s && *s <= '7') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148 if ('0' <= *s && *s <= '7')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151 *p++ = c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1153 case 'x':
14382
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1154 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
6501
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
1155 unsigned int x = 0;
14382
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1156 c = Py_CHARMASK(*s);
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1157 s++;
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1158 if (isdigit(c))
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1159 x = c - '0';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1160 else if (islower(c))
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1161 x = 10 + c - 'a';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1162 else
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1163 x = 10 + c - 'A';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1164 x = x << 4;
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1165 c = Py_CHARMASK(*s);
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1166 s++;
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1167 if (isdigit(c))
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1168 x += c - '0';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1169 else if (islower(c))
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1170 x += 10 + c - 'a';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1171 else
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1172 x += 10 + c - 'A';
6501
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
1173 *p++ = x;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1174 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175 }
14382
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1176 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1177 Py_DECREF(v);
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1178 return NULL;
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1179 default:
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1180 *p++ = '\\';
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1181 *p++ = s[-1];
2d6cf68aa64a changed \x to consume exactly two hex digits. implements PEP-223
Fredrik Lundh <fredrik@pythonware.com>
parents: 14375
diff changeset
1182 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1183 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1185 _PyString_Resize(&v, (int)(p - buf));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1186 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1187 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1188
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1189 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1190 parsestrplus(node *n)
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1191 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1192 PyObject *v;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1193 int i;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1194 REQ(CHILD(n, 0), STRING);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1195 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1196 /* String literal concatenation */
12388
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1197 for (i = 1; i < NCH(n); i++) {
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1198 PyObject *s;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1199 s = parsestr(STR(CHILD(n, i)));
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1200 if (s == NULL)
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1201 goto onError;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1202 if (PyString_Check(v) && PyString_Check(s)) {
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1203 PyString_ConcatAndDel(&v, s);
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1204 if (v == NULL)
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1205 goto onError;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1206 }
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1207 else {
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1208 PyObject *temp;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1209 temp = PyUnicode_Concat(v, s);
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1210 Py_DECREF(s);
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1211 if (temp == NULL)
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1212 goto onError;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1213 Py_DECREF(v);
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1214 v = temp;
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1215 }
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1216 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1217 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1218 return v;
12388
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1219
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1220 onError:
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1221 Py_XDECREF(v);
c48172af13dc M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents: 12333
diff changeset
1222 return NULL;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1223 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1224
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1225 static void
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1226 com_list_for(struct compiling *c, node *n, node *e, char *t)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1227 {
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1228 PyObject *v;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1229 int anchor = 0;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1230 int save_begin = c->c_begin;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1231
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1232 /* list_iter: for v in expr [list_iter] */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1233 com_node(c, CHILD(n, 3)); /* expr */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1234 v = PyInt_FromLong(0L);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1235 if (v == NULL)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1236 c->c_errors++;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1237 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1238 com_push(c, 1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1239 Py_XDECREF(v);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1240 c->c_begin = c->c_nexti;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1241 com_addoparg(c, SET_LINENO, n->n_lineno);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1242 com_addfwref(c, FOR_LOOP, &anchor);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1243 com_push(c, 1);
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1244 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1245 c->c_loops++;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1246 com_list_iter(c, n, e, t);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1247 c->c_loops--;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1248 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1249 c->c_begin = save_begin;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1250 com_backpatch(c, anchor);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1251 com_pop(c, 2); /* FOR_LOOP has popped these */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1252 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1253
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1254 static void
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1255 com_list_if(struct compiling *c, node *n, node *e, char *t)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1256 {
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1257 int anchor = 0;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1258 int a = 0;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1259 /* list_iter: 'if' test [list_iter] */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1260 com_addoparg(c, SET_LINENO, n->n_lineno);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1261 com_node(c, CHILD(n, 1));
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1262 com_addfwref(c, JUMP_IF_FALSE, &a);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1263 com_addbyte(c, POP_TOP);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1264 com_pop(c, 1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1265 com_list_iter(c, n, e, t);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1266 com_addfwref(c, JUMP_FORWARD, &anchor);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1267 com_backpatch(c, a);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1268 /* We jump here with an extra entry which we now pop */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1269 com_addbyte(c, POP_TOP);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1270 com_backpatch(c, anchor);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1271 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1272
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1273 static void
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1274 com_list_iter(struct compiling *c,
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1275 node *p, /* parent of list_iter node */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1276 node *e, /* element expression node */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1277 char *t /* name of result list temp local */)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1278 {
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1279 /* list_iter is the last child in a listmaker, list_for, or list_if */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1280 node *n = CHILD(p, NCH(p)-1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1281 if (TYPE(n) == list_iter) {
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1282 n = CHILD(n, 0);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1283 switch (TYPE(n)) {
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1284 case list_for:
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1285 com_list_for(c, n, e, t);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1286 break;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1287 case list_if:
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1288 com_list_if(c, n, e, t);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1289 break;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1290 default:
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1291 com_error(c, PyExc_SystemError,
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1292 "invalid list_iter node type");
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1293 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1294 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1295 else {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1296 com_addop_varname(c, VAR_LOAD, t);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1297 com_push(c, 1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1298 com_node(c, e);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1299 com_addoparg(c, CALL_FUNCTION, 1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1300 com_addbyte(c, POP_TOP);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1301 com_pop(c, 2);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1302 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1303 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1304
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1305 static void
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1306 com_list_comprehension(struct compiling *c, node *n)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1307 {
14117
ac8809959d01 require list comprehensions to start with a for clause
Skip Montanaro <skip@pobox.com>
parents: 14105
diff changeset
1308 /* listmaker: test list_for */
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1309 char tmpname[12];
16638
79568c0d3e77 Change temp names created by listcomps from [%d] to _[%d], so the one-liner
Tim Peters <tim.peters@gmail.com>
parents: 16571
diff changeset
1310 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1311 com_addoparg(c, BUILD_LIST, 0);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1312 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1313 com_push(c, 2);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1314 com_addop_name(c, LOAD_ATTR, "append");
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1315 com_addop_varname(c, VAR_STORE, tmpname);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1316 com_pop(c, 1);
14117
ac8809959d01 require list comprehensions to start with a for clause
Skip Montanaro <skip@pobox.com>
parents: 14105
diff changeset
1317 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1318 com_addop_varname(c, VAR_DELETE, tmpname);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1319 --c->c_tmpname;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1320 }
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1321
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1322 static void
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1323 com_listmaker(struct compiling *c, node *n)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1324 {
14117
ac8809959d01 require list comprehensions to start with a for clause
Skip Montanaro <skip@pobox.com>
parents: 14105
diff changeset
1325 /* listmaker: test ( list_for | (',' test)* [','] ) */
ac8809959d01 require list comprehensions to start with a for clause
Skip Montanaro <skip@pobox.com>
parents: 14105
diff changeset
1326 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1327 com_list_comprehension(c, n);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1328 else {
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1329 int len = 0;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1330 int i;
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1331 for (i = 0; i < NCH(n); i += 2, len++)
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1332 com_node(c, CHILD(n, i));
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1333 com_addoparg(c, BUILD_LIST, len);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1334 com_pop(c, len-1);
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1335 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1339 com_dictmaker(struct compiling *c, node *n)
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1340 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1341 int i;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1342 /* dictmaker: test ':' test (',' test ':' value)* [','] */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1343 for (i = 0; i+2 < NCH(n); i += 4) {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1344 /* We must arrange things just right for STORE_SUBSCR.
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1345 It wants the stack to look like (value) (dict) (key) */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1346 com_addbyte(c, DUP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1347 com_push(c, 1);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1348 com_node(c, CHILD(n, i+2)); /* value */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1349 com_addbyte(c, ROT_TWO);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1350 com_node(c, CHILD(n, i)); /* key */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1351 com_addbyte(c, STORE_SUBSCR);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1352 com_pop(c, 3);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1353 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1354 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1355
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1356 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1357 com_atom(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1359 node *ch;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1360 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1361 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362 REQ(n, atom);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363 ch = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364 switch (TYPE(ch)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1365 case LPAR:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1366 if (TYPE(CHILD(n, 1)) == RPAR) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1367 com_addoparg(c, BUILD_TUPLE, 0);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1368 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1369 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372 break;
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1373 case LSQB: /* '[' [listmaker] ']' */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1374 if (TYPE(CHILD(n, 1)) == RSQB) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375 com_addoparg(c, BUILD_LIST, 0);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1376 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1377 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378 else
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1379 com_listmaker(c, CHILD(n, 1));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1381 case LBRACE: /* '{' [dictmaker] '}' */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 com_addoparg(c, BUILD_MAP, 0);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1383 com_push(c, 1);
13936
25fd9846bd54 list comprehensions. see
Skip Montanaro <skip@pobox.com>
parents: 13930
diff changeset
1384 if (TYPE(CHILD(n, 1)) == dictmaker)
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1385 com_dictmaker(c, CHILD(n, 1));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1386 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387 case BACKQUOTE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1389 com_addbyte(c, UNARY_CONVERT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391 case NUMBER:
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1392 if ((v = parsenumber(c, STR(ch))) == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1394 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1395 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396 i = com_addconst(c, v);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1397 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1399 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1400 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1401 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1402 case STRING:
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1403 v = parsestrplus(n);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1404 if (v == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1405 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1406 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1409 i = com_addconst(c, v);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1410 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1411 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1413 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1414 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1415 case NAME:
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
1416 com_addop_varname(c, VAR_LOAD, STR(ch));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1417 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1418 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1419 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1420 com_error(c, PyExc_SystemError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1421 "com_atom: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1422 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1423 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1424
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1425 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1426 com_slice(struct compiling *c, node *n, int op)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1427 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1428 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1429 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1430 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1431 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1432 if (TYPE(CHILD(n, 0)) != COLON) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1433 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1434 com_addbyte(c, op+1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1435 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1436 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1437 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1438 com_addbyte(c, op+2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1439 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1440 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1441 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1442 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1443 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1444 com_node(c, CHILD(n, 2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1445 com_addbyte(c, op+3);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1446 com_pop(c, 2);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1447 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1448 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1449
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1450 static void
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1451 com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1452 {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1453 if (NCH(n) == 1) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1454 com_addbyte(c, DUP_TOP);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1455 com_push(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1456 com_addbyte(c, SLICE);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1457 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1458 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1459 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1460 com_addbyte(c, ROT_TWO);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1461 com_addbyte(c, STORE_SLICE);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1462 com_pop(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1463 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1464 com_node(c, CHILD(n, 0));
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1465 com_addoparg(c, DUP_TOPX, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1466 com_push(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1467 com_addbyte(c, SLICE+1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1468 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1469 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1470 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1471 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1472 com_addbyte(c, ROT_THREE);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1473 com_addbyte(c, STORE_SLICE+1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1474 com_pop(c, 3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1475 } else if (NCH(n) == 2) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1476 com_node(c, CHILD(n, 1));
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1477 com_addoparg(c, DUP_TOPX, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1478 com_push(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1479 com_addbyte(c, SLICE+2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1480 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1481 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1482 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1483 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1484 com_addbyte(c, ROT_THREE);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1485 com_addbyte(c, STORE_SLICE+2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1486 com_pop(c, 3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1487 } else {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1488 com_node(c, CHILD(n, 0));
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1489 com_node(c, CHILD(n, 2));
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1490 com_addoparg(c, DUP_TOPX, 3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1491 com_push(c, 3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1492 com_addbyte(c, SLICE+3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1493 com_pop(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1494 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1495 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1496 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1497 com_addbyte(c, ROT_FOUR);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1498 com_addbyte(c, STORE_SLICE+3);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1499 com_pop(c, 4);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1500 }
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1501 }
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1502
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1503 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1504 com_argument(struct compiling *c, node *n, PyObject **pkeywords)
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1505 {
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1506 node *m;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1507 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1508 if (NCH(n) == 1) {
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1509 if (*pkeywords != NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1510 com_error(c, PyExc_SyntaxError,
13993
716e1c4e3f78 When raising a SyntaxError, make a best-effort attempt to set the
Fred Drake <fdrake@acm.org>
parents: 13956
diff changeset
1511 "non-keyword arg after keyword arg");
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1512 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1513 else {
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1514 com_node(c, CHILD(n, 0));
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1515 }
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1516 return;
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1517 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1518 m = n;
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1519 do {
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1520 m = CHILD(m, 0);
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1521 } while (NCH(m) == 1);
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1522 if (TYPE(m) != NAME) {
16658
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1523 /* f(lambda x: x[0] = 3) ends up getting parsed with
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1524 * LHS test = lambda x: x[0], and RHS test = 3.
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1525 * SF bug 132313 points out that complaining about a keyword
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1526 * then is very confusing.
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1527 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1528 com_error(c, PyExc_SyntaxError,
16658
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1529 TYPE(m) == lambdef ?
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1530 "lambda cannot contain assignment" :
1a5a441772ff Bug #132313 error message confusing for assignment in lambda.
Tim Peters <tim.peters@gmail.com>
parents: 16638
diff changeset
1531 "keyword can't be an expression");
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1532 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1533 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1534 PyObject *v = PyString_InternFromString(STR(m));
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1535 if (v != NULL && *pkeywords == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1536 *pkeywords = PyDict_New();
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
1537 if (v == NULL)
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1538 c->c_errors++;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
1539 else if (*pkeywords == NULL) {
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
1540 c->c_errors++;
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
1541 Py_DECREF(v);
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
1542 } else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1543 if (PyDict_GetItem(*pkeywords, v) != NULL)
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1544 com_error(c, PyExc_SyntaxError,
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1545 "duplicate keyword argument");
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1546 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1547 if (PyDict_SetItem(*pkeywords, v, v) != 0)
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1548 c->c_errors++;
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1549 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1550 com_push(c, 1);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1551 Py_DECREF(v);
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1552 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1553 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1554 com_node(c, CHILD(n, 2));
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1555 }
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1556
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1558 com_call_function(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1559 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1560 if (TYPE(n) == RPAR) {
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1561 com_addoparg(c, CALL_FUNCTION, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1562 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1563 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1564 PyObject *keywords = NULL;
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1565 int i, na, nk;
9625
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1566 int lineno = n->n_lineno;
12082
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1567 int star_flag = 0;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1568 int starstar_flag = 0;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1569 int opcode;
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1570 REQ(n, arglist);
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1571 na = 0;
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1572 nk = 0;
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1573 for (i = 0; i < NCH(n); i += 2) {
9625
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1574 node *ch = CHILD(n, i);
12082
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1575 if (TYPE(ch) == STAR ||
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1576 TYPE(ch) == DOUBLESTAR)
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1577 break;
9625
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1578 if (ch->n_lineno != lineno) {
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1579 lineno = ch->n_lineno;
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1580 com_addoparg(c, SET_LINENO, lineno);
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1581 }
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1582 com_argument(c, ch, &keywords);
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1583 if (keywords == NULL)
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1584 na++;
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1585 else
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1586 nk++;
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1587 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1588 Py_XDECREF(keywords);
12082
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1589 while (i < NCH(n)) {
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1590 node *tok = CHILD(n, i);
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1591 node *ch = CHILD(n, i+1);
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1592 i += 3;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1593 switch (TYPE(tok)) {
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1594 case STAR: star_flag = 1; break;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1595 case DOUBLESTAR: starstar_flag = 1; break;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1596 }
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1597 com_node(c, ch);
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1598 }
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1599 if (na > 255 || nk > 255) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1600 com_error(c, PyExc_SyntaxError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1601 "more than 255 arguments");
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
1602 }
12082
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1603 if (star_flag || starstar_flag)
12086
96ea1a800b23 remove reference (vestigal) to CALL_FUNCTION_STAR
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12082
diff changeset
1604 opcode = CALL_FUNCTION_VAR - 1 +
12082
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1605 star_flag + (starstar_flag << 1);
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1606 else
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1607 opcode = CALL_FUNCTION;
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1608 com_addoparg(c, opcode, na | (nk << 8));
603db0d0aed1 slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11974
diff changeset
1609 com_pop(c, na + 2*nk + star_flag + starstar_flag);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1610 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1611 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1613 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1614 com_select_member(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1615 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1616 com_addopname(c, LOAD_ATTR, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1617 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1618
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1619 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1620 com_sliceobj(struct compiling *c, node *n)
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1621 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1622 int i=0;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1623 int ns=2; /* number of slice arguments */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1624 node *ch;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1625
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1626 /* first argument */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1627 if (TYPE(CHILD(n,i)) == COLON) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1628 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1629 com_push(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1630 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1631 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1632 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1633 com_node(c, CHILD(n,i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1634 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1635 REQ(CHILD(n,i),COLON);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1636 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1637 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1638 /* second argument */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1639 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1640 com_node(c, CHILD(n,i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1641 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1642 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1643 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1645 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1646 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1647 /* remaining arguments */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1648 for (; i < NCH(n); i++) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1649 ns++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1650 ch=CHILD(n,i);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1651 REQ(ch, sliceop);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1652 if (NCH(ch) == 1) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1653 /* right argument of ':' missing */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1654 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1655 com_push(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1656 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1657 else
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1658 com_node(c, CHILD(ch,1));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1659 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1660 com_addoparg(c, BUILD_SLICE, ns);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1661 com_pop(c, 1 + (ns == 3));
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1662 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1663
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1664 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1665 com_subscript(struct compiling *c, node *n)
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1666 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1667 node *ch;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1668 REQ(n, subscript);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1669 ch = CHILD(n,0);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1670 /* check for rubber index */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1671 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
4403
3b3f7c3f6da2 Ellipses -> Ellipsis rename (the dictionary really says that it should
Guido van Rossum <guido@python.org>
parents: 4315
diff changeset
1672 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1673 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1674 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1675 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1676 /* check for slice */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1677 if ((TYPE(ch) == COLON || NCH(n) > 1))
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1678 com_sliceobj(c, n);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1679 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1680 REQ(ch, test);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1681 com_node(c, ch);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1682 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1683 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1684 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1685
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1686 static void
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1687 com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1688 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1689 int i, op;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1690 REQ(n, subscriptlist);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1691 /* Check to make backward compatible slice behavior for '[i:j]' */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1692 if (NCH(n) == 1) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1693 node *sub = CHILD(n, 0); /* subscript */
13873
d014c8ab6a82 Fix some strange indentation and grammar that have been bugging me for
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1694 /* 'Basic' slice, should have exactly one colon. */
d014c8ab6a82 Fix some strange indentation and grammar that have been bugging me for
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1695 if ((TYPE(CHILD(sub, 0)) == COLON
d014c8ab6a82 Fix some strange indentation and grammar that have been bugging me for
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1696 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
d014c8ab6a82 Fix some strange indentation and grammar that have been bugging me for
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1697 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
d014c8ab6a82 Fix some strange indentation and grammar that have been bugging me for
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1698 {
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1699 switch (assigning) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1700 case OP_DELETE:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1701 op = DELETE_SLICE;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1702 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1703 case OP_ASSIGN:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1704 op = STORE_SLICE;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1705 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1706 case OP_APPLY:
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1707 op = SLICE;
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1708 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1709 default:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1710 com_augassign_slice(c, sub, assigning, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1711 return;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1712 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1713 com_slice(c, sub, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1714 if (op == STORE_SLICE)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1715 com_pop(c, 2);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1716 else if (op == DELETE_SLICE)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1717 com_pop(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1718 return;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1719 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1720 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1721 /* Else normal subscriptlist. Compile each subscript. */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1722 for (i = 0; i < NCH(n); i += 2)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1723 com_subscript(c, CHILD(n, i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1724 /* Put multiple subscripts into a tuple */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1725 if (NCH(n) > 1) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1726 i = (NCH(n)+1) / 2;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1727 com_addoparg(c, BUILD_TUPLE, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1728 com_pop(c, i-1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1729 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1730 switch (assigning) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1731 case OP_DELETE:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1732 op = DELETE_SUBSCR;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1733 i = 2;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1734 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1735 default:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1736 case OP_ASSIGN:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1737 op = STORE_SUBSCR;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1738 i = 3;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1739 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1740 case OP_APPLY:
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1741 op = BINARY_SUBSCR;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1742 i = 1;
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1743 break;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1744 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1745 if (assigning > OP_APPLY) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1746 com_addoparg(c, DUP_TOPX, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1747 com_push(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1748 com_addbyte(c, BINARY_SUBSCR);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1749 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1750 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1751 com_addbyte(c, assigning);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1752 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1753 com_addbyte(c, ROT_THREE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1754 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1755 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1756 com_pop(c, i);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1757 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1758
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1759 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1760 com_apply_trailer(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1761 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1762 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1763 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1764 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1765 com_call_function(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1766 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1767 case DOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1768 com_select_member(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1769 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1770 case LSQB:
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
1771 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1772 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1773 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1774 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1775 "com_apply_trailer: unknown trailer type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1776 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1777 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1778
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1779 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1780 com_power(struct compiling *c, node *n)
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1781 {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1782 int i;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1783 REQ(n, power);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1784 com_atom(c, CHILD(n, 0));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1785 for (i = 1; i < NCH(n); i++) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1786 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1787 com_factor(c, CHILD(n, i+1));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1788 com_addbyte(c, BINARY_POWER);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1789 com_pop(c, 1);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1790 break;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1791 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1792 else
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1793 com_apply_trailer(c, CHILD(n, i));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1794 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1795 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1796
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1797 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1798 com_factor(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1799 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1800 REQ(n, factor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1801 if (TYPE(CHILD(n, 0)) == PLUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1802 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1803 com_addbyte(c, UNARY_POSITIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1804 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1805 else if (TYPE(CHILD(n, 0)) == MINUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1806 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1807 com_addbyte(c, UNARY_NEGATIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1808 }
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1809 else if (TYPE(CHILD(n, 0)) == TILDE) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1810 com_factor(c, CHILD(n, 1));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1811 com_addbyte(c, UNARY_INVERT);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1812 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1813 else {
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1814 com_power(c, CHILD(n, 0));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1815 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1816 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1817
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1818 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1819 com_term(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1820 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1821 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1822 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1823 REQ(n, term);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1824 com_factor(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1825 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1826 com_factor(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1827 switch (TYPE(CHILD(n, i-1))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1828 case STAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1829 op = BINARY_MULTIPLY;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1830 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1831 case SLASH:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1832 op = BINARY_DIVIDE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1833 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1834 case PERCENT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1835 op = BINARY_MODULO;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1836 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1837 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1838 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1839 "com_term: operator not *, / or %");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1840 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1841 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1842 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1843 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1844 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1845 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1846
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1847 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1848 com_arith_expr(struct compiling *c, node *n)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1849 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1850 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1851 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1852 REQ(n, arith_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1853 com_term(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1854 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1855 com_term(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1856 switch (TYPE(CHILD(n, i-1))) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1857 case PLUS:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1858 op = BINARY_ADD;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1859 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1860 case MINUS:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1861 op = BINARY_SUBTRACT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1862 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1863 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1864 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1865 "com_arith_expr: operator not + or -");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1866 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1867 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1868 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1869 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1870 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1871 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1872
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1873 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1874 com_shift_expr(struct compiling *c, node *n)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1875 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1876 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1877 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1878 REQ(n, shift_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1879 com_arith_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1880 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1881 com_arith_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1882 switch (TYPE(CHILD(n, i-1))) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1883 case LEFTSHIFT:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1884 op = BINARY_LSHIFT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1885 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1886 case RIGHTSHIFT:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1887 op = BINARY_RSHIFT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1888 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1889 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1890 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1891 "com_shift_expr: operator not << or >>");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1892 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1893 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1894 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1895 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1896 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1897 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1898
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1899 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1900 com_and_expr(struct compiling *c, node *n)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1901 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1902 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1903 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1904 REQ(n, and_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1905 com_shift_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1906 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1907 com_shift_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1908 if (TYPE(CHILD(n, i-1)) == AMPER) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1909 op = BINARY_AND;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1910 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1911 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1912 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1913 "com_and_expr: operator not &");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1914 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1915 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1916 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1917 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1918 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1919 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1920
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1921 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1922 com_xor_expr(struct compiling *c, node *n)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1923 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1924 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1925 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1926 REQ(n, xor_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1927 com_and_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1928 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1929 com_and_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1930 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1931 op = BINARY_XOR;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1932 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1933 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1934 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1935 "com_xor_expr: operator not ^");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1936 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1937 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1938 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1939 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1940 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1941 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1942
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1943 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1944 com_expr(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1945 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1946 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1947 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1948 REQ(n, expr);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1949 com_xor_expr(c, CHILD(n, 0));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1950 for (i = 2; i < NCH(n); i += 2) {
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1951 com_xor_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1952 if (TYPE(CHILD(n, i-1)) == VBAR) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1953 op = BINARY_OR;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1954 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1955 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1956 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1957 "com_expr: expr operator not |");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1958 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1959 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1960 com_addbyte(c, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1961 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1962 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1963 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1964
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1965 static enum cmp_op
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1966 cmp_type(node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1967 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1968 REQ(n, comp_op);
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1969 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1970 | 'in' | 'not' 'in' | 'is' | 'is' not' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1971 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1972 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1973 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1974 case LESS: return LT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1975 case GREATER: return GT;
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1976 case EQEQUAL: /* == */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1977 case EQUAL: return EQ;
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1978 case LESSEQUAL: return LE;
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1979 case GREATEREQUAL: return GE;
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1980 case NOTEQUAL: return NE; /* <> or != */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1981 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1982 if (strcmp(STR(n), "is") == 0) return IS;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1983 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1984 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1985 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1986 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1987 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1988 return NOT_IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1989 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1990 return IS_NOT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1991 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1992 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1993 return BAD;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1994 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1995
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1996 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
1997 com_comparison(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1998 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1999 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2000 enum cmp_op op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2001 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2002 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2003 com_expr(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2004 if (NCH(n) == 1)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2005 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2006
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2007 /****************************************************************
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2008 The following code is generated for all but the last
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2009 comparison in a chain:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2010
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2011 label: on stack: opcode: jump to:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2012
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2013 a <code to load b>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2014 a, b DUP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2015 a, b, b ROT_THREE
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2016 b, a, b COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2017 b, 0-or-1 JUMP_IF_FALSE L1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2018 b, 1 POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2019 b
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2020
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2021 We are now ready to repeat this sequence for the next
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2022 comparison in the chain.
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2023
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2024 For the last we generate:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2025
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2026 b <code to load c>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2027 b, c COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2028 0-or-1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2029
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2030 If there were any jumps to L1 (i.e., there was more than one
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2031 comparison), we generate:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2032
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2033 0-or-1 JUMP_FORWARD L2
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2034 L1: b, 0 ROT_TWO
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2035 0, b POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2036 0
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2037 L2: 0-or-1
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2038 ****************************************************************/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2039
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2040 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2041
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2042 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2043 com_expr(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2044 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2045 com_addbyte(c, DUP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2046 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2047 com_addbyte(c, ROT_THREE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2048 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2049 op = cmp_type(CHILD(n, i-1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2050 if (op == BAD) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2051 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2052 "com_comparison: unknown comparison op");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2053 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2054 com_addoparg(c, COMPARE_OP, op);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2055 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2056 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2057 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2058 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2059 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2060 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2061 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2062
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2063 if (anchor) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2064 int anchor2 = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2065 com_addfwref(c, JUMP_FORWARD, &anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2066 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2067 com_addbyte(c, ROT_TWO);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2068 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2069 com_backpatch(c, anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2070 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2071 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2072
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2073 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2074 com_not_test(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2075 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2076 REQ(n, not_test); /* 'not' not_test | comparison */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2077 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2078 com_comparison(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2079 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2080 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2081 com_not_test(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2082 com_addbyte(c, UNARY_NOT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2083 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2084 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2085
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2086 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2087 com_and_test(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2088 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2089 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2090 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2091 REQ(n, and_test); /* not_test ('and' not_test)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2092 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2093 i = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2094 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2095 com_not_test(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2096 if ((i += 2) >= NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2097 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2098 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2099 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2100 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2101 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2102 if (anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2103 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2104 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2105
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2106 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2107 com_make_closure(struct compiling *c, PyCodeObject *co)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2108 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2109 int i, free = PyTuple_GET_SIZE(co->co_freevars);
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
2110 /* If the code is compiled with st->st_nested_scopes == 0,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
2111 then no variable will ever be added to co_freevars.
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
2112 */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2113 if (free == 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2114 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2115 for (i = 0; i < free; ++i) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2116 /* Bypass com_addop_varname because it will generate
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2117 LOAD_DEREF but LOAD_CLOSURE is needed.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2118 */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2119 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2120 int arg, reftype;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2121
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2122 /* Special case: If a class contains a method with a
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2123 free variable that has the same name as a method,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2124 the name will be considered free *and* local in the
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2125 class. It should be handled by the closure, as
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2126 well as by the normal name loookup logic.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2127 */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2128 reftype = get_ref_type(c, PyString_AS_STRING(name));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2129 if (reftype == CELL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2130 arg = com_lookup_arg(c->c_cellvars, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2131 else /* (reftype == FREE) */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2132 arg = com_lookup_arg(c->c_freevars, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2133 if (arg == -1) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2134 fprintf(stderr, "lookup %s in %s %d %d\n",
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
2135 PyObject_REPR(name), c->c_name, reftype, arg);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2136 Py_FatalError("com_make_closure()");
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2137 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2138 com_addoparg(c, LOAD_CLOSURE, arg);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2139
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2140 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2141 com_push(c, free);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2142 return 1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2143 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2144
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2145 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2146 com_test(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2147 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2148 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2149 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2150 PyObject *co;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2151 int i, closure;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2152 int ndefs = com_argdefs(c, CHILD(n, 0));
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
2153 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
2154 n->n_lineno);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2155 co = (PyObject *) icompile(CHILD(n, 0), c);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2156 if (co == NULL) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2157 c->c_errors++;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2158 return;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2159 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2160 symtable_exit_scope(c->c_symtable);
16763
2f585cbe71da Shuffle premature decref; nuke unreachable code block.
Tim Peters <tim.peters@gmail.com>
parents: 16754
diff changeset
2161 i = com_addconst(c, co);
2f585cbe71da Shuffle premature decref; nuke unreachable code block.
Tim Peters <tim.peters@gmail.com>
parents: 16754
diff changeset
2162 closure = com_make_closure(c, (PyCodeObject *)co);
2f585cbe71da Shuffle premature decref; nuke unreachable code block.
Tim Peters <tim.peters@gmail.com>
parents: 16754
diff changeset
2163 Py_DECREF(co);
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2164 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2165 com_push(c, 1);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2166 if (closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2167 com_addoparg(c, MAKE_CLOSURE, ndefs);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2168 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2169 com_addoparg(c, MAKE_FUNCTION, ndefs);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2170 com_pop(c, ndefs);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2171 }
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2172 else {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2173 int anchor = 0;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2174 int i = 0;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2175 for (;;) {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2176 com_and_test(c, CHILD(n, i));
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2177 if ((i += 2) >= NCH(n))
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2178 break;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2179 com_addfwref(c, JUMP_IF_TRUE, &anchor);
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2180 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2181 com_pop(c, 1);
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2182 }
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2183 if (anchor)
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2184 com_backpatch(c, anchor);
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2185 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2186 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2187
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2188 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2189 com_list(struct compiling *c, node *n, int toplevel)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2190 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2191 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
2192 if (NCH(n) == 1 && !toplevel) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2193 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2194 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2195 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2196 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2197 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2198 len = (NCH(n) + 1) / 2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2199 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2200 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2201 com_addoparg(c, BUILD_TUPLE, len);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2202 com_pop(c, len-1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2203 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2204 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2205
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2206
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2207 /* Begin of assignment compilation */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2208
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2209
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2210 static void
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2211 com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2212 {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2213 com_addbyte(c, DUP_TOP);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2214 com_push(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2215 com_addopname(c, LOAD_ATTR, n);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2216 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2217 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2218 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2219 com_addbyte(c, ROT_TWO);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2220 com_addopname(c, STORE_ATTR, n);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2221 com_pop(c, 2);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2222 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2223
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2224 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2225 com_assign_attr(struct compiling *c, node *n, int assigning)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2226 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2227 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2228 com_pop(c, assigning ? 2 : 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2229 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2230
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2231 static void
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2232 com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2233 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2234 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2235 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2236 case LPAR: /* '(' [exprlist] ')' */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2237 com_error(c, PyExc_SyntaxError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2238 "can't assign to function call");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2239 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2240 case DOT: /* '.' NAME */
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2241 if (assigning > OP_APPLY)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2242 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2243 else
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2244 com_assign_attr(c, CHILD(n, 1), assigning);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2245 break;
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
2246 case LSQB: /* '[' subscriptlist ']' */
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2247 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2248 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2249 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2250 com_error(c, PyExc_SystemError, "unknown trailer type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2251 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2252 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2253
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2254 static void
13930
4eaa463c031a Merge UNPACK_LIST and UNPACK_TUPLE into a single UNPACK_SEQUENCE, since they
Thomas Wouters <thomas@python.org>
parents: 13884
diff changeset
2255 com_assign_sequence(struct compiling *c, node *n, int assigning)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2256 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2257 int i;
14178
dff22d4a48da Fix allowable node-types for assignment, need to add 'listmaker'.
Thomas Wouters <thomas@python.org>
parents: 14163
diff changeset
2258 if (TYPE(n) != testlist && TYPE(n) != listmaker)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2259 REQ(n, exprlist);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2260 if (assigning) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2261 i = (NCH(n)+1)/2;
13930
4eaa463c031a Merge UNPACK_LIST and UNPACK_TUPLE into a single UNPACK_SEQUENCE, since they
Thomas Wouters <thomas@python.org>
parents: 13884
diff changeset
2262 com_addoparg(c, UNPACK_SEQUENCE, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2263 com_push(c, i-1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2264 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2265 for (i = 0; i < NCH(n); i += 2)
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2266 com_assign(c, CHILD(n, i), assigning, NULL);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2267 }
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2268
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2269 static void
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2270 com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2271 {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2272 REQ(n, NAME);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2273 com_addop_varname(c, VAR_LOAD, STR(n));
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2274 com_push(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2275 com_node(c, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2276 com_addbyte(c, opcode);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2277 com_pop(c, 1);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2278 com_assign_name(c, n, OP_ASSIGN);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2279 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2280
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2281 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2282 com_assign_name(struct compiling *c, node *n, int assigning)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2283 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2284 REQ(n, NAME);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2285 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2286 if (assigning)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2287 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2288 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2289
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2290 static void
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2291 com_assign(struct compiling *c, node *n, int assigning, node *augn)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2292 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2293 /* Loop to avoid trivial recursion */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2294 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2295 switch (TYPE(n)) {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2296
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2297 case exprlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2298 case testlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2299 if (NCH(n) > 1) {
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2300 if (assigning > OP_APPLY) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2301 com_error(c, PyExc_SyntaxError,
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
2302 "augmented assign to tuple not possible");
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2303 return;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2304 }
13930
4eaa463c031a Merge UNPACK_LIST and UNPACK_TUPLE into a single UNPACK_SEQUENCE, since they
Thomas Wouters <thomas@python.org>
parents: 13884
diff changeset
2305 com_assign_sequence(c, n, assigning);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2306 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2307 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2308 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2309 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2310
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2311 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2312 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2313 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2314 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2315 case expr:
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2316 case xor_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2317 case and_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2318 case shift_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2319 case arith_expr:
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2320 case term:
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2321 case factor:
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2322 if (NCH(n) > 1) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2323 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2324 "can't assign to operator");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2325 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2326 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2327 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2328 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2329
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2330 case power: /* atom trailer* ('**' power)*
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
2331 ('+'|'-'|'~') factor | atom trailer* */
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2332 if (TYPE(CHILD(n, 0)) != atom) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2333 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2334 "can't assign to operator");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2335 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2336 }
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2337 if (NCH(n) > 1) { /* trailer or exponent present */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2338 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2339 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2340 for (i = 1; i+1 < NCH(n); i++) {
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2341 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2342 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2343 "can't assign to operator");
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2344 return;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2345 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2346 com_apply_trailer(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2347 } /* NB i is still alive */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2348 com_assign_trailer(c,
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2349 CHILD(n, i), assigning, augn);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2350 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2351 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2352 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2353 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2354
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2355 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2356 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2357 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2358 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2359 if (TYPE(n) == RPAR) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2360 /* XXX Should allow () = () ??? */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2361 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2362 "can't assign to ()");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2363 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2364 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2365 if (assigning > OP_APPLY) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2366 com_error(c, PyExc_SyntaxError,
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2367 "augmented assign to tuple not possible");
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2368 return;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2369 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2370 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2371 case LSQB:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2372 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2373 if (TYPE(n) == RSQB) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2374 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2375 "can't assign to []");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2376 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2377 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2378 if (assigning > OP_APPLY) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2379 com_error(c, PyExc_SyntaxError,
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2380 "augmented assign to list not possible");
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2381 return;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2382 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2383 if (NCH(n) > 1
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2384 && TYPE(CHILD(n, 1)) == list_for) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2385 com_error(c, PyExc_SyntaxError,
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
2386 "can't assign to list comprehension");
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2387 return;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2388 }
13930
4eaa463c031a Merge UNPACK_LIST and UNPACK_TUPLE into a single UNPACK_SEQUENCE, since they
Thomas Wouters <thomas@python.org>
parents: 13884
diff changeset
2389 com_assign_sequence(c, n, assigning);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2390 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2391 case NAME:
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2392 if (assigning > OP_APPLY)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2393 com_augassign_name(c, CHILD(n, 0),
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2394 assigning, augn);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2395 else
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2396 com_assign_name(c, CHILD(n, 0),
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2397 assigning);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2398 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2399 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2400 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2401 "can't assign to literal");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2402 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2403 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2404 break;
3963
00722990b80c Removed unused var; added error check for ``lambda: x=1''.
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
2405
00722990b80c Removed unused var; added error check for ``lambda: x=1''.
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
2406 case lambdef:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2407 com_error(c, PyExc_SyntaxError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2408 "can't assign to lambda");
3963
00722990b80c Removed unused var; added error check for ``lambda: x=1''.
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
2409 return;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2410
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2411 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2412 com_error(c, PyExc_SystemError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2413 "com_assign: bad node");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2414 return;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2415
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2416 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2417 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2418 }
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2419
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2420 static void
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2421 com_augassign(struct compiling *c, node *n)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2422 {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2423 int opcode;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2424
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2425 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2426 case '+': opcode = INPLACE_ADD; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2427 case '-': opcode = INPLACE_SUBTRACT; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2428 case '/': opcode = INPLACE_DIVIDE; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2429 case '%': opcode = INPLACE_MODULO; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2430 case '<': opcode = INPLACE_LSHIFT; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2431 case '>': opcode = INPLACE_RSHIFT; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2432 case '&': opcode = INPLACE_AND; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2433 case '^': opcode = INPLACE_XOR; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2434 case '|': opcode = INPLACE_OR; break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2435 case '*':
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2436 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2437 opcode = INPLACE_POWER;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2438 else
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2439 opcode = INPLACE_MULTIPLY;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2440 break;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2441 default:
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2442 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2443 return;
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2444 }
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2445 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2446 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2447
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2448 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2449 com_expr_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2450 {
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2451 REQ(n, expr_stmt);
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2452 /* testlist (('=' testlist)* | augassign testlist) */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2453 /* Forget it if we have just a doc string here */
5264
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
2454 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2455 return;
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2456 if (NCH(n) == 1) {
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2457 com_node(c, CHILD(n, NCH(n)-1));
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2458 if (c->c_interactive)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2459 com_addbyte(c, PRINT_EXPR);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2460 else
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2461 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2462 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2463 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2464 else if (TYPE(CHILD(n,1)) == augassign)
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2465 com_augassign(c, n);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2466 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2467 int i;
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2468 com_node(c, CHILD(n, NCH(n)-1));
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2469 for (i = 0; i < NCH(n)-2; i+=2) {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2470 if (i+2 < NCH(n)-2) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2471 com_addbyte(c, DUP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2472 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2473 }
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2474 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2475 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2476 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2477 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2478
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2479 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2480 com_assert_stmt(struct compiling *c, node *n)
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2481 {
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2482 int a = 0, b = 0;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2483 int i;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2484 REQ(n, assert_stmt); /* 'assert' test [',' test] */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2485 /* Generate code like for
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2486
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2487 if __debug__:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2488 if not <test>:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2489 raise AssertionError [, <message>]
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2490
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2491 where <message> is the second test, if present.
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2492 */
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2493
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2494 if (Py_OptimizeFlag)
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2495 return;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2496 com_addop_name(c, LOAD_GLOBAL, "__debug__");
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2497 com_push(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2498 com_addfwref(c, JUMP_IF_FALSE, &a);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2499 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2500 com_pop(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2501 com_node(c, CHILD(n, 1));
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2502 com_addfwref(c, JUMP_IF_TRUE, &b);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2503 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2504 com_pop(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2505 /* Raise that exception! */
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2506 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2507 com_push(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2508 i = NCH(n)/2; /* Either 2 or 4 */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2509 if (i > 1)
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2510 com_node(c, CHILD(n, 3));
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2511 com_addoparg(c, RAISE_VARARGS, i);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2512 com_pop(c, i);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2513 /* The interpreter does not fall through */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2514 /* All jumps converge here */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2515 com_backpatch(c, a);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2516 com_backpatch(c, b);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2517 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2518 }
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2519
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2520 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2521 com_print_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2522 {
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2523 int i = 1;
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2524 node* stream = NULL;
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2525
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2526 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2527
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2528 /* are we using the extended print form? */
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2529 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2530 stream = CHILD(n, 2);
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2531 com_node(c, stream);
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2532 /* stack: [...] => [... stream] */
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2533 com_push(c, 1);
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2534 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2535 i = 4;
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2536 else
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2537 i = 3;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2538 }
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2539 for (; i < NCH(n); i += 2) {
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2540 if (stream != NULL) {
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2541 com_addbyte(c, DUP_TOP);
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2542 /* stack: [stream] => [stream stream] */
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2543 com_push(c, 1);
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2544 com_node(c, CHILD(n, i));
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2545 /* stack: [stream stream] => [stream stream obj] */
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2546 com_addbyte(c, ROT_TWO);
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2547 /* stack: [stream stream obj] => [stream obj stream] */
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2548 com_addbyte(c, PRINT_ITEM_TO);
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2549 /* stack: [stream obj stream] => [stream] */
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2550 com_pop(c, 2);
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2551 }
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2552 else {
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2553 com_node(c, CHILD(n, i));
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2554 /* stack: [...] => [... obj] */
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2555 com_addbyte(c, PRINT_ITEM);
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2556 com_pop(c, 1);
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2557 }
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2558 }
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2559 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2560 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2561 if (stream != NULL) {
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2562 /* must pop the extra stream object off the stack */
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2563 com_addbyte(c, POP_TOP);
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2564 /* stack: [... stream] => [...] */
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2565 com_pop(c, 1);
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2566 }
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2567 }
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2568 else {
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2569 if (stream != NULL) {
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2570 /* this consumes the last stream object on stack */
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2571 com_addbyte(c, PRINT_NEWLINE_TO);
14105
d809b9b75b99 com_print_stmt(): Guido rightly points out that the stream expression
Barry Warsaw <barry@python.org>
parents: 14099
diff changeset
2572 /* stack: [... stream] => [...] */
14099
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2573 com_pop(c, 1);
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2574 }
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2575 else
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2576 com_addbyte(c, PRINT_NEWLINE);
468481135c49 PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents: 14077
diff changeset
2577 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2578 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2579
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2580 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2581 com_return_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2582 {
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2583 REQ(n, return_stmt); /* 'return' [testlist] */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2584 if (!c->c_infunction) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2585 com_error(c, PyExc_SyntaxError, "'return' outside function");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2586 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2587 if (NCH(n) < 2) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2588 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2589 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2590 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2591 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2592 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2593 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2594 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2595 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2596
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2597 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2598 com_raise_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2599 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2600 int i;
7946
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2601 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2602 if (NCH(n) > 1) {
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2603 com_node(c, CHILD(n, 1));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2604 if (NCH(n) > 3) {
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2605 com_node(c, CHILD(n, 3));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2606 if (NCH(n) > 5)
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2607 com_node(c, CHILD(n, 5));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2608 }
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
2609 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2610 i = NCH(n)/2;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2611 com_addoparg(c, RAISE_VARARGS, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2612 com_pop(c, i);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2613 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2614
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2615 static void
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2616 com_from_import(struct compiling *c, node *n)
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2617 {
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2618 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2619 com_push(c, 1);
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2620 if (NCH(n) > 1) {
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2621 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2622 com_error(c, PyExc_SyntaxError, "invalid syntax");
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2623 return;
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2624 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2625 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2626 } else
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2627 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2628 com_pop(c, 1);
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2629 }
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2630
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2631 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2632 com_import_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2633 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2634 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2635 REQ(n, import_stmt);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2636 /* 'import' dotted_name (',' dotted_name)* |
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2637 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2638 if (STR(CHILD(n, 0))[0] == 'f') {
15438
433458651eb4 Plug a memory leak in com_import_stmt(): the tuple created to hold the
Guido van Rossum <guido@python.org>
parents: 15408
diff changeset
2639 PyObject *tup;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2640 /* 'from' dotted_name 'import' ... */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2641 REQ(CHILD(n, 1), dotted_name);
14232
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2642
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2643 if (TYPE(CHILD(n, 3)) == STAR) {
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2644 tup = Py_BuildValue("(s)", "*");
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2645 } else {
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2646 tup = PyTuple_New((NCH(n) - 2)/2);
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2647 for (i = 3; i < NCH(n); i += 2) {
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2648 PyTuple_SET_ITEM(tup, (i-3)/2,
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2649 PyString_FromString(STR(
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2650 CHILD(CHILD(n, i), 0))));
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2651 }
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2652 }
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2653 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
15438
433458651eb4 Plug a memory leak in com_import_stmt(): the tuple created to hold the
Guido van Rossum <guido@python.org>
parents: 15408
diff changeset
2654 Py_DECREF(tup);
14232
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2655 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2656 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2657 if (TYPE(CHILD(n, 3)) == STAR)
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2658 com_addbyte(c, IMPORT_STAR);
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2659 else {
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2660 for (i = 3; i < NCH(n); i += 2)
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2661 com_from_import(c, CHILD(n, i));
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2662 com_addbyte(c, POP_TOP);
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2663 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2664 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2665 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2666 else {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2667 /* 'import' ... */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2668 for (i = 1; i < NCH(n); i += 2) {
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2669 node *subn = CHILD(n, i);
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2670 REQ(subn, dotted_as_name);
14232
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2671 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
1f1a156ed5af Replace the run-time 'future-bytecode-stream-inspection' hack to find out
Thomas Wouters <thomas@python.org>
parents: 14230
diff changeset
2672 com_push(c, 1);
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2673 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2674 if (NCH(subn) > 1) {
14230
31925ab46b23 Re-allow 'import mod.submod as s', and change its meaning to what it should
Thomas Wouters <thomas@python.org>
parents: 14226
diff changeset
2675 int j;
31925ab46b23 Re-allow 'import mod.submod as s', and change its meaning to what it should
Thomas Wouters <thomas@python.org>
parents: 14226
diff changeset
2676 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2677 com_error(c, PyExc_SyntaxError,
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2678 "invalid syntax");
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2679 return;
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2680 }
14230
31925ab46b23 Re-allow 'import mod.submod as s', and change its meaning to what it should
Thomas Wouters <thomas@python.org>
parents: 14226
diff changeset
2681 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
31925ab46b23 Re-allow 'import mod.submod as s', and change its meaning to what it should
Thomas Wouters <thomas@python.org>
parents: 14226
diff changeset
2682 com_addopname(c, LOAD_ATTR,
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2683 CHILD(CHILD(subn, 0),
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2684 j));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2685 com_addop_varname(c, VAR_STORE,
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2686 STR(CHILD(subn, 2)));
14038
18385172fac0 Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents: 13997
diff changeset
2687 } else
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2688 com_addop_varname(c, VAR_STORE,
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2689 STR(CHILD(CHILD(subn, 0),
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2690 0)));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2691 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2692 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2693 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2694 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2695
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2696 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2697 com_exec_stmt(struct compiling *c, node *n)
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2698 {
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2699 REQ(n, exec_stmt);
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2700 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2701 com_node(c, CHILD(n, 1));
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2702 if (NCH(n) >= 4)
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2703 com_node(c, CHILD(n, 3));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2704 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2705 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2706 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2707 }
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2708 if (NCH(n) >= 6)
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2709 com_node(c, CHILD(n, 5));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2710 else {
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2711 com_addbyte(c, DUP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2712 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2713 }
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2714 com_addbyte(c, EXEC_STMT);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2715 com_pop(c, 3);
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2716 }
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2717
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2718 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2719 is_constant_false(struct compiling *c, node *n)
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2720 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2721 PyObject *v;
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2722 int i;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
2723 /* argument c will be NULL when called from symtable_node() */
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2724
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2725 /* Label to avoid tail recursion */
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2726 next:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2727 switch (TYPE(n)) {
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2728
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2729 case suite:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2730 if (NCH(n) == 1) {
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2731 n = CHILD(n, 0);
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2732 goto next;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2733 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2734 /* Fall through */
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2735 case file_input:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2736 for (i = 0; i < NCH(n); i++) {
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2737 node *ch = CHILD(n, i);
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2738 if (TYPE(ch) == stmt) {
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2739 n = ch;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2740 goto next;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2741 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2742 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2743 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2744
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2745 case stmt:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2746 case simple_stmt:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2747 case small_stmt:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2748 n = CHILD(n, 0);
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2749 goto next;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2750
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2751 case expr_stmt:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2752 case testlist:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2753 case test:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2754 case and_test:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2755 case not_test:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2756 case comparison:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2757 case expr:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2758 case xor_expr:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2759 case and_expr:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2760 case shift_expr:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2761 case arith_expr:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2762 case term:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2763 case factor:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2764 case power:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2765 case atom:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2766 if (NCH(n) == 1) {
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2767 n = CHILD(n, 0);
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2768 goto next;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2769 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2770 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2771
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2772 case NAME:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2773 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2774 return 1;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2775 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2776
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2777 case NUMBER:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2778 v = parsenumber(c, STR(n));
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2779 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2780 PyErr_Clear();
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2781 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2782 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2783 i = PyObject_IsTrue(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2784 Py_DECREF(v);
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2785 return i == 0;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2786
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2787 case STRING:
5183
636757e812a4 Fix dumb bug calling parsestrplus with wrong node as argument.
Guido van Rossum <guido@python.org>
parents: 5181
diff changeset
2788 v = parsestr(STR(n));
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2789 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2790 PyErr_Clear();
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2791 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2792 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2793 i = PyObject_IsTrue(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2794 Py_DECREF(v);
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2795 return i == 0;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2796
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2797 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2798 return 0;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2799 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2800
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2801 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2802 com_if_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2803 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2804 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2805 int anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2806 REQ(n, if_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2807 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2808 for (i = 0; i+3 < NCH(n); i+=4) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2809 int a = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2810 node *ch = CHILD(n, i+1);
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2811 if (is_constant_false(c, ch))
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2812 continue;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2813 if (i > 0)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2814 com_addoparg(c, SET_LINENO, ch->n_lineno);
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2815 com_node(c, ch);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2816 com_addfwref(c, JUMP_IF_FALSE, &a);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2817 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2818 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2819 com_node(c, CHILD(n, i+3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2820 com_addfwref(c, JUMP_FORWARD, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2821 com_backpatch(c, a);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2822 /* We jump here with an extra entry which we now pop */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2823 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2824 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2825 if (i+2 < NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2826 com_node(c, CHILD(n, i+2));
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2827 if (anchor)
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2828 com_backpatch(c, anchor);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2829 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2830
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2831 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2832 com_while_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2833 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2834 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2835 int anchor = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2836 int save_begin = c->c_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2837 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2838 com_addfwref(c, SETUP_LOOP, &break_anchor);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2839 block_push(c, SETUP_LOOP);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2840 c->c_begin = c->c_nexti;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2841 com_addoparg(c, SET_LINENO, n->n_lineno);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2842 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2843 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2844 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2845 com_pop(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2846 c->c_loops++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2847 com_node(c, CHILD(n, 3));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2848 c->c_loops--;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2849 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2850 c->c_begin = save_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2851 com_backpatch(c, anchor);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2852 /* We jump here with one entry more on the stack */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2853 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2854 com_addbyte(c, POP_BLOCK);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2855 block_pop(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2856 if (NCH(n) > 4)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2857 com_node(c, CHILD(n, 6));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2858 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2859 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2860
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2861 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2862 com_for_stmt(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2863 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2864 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2865 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2866 int anchor = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2867 int save_begin = c->c_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2868 REQ(n, for_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2869 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2870 com_addfwref(c, SETUP_LOOP, &break_anchor);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2871 block_push(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2872 com_node(c, CHILD(n, 3));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2873 v = PyInt_FromLong(0L);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2874 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2875 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2876 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2877 com_push(c, 1);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2878 Py_XDECREF(v);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2879 c->c_begin = c->c_nexti;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2880 com_addoparg(c, SET_LINENO, n->n_lineno);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2881 com_addfwref(c, FOR_LOOP, &anchor);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2882 com_push(c, 1);
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
2883 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2884 c->c_loops++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2885 com_node(c, CHILD(n, 5));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2886 c->c_loops--;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2887 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2888 c->c_begin = save_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2889 com_backpatch(c, anchor);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2890 com_pop(c, 2); /* FOR_LOOP has popped these */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2891 com_addbyte(c, POP_BLOCK);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2892 block_pop(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2893 if (NCH(n) > 8)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2894 com_node(c, CHILD(n, 8));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2895 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2896 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2897
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2898 /* Code generated for "try: S finally: Sf" is as follows:
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2899
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2900 SETUP_FINALLY L
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2901 <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2902 POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2903 LOAD_CONST <nil>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2904 L: <code for Sf>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2905 END_FINALLY
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2906
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2907 The special instructions use the block stack. Each block
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2908 stack entry contains the instruction that created it (here
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2909 SETUP_FINALLY), the level of the value stack at the time the
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2910 block stack entry was created, and a label (here L).
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2911
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2912 SETUP_FINALLY:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2913 Pushes the current value stack level and the label
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2914 onto the block stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2915 POP_BLOCK:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2916 Pops en entry from the block stack, and pops the value
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2917 stack until its level is the same as indicated on the
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2918 block stack. (The label is ignored.)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2919 END_FINALLY:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2920 Pops a variable number of entries from the *value* stack
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2921 and re-raises the exception they specify. The number of
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2922 entries popped depends on the (pseudo) exception type.
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2923
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2924 The block stack is unwound when an exception is raised:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2925 when a SETUP_FINALLY entry is found, the exception is pushed
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2926 onto the value stack (and the exception condition is cleared),
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2927 and the interpreter jumps to the label gotten from the block
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2928 stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2929
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2931 (The contents of the value stack is shown in [], with the top
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2932 at the right; 'tb' is trace-back info, 'val' the exception's
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2933 associated value, and 'exc' the exception.)
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2934
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2935 Value stack Label Instruction Argument
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2936 [] SETUP_EXCEPT L1
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2937 [] <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2938 [] POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2939 [] JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2940
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2941 [tb, val, exc] L1: DUP )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2942 [tb, val, exc, exc] <evaluate E1> )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2945 [tb, val, exc, 1] POP )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2946 [tb, val, exc] POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2947 [tb, val] <assign to V1> (or POP if no V1)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2948 [tb] POP
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2949 [] <code for S1>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2950 JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2951
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2952 [tb, val, exc, 0] L2: POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2953 [tb, val, exc] DUP
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2954 .............................etc.......................
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2955
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2956 [tb, val, exc, 0] Ln+1: POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2957 [tb, val, exc] END_FINALLY # re-raise exception
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2958
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2959 [] L0: <next statement>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2960
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2961 Of course, parts are not generated if Vi or Ei is not present.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2962 */
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2963
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2964 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
2965 com_try_except(struct compiling *c, node *n)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2966 {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2967 int except_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2968 int end_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2969 int else_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2970 int i;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2971 node *ch;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2972
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2973 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2974 block_push(c, SETUP_EXCEPT);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2975 com_node(c, CHILD(n, 2));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2976 com_addbyte(c, POP_BLOCK);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2977 block_pop(c, SETUP_EXCEPT);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2978 com_addfwref(c, JUMP_FORWARD, &else_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2979 com_backpatch(c, except_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2980 for (i = 3;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2981 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2982 i += 3) {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2983 /* except_clause: 'except' [expr [',' var]] */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2984 if (except_anchor == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2985 com_error(c, PyExc_SyntaxError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
2986 "default 'except:' must be last");
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2987 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2988 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2989 except_anchor = 0;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2990 com_push(c, 3); /* tb, val, exc pushed by exception */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2991 com_addoparg(c, SET_LINENO, ch->n_lineno);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2992 if (NCH(ch) > 1) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2993 com_addbyte(c, DUP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2994 com_push(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2995 com_node(c, CHILD(ch, 1));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2996 com_addoparg(c, COMPARE_OP, EXC_MATCH);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2997 com_pop(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2998 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2999 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3000 com_pop(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3001 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3002 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3003 com_pop(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3004 if (NCH(ch) > 3)
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
3005 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3006 else {
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3007 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3008 com_pop(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3009 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3010 com_addbyte(c, POP_TOP);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3011 com_pop(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3012 com_node(c, CHILD(n, i+2));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3013 com_addfwref(c, JUMP_FORWARD, &end_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3014 if (except_anchor) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3015 com_backpatch(c, except_anchor);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3016 /* We come in with [tb, val, exc, 0] on the
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3017 stack; one pop and it's the same as
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3018 expected at the start of the loop */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3019 com_addbyte(c, POP_TOP);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3020 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3021 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3022 /* We actually come in here with [tb, val, exc] but the
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3023 END_FINALLY will zap those and jump around.
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3024 The c_stacklevel does not reflect them so we need not pop
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3025 anything. */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3026 com_addbyte(c, END_FINALLY);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3027 com_backpatch(c, else_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3028 if (i < NCH(n))
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3029 com_node(c, CHILD(n, i+2));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3030 com_backpatch(c, end_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3031 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3032
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3033 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3034 com_try_finally(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3035 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3036 int finally_anchor = 0;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3037 node *ch;
792
dc3b455f7632 Only * can be used for varargs argument lists
Guido van Rossum <guido@python.org>
parents: 744
diff changeset
3038
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3039 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3040 block_push(c, SETUP_FINALLY);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3041 com_node(c, CHILD(n, 2));
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3042 com_addbyte(c, POP_BLOCK);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3043 block_pop(c, SETUP_FINALLY);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3044 block_push(c, END_FINALLY);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3045 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3046 /* While the generated code pushes only one item,
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3047 the try-finally handling can enter here with
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3048 up to three items. OK, here are the details:
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3049 3 for an exception, 2 for RETURN, 1 for BREAK. */
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3050 com_push(c, 3);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3051 com_backpatch(c, finally_anchor);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3052 ch = CHILD(n, NCH(n)-1);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3053 com_addoparg(c, SET_LINENO, ch->n_lineno);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3054 com_node(c, ch);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3055 com_addbyte(c, END_FINALLY);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3056 block_pop(c, END_FINALLY);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3057 com_pop(c, 3); /* Matches the com_push above */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3058 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3059
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3060 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3061 com_try_stmt(struct compiling *c, node *n)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3062 {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3063 REQ(n, try_stmt);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3064 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3065 | 'try' ':' suite 'finally' ':' suite */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3066 if (TYPE(CHILD(n, 3)) != except_clause)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3067 com_try_finally(c, n);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3068 else
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3069 com_try_except(c, n);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3070 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3071
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3072 static node *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3073 get_rawdocstring(node *n)
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3074 {
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3075 int i;
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3076
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3077 /* Label to avoid tail recursion */
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3078 next:
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3079 switch (TYPE(n)) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3080
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3081 case suite:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3082 if (NCH(n) == 1) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3083 n = CHILD(n, 0);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3084 goto next;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3085 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3086 /* Fall through */
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3087 case file_input:
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3088 for (i = 0; i < NCH(n); i++) {
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3089 node *ch = CHILD(n, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3090 if (TYPE(ch) == stmt) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3091 n = ch;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3092 goto next;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3093 }
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3094 }
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3095 break;
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
3096
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3097 case stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3098 case simple_stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3099 case small_stmt:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3100 n = CHILD(n, 0);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3101 goto next;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3102
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3103 case expr_stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3104 case testlist:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3105 case test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3106 case and_test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3107 case not_test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3108 case comparison:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3109 case expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3110 case xor_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3111 case and_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3112 case shift_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3113 case arith_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3114 case term:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3115 case factor:
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3116 case power:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3117 if (NCH(n) == 1) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3118 n = CHILD(n, 0);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3119 goto next;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3120 }
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3121 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3122
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3123 case atom:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3124 if (TYPE(CHILD(n, 0)) == STRING)
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3125 return n;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3126 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3127
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3128 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3129 return NULL;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3130 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3131
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3132 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3133 get_docstring(node *n)
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3134 {
9987
b7bcc2cda1b3 Implement -OO; "unsafe" optimization that removes docstrings.
Guido van Rossum <guido@python.org>
parents: 9626
diff changeset
3135 /* Don't generate doc-strings if run with -OO */
b7bcc2cda1b3 Implement -OO; "unsafe" optimization that removes docstrings.
Guido van Rossum <guido@python.org>
parents: 9626
diff changeset
3136 if (Py_OptimizeFlag > 1)
b7bcc2cda1b3 Implement -OO; "unsafe" optimization that removes docstrings.
Guido van Rossum <guido@python.org>
parents: 9626
diff changeset
3137 return NULL;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3138 n = get_rawdocstring(n);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3139 if (n == NULL)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3140 return NULL;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3141 return parsestrplus(n);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3142 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3143
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3144 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3145 com_suite(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3146 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3147 REQ(n, suite);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3148 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3149 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3150 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3151 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3152 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3153 int i;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3154 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3155 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3156 if (TYPE(ch) == stmt)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3157 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3158 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3159 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3160 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3161
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
3162 /* ARGSUSED */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3163 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3164 com_continue_stmt(struct compiling *c, node *n)
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3165 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3166 int i = c->c_nblocks;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3167 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3168 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3169 }
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3170 else if (i <= 0) {
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3171 /* at the outer level */
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3172 com_error(c, PyExc_SyntaxError,
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3173 "'continue' not properly in loop");
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3174 }
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3175 else {
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3176 int j;
16398
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3177 for (j = i-1; j >= 0; --j) {
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3178 if (c->c_block[j] == SETUP_LOOP)
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3179 break;
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3180 }
16398
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3181 if (j >= 0) {
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3182 /* there is a loop, but something interferes */
16398
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3183 for (; i > j; --i) {
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3184 if (c->c_block[i] == SETUP_EXCEPT ||
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3185 c->c_block[i] == SETUP_FINALLY) {
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3186 com_addoparg(c, CONTINUE_LOOP,
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3187 c->c_begin);
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3188 return;
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3189 }
16398
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3190 if (c->c_block[i] == END_FINALLY) {
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3191 com_error(c, PyExc_SyntaxError,
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3192 "'continue' not supported inside 'finally' clause");
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3193 return;
80c0b280a4f9 Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16394
diff changeset
3194 }
14471
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3195 }
c3c49859e80b com_continue_stmt(): Improve error message when continue is found
Fred Drake <fdrake@acm.org>
parents: 14382
diff changeset
3196 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3197 com_error(c, PyExc_SyntaxError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3198 "'continue' not properly in loop");
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3199 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3200 /* XXX Could allow it inside a 'finally' clause
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3201 XXX if we could pop the exception still on the stack */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3202 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3203
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3204 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3205 com_argdefs(struct compiling *c, node *n)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3206 {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3207 int i, nch, nargs, ndefs;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3208 if (TYPE(n) == lambdef) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3209 /* lambdef: 'lambda' [varargslist] ':' test */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3210 n = CHILD(n, 1);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3211 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3212 else {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3213 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3214 n = CHILD(n, 2);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3215 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3216 n = CHILD(n, 1);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3217 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3218 if (TYPE(n) != varargslist)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3219 return 0;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3220 /* varargslist:
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3221 (fpdef ['=' test] ',')* '*' ....... |
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3222 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3223 nch = NCH(n);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3224 nargs = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3225 ndefs = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3226 for (i = 0; i < nch; i++) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3227 int t;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3228 if (TYPE(CHILD(n, i)) == STAR ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3229 TYPE(CHILD(n, i)) == DOUBLESTAR)
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
3230 break;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3231 nargs++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3232 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3233 if (i >= nch)
3103
e51e17b2d88b fix bug with missing default for last arg (discovered by Tommy Burnette)
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
3234 t = RPAR; /* Anything except EQUAL or COMMA */
e51e17b2d88b fix bug with missing default for last arg (discovered by Tommy Burnette)
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
3235 else
e51e17b2d88b fix bug with missing default for last arg (discovered by Tommy Burnette)
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
3236 t = TYPE(CHILD(n, i));
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3237 if (t == EQUAL) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3238 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3239 ndefs++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3240 com_node(c, CHILD(n, i));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3241 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3242 if (i >= nch)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3243 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3244 t = TYPE(CHILD(n, i));
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3245 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3246 else {
9214
c259c3c4d0cc Treat def f(a, b=1, c): ... as an error (missing default for c)
Guido van Rossum <guido@python.org>
parents: 9049
diff changeset
3247 /* Treat "(a=1, b)" as an error */
c259c3c4d0cc Treat def f(a, b=1, c): ... as an error (missing default for c)
Guido van Rossum <guido@python.org>
parents: 9049
diff changeset
3248 if (ndefs)
c259c3c4d0cc Treat def f(a, b=1, c): ... as an error (missing default for c)
Guido van Rossum <guido@python.org>
parents: 9049
diff changeset
3249 com_error(c, PyExc_SyntaxError,
9215
1995cdbe3384 Eh, better error message for the previous change. It now says
Guido van Rossum <guido@python.org>
parents: 9214
diff changeset
3250 "non-default argument follows default argument");
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3251 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3252 if (t != COMMA)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3253 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3254 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3255 return ndefs;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3256 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3257
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3258 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3259 com_funcdef(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3260 {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3261 PyObject *co;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3262 int ndefs;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3263 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3264 ndefs = com_argdefs(c, n);
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3265 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3266 n->n_lineno);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3267 co = (PyObject *)icompile(n, c);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3268 symtable_exit_scope(c->c_symtable);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3269 if (co == NULL)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3270 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3271 else {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3272 int closure = com_make_closure(c, (PyCodeObject *)co);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3273 int i = com_addconst(c, co);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3274 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3275 com_push(c, 1);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3276 if (closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3277 com_addoparg(c, MAKE_CLOSURE, ndefs);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3278 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3279 com_addoparg(c, MAKE_FUNCTION, ndefs);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3280 com_pop(c, ndefs);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3281 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3282 com_pop(c, 1);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3283 Py_DECREF(co);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3284 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3285 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3286
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3287 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3288 com_bases(struct compiling *c, node *n)
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3289 {
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
3290 int i;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3291 REQ(n, testlist);
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3292 /* testlist: test (',' test)* [','] */
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3293 for (i = 0; i < NCH(n); i += 2)
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3294 com_node(c, CHILD(n, i));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3295 i = (NCH(n)+1) / 2;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3296 com_addoparg(c, BUILD_TUPLE, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3297 com_pop(c, i-1);
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3298 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3299
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3300 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3301 com_classdef(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3302 {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3303 int i;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3304 PyObject *co, *v;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3305 char *name;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3306
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3307 REQ(n, classdef);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3308 /* classdef: class NAME ['(' testlist ')'] ':' suite */
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
3309 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3310 c->c_errors++;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3311 return;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3312 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3313 /* Push the class name on the stack */
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3314 i = com_addconst(c, v);
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3315 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3316 com_push(c, 1);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3317 Py_DECREF(v);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3318 /* Push the tuple of base classes on the stack */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3319 if (TYPE(CHILD(n, 2)) != LPAR) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3320 com_addoparg(c, BUILD_TUPLE, 0);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3321 com_push(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3322 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3323 else
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3324 com_bases(c, CHILD(n, 3));
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3325 name = STR(CHILD(n, 1));
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3326 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3327 co = (PyObject *)icompile(n, c);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3328 symtable_exit_scope(c->c_symtable);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3329 if (co == NULL)
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3330 c->c_errors++;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3331 else {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3332 int closure = com_make_closure(c, (PyCodeObject *)co);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3333 i = com_addconst(c, co);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3334 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3335 com_push(c, 1);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3336 if (closure)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3337 com_addoparg(c, MAKE_CLOSURE, 0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3338 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3339 com_addoparg(c, MAKE_FUNCTION, 0);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3340 com_addoparg(c, CALL_FUNCTION, 0);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3341 com_addbyte(c, BUILD_CLASS);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3342 com_pop(c, 2);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3343 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3344 Py_DECREF(co);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3345 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3346 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3347
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3348 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3349 com_node(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3350 {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3351 loop:
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3352 if (c->c_errors)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3353 return;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3354 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3355
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3356 /* Definition nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3357
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3358 case funcdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3359 com_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3360 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3361 case classdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3362 com_classdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3363 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3364
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3365 /* Trivial parse tree nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3366
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3367 case stmt:
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3368 case small_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3369 case flow_stmt:
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3370 n = CHILD(n, 0);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3371 goto loop;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3372
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3373 case simple_stmt:
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3374 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3375 com_addoparg(c, SET_LINENO, n->n_lineno);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3376 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3377 int i;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3378 for (i = 0; i < NCH(n)-1; i += 2)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3379 com_node(c, CHILD(n, i));
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3380 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3381 break;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3382
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3383 case compound_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3384 com_addoparg(c, SET_LINENO, n->n_lineno);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3385 n = CHILD(n, 0);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3386 goto loop;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3387
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3388 /* Statement nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3389
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3390 case expr_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3391 com_expr_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3392 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3393 case print_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3394 com_print_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3395 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3396 case del_stmt: /* 'del' exprlist */
14163
1b9fd0cbd914 Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents: 14147
diff changeset
3397 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3398 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3399 case pass_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3400 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3401 case break_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3402 if (c->c_loops == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3403 com_error(c, PyExc_SyntaxError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3404 "'break' outside loop");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3405 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3406 com_addbyte(c, BREAK_LOOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3407 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3408 case continue_stmt:
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3409 com_continue_stmt(c, n);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
3410 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3411 case return_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3412 com_return_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3413 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3414 case raise_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3415 com_raise_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3416 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3417 case import_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3418 com_import_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3419 break;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3420 case global_stmt:
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
3421 break;
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
3422 case exec_stmt:
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
3423 com_exec_stmt(c, n);
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
3424 break;
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
3425 case assert_stmt:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
3426 com_assert_stmt(c, n);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
3427 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3428 case if_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3429 com_if_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3430 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3431 case while_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3432 com_while_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3433 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3434 case for_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3435 com_for_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3436 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3437 case try_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3438 com_try_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3439 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3440 case suite:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3441 com_suite(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3442 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3443
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3444 /* Expression nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3445
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3446 case testlist:
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
3447 com_list(c, n, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3448 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3449 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3450 com_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3451 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3452 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3453 com_and_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3454 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3455 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3456 com_not_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3457 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3458 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3459 com_comparison(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3460 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3461 case exprlist:
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
3462 com_list(c, n, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3463 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3464 case expr:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3465 com_expr(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3466 break;
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3467 case xor_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3468 com_xor_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3469 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3470 case and_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3471 com_and_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3472 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3473 case shift_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3474 com_shift_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3475 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3476 case arith_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3477 com_arith_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
3478 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3479 case term:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3480 com_term(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3481 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3482 case factor:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3483 com_factor(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3484 break;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3485 case power:
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3486 com_power(c, n);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3487 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3488 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3489 com_atom(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3490 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3491
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3492 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3493 com_error(c, PyExc_SystemError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3494 "com_node: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3495 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3496 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3497
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13330
diff changeset
3498 static void com_fplist(struct compiling *, node *);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3499
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3500 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3501 com_fpdef(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3502 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3503 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3504 if (TYPE(CHILD(n, 0)) == LPAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3505 com_fplist(c, CHILD(n, 1));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3506 else {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3507 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3508 com_pop(c, 1);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3509 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3510 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3511
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3512 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3513 com_fplist(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3514 {
544
d0baa8300005 Minor changes.
Guido van Rossum <guido@python.org>
parents: 493
diff changeset
3515 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3516 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3517 com_fpdef(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3518 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3519 else {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3520 int i = (NCH(n)+1)/2;
13930
4eaa463c031a Merge UNPACK_LIST and UNPACK_TUPLE into a single UNPACK_SEQUENCE, since they
Thomas Wouters <thomas@python.org>
parents: 13884
diff changeset
3521 com_addoparg(c, UNPACK_SEQUENCE, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3522 com_push(c, i-1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3523 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3524 com_fpdef(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3525 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3526 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3527
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3528 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3529 com_arglist(struct compiling *c, node *n)
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3530 {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3531 int nch, i, narg;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3532 int complex = 0;
5754
9ed26afeeaa5 Fix bug reported by Just: anonymous arguments used for tuples should
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
3533 char nbuf[10];
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3534 REQ(n, varargslist);
617
755bb8efcc2d Use strtoul() for oct/hex constants.
Guido van Rossum <guido@python.org>
parents: 584
diff changeset
3535 /* varargslist:
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3536 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3537 nch = NCH(n);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3538 /* Enter all arguments in table of locals */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3539 for (i = 0, narg = 0; i < nch; i++) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3540 node *ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3541 node *fp;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3542 char *name;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3543 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
3544 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3545 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3546 fp = CHILD(ch, 0);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3547 if (TYPE(fp) == NAME) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3548 PyObject *v;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3549 name = STR(fp);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3550 v = PyDict_GetItemString(c->c_cellvars, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3551 if (v) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3552 com_addoparg(c, LOAD_FAST, narg);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3553 com_addoparg(c, STORE_DEREF,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3554 PyInt_AS_LONG(v));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3555 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3556 } else {
5754
9ed26afeeaa5 Fix bug reported by Just: anonymous arguments used for tuples should
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
3557 name = nbuf;
9ed26afeeaa5 Fix bug reported by Just: anonymous arguments used for tuples should
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
3558 sprintf(nbuf, ".%d", i);
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3366
diff changeset
3559 complex = 1;
2813
999b5bdc18ce 3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents: 2367
diff changeset
3560 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3561 narg++;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3562 /* all name updates handled by symtable */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3563 if (++i >= nch)
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3564 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3565 ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3566 if (TYPE(ch) == EQUAL)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3567 i += 2;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3568 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3569 REQ(ch, COMMA);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3570 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3571 /* Handle *arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3572 if (i < nch) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3573 node *ch;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3574 ch = CHILD(n, i);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3575 if (TYPE(ch) != DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3576 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3577 ch = CHILD(n, i+1);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3578 if (TYPE(ch) == NAME) {
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3579 PyObject *v;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3580 i += 3;
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3581 v = PyDict_GetItemString(c->c_cellvars,
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3582 STR(ch));
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3583 if (v) {
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3584 com_addoparg(c, LOAD_FAST, narg);
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3585 com_addoparg(c, STORE_DEREF,
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3586 PyInt_AS_LONG(v));
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3587 }
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3588 narg++;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3589 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3590 }
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3591 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3592 /* Handle **keywords */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3593 if (i < nch) {
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3594 PyObject *v;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3595 node *ch;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3596 ch = CHILD(n, i);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3597 if (TYPE(ch) != DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3598 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3599 ch = CHILD(n, i+1);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3600 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3601 ch = CHILD(n, i+2);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3602 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3603 else
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3604 ch = CHILD(n, i+1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3605 REQ(ch, NAME);
16540
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3606 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3607 if (v) {
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3608 com_addoparg(c, LOAD_FAST, narg);
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3609 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
8236f3e7585e SF patch 103589: Fix handling of cell vars that are either * or ** parameters.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
3610 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3611 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3612 if (complex) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3613 /* Generate code for complex arguments only after
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3614 having counted the simple arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3615 int ilocal = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3616 for (i = 0; i < nch; i++) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3617 node *ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3618 node *fp;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3619 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3620 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3621 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3622 fp = CHILD(ch, 0);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3623 if (TYPE(fp) != NAME) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3624 com_addoparg(c, LOAD_FAST, ilocal);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3625 com_push(c, 1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3626 com_fpdef(c, ch);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3627 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3628 ilocal++;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3629 if (++i >= nch)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3630 break;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3631 ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3632 if (TYPE(ch) == EQUAL)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3633 i += 2;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3634 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3635 REQ(ch, COMMA);
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3636 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3637 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3638 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3639
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3640 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3641 com_file_input(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3642 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3643 int i;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3644 PyObject *doc;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3645 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3646 doc = get_docstring(n);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3647 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3648 int i = com_addconst(c, doc);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3649 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3650 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3651 com_push(c, 1);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3652 com_addop_name(c, STORE_NAME, "__doc__");
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3653 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3654 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3655 for (i = 0; i < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3656 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3657 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3658 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3659 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3660 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3661
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3662 /* Top-level compile-node interface */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3663
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3664 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3665 compile_funcdef(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3666 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3667 PyObject *doc;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3668 node *ch;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3669 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
3670 c->c_name = STR(CHILD(n, 1));
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3671 doc = get_docstring(CHILD(n, 4));
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3672 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3673 (void) com_addconst(c, doc);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3674 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3675 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3676 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3677 (void) com_addconst(c, Py_None); /* No docstring */
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3678 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3679 ch = CHILD(ch, 1); /* ')' | varargslist */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3680 if (TYPE(ch) == varargslist)
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3681 com_arglist(c, ch);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3682 c->c_infunction = 1;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3683 com_node(c, CHILD(n, 4));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3684 c->c_infunction = 0;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3685 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3686 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3687 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3688 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3689 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3690
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3691 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3692 compile_lambdef(struct compiling *c, node *n)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3693 {
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3694 node *ch;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3695 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
2005
ed5d0ad5ea2f set name to <lambda> instead of None for lambdas
Guido van Rossum <guido@python.org>
parents: 1833
diff changeset
3696 c->c_name = "<lambda>";
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3697
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3698 ch = CHILD(n, 1);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3699 (void) com_addconst(c, Py_None); /* No docstring */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3700 if (TYPE(ch) == varargslist) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3701 com_arglist(c, ch);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3702 ch = CHILD(n, 3);
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3703 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3704 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3705 ch = CHILD(n, 2);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3706 com_node(c, ch);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3707 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3708 com_pop(c, 1);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3709 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3710
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3711 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3712 compile_classdef(struct compiling *c, node *n)
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3713 {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3714 node *ch;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3715 PyObject *doc;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3716 REQ(n, classdef);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3717 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3718 c->c_name = STR(CHILD(n, 1));
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3719 c->c_private = c->c_name;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3720 ch = CHILD(n, NCH(n)-1); /* The suite */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3721 doc = get_docstring(ch);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3722 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3723 int i = com_addconst(c, doc);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3724 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3725 com_addoparg(c, LOAD_CONST, i);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3726 com_push(c, 1);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3727 com_addop_name(c, STORE_NAME, "__doc__");
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3728 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3729 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3730 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3731 (void) com_addconst(c, Py_None);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3732 com_node(c, ch);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3733 com_addbyte(c, LOAD_LOCALS);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3734 com_push(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3735 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3736 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3737 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3738
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3739 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3740 compile_node(struct compiling *c, node *n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3741 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3742 com_addoparg(c, SET_LINENO, n->n_lineno);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3743
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3744 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3745
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3746 case single_input: /* One interactive command */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3747 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3748 c->c_interactive++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3749 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3750 if (TYPE(n) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3751 com_node(c, n);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3752 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3753 com_push(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3754 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3755 com_pop(c, 1);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3756 c->c_interactive--;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3757 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3758
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3759 case file_input: /* A whole file, or built-in function exec() */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3760 com_file_input(c, n);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3761 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3762 com_push(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3763 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3764 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3765 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3766
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3767 case eval_input: /* Built-in function input() */
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3768 com_node(c, CHILD(n, 0));
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3769 com_addbyte(c, RETURN_VALUE);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3770 com_pop(c, 1);
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3771 break;
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3772
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3773 case lambdef: /* anonymous function definition */
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3774 compile_lambdef(c, n);
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3775 break;
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3776
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3777 case funcdef: /* A function definition */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3778 compile_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3779 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3780
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3781 case classdef: /* A class definition */
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3782 compile_classdef(c, n);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3783 break;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3784
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3785 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3786 com_error(c, PyExc_SystemError,
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
3787 "compile_node: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3788 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3789 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3790
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3791 static PyObject *
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3792 dict_keys_inorder(PyObject *dict, int offset)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3793 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3794 PyObject *tuple, *k, *v;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3795 int i, pos = 0, size = PyDict_Size(dict);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3796
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3797 tuple = PyTuple_New(size);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3798 if (tuple == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3799 return NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3800 while (PyDict_Next(dict, &pos, &k, &v)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3801 i = PyInt_AS_LONG(v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3802 Py_INCREF(k);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3803 PyTuple_SET_ITEM(tuple, i - offset, k);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3804 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3805 return tuple;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3806 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3807
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3808 PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3809 PyNode_Compile(node *n, char *filename)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3810 {
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3811 return jcompile(n, filename, NULL);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3812 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3813
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3814 struct symtable *
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3815 PyNode_CompileSymtable(node *n, char *filename)
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3816 {
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3817 struct symtable *st;
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3818
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3819 st = symtable_init();
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3820 if (st == NULL)
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3821 return NULL;
16428
6496844c4a42 Fix symbol table pass to generation SyntaxError exceptions that
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16421
diff changeset
3822 assert(st->st_symbols != NULL);
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3823 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3824 if (st->st_errors > 0) {
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3825 PySymtable_Free(st);
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3826 return NULL;
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3827 }
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3828 symtable_node(st, n);
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3829 if (st->st_errors > 0) {
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3830 PySymtable_Free(st);
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3831 return NULL;
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3832 }
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3833 return st;
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3834 }
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3835
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3836 static PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3837 icompile(node *n, struct compiling *base)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3838 {
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3839 return jcompile(n, base->c_filename, base);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3840 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3841
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3842 static PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3843 jcompile(node *n, char *filename, struct compiling *base)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3844 {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3845 struct compiling sc;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3846 PyCodeObject *co;
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3847 if (!com_init(&sc, filename))
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3848 return NULL;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3849 if (base) {
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3850 sc.c_private = base->c_private;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3851 sc.c_symtable = base->c_symtable;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3852 /* c_symtable still points to parent's symbols */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3853 if (base->c_nested
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3854 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3855 sc.c_nested = 1;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3856 } else {
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3857 sc.c_private = NULL;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16783
diff changeset
3858 sc.c_future = PyNode_Future(n, filename);
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16783
diff changeset
3859 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3860 com_free(&sc);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3861 return NULL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3862 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3863 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3864 co = NULL;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3865 if (symtable_load_symbols(&sc) < 0) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3866 sc.c_errors++;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3867 goto exit;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3868 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3869 compile_node(&sc, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3870 com_done(&sc);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
3871 if (sc.c_errors == 0) {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3872 PyObject *consts, *names, *varnames, *filename, *name,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3873 *freevars, *cellvars;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3874 consts = PyList_AsTuple(sc.c_consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3875 names = PyList_AsTuple(sc.c_names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3876 varnames = PyList_AsTuple(sc.c_varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3877 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3878 freevars = dict_keys_inorder(sc.c_freevars,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3879 PyTuple_GET_SIZE(cellvars));
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
3880 filename = PyString_InternFromString(sc.c_filename);
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
3881 name = PyString_InternFromString(sc.c_name);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3882 if (!PyErr_Occurred())
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3883 co = PyCode_New(sc.c_argcount,
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3884 sc.c_nlocals,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3885 sc.c_maxstacklevel,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3886 sc.c_flags,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3887 sc.c_code,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3888 consts,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3889 names,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3890 varnames,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3891 freevars,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3892 cellvars,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3893 filename,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3894 name,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3895 sc.c_firstlineno,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3896 sc.c_lnotab);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3897 Py_XDECREF(consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3898 Py_XDECREF(names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3899 Py_XDECREF(varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3900 Py_XDECREF(freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3901 Py_XDECREF(cellvars);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3902 Py_XDECREF(filename);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3903 Py_XDECREF(name);
266
b5826bf29677 Changed and exported newcodeobject() interface, for ".pyc" files.
Guido van Rossum <guido@python.org>
parents: 238
diff changeset
3904 }
13884
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3905 else if (!PyErr_Occurred()) {
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3906 /* This could happen if someone called PyErr_Clear() after an
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3907 error was reported above. That's not supposed to happen,
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3908 but I just plugged one case and I'm not sure there can't be
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3909 others. In that case, raise SystemError so that at least
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3910 it gets reported instead dumping core. */
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3911 PyErr_SetString(PyExc_SystemError, "lost syntax error");
8eeaff96b4c2 When returning an error from jcompile() (which is passed through by
Guido van Rossum <guido@python.org>
parents: 13873
diff changeset
3912 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3913 exit:
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
3914 if (base == NULL) {
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3915 PySymtable_Free(sc.c_symtable);
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
3916 sc.c_symtable = NULL;
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
3917 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3918 com_free(&sc);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3919 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3920 }
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3921
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3922 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13585
diff changeset
3923 PyCode_Addr2Line(PyCodeObject *co, int addrq)
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3924 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3925 int size = PyString_Size(co->co_lnotab) / 2;
11290
ccdf5dc2acf6 Tim Peters writes:
Guido van Rossum <guido@python.org>
parents: 9987
diff changeset
3926 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3927 int line = co->co_firstlineno;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3928 int addr = 0;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3929 while (--size >= 0) {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3930 addr += *p++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3931 if (addr > addrq)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3932 break;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3933 line += *p++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3934 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3935 return line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3936 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3937
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3938 /* The test for LOCAL must come before the test for FREE in order to
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3939 handle classes where name is both local and free. The local var is
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3940 a method and the free var is a free var referenced within a method.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3941 */
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3942
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3943 static int
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3944 get_ref_type(struct compiling *c, char *name)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3945 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3946 PyObject *v;
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3947 if (c->c_symtable->st_nested_scopes) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3948 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3949 return CELL;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3950 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3951 return LOCAL;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3952 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3953 return FREE;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3954 v = PyDict_GetItemString(c->c_globals, name);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3955 if (v) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3956 if (v == Py_None)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3957 return GLOBAL_EXPLICIT;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3958 else {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3959 return GLOBAL_IMPLICIT;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3960 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3961 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3962 } else {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3963 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3964 return LOCAL;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3965 v = PyDict_GetItemString(c->c_globals, name);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3966 if (v) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3967 if (v == Py_None)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3968 return GLOBAL_EXPLICIT;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3969 else {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3970 return GLOBAL_IMPLICIT;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
3971 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3972 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3973 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3974 {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3975 char buf[350];
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3976 sprintf(buf,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3977 "unknown scope for %.100s in %.100s(%s) in %s",
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
3978 name, c->c_name,
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3979 PyObject_REPR(c->c_symtable->st_cur->ste_id),
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3980 c->c_filename);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3981 Py_FatalError(buf);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3982 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3983 return -1; /* can't get here */
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3984 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3985
16831
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
3986 /* Helper function for setting lineno and filename */
27f04d714ecb Print the offending line of code in the traceback for SyntaxErrors
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16823
diff changeset
3987
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3988 static int
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3989 symtable_build(struct compiling *c, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3990 {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
3991 if ((c->c_symtable = symtable_init()) == NULL)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3992 return -1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
3993 c->c_symtable->st_future = c->c_future;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16783
diff changeset
3994 if (c->c_future->ff_nested_scopes)
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16783
diff changeset
3995 c->c_symtable->st_nested_scopes = 1;
16428
6496844c4a42 Fix symbol table pass to generation SyntaxError exceptions that
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16421
diff changeset
3996 c->c_symtable->st_filename = c->c_filename;
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3997 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
3998 if (c->c_symtable->st_errors > 0)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3999 return -1;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4000 symtable_node(c->c_symtable, n);
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4001 if (c->c_symtable->st_errors > 0)
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4002 return -1;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4003 /* reset for second pass */
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4004 c->c_symtable->st_nscopes = 1;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4005 c->c_symtable->st_pass = 2;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4006 return 0;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4007 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4008
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4009 static int
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4010 symtable_init_compiling_symbols(struct compiling *c)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4011 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4012 PyObject *varnames;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4013
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4014 varnames = c->c_symtable->st_cur->ste_varnames;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4015 if (varnames == NULL) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4016 varnames = PyList_New(0);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4017 if (varnames == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4018 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4019 c->c_symtable->st_cur->ste_varnames = varnames;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4020 Py_INCREF(varnames);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4021 } else
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4022 Py_INCREF(varnames);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4023 c->c_varnames = varnames;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4024
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4025 c->c_globals = PyDict_New();
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4026 if (c->c_globals == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4027 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4028 c->c_freevars = PyDict_New();
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4029 if (c->c_freevars == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4030 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4031 c->c_cellvars = PyDict_New();
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4032 if (c->c_cellvars == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4033 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4034 return 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4035 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4036
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4037 struct symbol_info {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4038 int si_nlocals;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4039 int si_ncells;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4040 int si_nfrees;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4041 int si_nimplicit;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4042 };
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4043
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4044 static void
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4045 symtable_init_info(struct symbol_info *si)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4046 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4047 si->si_nlocals = 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4048 si->si_ncells = 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4049 si->si_nfrees = 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4050 si->si_nimplicit = 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4051 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4052
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4053 static int
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4054 symtable_resolve_free(struct compiling *c, PyObject *name,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4055 struct symbol_info *si)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4056 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4057 PyObject *dict, *v;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4058
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4059 /* Seperate logic for DEF_FREE. If it occurs in a function,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4060 it indicates a local that we must allocate storage for (a
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4061 cell var). If it occurs in a class, then the class has a
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4062 method and a free variable with the same name.
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4063 */
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4064
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4065 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4066 v = PyInt_FromLong(si->si_ncells++);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4067 dict = c->c_cellvars;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4068 } else {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4069 v = PyInt_FromLong(si->si_nfrees++);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4070 dict = c->c_freevars;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4071 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4072 if (v == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4073 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4074 if (PyDict_SetItem(dict, name, v) < 0) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4075 Py_DECREF(v);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4076 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4077 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4078 Py_DECREF(v);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4079 return 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4080 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4081
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4082 static int
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4083 symtable_freevar_offsets(PyObject *freevars, int offset)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4084 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4085 PyObject *name, *v;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4086 int pos;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4087
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4088 /* The cell vars are the first elements of the closure,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4089 followed by the free vars. Update the offsets in
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4090 c_freevars to account for number of cellvars. */
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4091 pos = 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4092 while (PyDict_Next(freevars, &pos, &name, &v)) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4093 int i = PyInt_AS_LONG(v) + offset;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4094 PyObject *o = PyInt_FromLong(i);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4095 if (o == NULL)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4096 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4097 if (PyDict_SetItem(freevars, name, o) < 0) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4098 Py_DECREF(o);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4099 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4100 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4101 Py_DECREF(o);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4102 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4103 return 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4104 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4105
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4106 static int
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4107 symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4108 struct symbol_info *si)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4109 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4110 if (ste->ste_type != TYPE_MODULE)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4111 c->c_flags |= CO_NEWLOCALS;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4112 if (ste->ste_type == TYPE_FUNCTION) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4113 c->c_nlocals = si->si_nlocals;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4114 if (ste->ste_optimized == 0)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4115 c->c_flags |= CO_OPTIMIZED;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4116 else if (si->si_ncells || si->si_nfrees
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4117 || (ste->ste_nested && si->si_nimplicit)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4118 || ste->ste_child_free) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4119 if (c->c_symtable->st_nested_scopes) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4120 PyErr_Format(PyExc_SyntaxError,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4121 ILLEGAL_DYNAMIC_SCOPE,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4122 PyString_AS_STRING(ste->ste_name));
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
4123 PyErr_SyntaxLocation(c->c_symtable->st_filename,
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4124 ste->ste_lineno);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4125 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4126 } else {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4127 char buf[200];
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4128 sprintf(buf, ILLEGAL_DYNAMIC_SCOPE,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4129 PyString_AS_STRING(ste->ste_name));
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4130 if (PyErr_Warn(PyExc_SyntaxWarning,
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4131 buf) < 0) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4132 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4133 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4134 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4135 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4136 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4137 return 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4138 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4139
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4140 static int
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4141 symtable_load_symbols(struct compiling *c)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4142 {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4143 static PyObject *implicit = NULL;
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4144 struct symtable *st = c->c_symtable;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4145 PySymtableEntryObject *ste = st->st_cur;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4146 PyObject *name, *varnames, *v;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4147 int i, flags, pos;
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4148 struct symbol_info si;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4149
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4150 if (implicit == NULL) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4151 implicit = PyInt_FromLong(1);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4152 if (implicit == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4153 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4154 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4155 v = NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4156
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4157 if (symtable_init_compiling_symbols(c) < 0)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4158 goto fail;
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4159 symtable_init_info(&si);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4160 varnames = st->st_cur->ste_varnames;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4161 si.si_nlocals = PyList_GET_SIZE(varnames);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4162 c->c_argcount = si.si_nlocals;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4163
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4164 for (i = 0; i < si.si_nlocals; ++i) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4165 v = PyInt_FromLong(i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4166 if (PyDict_SetItem(c->c_locals,
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4167 PyList_GET_ITEM(varnames, i), v) < 0)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4168 goto fail;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4169 Py_DECREF(v);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4170 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4171
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4172 /* XXX The cases below define the rules for whether a name is
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4173 local or global. The logic could probably be clearer. */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4174 pos = 0;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4175 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4176 flags = PyInt_AS_LONG(v);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4177
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4178 if (flags & DEF_FREE_GLOBAL)
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4179 /* undo the original DEF_FREE */
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4180 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4181
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4182 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4183 && (flags & (DEF_LOCAL | DEF_PARAM)))
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4184 symtable_resolve_free(c, name, &si);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4185
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4186 if (flags & DEF_STAR) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4187 c->c_argcount--;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4188 c->c_flags |= CO_VARARGS;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4189 } else if (flags & DEF_DOUBLESTAR) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4190 c->c_argcount--;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4191 c->c_flags |= CO_VARKEYWORDS;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4192 } else if (flags & DEF_INTUPLE)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4193 c->c_argcount--;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4194 else if (flags & DEF_GLOBAL) {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4195 if (flags & DEF_PARAM) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4196 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
16428
6496844c4a42 Fix symbol table pass to generation SyntaxError exceptions that
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16421
diff changeset
4197 PyString_AS_STRING(name));
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
4198 PyErr_SyntaxLocation(st->st_filename,
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4199 ste->ste_lineno);
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4200 st->st_errors++;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4201 goto fail;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4202 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4203 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4204 goto fail;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4205 } else if (flags & DEF_FREE_GLOBAL) {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4206 si.si_nimplicit++;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4207 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4208 goto fail;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4209 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4210 v = PyInt_FromLong(si.si_nlocals++);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4211 if (v == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4212 goto fail;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4213 if (PyDict_SetItem(c->c_locals, name, v) < 0)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4214 goto fail;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4215 Py_DECREF(v);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4216 if (ste->ste_type != TYPE_CLASS)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4217 if (PyList_Append(c->c_varnames, name) < 0)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4218 goto fail;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4219 } else if (is_free(flags)) {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4220 if (ste->ste_nested && st->st_nested_scopes) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4221 v = PyInt_FromLong(si.si_nfrees++);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4222 if (v == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4223 goto fail;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4224 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4225 goto fail;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4226 Py_DECREF(v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4227 } else {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4228 si.si_nimplicit++;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4229 if (PyDict_SetItem(c->c_globals, name,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4230 implicit) < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4231 goto fail;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4232 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4233 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4234 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4235
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4236 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4237 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4238 return symtable_update_flags(c, ste, &si);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4239 fail:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4240 /* is this always the right thing to do? */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4241 Py_XDECREF(v);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4242 return -1;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4243 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4244
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4245 static struct symtable *
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4246 symtable_init()
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4247 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4248 struct symtable *st;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4249
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4250 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4251 if (st == NULL)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4252 return NULL;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4253 st->st_pass = 1;
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4254 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
16428
6496844c4a42 Fix symbol table pass to generation SyntaxError exceptions that
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16421
diff changeset
4255 st->st_filename = NULL;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4256 if ((st->st_stack = PyList_New(0)) == NULL)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4257 goto fail;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4258 if ((st->st_symbols = PyDict_New()) == NULL)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4259 goto fail;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4260 st->st_cur = NULL;
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4261 st->st_nscopes = 0;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4262 st->st_errors = 0;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4263 st->st_tmpname = 0;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4264 st->st_private = NULL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4265 return st;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4266 fail:
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4267 PySymtable_Free(st);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4268 return NULL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4269 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4270
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4271 void
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4272 PySymtable_Free(struct symtable *st)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4273 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4274 Py_XDECREF(st->st_symbols);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4275 Py_XDECREF(st->st_stack);
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
4276 Py_XDECREF(st->st_cur);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4277 PyMem_Free((void *)st);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4278 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4279
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4280 /* When the compiler exits a scope, it must should update the scope's
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4281 free variable information with the list of free variables in its
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4282 children.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4283
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4284 Variables that are free in children and defined in the current
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4285 scope are cellvars.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4286
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4287 If the scope being exited is defined at the top-level (ste_nested is
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4288 false), free variables in children that are not defined here are
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4289 implicit globals.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4290
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4291 */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4292
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4293 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4294 symtable_update_free_vars(struct symtable *st)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4295 {
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4296 int i, j, def;
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4297 PyObject *o, *name, *list = NULL;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4298 PySymtableEntryObject *child, *ste = st->st_cur;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4299
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4300 if (ste->ste_type == TYPE_CLASS)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4301 def = DEF_FREE_CLASS;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4302 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4303 def = DEF_FREE;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4304 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4305 int pos = 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4306
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4307 if (list)
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4308 PyList_SetSlice(list, 0,
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4309 ((PyVarObject*)list)->ob_size, 0);
16754
23c7a0108f59 symtable_update_free_vars(), symtable_undo_free(),
Barry Warsaw <barry@python.org>
parents: 16753
diff changeset
4310 child = (PySymtableEntryObject *)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4311 PyList_GET_ITEM(ste->ste_children, i);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4312 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4313 int v = PyInt_AS_LONG(o);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4314 if (!(is_free(v)))
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4315 continue; /* avoids indentation */
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4316 if (list == NULL) {
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4317 list = PyList_New(0);
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4318 if (list == NULL)
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4319 return -1;
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4320 }
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4321 ste->ste_child_free = 1;
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4322 if (PyList_Append(list, name) < 0) {
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4323 Py_DECREF(list);
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4324 return -1;
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4325 }
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4326 }
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4327 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4328 name = PyList_GET_ITEM(list, j);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4329 if (ste->ste_nested) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4330 if (symtable_add_def_o(st, ste->ste_symbols,
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4331 name, def) < 0) {
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4332 Py_DECREF(list);
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4333 return -1;
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4334 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4335 } else {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4336 if (symtable_check_global(st, child->ste_id,
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4337 name) < 0) {
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4338 Py_DECREF(list);
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4339 return -1;
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4340 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4341 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4342 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4343 }
16571
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4344
2c6417ef4628 In symtable_update_free_vars() do not modify the dictionary while
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16540
diff changeset
4345 Py_XDECREF(list);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4346 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4347 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4348
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4349 /* If the current scope is a non-nested class or if name is not
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4350 defined in the current, non-nested scope, then it is an implicit
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4351 global in all nested scopes.
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4352 */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4353
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4354 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4355 symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4356 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4357 PyObject *o;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4358 int v;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4359 PySymtableEntryObject *ste = st->st_cur;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4360
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4361 if (ste->ste_type == TYPE_CLASS)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4362 return symtable_undo_free(st, child, name);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4363 o = PyDict_GetItem(ste->ste_symbols, name);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4364 if (o == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4365 return symtable_undo_free(st, child, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4366 v = PyInt_AS_LONG(o);
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4367 if (is_free(v) || (v & DEF_GLOBAL))
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4368 return symtable_undo_free(st, child, name);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4369 else
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4370 return symtable_add_def_o(st, ste->ste_symbols,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4371 name, DEF_FREE);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4372 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4373
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4374 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4375 symtable_undo_free(struct symtable *st, PyObject *id,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4376 PyObject *name)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4377 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4378 int i, v, x;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4379 PyObject *info;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4380 PySymtableEntryObject *ste;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4381
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4382 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4383 if (ste == NULL)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4384 return -1;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4385 info = PyDict_GetItem(ste->ste_symbols, name);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4386 if (info == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4387 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4388 v = PyInt_AS_LONG(info);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4389 if (is_free(v)) {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4390 if (symtable_add_def_o(st, ste->ste_symbols, name,
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4391 DEF_FREE_GLOBAL) < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4392 return -1;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4393 } else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4394 /* If the name is defined here or declared global,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4395 then the recursion stops. */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4396 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4397
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4398 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4399 PySymtableEntryObject *child;
16754
23c7a0108f59 symtable_update_free_vars(), symtable_undo_free(),
Barry Warsaw <barry@python.org>
parents: 16753
diff changeset
4400 child = (PySymtableEntryObject *)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4401 PyList_GET_ITEM(ste->ste_children, i);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4402 x = symtable_undo_free(st, child->ste_id, name);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4403 if (x < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4404 return x;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4405 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4406 return 0;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4407 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4408
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4409 /* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4410 This reference is released when the scope is exited, via the DECREF
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4411 in symtable_exit_scope().
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4412 */
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4413
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4414 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4415 symtable_exit_scope(struct symtable *st)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4416 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4417 int end;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4418
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4419 if (st->st_pass == 1 && st->st_nested_scopes)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4420 symtable_update_free_vars(st);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4421 Py_DECREF(st->st_cur);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4422 end = PyList_GET_SIZE(st->st_stack) - 1;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4423 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4424 end);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4425 if (PySequence_DelItem(st->st_stack, end) < 0)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4426 return -1;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4427 return 0;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4428 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4429
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4430 static void
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4431 symtable_enter_scope(struct symtable *st, char *name, int type,
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4432 int lineno)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4433 {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4434 PySymtableEntryObject *prev = NULL;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4435
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4436 if (st->st_cur) {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4437 prev = st->st_cur;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4438 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4439 Py_DECREF(st->st_cur);
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4440 st->st_errors++;
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4441 return;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4442 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4443 }
16754
23c7a0108f59 symtable_update_free_vars(), symtable_undo_free(),
Barry Warsaw <barry@python.org>
parents: 16753
diff changeset
4444 st->st_cur = (PySymtableEntryObject *)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4445 PySymtableEntry_New(st, name, type, lineno);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4446 if (strcmp(name, TOP) == 0)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4447 st->st_global = st->st_cur->ste_symbols;
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
4448 if (prev && st->st_pass == 1) {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4449 if (PyList_Append(prev->ste_children,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4450 (PyObject *)st->st_cur) < 0)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4451 st->st_errors++;
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16699
diff changeset
4452 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4453 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4454
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4455 static int
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4456 symtable_lookup(struct symtable *st, char *name)
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4457 {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4458 char buffer[MANGLE_LEN];
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4459 PyObject *v;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4460 int flags;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4461
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4462 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4463 name = buffer;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4464 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4465 if (v == NULL) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4466 if (PyErr_Occurred())
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4467 return -1;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4468 else
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4469 return 0;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4470 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4471
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4472 flags = PyInt_AS_LONG(v);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4473 return flags;
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4474 }
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4475
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4476 static int
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4477 symtable_add_def(struct symtable *st, char *name, int flag)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4478 {
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4479 PyObject *s;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4480 char buffer[MANGLE_LEN];
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4481 int ret;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4482
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4483 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4484 name = buffer;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4485 if ((s = PyString_InternFromString(name)) == NULL)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4486 return -1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4487 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4488 Py_DECREF(s);
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4489 return ret;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4490 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4491
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4492 /* Must only be called with mangled names */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4493
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4494 static int
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4495 symtable_add_def_o(struct symtable *st, PyObject *dict,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4496 PyObject *name, int flag)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4497 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4498 PyObject *o;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4499 int val;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4500
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4501 if ((o = PyDict_GetItem(dict, name))) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4502 val = PyInt_AS_LONG(o);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4503 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4504 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4505 PyString_AsString(name));
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
4506 PyErr_SyntaxLocation(st->st_filename,
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4507 st->st_cur->ste_lineno);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4508 return -1;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4509 }
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4510 val |= flag;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4511 } else
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4512 val = flag;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4513 o = PyInt_FromLong(val);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4514 if (PyDict_SetItem(dict, name, o) < 0) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4515 Py_DECREF(o);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4516 return -1;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4517 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4518 Py_DECREF(o);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4519
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4520 if (flag & DEF_PARAM) {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16523
diff changeset
4521 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4522 return -1;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4523 } else if (flag & DEF_GLOBAL) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4524 /* XXX need to update DEF_GLOBAL for other flags too;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4525 perhaps only DEF_FREE_GLOBAL */
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4526 if ((o = PyDict_GetItem(st->st_global, name))) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4527 val = PyInt_AS_LONG(o);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4528 val |= flag;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4529 } else
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4530 val = flag;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4531 o = PyInt_FromLong(val);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4532 if (PyDict_SetItem(st->st_global, name, o) < 0) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4533 Py_DECREF(o);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4534 return -1;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4535 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4536 Py_DECREF(o);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4537 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4538 return 0;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4539 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4540
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4541 #define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4542
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4543 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4544 symtable_node(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4545 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4546 int i, start = 0;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4547
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4548 loop:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4549 switch (TYPE(n)) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4550 case funcdef: {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4551 char *func_name = STR(CHILD(n, 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4552 symtable_add_def(st, func_name, DEF_LOCAL);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4553 symtable_default_args(st, CHILD(n, 2));
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4554 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4555 symtable_funcdef(st, n);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4556 symtable_exit_scope(st);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4557 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4558 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4559 case lambdef:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4560 if (NCH(n) == 4)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4561 symtable_default_args(st, CHILD(n, 1));
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4562 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4563 symtable_funcdef(st, n);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4564 symtable_exit_scope(st);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4565 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4566 case classdef: {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4567 char *tmp, *class_name = STR(CHILD(n, 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4568 symtable_add_def(st, class_name, DEF_LOCAL);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4569 if (TYPE(CHILD(n, 2)) == LPAR) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4570 node *bases = CHILD(n, 3);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4571 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4572 for (i = 0; i < NCH(bases); i += 2) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4573 symtable_node(st, CHILD(bases, i));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4574 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4575 }
16421
aa844711463a Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16408
diff changeset
4576 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4577 tmp = st->st_private;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4578 st->st_private = class_name;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4579 symtable_node(st, CHILD(n, NCH(n) - 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4580 st->st_private = tmp;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4581 symtable_exit_scope(st);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4582 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4583 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4584 case if_stmt:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4585 for (i = 0; i + 3 < NCH(n); i += 4) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4586 if (is_constant_false(NULL, (CHILD(n, i + 1))))
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4587 continue;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4588 symtable_node(st, CHILD(n, i + 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4589 symtable_node(st, CHILD(n, i + 3));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4590 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4591 if (i + 2 < NCH(n))
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4592 symtable_node(st, CHILD(n, i + 2));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4593 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4594 case global_stmt:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4595 symtable_global(st, n);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4596 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4597 case import_stmt:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4598 symtable_import(st, n);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4599 break;
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4600 case exec_stmt: {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4601 st->st_cur->ste_optimized |= OPT_EXEC;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4602 symtable_node(st, CHILD(n, 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4603 if (NCH(n) > 2)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4604 symtable_node(st, CHILD(n, 3));
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4605 else
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4606 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4607 if (NCH(n) > 4)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4608 symtable_node(st, CHILD(n, 5));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4609 break;
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4610
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4611 }
16680
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4612 case assert_stmt:
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4613 if (Py_OptimizeFlag)
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4614 return;
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4615 if (NCH(n) == 2) {
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4616 n = CHILD(n, 1);
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4617 goto loop;
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4618 } else {
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4619 symtable_node(st, CHILD(n, 1));
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4620 n = CHILD(n, 3);
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4621 goto loop;
17ed61fd5b65 When running python -O, do not include blocks defined in asserts in
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16677
diff changeset
4622 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4623 case except_clause:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4624 if (NCH(n) == 4)
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4625 symtable_assign(st, CHILD(n, 3), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4626 if (NCH(n) > 1) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4627 n = CHILD(n, 1);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4628 goto loop;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4629 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4630 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4631 case del_stmt:
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4632 symtable_assign(st, CHILD(n, 1), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4633 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4634 case expr_stmt:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4635 if (NCH(n) == 1)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4636 n = CHILD(n, 0);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4637 else {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4638 if (TYPE(CHILD(n, 1)) == augassign) {
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4639 symtable_assign(st, CHILD(n, 0), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4640 symtable_node(st, CHILD(n, 2));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4641 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4642 } else {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4643 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4644 for (i = 0; i < NCH(n) - 2; i += 2)
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4645 symtable_assign(st, CHILD(n, i), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4646 n = CHILD(n, NCH(n) - 1);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4647 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4648 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4649 goto loop;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4650 /* watchout for fall-through logic below */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4651 case argument:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4652 if (NCH(n) == 3) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4653 n = CHILD(n, 2);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4654 goto loop;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4655 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4656 case listmaker:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4657 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4658 symtable_list_comprehension(st, CHILD(n, 1));
16138
49b7c1bc6004 Visit the initial test element of the listmaker for a list
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16137
diff changeset
4659 n = CHILD(n, 0);
49b7c1bc6004 Visit the initial test element of the listmaker for a list
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16137
diff changeset
4660 goto loop;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4661 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4662 case atom:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4663 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4664 symtable_add_use(st, STR(CHILD(n, 0)));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4665 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4666 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4667 case for_stmt:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4668 if (TYPE(n) == for_stmt) {
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4669 symtable_assign(st, CHILD(n, 1), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4670 start = 3;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4671 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4672 default:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4673 if (NCH(n) == 1) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4674 n = CHILD(n, 0);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4675 goto loop;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4676 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4677 for (i = start; i < NCH(n); ++i)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4678 if (TYPE(CHILD(n, i)) >= single_input)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4679 symtable_node(st, CHILD(n, i));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4680 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4681 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4682
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4683 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4684 symtable_funcdef(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4685 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4686 node *body;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4687
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4688 if (TYPE(n) == lambdef) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4689 if (NCH(n) == 4)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4690 symtable_params(st, CHILD(n, 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4691 } else
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4692 symtable_params(st, CHILD(n, 2));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4693 body = CHILD(n, NCH(n) - 1);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4694 symtable_node(st, body);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4695 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4696
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4697 /* The next two functions parse the argument tuple.
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4698 symtable_default_arg() checks for names in the default arguments,
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4699 which are references in the defining scope. symtable_params()
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4700 parses the parameter names, which are defined in the function's
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4701 body.
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4702
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4703 varargslist:
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4704 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4705 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4706 */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4707
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4708 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4709 symtable_default_args(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4710 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4711 node *c;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4712 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4713
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4714 if (TYPE(n) == parameters) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4715 n = CHILD(n, 1);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4716 if (TYPE(n) == RPAR)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4717 return;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4718 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4719 REQ(n, varargslist);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4720 for (i = 0; i < NCH(n); i += 2) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4721 c = CHILD(n, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4722 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4723 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4724 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4725 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4726 symtable_node(st, CHILD(n, i));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4727 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4728 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4729
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4730 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4731 symtable_params(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4732 {
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4733 int i, complex = -1, ext = 0;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4734 node *c = NULL;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4735
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4736 if (TYPE(n) == parameters) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4737 n = CHILD(n, 1);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4738 if (TYPE(n) == RPAR)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4739 return;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4740 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4741 REQ(n, varargslist);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4742 for (i = 0; i < NCH(n); i += 2) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4743 c = CHILD(n, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4744 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4745 ext = 1;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4746 break;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4747 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4748 if (TYPE(c) == test) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4749 continue;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4750 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4751 if (TYPE(CHILD(c, 0)) == NAME)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4752 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4753 else {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4754 char nbuf[10];
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4755 sprintf(nbuf, ".%d", i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4756 symtable_add_def(st, nbuf, DEF_PARAM);
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4757 complex = i;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4758 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4759 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4760 if (ext) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4761 c = CHILD(n, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4762 if (TYPE(c) == STAR) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4763 i++;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4764 symtable_add_def(st, STR(CHILD(n, i)),
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4765 DEF_PARAM | DEF_STAR);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4766 i += 2;
16137
883cb0e31bb2 prevent symtable_params() from dereferencing off the end of the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16096
diff changeset
4767 if (i >= NCH(n))
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4768 c = NULL;
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4769 else
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4770 c = CHILD(n, i);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4771 }
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4772 if (c && TYPE(c) == DOUBLESTAR) {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4773 i++;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4774 symtable_add_def(st, STR(CHILD(n, i)),
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4775 DEF_PARAM | DEF_DOUBLESTAR);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4776 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4777 }
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4778 if (complex >= 0) {
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4779 int j;
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4780 for (j = 0; j <= complex; j++) {
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4781 c = CHILD(n, j);
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4782 if (TYPE(c) == COMMA)
16699
7334b2cedda8 Fix for implicit tuple + default arguments, courtesy of Michael Hudson.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16680
diff changeset
4783 c = CHILD(n, ++j);
7334b2cedda8 Fix for implicit tuple + default arguments, courtesy of Michael Hudson.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16680
diff changeset
4784 else if (TYPE(c) == EQUAL)
7334b2cedda8 Fix for implicit tuple + default arguments, courtesy of Michael Hudson.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16680
diff changeset
4785 c = CHILD(n, j += 3);
16250
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4786 if (TYPE(CHILD(c, 0)) == LPAR)
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4787 symtable_params_fplist(st, CHILD(c, 1));
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4788 }
aab871635ffa Fix bug reported by Ka-Ping Yee: The compiler botched parsing function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16138
diff changeset
4789 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4790 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4791
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4792 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4793 symtable_params_fplist(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4794 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4795 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4796 node *c;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4797
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4798 REQ(n, fplist);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4799 for (i = 0; i < NCH(n); i += 2) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4800 c = CHILD(n, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4801 REQ(c, fpdef);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4802 if (NCH(c) == 1)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4803 symtable_add_def(st, STR(CHILD(c, 0)),
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4804 DEF_PARAM | DEF_INTUPLE);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4805 else
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4806 symtable_params_fplist(st, CHILD(c, 1));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4807 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4808
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4809 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4810
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4811 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4812 symtable_global(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4813 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4814 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4815
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4816 for (i = 1; i < NCH(n); i += 2) {
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4817 char *name = STR(CHILD(n, i));
16783
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4818 int flags;
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4819
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4820 flags = symtable_lookup(st, name);
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4821 if (flags < 0)
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4822 continue;
16783
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4823 if (flags && flags != DEF_GLOBAL) {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4824 char buf[500];
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4825 if (flags & DEF_PARAM) {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4826 PyErr_Format(PyExc_SyntaxError,
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4827 "name '%.400s' is local and global",
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4828 name);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
4829 PyErr_SyntaxLocation(st->st_filename,
16783
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4830 st->st_cur->ste_lineno);
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4831 st->st_errors++;
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4832 return;
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4833 } else if (flags & DEF_LOCAL) {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4834 sprintf(buf, GLOBAL_AFTER_ASSIGN, name);
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4835 if (PyErr_Warn(PyExc_SyntaxWarning,
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4836 buf) < 0) {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4837 /* XXX set line number? */
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4838 st->st_errors++;
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4839 }
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4840 } else {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4841 sprintf(buf, GLOBAL_AFTER_USE, name);
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4842 if (PyErr_Warn(PyExc_SyntaxWarning,
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4843 buf) < 0) {
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4844 /* XXX set line number? */
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4845 st->st_errors++;
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4846 }
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4847 }
4feea99be777 Add warnings about undefined "global"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16781
diff changeset
4848 }
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4849 symtable_add_def(st, name, DEF_GLOBAL);
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4850 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4851 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4852
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4853 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4854 symtable_list_comprehension(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4855 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4856 char tmpname[12];
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4857
16638
79568c0d3e77 Change temp names created by listcomps from [%d] to _[%d], so the one-liner
Tim Peters <tim.peters@gmail.com>
parents: 16571
diff changeset
4858 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4859 symtable_add_def(st, tmpname, DEF_LOCAL);
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4860 symtable_assign(st, CHILD(n, 1), 0);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4861 symtable_node(st, CHILD(n, 3));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4862 if (NCH(n) == 5)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4863 symtable_node(st, CHILD(n, 4));
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4864 --st->st_tmpname;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4865 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4866
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4867 static void
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4868 symtable_import(struct symtable *st, node *n)
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4869 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4870 int i;
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4871 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4872 | 'from' dotted_name 'import'
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4873 ('*' | import_as_name (',' import_as_name)*)
16394
f700e6b8de1f Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16357
diff changeset
4874 import_as_name: NAME [NAME NAME]
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4875 */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4876 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4877 node *dotname = CHILD(n, 1);
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4878 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4879 /* check for bogus imports */
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4880 if (n->n_lineno >= st->st_future->ff_last_lineno) {
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4881 PyErr_SetString(PyExc_SyntaxError,
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4882 LATE_FUTURE);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16831
diff changeset
4883 PyErr_SyntaxLocation(st->st_filename,
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4884 n->n_lineno);
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4885 st->st_errors++;
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4886 return;
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4887 }
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
4888 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4889 if (TYPE(CHILD(n, 3)) == STAR) {
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4890 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4891 } else {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4892 for (i = 3; i < NCH(n); i += 2) {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4893 node *c = CHILD(n, i);
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4894 if (NCH(c) > 1) /* import as */
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4895 symtable_assign(st, CHILD(c, 2),
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4896 DEF_IMPORT);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4897 else
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4898 symtable_assign(st, CHILD(c, 0),
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4899 DEF_IMPORT);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4900 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4901 }
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4902 } else {
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4903 for (i = 1; i < NCH(n); i += 2) {
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4904 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4905 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4906 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4907 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4908
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4909 static void
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4910 symtable_assign(struct symtable *st, node *n, int flag)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4911 {
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4912 node *tmp;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4913 int i;
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4914
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4915 loop:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4916 switch (TYPE(n)) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4917 case lambdef:
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4918 /* invalid assignment, e.g. lambda x:x=2. The next
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4919 pass will catch this error. */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4920 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4921 case power:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4922 if (NCH(n) > 2) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4923 for (i = 2; i < NCH(n); ++i)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4924 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4925 symtable_node(st, CHILD(n, i));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4926 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4927 if (NCH(n) > 1) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4928 symtable_node(st, CHILD(n, 0));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4929 symtable_node(st, CHILD(n, 1));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4930 } else {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4931 n = CHILD(n, 0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4932 goto loop;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4933 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4934 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4935 case listmaker:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4936 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4937 symtable_list_comprehension(st, CHILD(n, 1));
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4938 else {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4939 for (i = 0; i < NCH(n); i += 2)
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4940 symtable_assign(st, CHILD(n, i), flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4941 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4942 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4943 case exprlist:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4944 case testlist:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4945 if (NCH(n) == 1) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4946 n = CHILD(n, 0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4947 goto loop;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4948 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4949 else {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4950 int i;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4951 for (i = 0; i < NCH(n); i += 2)
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4952 symtable_assign(st, CHILD(n, i), flag);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4953 return;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4954 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4955 goto loop;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4956 case atom:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4957 tmp = CHILD(n, 0);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4958 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4959 n = CHILD(n, 1);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4960 goto loop;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4961 } else if (TYPE(tmp) == NAME)
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4962 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4963 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4964 case dotted_as_name:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4965 if (NCH(n) == 3)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4966 symtable_add_def(st, STR(CHILD(n, 2)),
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4967 DEF_LOCAL | flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4968 else
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4969 symtable_add_def(st,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4970 STR(CHILD(CHILD(n,
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4971 0), 0)),
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4972 DEF_LOCAL | flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4973 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4974 case dotted_name:
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4975 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4976 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4977 case NAME:
16357
9f2ca855fa44 Enforce two illegal import statements that were outlawed in the
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16353
diff changeset
4978 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4979 return;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4980 default:
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4981 if (NCH(n) == 0)
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4982 return;
16677
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4983 if (NCH(n) == 1) {
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4984 n = CHILD(n, 0);
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4985 goto loop;
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4986 }
16677
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4987 /* Should only occur for errors like x + 1 = 1,
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4988 which will be caught in the next pass. */
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4989 for (i = 0; i < NCH(n); ++i)
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4990 if (TYPE(CHILD(n, i)) >= single_input)
b955e74955d5 Tolerate ill-formed trees in symtable_assign(). Fixes SF bug 132510.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16658
diff changeset
4991 symtable_assign(st, CHILD(n, i), flag);
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4992 }
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4993 }