annotate Python/compile.c @ 9808:0bfaff11c573 legacy-trunk

Ty Sarna writes: The following patches (relative to 1.5.2b1) enable Python dynamic loading to work on NetBSD platforms that use ELF (presnetly mips and alpha systems). They automaticly determine wether the system is ELF or a.out rather than using astatic list of platforms so that when other NetBSD platforms move to ELF, python will continue to work without change.
author Guido van Rossum <guido@python.org>
date Thu, 07 Jan 1999 21:50:41 +0000
parents 98a6fc6877ae
children b7bcc2cda1b3
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 /***********************************************************
2062
d0d0a69b5ca3 Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2052
diff changeset
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
d0d0a69b5ca3 Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2052
diff changeset
3 The Netherlands.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
4
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
5 All Rights Reserved
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
6
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
8 documentation for any purpose and without fee is hereby granted,
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
9 provided that the above copyright notice appear in all copies and that
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
10 both that copyright notice and this permission notice appear in
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
12 Centrum or CWI or Corporation for National Research Initiatives or
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
13 CNRI not be used in advertising or publicity pertaining to
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
14 distribution of the software without specific, written prior
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
15 permission.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
16
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
17 While CWI is the initial source for this software, a modified version
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
18 is made available by the Corporation for National Research Initiatives
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
19 (CNRI) at the Internet address ftp://ftp.python.org.
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
20
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 4403
diff changeset
28 PERFORMANCE OF THIS SOFTWARE.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
29
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
30 ******************************************************************/
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 120
diff changeset
31
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 /* Compile an expression node to intermediate code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
34 /* 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
35 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
36 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
37 XXX Generate simple jump for break/return outside 'try...finally'
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
38 XXX Allow 'continue' inside try-finally
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
39 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
40 XXX other JAR tricks?
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
41 */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
43 #ifndef NO_PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
44 #define PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
45 #endif
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
46
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
47 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
48
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 #include "node.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 #include "token.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 #include "graminit.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 #include "compile.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 #include "opcode.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
54 #include "structmember.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
55
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
56 #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
57
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
58 /* 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
59 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
60 (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
61 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
62 #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
63 #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
64 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
65 #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
66 #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
67 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
68 #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
69 #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
70 #endif
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
71
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
72 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
73
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
74 #define OP_DELETE 0
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
75 #define OP_ASSIGN 1
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
76 #define OP_APPLY 2
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
77
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
78 #define OFF(x) offsetof(PyCodeObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
79
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
80 static struct memberlist code_memberlist[] = {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
81 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
82 {"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
83 {"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
84 {"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
85 {"co_code", T_OBJECT, OFF(co_code), READONLY},
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
87 {"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
88 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
568
92509d304e47 add READONLY to member list.
Guido van Rossum <guido@python.org>
parents: 544
diff changeset
89 {"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
90 {"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
91 {"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
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
93 {NULL} /* Sentinel */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
94 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
95
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
96 static PyObject *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
97 code_getattr(co, name)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
98 PyCodeObject *co;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
99 char *name;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
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 return PyMember_Get((char *)co, code_memberlist, name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
102 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 static void
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
105 code_dealloc(co)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
106 PyCodeObject *co;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 {
5373
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_code);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
109 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
110 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
111 Py_XDECREF(co->co_varnames);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
112 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
113 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
114 Py_XDECREF(co->co_lnotab);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
115 PyMem_DEL(co);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
118 static PyObject *
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
119 code_repr(co)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
120 PyCodeObject *co;
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
121 {
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
122 char buf[500];
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
123 int lineno = -1;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
124 unsigned char *p;
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
125 char *filename = "???";
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
126 char *name = "???";
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
127
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
128 _PyCode_GETCODEPTR(co, &p);
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
129 if (*p == SET_LINENO)
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
130 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
131 if (co->co_filename && PyString_Check(co->co_filename))
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
132 filename = PyString_AsString(co->co_filename);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
133 if (co->co_name && PyString_Check(co->co_name))
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
134 name = PyString_AsString(co->co_name);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
135 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
136 name, (long)co, filename, lineno);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
137 return PyString_FromString(buf);
1029
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
138 }
2f9805c963e8 Give code objects a more useful representation.
Guido van Rossum <guido@python.org>
parents: 792
diff changeset
139
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
140 static int
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
141 code_compare(co, cp)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
142 PyCodeObject *co, *cp;
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
143 {
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
144 int cmp;
6186
2e755d1ff661 Cprrect stuoid tyops -- was comparing variabes with themselves because
Guido van Rossum <guido@python.org>
parents: 5901
diff changeset
145 cmp = co->co_argcount - cp->co_argcount;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
146 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
147 cmp = co->co_nlocals - cp->co_nlocals;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
148 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
149 cmp = co->co_flags - cp->co_flags;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
150 if (cmp) return cmp;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
151 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
152 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
153 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
154 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
155 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
156 if (cmp) return cmp;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
158 return cmp;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
159 }
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
160
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
161 static long
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
162 code_hash(co)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
163 PyCodeObject *co;
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
164 {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
165 long h, h1, h2, h3, h4;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
166 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
167 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
168 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
169 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
170 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
171 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
172 h4 = PyObject_Hash(co->co_varnames);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
173 if (h4 == -1) return -1;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
174 h = h1 ^ h2 ^ h3 ^ h4 ^
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
175 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
176 if (h == -1) h = -2;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
177 return h;
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
178 }
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
179
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
180 PyTypeObject PyCode_Type = {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
181 PyObject_HEAD_INIT(&PyType_Type)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 "code",
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
184 sizeof(PyCodeObject),
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 0,
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
186 (destructor)code_dealloc, /*tp_dealloc*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 0, /*tp_print*/
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
188 (getattrfunc)code_getattr, /*tp_getattr*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 0, /*tp_setattr*/
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
190 (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
191 (reprfunc)code_repr, /*tp_repr*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 0, /*tp_as_number*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 0, /*tp_as_sequence*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 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
195 (hashfunc)code_hash, /*tp_hash*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
5287
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
198 #define NAME_CHARS \
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
199 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
200
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
201 PyCodeObject *
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
202 PyCode_New(argcount, nlocals, stacksize, flags,
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
203 code, consts, names, varnames, filename, name,
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
204 firstlineno, lnotab)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
205 int argcount;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
206 int nlocals;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
207 int stacksize;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
208 int flags;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
209 PyObject *code;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
210 PyObject *consts;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
211 PyObject *names;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
212 PyObject *varnames;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
213 PyObject *filename;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
214 PyObject *name;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
215 int firstlineno;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
216 PyObject *lnotab;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
218 PyCodeObject *co;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 int i;
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
220 PyBufferProcs *pb;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 /* Check argument types */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
222 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
223 code == NULL ||
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
224 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
225 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
226 varnames == NULL || !PyTuple_Check(varnames) ||
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
227 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
228 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
229 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
230 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 }
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
233 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
234 if (pb == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
235 pb->bf_getreadbuffer == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
236 pb->bf_getsegcount == NULL ||
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
237 (*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
238 {
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
239 PyErr_BadInternalCall();
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
240 return NULL;
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
241 }
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
242 /* Make sure names and varnames are all strings, & intern them */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
243 for (i = PyTuple_Size(names); --i >= 0; ) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
244 PyObject *v = PyTuple_GetItem(names, i);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
245 if (v == NULL || !PyString_Check(v)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
246 PyErr_BadInternalCall();
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
247 return NULL;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
248 }
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
249 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
250 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
251 for (i = PyTuple_Size(varnames); --i >= 0; ) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
252 PyObject *v = PyTuple_GetItem(varnames, i);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
253 if (v == NULL || !PyString_Check(v)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
254 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 }
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
257 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
258 }
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
259 /* 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
260 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
261 PyObject *v = PyTuple_GetItem(consts, i);
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
262 char *p;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
263 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
264 continue;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
265 p = PyString_AsString(v);
5287
5af766a1b531 Tweaks to keep the Microsoft compiler quier.
Guido van Rossum <guido@python.org>
parents: 5264
diff changeset
266 if ((int)strspn(p, NAME_CHARS)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
267 != PyString_Size(v))
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
268 continue;
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
269 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
271 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 if (co != NULL) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
273 co->co_argcount = argcount;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
274 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
275 co->co_stacksize = stacksize;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
276 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
277 Py_INCREF(code);
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 9215
diff changeset
278 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
279 Py_INCREF(consts);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 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
281 Py_INCREF(names);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 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
283 Py_INCREF(varnames);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
284 co->co_varnames = varnames;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
285 Py_INCREF(filename);
266
b5826bf29677 Changed and exported newcodeobject() interface, for ".pyc" files.
Guido van Rossum <guido@python.org>
parents: 238
diff changeset
286 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
287 Py_INCREF(name);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
288 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
289 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
290 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
291 co->co_lnotab = lnotab;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 /* Data structure used internally */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
298
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 struct compiling {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
300 PyObject *c_code; /* string */
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
301 PyObject *c_consts; /* list of objects */
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
302 PyObject *c_names; /* list of strings (names) */
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
303 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
304 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
305 PyObject *c_varnames; /* list (inverse of c_locals) */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
306 int c_nlocals; /* index of next local */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
307 int c_argcount; /* number of top-level arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
308 int c_flags; /* same as co_flags */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 int c_nexti; /* index into c_code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 int c_errors; /* counts errors occurred */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
311 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
312 int c_interactive; /* generating code for interactive command */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
313 int c_loops; /* counts nested loops */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
314 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
315 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
316 int c_nblocks; /* current block stack level */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
317 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
318 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
319 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
320 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
321 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
322 int c_firstlineno;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
323 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
324 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
325 #ifdef PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
326 char *c_private; /* for private name mangling */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
327 #endif
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
330
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
331 /* Error message including line number */
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
332
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
333 static void
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
334 com_error(c, exc, msg)
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
335 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
336 PyObject *exc;
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
337 char *msg;
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
338 {
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
339 int n = strlen(msg);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
340 PyObject *v;
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
341 char buffer[30];
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
342 char *s;
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
343 c->c_errors++;
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
344 if (c->c_lineno <= 1) {
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
345 /* Unknown line number or single interactive command */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
346 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
347 return;
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
348 }
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
349 sprintf(buffer, " (line %d)", c->c_lineno);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
350 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
351 if (v == NULL)
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
352 return; /* MemoryError, too bad */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
353 s = PyString_AS_STRING((PyStringObject *)v);
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
354 strcpy(s, msg);
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
355 strcat(s, buffer);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
356 PyErr_SetObject(exc, v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
357 Py_DECREF(v);
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
358 }
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
359
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
360
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
361 /* Interface to the block stack */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
362
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
363 static void
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
364 block_push(c, type)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
365 struct compiling *c;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
366 int type;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
367 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
368 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
369 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
370 "too many statically nested blocks");
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
371 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
372 else {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
373 c->c_block[c->c_nblocks++] = type;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
374 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
375 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
376
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
377 static void
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
378 block_pop(c, type)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
379 struct compiling *c;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
380 int type;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
381 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
382 if (c->c_nblocks > 0)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
383 c->c_nblocks--;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
384 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
385 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
386 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
387 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
388
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
389
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
390 /* Prototype forward declarations */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
391
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
392 static int com_init Py_PROTO((struct compiling *, char *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
393 static void com_free Py_PROTO((struct compiling *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
394 static void com_push Py_PROTO((struct compiling *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
395 static void com_pop Py_PROTO((struct compiling *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
396 static void com_done Py_PROTO((struct compiling *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
397 static void com_node Py_PROTO((struct compiling *, struct _node *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
398 static void com_factor Py_PROTO((struct compiling *, struct _node *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
399 static void com_addbyte Py_PROTO((struct compiling *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
400 static void com_addint Py_PROTO((struct compiling *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
401 static void com_addoparg Py_PROTO((struct compiling *, int, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
402 static void com_addfwref Py_PROTO((struct compiling *, int, int *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
403 static void com_backpatch Py_PROTO((struct compiling *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
404 static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
405 static int com_addconst Py_PROTO((struct compiling *, PyObject *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
406 static int com_addname Py_PROTO((struct compiling *, PyObject *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
407 static void com_addopname Py_PROTO((struct compiling *, int, node *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
408 static void com_list Py_PROTO((struct compiling *, node *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
409 static int com_argdefs Py_PROTO((struct compiling *, node *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
410 static int com_newlocal Py_PROTO((struct compiling *, char *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
411 static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
412 static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
413 struct compiling *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
414 static PyObject *parsestrplus Py_PROTO((node *));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
415 static PyObject *parsestr Py_PROTO((char *));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 static int
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
418 com_init(c, filename)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 struct compiling *c;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
420 char *filename;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
422 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
423 1000)) == NULL)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 goto fail_3;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
425 if ((c->c_consts = PyList_New(0)) == NULL)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 goto fail_2;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
427 if ((c->c_names = PyList_New(0)) == NULL)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 goto fail_1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
429 if ((c->c_globals = PyDict_New()) == NULL)
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
430 goto fail_0;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
431 if ((c->c_locals = PyDict_New()) == NULL)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
432 goto fail_00;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
433 if ((c->c_varnames = PyList_New(0)) == NULL)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
434 goto fail_000;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
435 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
436 1000)) == NULL)
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
437 goto fail_0000;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
438 c->c_nlocals = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
439 c->c_argcount = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
440 c->c_flags = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 c->c_nexti = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 c->c_errors = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
443 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
444 c->c_interactive = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
445 c->c_loops = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
446 c->c_begin = 0;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
447 c->c_nblocks = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
448 c->c_filename = filename;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
449 c->c_name = "?";
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
450 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
451 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
452 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
453 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
454 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
455 c->c_last_line = 0;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
456 c-> c_lnotab_next = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 return 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
459 fail_0000:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
460 Py_DECREF(c->c_lnotab);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
461 fail_000:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
462 Py_DECREF(c->c_locals);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
463 fail_00:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
464 Py_DECREF(c->c_globals);
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
465 fail_0:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
466 Py_DECREF(c->c_names);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 fail_1:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
468 Py_DECREF(c->c_consts);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 fail_2:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
470 Py_DECREF(c->c_code);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 fail_3:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 return 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 com_free(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
479 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
480 Py_XDECREF(c->c_consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
481 Py_XDECREF(c->c_names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
482 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
483 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
484 Py_XDECREF(c->c_varnames);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
485 Py_XDECREF(c->c_lnotab);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 static void
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
489 com_push(c, n)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
490 struct compiling *c;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
491 int n;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
492 {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
493 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
494 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
495 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
496 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
497
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
498 static void
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
499 com_pop(c, n)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
500 struct compiling *c;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
501 int n;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
502 {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
503 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
504 /* fprintf(stderr,
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
505 "%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
506 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
507 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
508 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
509 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
510 else
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
511 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
512 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
513
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
514 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 com_done(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 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
519 _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
520 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
521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 com_addbyte(c, byte)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 int byte;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
529 int len;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 if (byte < 0 || byte > 255) {
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
532 /*
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2005
diff changeset
534 fatal("com_addbyte: byte out of range");
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
535 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
536 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
537 "com_addbyte: byte out of range");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 if (c->c_code == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 return;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
541 len = PyString_Size(c->c_code);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542 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
543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
544 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 com_addint(c, x)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 int x;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
556 com_addbyte(c, x & 0xff);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 static void
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
561 com_add_lnotab(c, addr, line)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
562 struct compiling *c;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
563 int addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
564 int line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
565 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
566 int size;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
567 char *p;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
568 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
569 return;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
570 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
571 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
572 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
573 c->c_errors++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
574 return;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
575 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
576 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
577 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
578 *p++ = addr;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
579 *p++ = line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
580 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
581 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
582
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
583 static void
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
584 com_set_lineno(c, lineno)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
585 struct compiling *c;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
586 int lineno;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
587 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
588 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
589 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
590 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
591 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
592 else {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
593 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
594 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
595 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
596 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
597 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
598 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
599 trunc_addr = 255;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
600 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
601 trunc_line = 255;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
602 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
603 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
604 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
605 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
606 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
607 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
608 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
609 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
610
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
611 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 com_addoparg(c, op, arg)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 int arg;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 {
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
617 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
618 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
619 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
620 return;
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
621 }
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
622 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
623 com_addint(c, arg);
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
627 com_addfwref(c, op, p_anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 int *p_anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
632 /* Compile a forward reference for backpatching */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 int here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 here = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 anchor = *p_anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 *p_anchor = here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 com_backpatch(c, anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 int anchor; /* Must be nonzero */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 int target = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 int dist;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
650 int prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 /* Make the JUMP instruction at anchor point to target */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
653 prev = code[anchor] + (code[anchor+1] << 8);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
654 dist = target - (anchor+2);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
655 code[anchor] = dist & 0xff;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
656 code[anchor+1] = dist >> 8;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 if (!prev)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 anchor -= prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
661 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662
544
d0baa8300005 Minor changes.
Guido van Rossum <guido@python.org>
parents: 493
diff changeset
663 /* Handle literals and names uniformly */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 com_add(c, list, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
668 PyObject *list;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
669 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
671 int n = PyList_Size(list);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
672 int i;
7946
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
673 /* XXX This is quadratic in the number of names per compilation unit.
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
674 XXX Should use a dictionary. */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
675 for (i = n; --i >= 0; ) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
676 PyObject *w = PyList_GetItem(list, i);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
677 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
678 return i;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
679 }
5610
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5566
diff changeset
680 /* Check for error from PyObject_Compare */
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5566
diff changeset
681 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 c->c_errors++;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
683 return n;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 com_addconst(c, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
689 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 return com_add(c, c->c_consts, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
693
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 com_addname(c, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
697 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 return com_add(c, c->c_names, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
701
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
702 #ifdef PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
703 static int
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
704 com_mangle(c, name, buffer, maxlen)
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
705 struct compiling *c;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
706 char *name;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
707 char *buffer;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
708 int maxlen;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
709 {
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
710 /* Name mangling: __private becomes _classname__private.
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
711 This is independent from how the name is used. */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
712 char *p;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
713 int nlen, plen;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
714 nlen = strlen(name);
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
715 if (nlen+2 >= maxlen)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
716 return 0; /* Don't mangle __extremely_long_names */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
717 if (name[nlen-1] == '_' && name[nlen-2] == '_')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
718 return 0; /* Don't mangle __whatever__ */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
719 p = c->c_private;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
720 /* Strip leading underscores from class name */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
721 while (*p == '_')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
722 p++;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
723 if (*p == '\0')
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
724 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
725 plen = strlen(p);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
726 if (plen + nlen >= maxlen)
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
727 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
728 /* 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
729 buffer[0] = '_';
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
730 strncpy(buffer+1, p, plen);
4131
6b589334e0e9 Afterthough: leave both leading underscores in,
Guido van Rossum <guido@python.org>
parents: 4130
diff changeset
731 strcpy(buffer+1+plen, name);
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
733 return 1;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
734 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
735 #endif
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
736
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737 static void
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
738 com_addopnamestr(c, op, name)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 int op;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
741 char *name;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
743 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 int i;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
745 #ifdef PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
746 char buffer[256];
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
747 if (name != NULL && name[0] == '_' && name[1] == '_' &&
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
748 c->c_private != NULL &&
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
749 com_mangle(c, name, buffer, (int)sizeof(buffer)))
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
750 name = buffer;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
751 #endif
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
752 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
755 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
756 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 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
758 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 }
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
761 switch (op) {
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
762 case LOAD_NAME:
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
763 case STORE_NAME:
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
764 case DELETE_NAME:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
765 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
766 switch (op) {
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
767 case LOAD_NAME: op = LOAD_GLOBAL; break;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
768 case STORE_NAME: op = STORE_GLOBAL; break;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
769 case DELETE_NAME: op = DELETE_GLOBAL; break;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
770 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
771 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
772 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 com_addoparg(c, op, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
776 static void
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
777 com_addopname(c, op, n)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
778 struct compiling *c;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
779 int op;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
780 node *n;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
781 {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
782 char *name;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
783 char buffer[1000];
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
784 /* 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
785 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
786 bothered right now */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
787 if (TYPE(n) == STAR)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
788 name = "*";
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
789 else if (TYPE(n) == dotted_name) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
790 char *p = buffer;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
791 int i;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
792 name = buffer;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
793 for (i = 0; i < NCH(n); i += 2) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
794 char *s = STR(CHILD(n, i));
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
795 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
796 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
797 "dotted_name too long");
2367
915fabec64a3 fix typo (== for =) in assignment
Guido van Rossum <guido@python.org>
parents: 2310
diff changeset
798 name = NULL;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
799 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
800 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
801 if (p != buffer)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
802 *p++ = '.';
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
803 strcpy(p, s);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
804 p = strchr(p, '\0');
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
805 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
806 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
807 else {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
808 REQ(n, NAME);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
809 name = STR(n);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
810 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
811 com_addopnamestr(c, op, name);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
812 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
813
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
814 static PyObject *
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
815 parsenumber(co, s)
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
816 struct compiling *co;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 char *s;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
819 extern double atof Py_PROTO((const char *));
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
820 char *end;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 long x;
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
822 double dx;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
823 #ifndef WITHOUT_COMPLEX
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3366
diff changeset
824 Py_complex c;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
825 int imflag;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
826 #endif
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
827
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
828 errno = 0;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
829 end = s + strlen(s) - 1;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
830 #ifndef WITHOUT_COMPLEX
3366
c25865884649 only use 'j' for imaginary constants
Guido van Rossum <guido@python.org>
parents: 3349
diff changeset
831 imflag = *end == 'j' || *end == 'J';
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
832 #endif
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
833 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
834 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
835 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
836 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
837 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
838 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
839 if (*end == '\0') {
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
840 if (errno != 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
841 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
842 "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
843 return NULL;
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
844 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
845 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
846 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
847 /* XXX Huge floats may silently fail */
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
848 #ifndef WITHOUT_COMPLEX
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
849 if (imflag) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
850 c.real = 0.;
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
851 PyFPE_START_PROTECT("atof", return 0)
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
852 c.imag = atof(s);
5197
74c12704a0bd New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents: 5183
diff changeset
853 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
854 return PyComplex_FromCComplex(c);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
855 }
6453
c9b139b9c5ff Fixed for WITHOUT_COMPLEX compilation (Jack)
Guido van Rossum <guido@python.org>
parents: 6186
diff changeset
856 else
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
857 #endif
6453
c9b139b9c5ff Fixed for WITHOUT_COMPLEX compilation (Jack)
Guido van Rossum <guido@python.org>
parents: 6186
diff changeset
858 {
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
859 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
860 dx = atof(s);
5197
74c12704a0bd New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents: 5183
diff changeset
861 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
862 return PyFloat_FromDouble(dx);
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5041
diff changeset
863 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
865
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
866 static PyObject *
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 parsestr(s)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 char *s;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
870 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
872 char *buf;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 char *p;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
874 char *end;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 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
876 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
877 int quote = first;
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
878 if (isalpha(quote) || quote == '_')
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
879 quote = *++s;
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
880 if (quote != '\'' && quote != '\"') {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
881 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
885 len = strlen(s);
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
886 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
887 PyErr_BadInternalCall();
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
889 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
890 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
891 s += 2;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
892 len -= 2;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
893 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
894 PyErr_BadInternalCall();
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
895 return NULL;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
896 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
897 }
5264
38878f1cd4f1 Support for alternative string quotes (a"xx", b"xx", c"xx", ...).
Guido van Rossum <guido@python.org>
parents: 5233
diff changeset
898 if (first != quote || strchr(s, '\\') == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
899 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
900 v = PyString_FromStringAndSize((char *)NULL, len);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
901 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
902 end = s + len;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
903 while (s < end) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 if (*s != '\\') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 *p++ = *s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 continue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
908 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 switch (*s++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 /* 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
911 case '\n': break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 case '\\': *p++ = '\\'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 case '\'': *p++ = '\''; break;
1364
132602d854d8 Changes to accept double-quoted strings on input.
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
914 case '\"': *p++ = '\"'; break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
915 case 'b': *p++ = '\b'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
916 case 'f': *p++ = '\014'; break; /* FF */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
917 case 't': *p++ = '\t'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
918 case 'n': *p++ = '\n'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
919 case 'r': *p++ = '\r'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920 case 'v': *p++ = '\013'; break; /* VT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
921 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
922 case '0': case '1': case '2': case '3':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 case '4': case '5': case '6': case '7':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 c = s[-1] - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
925 if ('0' <= *s && *s <= '7') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
926 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
927 if ('0' <= *s && *s <= '7')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
928 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
929 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
930 *p++ = c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
931 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
932 case 'x':
2310
07913fb8f92f use Py_CHARMASK
Guido van Rossum <guido@python.org>
parents: 2241
diff changeset
933 if (isxdigit(Py_CHARMASK(*s))) {
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
934 unsigned int x = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
935 do {
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
936 c = Py_CHARMASK(*s);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 s++;
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
938 x = (x<<4) & ~0xF;
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
939 if (isdigit(c))
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
940 x += c - '0';
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
941 else if (islower(c))
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
942 x += 10 + c - 'a';
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
943 else
9ef9cadd978c Don't use sscanf(s, "%x", &c) to parse \xX... escapes; hardcode it.
Guido van Rossum <guido@python.org>
parents: 6453
diff changeset
944 x += 10 + c - 'A';
2310
07913fb8f92f use Py_CHARMASK
Guido van Rossum <guido@python.org>
parents: 2241
diff changeset
945 } while (isxdigit(Py_CHARMASK(*s)));
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
946 *p++ = x;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
947 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
948 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 /* FALLTHROUGH */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 default: *p++ = '\\'; *p++ = s[-1]; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
952 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
953 _PyString_Resize(&v, (int)(p - buf));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
954 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
955 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
957 static PyObject *
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
958 parsestrplus(n)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
959 node *n;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
960 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
961 PyObject *v;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
962 int i;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
963 REQ(CHILD(n, 0), STRING);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
964 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
965 /* String literal concatenation */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
966 for (i = 1; i < NCH(n) && v != NULL; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
967 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
968 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
969 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
970 return v;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
971 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
972
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 com_list_constructor(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 if (TYPE(n) != testlist)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
981 REQ(n, exprlist);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
982 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
983 len = (NCH(n) + 1) / 2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 com_addoparg(c, BUILD_LIST, len);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
987 com_pop(c, len-1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
988 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
989
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 static void
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
991 com_dictmaker(c, n)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
992 struct compiling *c;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
993 node *n;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
994 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
995 int i;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
996 /* dictmaker: test ':' test (',' test ':' value)* [','] */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
997 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
998 /* 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
999 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
1000 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
1001 com_push(c, 1);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1002 com_node(c, CHILD(n, i+2)); /* value */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1003 com_addbyte(c, ROT_TWO);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1004 com_node(c, CHILD(n, i)); /* key */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1005 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
1006 com_pop(c, 3);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1007 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1008 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1009
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1010 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1011 com_atom(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1014 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015 node *ch;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1016 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 REQ(n, atom);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 ch = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020 switch (TYPE(ch)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021 case LPAR:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1022 if (TYPE(CHILD(n, 1)) == RPAR) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023 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
1024 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
1025 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 case LSQB:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1030 if (TYPE(CHILD(n, 1)) == RSQB) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 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
1032 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
1033 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1034 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 com_list_constructor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1037 case LBRACE: /* '{' [dictmaker] '}' */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1038 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
1039 com_push(c, 1);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1040 if (TYPE(CHILD(n, 1)) != RBRACE)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1041 com_dictmaker(c, CHILD(n, 1));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1042 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1043 case BACKQUOTE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045 com_addbyte(c, UNARY_CONVERT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1046 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1047 case NUMBER:
4315
46d736fb9da3 Added line number to most compile-time error messages.
Guido van Rossum <guido@python.org>
parents: 4131
diff changeset
1048 if ((v = parsenumber(c, STR(ch))) == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1049 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1050 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052 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
1053 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1054 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1055 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
1056 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058 case STRING:
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1059 v = parsestrplus(n);
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1060 if (v == NULL) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1061 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1064 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1065 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
1066 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1067 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068 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
1069 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1070 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 case NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 com_addopname(c, LOAD_NAME, ch);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1073 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075 default:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1076 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1077 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
1078 "com_atom: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1082 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1083 com_slice(c, n, op)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1086 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 com_addbyte(c, op);
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 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 if (TYPE(CHILD(n, 0)) != COLON) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1093 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1094 com_addbyte(c, op+1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1095 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1096 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 com_addbyte(c, op+2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1100 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1101 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 com_node(c, CHILD(n, 2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 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
1106 com_pop(c, 2);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1110 static void
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1111 com_argument(c, n, 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
1112 struct compiling *c;
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
1113 node *n; /* argument */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1114 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
1115 {
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
1116 node *m;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1117 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
1118 if (NCH(n) == 1) {
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1119 if (*pkeywords != NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1120 com_error(c, PyExc_SyntaxError,
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
1121 "non-keyword arg after keyword arg");
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
1122 }
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
1123 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
1124 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
1125 }
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1126 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
1127 }
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
1128 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
1129 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
1130 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
1131 } 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
1132 if (TYPE(m) != NAME) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1133 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
1134 "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
1135 }
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
1136 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1137 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
1138 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
1139 *pkeywords = PyDict_New();
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1140 if (v == NULL || *pkeywords == 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
1141 c->c_errors++;
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
1142 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1143 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
1144 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
1145 "duplicate keyword argument");
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1146 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1147 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
1148 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
1149 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
1150 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
1151 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
1152 }
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
1153 }
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
1154 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
1155 }
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
1156
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1157 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1158 com_call_function(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1159 struct compiling *c;
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
1160 node *n; /* EITHER arglist OR ')' */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1161 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 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
1163 com_addoparg(c, CALL_FUNCTION, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1166 PyObject *keywords = NULL;
4905
32220c5728f5 Check for duplicate keyword arguments at compile time.
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
1167 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
1168 int lineno = n->n_lineno;
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
1169 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
1170 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
1171 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
1172 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
1173 node *ch = CHILD(n, i);
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1174 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
1175 lineno = ch->n_lineno;
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1176 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
1177 }
1fe48009d8ea Add more SET_LINENO instructions in long argument lists
Guido van Rossum <guido@python.org>
parents: 9293
diff changeset
1178 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
1179 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
1180 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
1181 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
1182 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
1183 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1184 Py_XDECREF(keywords);
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
1185 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
1186 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
1187 "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
1188 }
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
1189 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1190 com_pop(c, na + 2*nk);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1191 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 com_select_member(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1197 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1199 com_addopname(c, LOAD_ATTR, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1200 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1202 static void
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1203 com_sliceobj(c, n)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1204 struct compiling *c;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1205 node *n;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1206 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1207 int i=0;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1208 int ns=2; /* number of slice arguments */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1209 node *ch;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1210
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1211 /* first argument */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1212 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
1213 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
1214 com_push(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1215 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1216 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1217 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1218 com_node(c, CHILD(n,i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1219 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1220 REQ(CHILD(n,i),COLON);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1221 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1222 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1223 /* second argument */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1224 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
1225 com_node(c, CHILD(n,i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1226 i++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1227 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1228 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1229 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
1230 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
1231 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1232 /* remaining arguments */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1233 for (; i < NCH(n); i++) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1234 ns++;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1235 ch=CHILD(n,i);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1236 REQ(ch, sliceop);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1237 if (NCH(ch) == 1) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1238 /* 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
1239 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
1240 com_push(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1241 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1242 else
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1243 com_node(c, CHILD(ch,1));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1244 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1245 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
1246 com_pop(c, 1 + (ns == 3));
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1247 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1248
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1249 static void
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1250 com_subscript(c, n)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1251 struct compiling *c;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1252 node *n;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1253 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1254 node *ch;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1255 REQ(n, subscript);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1256 ch = CHILD(n,0);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1257 /* 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
1258 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
1259 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
1260 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
1261 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1262 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1263 /* check for slice */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1264 if ((TYPE(ch) == COLON || NCH(n) > 1))
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1265 com_sliceobj(c, n);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1266 else {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1267 REQ(ch, test);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1268 com_node(c, ch);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1269 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1270 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1271 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1272
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1273 static void
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1274 com_subscriptlist(c, n, assigning)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1275 struct compiling *c;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1276 node *n;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1277 int assigning;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1278 {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1279 int i, op;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1280 REQ(n, subscriptlist);
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1281 /* 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
1282 if (NCH(n) == 1) {
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1283 node *sub = CHILD(n, 0); /* subscript */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1284 /* Make it is a simple slice.
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1285 Should have exactly one colon. */
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1286 if ((TYPE(CHILD(sub, 0)) == COLON
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1287 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1288 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1289 {
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1290 if (assigning == OP_APPLY)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1291 op = SLICE;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1292 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1293 op = ((assigning == OP_ASSIGN) ?
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1294 STORE_SLICE : DELETE_SLICE);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1295 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
1296 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
1297 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
1298 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
1299 com_pop(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1300 return;
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1301 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1302 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1303 /* Else normal subscriptlist. Compile each subscript. */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1304 for (i = 0; i < NCH(n); i += 2)
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1305 com_subscript(c, CHILD(n, i));
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1306 /* 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
1307 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
1308 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
1309 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
1310 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
1311 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1312 if (assigning == OP_APPLY) {
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1313 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
1314 i = 1;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1315 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1316 else if (assigning == OP_ASSIGN) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1317 op = STORE_SUBSCR;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1318 i = 3;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1319 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1320 else {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1321 op = DELETE_SUBSCR;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1322 i = 2;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1323 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1324 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
1325 com_pop(c, i);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1326 }
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1327
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1328 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1329 com_apply_trailer(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1330 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1331 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1332 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1335 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 com_call_function(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 case DOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1339 com_select_member(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1341 case LSQB:
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1342 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1343 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1344 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1345 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
1346 "com_apply_trailer: unknown trailer type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1348 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1349
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1350 static void
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1351 com_power(c, n)
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1352 struct compiling *c;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1353 node *n;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1354 {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1355 int i;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1356 REQ(n, power);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1357 com_atom(c, CHILD(n, 0));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1358 for (i = 1; i < NCH(n); i++) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1359 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1360 com_factor(c, CHILD(n, i+1));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1361 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
1362 com_pop(c, 1);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1363 break;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1364 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1365 else
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1366 com_apply_trailer(c, CHILD(n, i));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1367 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1368 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1369
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1370 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 com_factor(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1373 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375 REQ(n, factor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1376 if (TYPE(CHILD(n, 0)) == PLUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1377 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378 com_addbyte(c, UNARY_POSITIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380 else if (TYPE(CHILD(n, 0)) == MINUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 com_addbyte(c, UNARY_NEGATIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383 }
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1384 else if (TYPE(CHILD(n, 0)) == TILDE) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1385 com_factor(c, CHILD(n, 1));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1386 com_addbyte(c, UNARY_INVERT);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1387 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388 else {
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1389 com_power(c, CHILD(n, 0));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1392
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1394 com_term(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1395 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1397 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1399 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1400 REQ(n, term);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1401 com_factor(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1402 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1403 com_factor(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1404 switch (TYPE(CHILD(n, i-1))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1405 case STAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1406 op = BINARY_MULTIPLY;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408 case SLASH:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1409 op = BINARY_DIVIDE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1410 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1411 case PERCENT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412 op = BINARY_MODULO;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1413 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1414 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1415 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
1416 "com_term: operator not *, / or %");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1417 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1418 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1419 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
1420 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1421 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1422 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1423
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1424 static void
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1425 com_arith_expr(c, n)
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1426 struct compiling *c;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1427 node *n;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1428 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1429 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1430 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1431 REQ(n, arith_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1432 com_term(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1433 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1434 com_term(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1435 switch (TYPE(CHILD(n, i-1))) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1436 case PLUS:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1437 op = BINARY_ADD;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1438 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1439 case MINUS:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1440 op = BINARY_SUBTRACT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1441 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1442 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1443 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
1444 "com_arith_expr: operator not + or -");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1445 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1446 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1447 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
1448 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1449 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1450 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1451
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1452 static void
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1453 com_shift_expr(c, n)
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1454 struct compiling *c;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1455 node *n;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1456 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1457 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1458 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1459 REQ(n, shift_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1460 com_arith_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1461 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1462 com_arith_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1463 switch (TYPE(CHILD(n, i-1))) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1464 case LEFTSHIFT:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1465 op = BINARY_LSHIFT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1466 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1467 case RIGHTSHIFT:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1468 op = BINARY_RSHIFT;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1469 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1470 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1471 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
1472 "com_shift_expr: operator not << or >>");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1473 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1474 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1475 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
1476 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1477 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1478 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1479
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1480 static void
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1481 com_and_expr(c, n)
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1482 struct compiling *c;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1483 node *n;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1484 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1485 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1486 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1487 REQ(n, and_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1488 com_shift_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1489 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1490 com_shift_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1491 if (TYPE(CHILD(n, i-1)) == AMPER) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1492 op = BINARY_AND;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1493 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1494 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1495 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
1496 "com_and_expr: operator not &");
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1497 op = 255;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1498 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1499 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
1500 com_pop(c, 1);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1501 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1502 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1503
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1504 static void
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1505 com_xor_expr(c, n)
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1506 struct compiling *c;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1507 node *n;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1508 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1509 int i;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1510 int op;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1511 REQ(n, xor_expr);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1512 com_and_expr(c, CHILD(n, 0));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1513 for (i = 2; i < NCH(n); i += 2) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1514 com_and_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1515 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1516 op = BINARY_XOR;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1517 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1518 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1519 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
1520 "com_xor_expr: operator not ^");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1521 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1522 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523 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
1524 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1525 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1526 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1527
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1528 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1529 com_expr(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1530 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1531 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1532 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1533 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1534 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1535 REQ(n, expr);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1536 com_xor_expr(c, CHILD(n, 0));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1537 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
1538 com_xor_expr(c, CHILD(n, i));
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1539 if (TYPE(CHILD(n, i-1)) == VBAR) {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1540 op = BINARY_OR;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1541 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
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 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
1544 "com_expr: expr operator not |");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1545 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1546 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547 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
1548 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1550 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1551
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1552 static enum cmp_op
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1553 cmp_type(n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1554 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1555 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1556 REQ(n, comp_op);
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1557 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1558 | 'in' | 'not' 'in' | 'is' | 'is' not' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1559 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1560 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1561 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1562 case LESS: return LT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1563 case GREATER: return GT;
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1564 case EQEQUAL: /* == */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1565 case EQUAL: return EQ;
388
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1566 case LESSEQUAL: return LE;
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1567 case GREATEREQUAL: return GE;
31d509e94271 Comment out 'abort()' call.
Guido van Rossum <guido@python.org>
parents: 336
diff changeset
1568 case NOTEQUAL: return NE; /* <> or != */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1569 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1570 if (strcmp(STR(n), "is") == 0) return IS;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1571 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1572 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1573 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1574 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1575 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1576 return NOT_IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1577 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1578 return IS_NOT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1579 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1580 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1581 return BAD;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1582 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1583
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1584 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1585 com_comparison(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1586 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1587 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1588 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1589 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1590 enum cmp_op op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1591 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1592 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1593 com_expr(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1594 if (NCH(n) == 1)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1595 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1596
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1597 /****************************************************************
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1598 The following code is generated for all but the last
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1599 comparison in a chain:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1600
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1601 label: on stack: opcode: jump to:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1602
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1603 a <code to load b>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1604 a, b DUP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1605 a, b, b ROT_THREE
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1606 b, a, b COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1607 b, 0-or-1 JUMP_IF_FALSE L1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1608 b, 1 POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1609 b
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 We are now ready to repeat this sequence for the next
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612 comparison in the chain.
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1613
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1614 For the last we generate:
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 b <code to load c>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1617 b, c COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1618 0-or-1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1619
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1620 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
1621 comparison), we generate:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1622
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1623 0-or-1 JUMP_FORWARD L2
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1624 L1: b, 0 ROT_TWO
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1625 0, b POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1626 0
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1627 L2: 0-or-1
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1628 ****************************************************************/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1629
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1630 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1631
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1632 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1633 com_expr(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1634 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1635 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
1636 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1637 com_addbyte(c, ROT_THREE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1638 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1639 op = cmp_type(CHILD(n, i-1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1640 if (op == BAD) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1641 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
1642 "com_comparison: unknown comparison op");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1643 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1644 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
1645 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1646 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1647 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1648 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
1649 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1650 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1651 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1652
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1653 if (anchor) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1654 int anchor2 = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1655 com_addfwref(c, JUMP_FORWARD, &anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1656 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1657 com_addbyte(c, ROT_TWO);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1658 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1659 com_backpatch(c, anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1660 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1661 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1662
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1663 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1664 com_not_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1665 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1666 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1667 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1668 REQ(n, not_test); /* 'not' not_test | comparison */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1669 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1670 com_comparison(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1671 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1672 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1673 com_not_test(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1674 com_addbyte(c, UNARY_NOT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1675 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1676 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1677
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1678 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1679 com_and_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1680 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1681 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1682 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1683 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1684 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1685 REQ(n, and_test); /* not_test ('and' not_test)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1686 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1687 i = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1688 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1689 com_not_test(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1690 if ((i += 2) >= NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1691 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1692 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1693 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
1694 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1695 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1696 if (anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1697 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1698 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1699
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1700 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1701 com_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1702 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1703 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1704 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1705 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
1706 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1707 PyObject *v;
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1708 int i;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
1709 int ndefs = com_argdefs(c, CHILD(n, 0));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1710 v = (PyObject *) icompile(CHILD(n, 0), c);
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1711 if (v == NULL) {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1712 c->c_errors++;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1713 i = 255;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1714 }
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1715 else {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1716 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
1717 Py_DECREF(v);
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1718 }
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1719 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
1720 com_push(c, 1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
1721 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
1722 com_pop(c, ndefs);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1723 }
1417
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1724 else {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1725 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
1726 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
1727 for (;;) {
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1728 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
1729 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
1730 break;
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1731 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
1732 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
1733 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
1734 }
f7edfa6d0dcb change syntactical position of lambdef (was an atom, now is a test)
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1735 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
1736 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
1737 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1738 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1739
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1740 static void
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
1741 com_list(c, n, toplevel)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1742 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1743 node *n;
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
1744 int toplevel; /* If nonzero, *always* build a tuple */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1745 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1746 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
1747 if (NCH(n) == 1 && !toplevel) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1748 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1749 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1750 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1751 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1752 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1753 len = (NCH(n) + 1) / 2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1754 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1755 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1756 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
1757 com_pop(c, len-1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1758 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1759 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1760
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 /* Begin of assignment compilation */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1763
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1764 static void com_assign_name Py_PROTO((struct compiling *, node *, int));
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1765 static void com_assign Py_PROTO((struct compiling *, node *, int));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1766
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1767 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1768 com_assign_attr(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1769 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1770 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1771 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1772 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1773 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
1774 com_pop(c, assigning ? 2 : 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1775 }
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 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1778 com_assign_trailer(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1779 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1780 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1781 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1782 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1783 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1784 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1785 case LPAR: /* '(' [exprlist] ')' */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1786 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
1787 "can't assign to function call");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1788 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1789 case DOT: /* '.' NAME */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1790 com_assign_attr(c, CHILD(n, 1), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1791 break;
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1792 case LSQB: /* '[' subscriptlist ']' */
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1793 com_subscriptlist(c, CHILD(n, 1), assigning);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1794 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1795 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1796 com_error(c, PyExc_SystemError, "unknown trailer type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1797 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1798 }
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 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1801 com_assign_tuple(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1802 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1803 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1804 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1805 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1806 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1807 if (TYPE(n) != testlist)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1808 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
1809 if (assigning) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1810 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
1811 com_addoparg(c, UNPACK_TUPLE, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1812 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
1813 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1814 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1815 com_assign(c, CHILD(n, i), assigning);
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1819 com_assign_list(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1820 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1821 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1822 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1823 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1824 int i;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1825 if (assigning) {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1826 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
1827 com_addoparg(c, UNPACK_LIST, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1828 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
1829 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1830 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1831 com_assign(c, CHILD(n, i), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1832 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1833
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1834 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1835 com_assign_name(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1836 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1837 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1838 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1839 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1840 REQ(n, NAME);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1841 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1842 if (assigning)
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);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1844 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1845
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1846 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1847 com_assign(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1848 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1849 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1850 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1851 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1852 /* Loop to avoid trivial recursion */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1853 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1854 switch (TYPE(n)) {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1855
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1856 case exprlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1857 case testlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1858 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1859 com_assign_tuple(c, n, assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1860 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1861 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1862 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1863 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1864
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1865 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1866 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1867 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1868 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1869 case expr:
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1870 case xor_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1871 case and_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1872 case shift_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
1873 case arith_expr:
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1874 case term:
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1875 case factor:
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1876 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
1877 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
1878 "can't assign to operator");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1879 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1880 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1881 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1882 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1883
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1884 case power: /* atom trailer* ('**' power)* */
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1885 /* ('+'|'-'|'~') factor | atom trailer* */
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1886 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
1887 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
1888 "can't assign to operator");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1889 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1890 }
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1891 if (NCH(n) > 1) { /* trailer or exponent present */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1892 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1893 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1894 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
1895 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
1896 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
1897 "can't assign to operator");
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1898 return;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
1899 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1900 com_apply_trailer(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1901 } /* NB i is still alive */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1902 com_assign_trailer(c,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1903 CHILD(n, i), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1904 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1905 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1906 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1907 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1908
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1909 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1910 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1911 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1912 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1913 if (TYPE(n) == RPAR) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1914 /* XXX Should allow () = () ??? */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1915 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
1916 "can't assign to ()");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1917 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1918 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1919 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1920 case LSQB:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1921 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1922 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
1923 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
1924 "can't assign to []");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1925 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1926 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1927 com_assign_list(c, n, assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1928 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1929 case NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1930 com_assign_name(c, CHILD(n, 0), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1931 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1932 default:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1933 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
1934 "can't assign to literal");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1935 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1936 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1937 break;
3963
00722990b80c Removed unused var; added error check for ``lambda: x=1''.
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1938
00722990b80c Removed unused var; added error check for ``lambda: x=1''.
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1939 case lambdef:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1940 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
1941 "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
1942 return;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1943
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1944 default:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1945 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1946 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
1947 "com_assign: bad node");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1948 return;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1949
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1950 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1951 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1952 }
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
1953
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1954 /* Forward */ static node *get_rawdocstring Py_PROTO((node *));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1955
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1956 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1957 com_expr_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1958 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1959 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1960 {
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
1961 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
1962 /* 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
1963 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
1964 return;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1965 com_node(c, CHILD(n, NCH(n)-1));
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1966 if (NCH(n) == 1) {
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1967 if (c->c_interactive)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1968 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
1969 else
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
1970 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
1971 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1972 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1973 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1974 int i;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
1975 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
1976 if (i+2 < NCH(n)-2) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1977 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
1978 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
1979 }
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
1980 com_assign(c, CHILD(n, i), OP_ASSIGN);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1981 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1982 }
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 static void
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1986 com_assert_stmt(c, n)
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1987 struct compiling *c;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1988 node *n;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1989 {
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1990 int a = 0, b = 0;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1991 int i;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1992 REQ(n, assert_stmt); /* 'assert' test [',' test] */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1993 /* Generate code like for
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1994
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1995 if __debug__:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1996 if not <test>:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1997 raise AssertionError [, <message>]
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1998
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1999 where <message> is the second test, if present.
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2000 */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2001 if (Py_OptimizeFlag)
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2002 return;
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2003 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2004 com_push(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2005 com_addfwref(c, JUMP_IF_FALSE, &a);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2006 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2007 com_pop(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2008 com_node(c, CHILD(n, 1));
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2009 com_addfwref(c, JUMP_IF_TRUE, &b);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2010 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2011 com_pop(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2012 /* Raise that exception! */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2013 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2014 com_push(c, 1);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2015 i = NCH(n)/2; /* Either 2 or 4 */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2016 if (i > 1)
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2017 com_node(c, CHILD(n, 3));
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2018 com_addoparg(c, RAISE_VARARGS, i);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2019 com_pop(c, i);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2020 /* The interpreter does not fall through */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2021 /* All jumps converge here */
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2022 com_backpatch(c, a);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2023 com_backpatch(c, b);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2024 com_addbyte(c, POP_TOP);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2025 }
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2026
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2027 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2028 com_print_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2029 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2030 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2031 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2032 int i;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2033 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2034 for (i = 1; i < NCH(n); i += 2) {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2035 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2036 com_addbyte(c, PRINT_ITEM);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2037 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2038 }
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2039 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2040 com_addbyte(c, PRINT_NEWLINE);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2041 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2042 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2043
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2044 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2045 com_return_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2046 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2047 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2048 {
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2049 REQ(n, return_stmt); /* 'return' [testlist] */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2050 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
2051 com_error(c, PyExc_SyntaxError, "'return' outside function");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2052 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2053 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
2054 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
2055 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
2056 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2057 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2058 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2059 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
2060 com_pop(c, 1);
69
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 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2064 com_raise_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2065 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2066 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2067 {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2068 int i;
7946
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2069 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2070 if (NCH(n) > 1) {
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2071 com_node(c, CHILD(n, 1));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2072 if (NCH(n) > 3) {
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2073 com_node(c, CHILD(n, 3));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2074 if (NCH(n) > 5)
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2075 com_node(c, CHILD(n, 5));
ad114620f8c2 Make first raise argument optional
Guido van Rossum <guido@python.org>
parents: 6501
diff changeset
2076 }
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
2077 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2078 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
2079 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
2080 com_pop(c, i);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2081 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2082
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2083 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2084 com_import_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2085 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2086 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2087 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2088 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2089 REQ(n, import_stmt);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2090 /* 'import' dotted_name (',' dotted_name)* |
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2091 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2092 if (STR(CHILD(n, 0))[0] == 'f') {
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2093 /* 'from' dotted_name 'import' ... */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2094 REQ(CHILD(n, 1), dotted_name);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2095 com_addopname(c, IMPORT_NAME, 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
2096 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2097 for (i = 3; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2098 com_addopname(c, IMPORT_FROM, CHILD(n, i));
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 else {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2103 /* 'import' ... */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2104 for (i = 1; i < NCH(n); i += 2) {
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2105 REQ(CHILD(n, i), dotted_name);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2106 com_addopname(c, IMPORT_NAME, 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
2107 com_push(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2108 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2109 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2110 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2111 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2112 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2113
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2114 static void
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2115 com_global_stmt(c, n)
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2116 struct compiling *c;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2117 node *n;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2118 {
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2119 int i;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2120 REQ(n, global_stmt);
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2121 /* 'global' NAME (',' NAME)* */
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2122 for (i = 1; i < NCH(n); i += 2) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2123 char *s = STR(CHILD(n, i));
4130
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2124 #ifdef PRIVATE_NAME_MANGLING
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2125 char buffer[256];
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2126 if (s != NULL && s[0] == '_' && s[1] == '_' &&
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2127 c->c_private != NULL &&
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2128 com_mangle(c, s, buffer, (int)sizeof(buffer)))
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2129 s = buffer;
7b84dae97ee8 Oops need to mangle global statement separately
Guido van Rossum <guido@python.org>
parents: 4129
diff changeset
2130 #endif
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2131 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2132 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
2133 "name is local and global");
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2134 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2135 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2136 c->c_errors++;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2137 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2138 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2139
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2140 static int
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2141 com_newlocal_o(c, nameval)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2142 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2143 PyObject *nameval;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2144 {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2145 int i;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2146 PyObject *ival;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2147 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2148 /* This is usually caused by an error on a previous call */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2149 if (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
2150 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
2151 "mixed up var name/index");
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2152 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2153 return 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2154 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2155 ival = PyInt_FromLong(i = c->c_nlocals++);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2156 if (ival == NULL)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2157 c->c_errors++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2158 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2159 c->c_errors++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2160 else if (PyList_Append(c->c_varnames, nameval) != 0)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2161 c->c_errors++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2162 Py_XDECREF(ival);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2163 return i;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2164 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2165
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2166 static int
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2167 com_addlocal_o(c, nameval)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2168 struct compiling *c;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2169 PyObject *nameval;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2170 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2171 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2172 if (ival != NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2173 return PyInt_AsLong(ival);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2174 return com_newlocal_o(c, nameval);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2175 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2176
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2177 static int
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2178 com_newlocal(c, name)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2179 struct compiling *c;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2180 char *name;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2181 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2182 PyObject *nameval = PyString_InternFromString(name);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2183 int i;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2184 if (nameval == NULL) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2185 c->c_errors++;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2186 return 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2187 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2188 i = com_newlocal_o(c, nameval);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2189 Py_DECREF(nameval);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2190 return i;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2191 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2192
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2193 static void
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2194 com_exec_stmt(c, n)
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2195 struct compiling *c;
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2196 node *n;
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2197 {
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2198 REQ(n, exec_stmt);
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2199 /* 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
2200 com_node(c, CHILD(n, 1));
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2201 if (NCH(n) >= 4)
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2202 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
2203 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2204 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
2205 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
2206 }
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2207 if (NCH(n) >= 6)
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2208 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
2209 else {
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2210 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
2211 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
2212 }
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2213 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
2214 com_pop(c, 3);
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2215 }
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2216
5181
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2217 static int
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2218 is_constant_false(c, n)
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2219 struct compiling *c;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2220 node *n;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2221 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2222 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
2223 int i;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2224
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2225 /* 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
2226 next:
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2227 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
2228
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2229 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
2230 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
2231 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
2232 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
2233 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2234 /* 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
2235 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
2236 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
2237 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
2238 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
2239 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
2240 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
2241 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2242 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2243 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2244
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2245 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
2246 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
2247 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
2248 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
2249 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
2250
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2251 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
2252 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
2253 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
2254 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
2255 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
2256 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
2257 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
2258 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
2259 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
2260 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
2261 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
2262 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
2263 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
2264 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
2265 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
2266 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
2267 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
2268 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
2269 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2270 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2271
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2272 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
2273 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
2274 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
2275 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2276
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2277 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
2278 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
2279 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2280 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
2281 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2282 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2283 i = PyObject_IsTrue(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2284 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
2285 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
2286
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2287 case STRING:
5183
636757e812a4 Fix dumb bug calling parsestrplus with wrong node as argument.
Guido van Rossum <guido@python.org>
parents: 5181
diff changeset
2288 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
2289 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2290 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
2291 break;
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2292 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2293 i = PyObject_IsTrue(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2294 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
2295 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
2296
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2297 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2298 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
2299 }
8a0b80dc6e71 Added support for ``if __debug__:'' -- if -O is given, this form is
Guido van Rossum <guido@python.org>
parents: 5164
diff changeset
2300
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2301 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2302 com_if_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2303 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2304 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2305 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2306 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2307 int anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2308 REQ(n, if_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2309 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2310 for (i = 0; i+3 < NCH(n); i+=4) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2311 int a = 0;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2312 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
2313 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
2314 continue;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2315 if (i > 0)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2316 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
2317 com_node(c, ch);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2318 com_addfwref(c, JUMP_IF_FALSE, &a);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2319 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
2320 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2321 com_node(c, CHILD(n, i+3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2322 com_addfwref(c, JUMP_FORWARD, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2323 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
2324 /* We jump here with an extra entry which we now pop */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2325 com_addbyte(c, POP_TOP);
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 if (i+2 < NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2328 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
2329 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
2330 com_backpatch(c, anchor);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2331 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2332
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2333 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2334 com_while_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2335 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2336 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2337 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2338 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2339 int anchor = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2340 int save_begin = c->c_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2341 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2342 com_addfwref(c, SETUP_LOOP, &break_anchor);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2343 block_push(c, SETUP_LOOP);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2344 c->c_begin = c->c_nexti;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2345 com_addoparg(c, SET_LINENO, n->n_lineno);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2346 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2347 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2348 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
2349 com_pop(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2350 c->c_loops++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2351 com_node(c, CHILD(n, 3));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2352 c->c_loops--;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2353 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2354 c->c_begin = save_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2355 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
2356 /* We jump here with one entry more on the stack */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2357 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2358 com_addbyte(c, POP_BLOCK);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2359 block_pop(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2360 if (NCH(n) > 4)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2361 com_node(c, CHILD(n, 6));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2362 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2363 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2364
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2365 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2366 com_for_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2367 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2368 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2369 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2370 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2371 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2372 int anchor = 0;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2373 int save_begin = c->c_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2374 REQ(n, for_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2375 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2376 com_addfwref(c, SETUP_LOOP, &break_anchor);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2377 block_push(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2378 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
2379 v = PyInt_FromLong(0L);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2380 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2381 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2382 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
2383 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
2384 Py_XDECREF(v);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2385 c->c_begin = c->c_nexti;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2386 com_addoparg(c, SET_LINENO, n->n_lineno);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2387 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
2388 com_push(c, 1);
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
2389 com_assign(c, CHILD(n, 1), OP_ASSIGN);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2390 c->c_loops++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2391 com_node(c, CHILD(n, 5));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2392 c->c_loops--;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2393 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2394 c->c_begin = save_begin;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2395 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
2396 com_pop(c, 2); /* FOR_LOOP has popped these */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2397 com_addbyte(c, POP_BLOCK);
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2398 block_pop(c, SETUP_LOOP);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2399 if (NCH(n) > 8)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2400 com_node(c, CHILD(n, 8));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2401 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2402 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2403
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2404 /* 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
2405
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2406 SETUP_FINALLY L
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2407 <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2408 POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2409 LOAD_CONST <nil>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2410 L: <code for Sf>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2411 END_FINALLY
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2412
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2413 The special instructions use the block stack. Each block
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2414 stack entry contains the instruction that created it (here
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2415 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
2416 block stack entry was created, and a label (here L).
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2417
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2418 SETUP_FINALLY:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2419 Pushes the current value stack level and the label
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2420 onto the block stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2421 POP_BLOCK:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2422 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
2423 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
2424 block stack. (The label is ignored.)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2425 END_FINALLY:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2426 Pops a variable number of entries from the *value* stack
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2427 and re-raises the exception they specify. The number of
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2428 entries popped depends on the (pseudo) exception type.
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2429
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2430 The block stack is unwound when an exception is raised:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2431 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
2432 onto the value stack (and the exception condition is cleared),
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2433 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
2434 stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2435
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2436 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
2437 (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
2438 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
2439 associated value, and 'exc' the exception.)
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2440
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2441 Value stack Label Instruction Argument
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2442 [] SETUP_EXCEPT L1
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2443 [] <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2444 [] POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2445 [] JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2446
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2447 [tb, val, exc] L1: DUP )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2448 [tb, val, exc, exc] <evaluate E1> )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2449 [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
2450 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2451 [tb, val, exc, 1] POP )
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2452 [tb, val, exc] POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2453 [tb, val] <assign to V1> (or POP if no V1)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2454 [tb] POP
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2455 [] <code for S1>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2456 JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2457
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2458 [tb, val, exc, 0] L2: POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2459 [tb, val, exc] DUP
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2460 .............................etc.......................
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2461
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2462 [tb, val, exc, 0] Ln+1: POP
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2463 [tb, val, exc] END_FINALLY # re-raise exception
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2464
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2465 [] L0: <next statement>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2466
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2467 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
2468 */
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2469
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2470 static void
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2471 com_try_except(c, n)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2472 struct compiling *c;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2473 node *n;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2474 {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2475 int except_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2476 int end_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2477 int else_anchor = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2478 int i;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2479 node *ch;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2480
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2481 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
2482 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
2483 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
2484 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
2485 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
2486 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
2487 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
2488 for (i = 3;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2489 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
2490 i += 3) {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2491 /* 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
2492 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
2493 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
2494 "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
2495 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2496 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2497 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
2498 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
2499 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
2500 if (NCH(ch) > 1) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2501 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
2502 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
2503 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
2504 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
2505 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
2506 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
2507 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
2508 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
2509 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2510 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
2511 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
2512 if (NCH(ch) > 3)
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
2513 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2514 else {
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2515 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
2516 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
2517 }
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2518 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
2519 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
2520 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
2521 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
2522 if (except_anchor) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2523 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
2524 /* 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
2525 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
2526 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
2527 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
2528 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2529 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2530 /* 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
2531 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
2532 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
2533 anything. */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2534 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
2535 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
2536 if (i < NCH(n))
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2537 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
2538 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
2539 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2540
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2541 static void
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2542 com_try_finally(c, n)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2543 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2544 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2545 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2546 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
2547 node *ch;
792
dc3b455f7632 Only * can be used for varargs argument lists
Guido van Rossum <guido@python.org>
parents: 744
diff changeset
2548
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2549 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
2550 block_push(c, SETUP_FINALLY);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2551 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
2552 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
2553 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
2554 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
2555 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
2556 /* 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
2557 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
2558 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
2559 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
2560 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
2561 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
2562 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
2563 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
2564 com_node(c, ch);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2565 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
2566 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
2567 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
2568 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2569
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2570 static void
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2571 com_try_stmt(c, n)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2572 struct compiling *c;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2573 node *n;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2574 {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2575 REQ(n, try_stmt);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2576 /* '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
2577 | 'try' ':' suite 'finally' ':' suite */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2578 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
2579 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
2580 else
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2581 com_try_except(c, n);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2582 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2583
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2584 static node *
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2585 get_rawdocstring(n)
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2586 node *n;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2587 {
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2588 int i;
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2589
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2590 /* 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
2591 next:
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2592 switch (TYPE(n)) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2593
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2594 case suite:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2595 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
2596 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
2597 goto next;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2598 }
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2599 /* Fall through */
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2600 case file_input:
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2601 for (i = 0; i < NCH(n); i++) {
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2602 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
2603 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
2604 n = ch;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2605 goto next;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2606 }
2241
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2607 }
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2608 break;
fefae37c053c added missing case to get_docstring
Guido van Rossum <guido@python.org>
parents: 2203
diff changeset
2609
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2610 case stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2611 case simple_stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2612 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
2613 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
2614 goto next;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2615
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2616 case expr_stmt:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2617 case testlist:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2618 case test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2619 case and_test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2620 case not_test:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2621 case comparison:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2622 case expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2623 case xor_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2624 case and_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2625 case shift_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2626 case arith_expr:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2627 case term:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2628 case factor:
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2629 case power:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2630 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
2631 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
2632 goto next;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2633 }
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2634 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2635
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2636 case atom:
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2637 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
2638 return n;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2639 break;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2640
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2641 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2642 return NULL;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2643 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
2644
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2645 static PyObject *
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2646 get_docstring(n)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2647 node *n;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2648 {
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2649 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
2650 if (n == NULL)
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2651 return NULL;
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2652 return parsestrplus(n);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2653 }
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2654
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2655 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2656 com_suite(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2657 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2658 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2659 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2660 REQ(n, suite);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2661 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2662 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2663 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2664 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2665 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2666 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2667 for (i = 0; i < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2668 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2669 if (TYPE(ch) == stmt)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2670 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2671 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2672 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2673 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2674
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
2675 /* ARGSUSED */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2676 static void
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2677 com_continue_stmt(c, n)
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2678 struct compiling *c;
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
2679 node *n; /* Not used, but passed for consistency */
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2680 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2681 int i = c->c_nblocks;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2682 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
2683 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2684 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2685 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2686 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
2687 "'continue' not properly in loop");
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2688 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2689 /* XXX Could allow it inside a 'finally' clause
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2690 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
2691 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2692
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2693 static int
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2694 com_argdefs(c, n)
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2695 struct compiling *c;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2696 node *n;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2697 {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2698 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
2699 if (TYPE(n) == lambdef) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2700 /* lambdef: 'lambda' [varargslist] ':' test */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2701 n = CHILD(n, 1);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2702 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2703 else {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2704 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
2705 n = CHILD(n, 2);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2706 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
2707 n = CHILD(n, 1);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2708 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2709 if (TYPE(n) != varargslist)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2710 return 0;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2711 /* varargslist:
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2712 (fpdef ['=' test] ',')* '*' ....... |
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2713 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2714 nch = NCH(n);
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2715 nargs = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2716 ndefs = 0;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2717 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
2718 int t;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2719 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
2720 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
2721 break;
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2722 nargs++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2723 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2724 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
2725 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
2726 else
e51e17b2d88b fix bug with missing default for last arg (discovered by Tommy Burnette)
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
2727 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
2728 if (t == EQUAL) {
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2729 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2730 ndefs++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2731 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
2732 i++;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2733 if (i >= nch)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2734 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2735 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
2736 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2737 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
2738 /* 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
2739 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
2740 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
2741 "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
2742 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2743 if (t != COMMA)
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2744 break;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2745 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2746 return ndefs;
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2747 }
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
2748
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2749 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2750 com_funcdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2751 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2752 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2753 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2754 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2755 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2756 v = (PyObject *)icompile(n, c);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2757 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2758 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2759 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2760 int i = com_addconst(c, v);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2761 int ndefs = com_argdefs(c, n);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2762 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
2763 com_push(c, 1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2764 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
2765 com_pop(c, ndefs);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2766 com_addopname(c, STORE_NAME, 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
2767 com_pop(c, 1);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2768 Py_DECREF(v);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2769 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2770 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2771
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2772 static void
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2773 com_bases(c, n)
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2774 struct compiling *c;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2775 node *n;
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2776 {
744
834dd4a77ee2 fix what lint found
Guido van Rossum <guido@python.org>
parents: 703
diff changeset
2777 int i;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2778 REQ(n, testlist);
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2779 /* testlist: test (',' test)* [','] */
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2780 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
2781 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
2782 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
2783 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
2784 com_pop(c, i-1);
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2785 }
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2786
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2787 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2788 com_classdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2789 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2790 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2791 {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2792 int i;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2793 PyObject *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2794 REQ(n, classdef);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2795 /* 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
2796 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
2797 c->c_errors++;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2798 return;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2799 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2800 /* Push the class name on the stack */
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2801 i = com_addconst(c, v);
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2802 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
2803 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
2804 Py_DECREF(v);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2805 /* 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
2806 if (TYPE(CHILD(n, 2)) != LPAR) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2807 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
2808 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
2809 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2810 else
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2811 com_bases(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
2812 v = (PyObject *)icompile(n, c);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2813 if (v == NULL)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2814 c->c_errors++;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2815 else {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2816 i = com_addconst(c, v);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2817 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
2818 com_push(c, 1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2819 com_addoparg(c, MAKE_FUNCTION, 0);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2820 com_addoparg(c, CALL_FUNCTION, 0);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2821 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
2822 com_pop(c, 2);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2823 com_addopname(c, STORE_NAME, CHILD(n, 1));
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2824 Py_DECREF(v);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
2825 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2826 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2827
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2828 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2829 com_node(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2830 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2831 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2832 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2833 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2834
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2835 /* Definition nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2836
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2837 case funcdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2838 com_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2839 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2840 case classdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2841 com_classdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2842 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2843
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2844 /* Trivial parse tree nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2845
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2846 case stmt:
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2847 case small_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2848 case flow_stmt:
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2849 com_node(c, CHILD(n, 0));
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2850 break;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2851
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2852 case simple_stmt:
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2853 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2854 com_addoparg(c, SET_LINENO, n->n_lineno);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2855 {
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2856 int i;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2857 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
2858 com_node(c, CHILD(n, i));
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2859 }
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2860 break;
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2861
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2862 case compound_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2863 com_addoparg(c, SET_LINENO, n->n_lineno);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2864 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2865 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2866
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2867 /* Statement nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2868
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2869 case expr_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2870 com_expr_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2871 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2872 case print_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2873 com_print_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2874 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2875 case del_stmt: /* 'del' exprlist */
3839
22e29b1747e1 Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents: 3766
diff changeset
2876 com_assign(c, CHILD(n, 1), OP_DELETE);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2877 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2878 case pass_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2879 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2880 case break_stmt:
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2881 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
2882 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
2883 "'break' outside loop");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
2884 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2885 com_addbyte(c, BREAK_LOOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2886 break;
317
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2887 case continue_stmt:
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2888 com_continue_stmt(c, n);
325b40d77235 New syntax: semicolons, continue statement.
Guido van Rossum <guido@python.org>
parents: 303
diff changeset
2889 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2890 case return_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2891 com_return_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2892 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2893 case raise_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2894 com_raise_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2895 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2896 case import_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2897 com_import_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2898 break;
466
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2899 case global_stmt:
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2900 com_global_stmt(c, n);
90cbcb0b97dc Implement 'global' and new class syntax.
Guido van Rossum <guido@python.org>
parents: 409
diff changeset
2901 break;
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2902 case exec_stmt:
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2903 com_exec_stmt(c, n);
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
2904 break;
5233
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2905 case assert_stmt:
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2906 com_assert_stmt(c, n);
b749d2dd7582 Added assert statement.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
2907 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2908 case if_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2909 com_if_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2910 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2911 case while_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2912 com_while_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2913 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2914 case for_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2915 com_for_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2916 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2917 case try_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2918 com_try_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2919 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2920 case suite:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2921 com_suite(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2922 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2923
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2924 /* Expression nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2925
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2926 case testlist:
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
2927 com_list(c, n, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2928 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2929 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2930 com_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2931 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2932 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2933 com_and_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2934 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2935 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2936 com_not_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2937 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2938 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2939 com_comparison(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2940 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2941 case exprlist:
482
ee899a81570d New argument passing.
Guido van Rossum <guido@python.org>
parents: 466
diff changeset
2942 com_list(c, n, 0);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2943 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2944 case expr:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2945 com_expr(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2946 break;
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2947 case xor_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2948 com_xor_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2949 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2950 case and_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2951 com_and_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2952 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2953 case shift_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2954 com_shift_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2955 break;
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2956 case arith_expr:
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2957 com_arith_expr(c, n);
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 388
diff changeset
2958 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2959 case term:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2960 com_term(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2961 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2962 case factor:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2963 com_factor(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2964 break;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2965 case power:
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2966 com_power(c, n);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
2967 break;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2968 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2969 com_atom(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2970 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2971
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2972 default:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
2973 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2974 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
2975 "com_node: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2976 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2977 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2978
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
2979 static void com_fplist Py_PROTO((struct compiling *, node *));
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2980
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2981 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2982 com_fpdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2983 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2984 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2985 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2986 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2987 if (TYPE(CHILD(n, 0)) == LPAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2988 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
2989 else {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
2990 com_addoparg(c, STORE_FAST, com_newlocal(c, 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
2991 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
2992 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2993 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2994
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2995 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2996 com_fplist(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2997 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2998 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2999 {
544
d0baa8300005 Minor changes.
Guido van Rossum <guido@python.org>
parents: 493
diff changeset
3000 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3001 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3002 com_fpdef(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3003 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3004 else {
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3005 int 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
3006 com_addoparg(c, UNPACK_TUPLE, i);
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3007 com_push(c, i-1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3008 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3009 com_fpdef(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3010 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3011 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3012
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3013 static void
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3014 com_arglist(c, n)
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3015 struct compiling *c;
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3016 node *n;
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3017 {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3018 int nch, i;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3019 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
3020 char nbuf[10];
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3021 REQ(n, varargslist);
617
755bb8efcc2d Use strtoul() for oct/hex constants.
Guido van Rossum <guido@python.org>
parents: 584
diff changeset
3022 /* varargslist:
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3023 (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
3024 nch = NCH(n);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3025 /* Enter all arguments in table of locals */
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3026 for (i = 0; i < nch; i++) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3027 node *ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3028 node *fp;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3029 char *name;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3030 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
3031 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3032 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3033 fp = CHILD(ch, 0);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3034 if (TYPE(fp) == NAME)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3035 name = STR(fp);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3036 else {
5754
9ed26afeeaa5 Fix bug reported by Just: anonymous arguments used for tuples should
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
3037 name = nbuf;
9ed26afeeaa5 Fix bug reported by Just: anonymous arguments used for tuples should
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
3038 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
3039 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
3040 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3041 com_newlocal(c, name);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3042 c->c_argcount++;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3043 if (++i >= nch)
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3044 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3045 ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3046 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
3047 i += 2;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3048 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3049 REQ(ch, COMMA);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3050 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3051 /* Handle *arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3052 if (i < nch) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3053 node *ch;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3054 ch = CHILD(n, i);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3055 if (TYPE(ch) != DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3056 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3057 ch = CHILD(n, i+1);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3058 if (TYPE(ch) == NAME) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3059 c->c_flags |= CO_VARARGS;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3060 i += 3;
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3061 com_newlocal(c, STR(ch));
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3062 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3063 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3064 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3065 /* Handle **keywords */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3066 if (i < nch) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3067 node *ch;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3068 ch = CHILD(n, i);
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3069 if (TYPE(ch) != DOUBLESTAR) {
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3070 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3071 ch = CHILD(n, i+1);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3072 REQ(ch, STAR);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3073 ch = CHILD(n, i+2);
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3074 }
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3075 else
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3076 ch = CHILD(n, i+1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3077 REQ(ch, NAME);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3078 c->c_flags |= CO_VARKEYWORDS;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3079 com_newlocal(c, STR(ch));
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3080 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3081 if (complex) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3082 /* Generate code for complex arguments only after
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3083 having counted the simple arguments */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3084 int ilocal = 0;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3085 for (i = 0; i < nch; i++) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3086 node *ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3087 node *fp;
3324
36920bbd81a8 changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents: 3166
diff changeset
3088 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
3089 break;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3090 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3091 fp = CHILD(ch, 0);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3092 if (TYPE(fp) != NAME) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3093 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
3094 com_push(c, 1);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3095 com_fpdef(c, ch);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3096 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3097 ilocal++;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3098 if (++i >= nch)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3099 break;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3100 ch = CHILD(n, i);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3101 if (TYPE(ch) == EQUAL)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3102 i += 2;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3103 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3104 REQ(ch, COMMA);
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3105 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3106 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3107 }
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3108
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3109 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3110 com_file_input(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3111 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3112 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3113 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3114 int i;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3115 PyObject *doc;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3116 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3117 doc = get_docstring(n);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3118 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3119 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
3120 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3121 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
3122 com_push(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3123 com_addopnamestr(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
3124 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3125 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3126 for (i = 0; i < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3127 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3128 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3129 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3130 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3131 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3132
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3133 /* Top-level compile-node interface */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3134
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3135 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3136 compile_funcdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3137 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3138 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3139 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3140 PyObject *doc;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3141 node *ch;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3142 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
3143 c->c_name = STR(CHILD(n, 1));
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3144 doc = get_docstring(CHILD(n, 4));
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3145 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3146 (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
3147 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3148 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3149 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3150 (void) com_addconst(c, Py_None); /* No docstring */
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3151 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3152 ch = CHILD(ch, 1); /* ')' | varargslist */
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3153 if (TYPE(ch) == varargslist)
584
37aa67f0867c Added varargs code.
Guido van Rossum <guido@python.org>
parents: 568
diff changeset
3154 com_arglist(c, ch);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3155 c->c_infunction = 1;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3156 com_node(c, CHILD(n, 4));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3157 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
3158 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
3159 com_push(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3160 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
3161 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3162 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3163
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3164 static void
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
3165 compile_lambdef(c, n)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3166 struct compiling *c;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3167 node *n;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3168 {
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
3169 node *ch;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3170 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
3171 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
3172
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
3173 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
3174 (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
3175 if (TYPE(ch) == varargslist) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3176 com_arglist(c, ch);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3177 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
3178 }
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3179 else
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3180 ch = CHILD(n, 2);
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3181 com_node(c, ch);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3182 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
3183 com_pop(c, 1);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3184 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3185
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1364
diff changeset
3186 static void
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3187 compile_classdef(c, n)
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3188 struct compiling *c;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3189 node *n;
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3190 {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3191 node *ch;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3192 PyObject *doc;
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3193 REQ(n, classdef);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3194 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3195 c->c_name = STR(CHILD(n, 1));
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3196 #ifdef PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3197 c->c_private = c->c_name;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3198 #endif
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3199 ch = CHILD(n, NCH(n)-1); /* The suite */
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3200 doc = get_docstring(ch);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3201 if (doc != NULL) {
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3202 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
3203 Py_DECREF(doc);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3204 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
3205 com_push(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3206 com_addopnamestr(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
3207 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3208 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3209 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3210 (void) com_addconst(c, Py_None);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3211 com_node(c, ch);
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3212 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
3213 com_push(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3214 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
3215 com_pop(c, 1);
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3216 }
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3217
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3218 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3219 compile_node(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3220 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3221 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3222 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3223 com_addoparg(c, SET_LINENO, n->n_lineno);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3224
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3225 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3226
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3227 case single_input: /* One interactive command */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3228 /* 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
3229 c->c_interactive++;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3230 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3231 if (TYPE(n) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3232 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
3233 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
3234 com_push(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3235 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
3236 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
3237 c->c_interactive--;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3238 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3239
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3240 case file_input: /* A whole file, or built-in function exec() */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3241 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
3242 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
3243 com_push(c, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3244 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
3245 com_pop(c, 1);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3246 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3247
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
3248 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
3249 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
3250 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
3251 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
3252 break;
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3253
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
3254 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
3255 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
3256 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
3257
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3258 case funcdef: /* A function definition */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3259 compile_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3260 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3261
120
c9a5fe1660f5 Fix bug in input(); add comments to cases in compile().
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
3262 case classdef: /* A class definition */
2089
53aa51433f7f Two independent chages:
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
3263 compile_classdef(c, n);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3264 break;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3265
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3266 default:
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3267 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3268 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
3269 "compile_node: unexpected node type");
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3270 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3271 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3272
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3273 /* Optimization for local variables in functions (and *only* functions).
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
3274
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3275 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3276 instructions that refer to local variables with LOAD_FAST etc.
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3277 The latter instructions are much faster because they don't need to
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3278 look up the variable name in a dictionary.
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3279
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3280 To find all local variables, we check all STORE_NAME, IMPORT_FROM
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3281 and DELETE_NAME instructions. This yields all local variables,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3282 function definitions, class definitions and import statements.
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3283 Argument names have already been entered into the list by the
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3284 special processing for the argument list.
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3285
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3286 All remaining LOAD_NAME instructions must refer to non-local (global
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3287 or builtin) variables, so are replaced by LOAD_GLOBAL.
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3288
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3289 There are two problems: 'from foo import *' and 'exec' may introduce
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3290 local variables that we can't know while compiling. If this is the
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3291 case, we can still optimize bona fide locals (since those
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3292 statements will be surrounded by fast_2_locals() and
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3293 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3294
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3295 NB: this modifies the string object c->c_code! */
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3296
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3297 static void
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3298 optimize(c)
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3299 struct compiling *c;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3300 {
203
ceb36ec6198d BUGFIX! Instructions are unsigned bytes.
Guido van Rossum <guido@python.org>
parents: 176
diff changeset
3301 unsigned char *next_instr, *cur_instr;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3302 int opcode;
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
3303 int oparg = 0;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3304 PyObject *name;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3305 PyObject *error_type, *error_value, *error_traceback;
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3306
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3307 #define NEXTOP() (*next_instr++)
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3308 #define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3309 #define GETITEM(v, i) (PyList_GetItem((v), (i)))
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3310 #define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3311
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3312 PyErr_Fetch(&error_type, &error_value, &error_traceback);
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3313
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3314 c->c_flags |= CO_OPTIMIZED;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3315
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3316 next_instr = (unsigned char *) PyString_AsString(c->c_code);
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3317 for (;;) {
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3318 opcode = NEXTOP();
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3319 if (opcode == STOP_CODE)
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3320 break;
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3321 if (HAS_ARG(opcode))
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3322 oparg = NEXTARG();
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3323 switch (opcode) {
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3324 case STORE_NAME:
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3325 case DELETE_NAME:
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3326 case IMPORT_FROM:
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3327 com_addlocal_o(c, GETNAMEOBJ(oparg));
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3328 break;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3329 case EXEC_STMT:
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3330 c->c_flags &= ~CO_OPTIMIZED;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3331 break;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3332 }
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3333 }
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3334
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3335 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3336 c->c_flags &= ~CO_OPTIMIZED;
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3337
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3338 next_instr = (unsigned char *) PyString_AsString(c->c_code);
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3339 for (;;) {
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3340 cur_instr = next_instr;
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3341 opcode = NEXTOP();
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3342 if (opcode == STOP_CODE)
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3343 break;
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3344 if (HAS_ARG(opcode))
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3345 oparg = NEXTARG();
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3346 if (opcode == LOAD_NAME ||
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3347 opcode == STORE_NAME ||
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3348 opcode == DELETE_NAME) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3349 PyObject *v;
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3350 int i;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3351 name = GETNAMEOBJ(oparg);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3352 v = PyDict_GetItem(c->c_locals, name);
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3353 if (v == NULL) {
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3354 if (opcode == LOAD_NAME &&
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3355 (c->c_flags&CO_OPTIMIZED))
1833
39a4c15acb32 * Python/compile.c (com_argdefs, com_arglist): avoid referencing
Guido van Rossum <guido@python.org>
parents: 1417
diff changeset
3356 cur_instr[0] = LOAD_GLOBAL;
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3357 continue;
336
64189ba7e23b Use dmore dict2lookup.
Guido van Rossum <guido@python.org>
parents: 317
diff changeset
3358 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3359 i = PyInt_AsLong(v);
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3360 switch (opcode) {
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3361 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3362 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3363 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3364 }
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3365 cur_instr[1] = i & 0xff;
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3366 cur_instr[2] = (i>>8) & 0xff;
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3367 }
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3368 }
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3369
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3370 if (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
3371 PyErr_Restore(error_type, error_value, error_traceback);
176
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3372 }
229168a2fe28 Added error checking for numeric constants; added local/global variable
Guido van Rossum <guido@python.org>
parents: 160
diff changeset
3373
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3374 PyCodeObject *
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3375 PyNode_Compile(n, filename)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3376 node *n;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3377 char *filename;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3378 {
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3379 return jcompile(n, filename, NULL);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3380 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3381
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3382 static PyCodeObject *
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3383 icompile(n, base)
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3384 node *n;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3385 struct compiling *base;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3386 {
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3387 return jcompile(n, base->c_filename, base);
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3388 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3389
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3390 static PyCodeObject *
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3391 jcompile(n, filename, base)
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3392 node *n;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3393 char *filename;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3394 struct compiling *base;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3395 {
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3396 struct compiling sc;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3397 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
3398 if (!com_init(&sc, filename))
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3399 return NULL;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3400 #ifdef PRIVATE_NAME_MANGLING
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3401 if (base)
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3402 sc.c_private = base->c_private;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3403 else
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3404 sc.c_private = NULL;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3405 #endif
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3406 compile_node(&sc, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3407 com_done(&sc);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3408 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
3409 optimize(&sc);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3410 sc.c_flags |= CO_NEWLOCALS;
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3411 }
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3412 else if (TYPE(n) == classdef)
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3413 sc.c_flags |= CO_NEWLOCALS;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
3414 co = NULL;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1029
diff changeset
3415 if (sc.c_errors == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3416 PyObject *consts, *names, *varnames, *filename, *name;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3417 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
3418 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
3419 varnames = PyList_AsTuple(sc.c_varnames);
5009
402e36c83d20 Intern all names and varnames in newcodeobject(), plus those string
Guido van Rossum <guido@python.org>
parents: 4991
diff changeset
3420 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
3421 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
3422 if (!PyErr_Occurred())
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3423 co = PyCode_New(sc.c_argcount,
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3424 sc.c_nlocals,
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3425 sc.c_maxstacklevel,
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3426 sc.c_flags,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3427 sc.c_code,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3428 consts,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3429 names,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3430 varnames,
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2813
diff changeset
3431 filename,
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3432 name,
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3433 sc.c_firstlineno,
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3434 sc.c_lnotab);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3435 Py_XDECREF(consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3436 Py_XDECREF(names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3437 Py_XDECREF(varnames);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3438 Py_XDECREF(filename);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
3439 Py_XDECREF(name);
266
b5826bf29677 Changed and exported newcodeobject() interface, for ".pyc" files.
Guido van Rossum <guido@python.org>
parents: 238
diff changeset
3440 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3441 com_free(&sc);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3442 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3443 }
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3444
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3445 int
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3446 PyCode_Addr2Line(co, addrq)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3447 PyCodeObject *co;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3448 int addrq;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3449 {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3450 int size = PyString_Size(co->co_lnotab) / 2;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3451 char *p = PyString_AsString(co->co_lnotab);
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3452 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
3453 int addr = 0;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3454 while (--size >= 0) {
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3455 addr += *p++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3456 if (addr > addrq)
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3457 break;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3458 line += *p++;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3459 }
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3460 return line;
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
3461 }