compile.c 134 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2
/* Compile an expression node to intermediate code */

Guido van Rossum's avatar
Guido van Rossum committed
3
/* XXX TO DO:
4 5
   XXX add __doc__ attribute == co_doc to code object attributes?
   XXX   (it's currently the first item of the co_const tuple)
Guido van Rossum's avatar
Guido van Rossum committed
6
   XXX Generate simple jump for break/return outside 'try...finally'
7
   XXX Allow 'continue' inside finally clause of try-finally
8
   XXX New opcode for loading the initial index for a for loop
9
   XXX other JAR tricks?
Guido van Rossum's avatar
Guido van Rossum committed
10 11
*/

12
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
13

Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17
#include "node.h"
#include "token.h"
#include "graminit.h"
#include "compile.h"
18
#include "symtable.h"
Guido van Rossum's avatar
Guido van Rossum committed
19
#include "opcode.h"
Guido van Rossum's avatar
Guido van Rossum committed
20 21 22
#include "structmember.h"

#include <ctype.h>
23

24 25 26 27 28
/* Three symbols from graminit.h are also defined in Python.h, with
   Py_ prefixes to their names.  Python.h can't include graminit.h
   (which defines too many confusing symbols), but we can check here
   that they haven't changed (which is very unlikely, but possible). */
#if Py_single_input != single_input
29
  #error "single_input has changed -- update Py_single_input in Python.h"
30 31
#endif
#if Py_file_input != file_input
32
  #error "file_input has changed -- update Py_file_input in Python.h"
33 34
#endif
#if Py_eval_input != eval_input
35
  #error "eval_input has changed -- update Py_eval_input in Python.h"
36 37
#endif

38 39
int Py_OptimizeFlag = 0;

40 41 42 43
#define OP_DELETE 0
#define OP_ASSIGN 1
#define OP_APPLY 2

44 45 46 47
#define VAR_LOAD 0
#define VAR_STORE 1
#define VAR_DELETE 2

Jeremy Hylton's avatar
Jeremy Hylton committed
48
#define DEL_CLOSURE_ERROR \
49 50 51 52 53
"can not delete variable '%.400s' referenced in nested scope"

#define DUPLICATE_ARGUMENT \
"duplicate argument '%s' in function definition"

54 55
#define ILLEGAL_DYNAMIC_SCOPE \
"%.100s: exec or 'import *' makes names ambiguous in nested scope"
56

57 58 59 60 61 62
#define GLOBAL_AFTER_ASSIGN \
"name '%.400s' is assigned to before global declaration"

#define GLOBAL_AFTER_USE \
"name '%.400s' is used prior to global declaration"

63
#define PARAM_GLOBAL \
64
"name '%.400s' is a function parameter and declared global"
65

66 67 68
#define LATE_FUTURE \
"from __future__ imports must occur at the beginning of the file"

69 70 71
#define ASSIGN_DEBUG \
"can not assign to __debug__"

72 73
#define MANGLE_LEN 256

74
#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum's avatar
Guido van Rossum committed
75

76
static PyMemberDef code_memberlist[] = {
77 78
	{"co_argcount",	T_INT,		OFF(co_argcount),	READONLY},
	{"co_nlocals",	T_INT,		OFF(co_nlocals),	READONLY},
79
	{"co_stacksize",T_INT,		OFF(co_stacksize),	READONLY},
80
	{"co_flags",	T_INT,		OFF(co_flags),		READONLY},
81 82 83
	{"co_code",	T_OBJECT,	OFF(co_code),		READONLY},
	{"co_consts",	T_OBJECT,	OFF(co_consts),		READONLY},
	{"co_names",	T_OBJECT,	OFF(co_names),		READONLY},
84
	{"co_varnames",	T_OBJECT,	OFF(co_varnames),	READONLY},
Jeremy Hylton's avatar
Jeremy Hylton committed
85 86
	{"co_freevars",	T_OBJECT,	OFF(co_freevars),	READONLY},
	{"co_cellvars",	T_OBJECT,	OFF(co_cellvars),	READONLY},
87
	{"co_filename",	T_OBJECT,	OFF(co_filename),	READONLY},
88
	{"co_name",	T_OBJECT,	OFF(co_name),		READONLY},
89 90
	{"co_firstlineno", T_INT,	OFF(co_firstlineno),	READONLY},
	{"co_lnotab",	T_OBJECT,	OFF(co_lnotab),		READONLY},
Guido van Rossum's avatar
Guido van Rossum committed
91 92 93
	{NULL}	/* Sentinel */
};

94 95 96 97 98 99 100 101 102 103 104 105 106
PyDoc_STRVAR(code_doc,
"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
      varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
\n\
Create a code object.  Not for the faint of heart.");

static PyObject *
code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
	int argcount;
	int nlocals;
	int stacksize;
	int flags;
107
	PyObject *co;
108
	PyObject *empty = NULL;
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	PyObject *code;
	PyObject *consts;
	PyObject *names;
	PyObject *varnames;
	PyObject *freevars = NULL;
	PyObject *cellvars = NULL;
	PyObject *filename;
	PyObject *name;
	int firstlineno;
	PyObject *lnotab;

	if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
			      &argcount, &nlocals, &stacksize, &flags,
			      &code,
			      &PyTuple_Type, &consts,
			      &PyTuple_Type, &names,
			      &PyTuple_Type, &varnames,
			      &filename, &name,
			      &firstlineno, &lnotab,
			      &PyTuple_Type, &freevars,
			      &PyTuple_Type, &cellvars))
		return NULL;

	if (!PyObject_CheckReadBuffer(code)) {
		PyErr_SetString(PyExc_TypeError,
		  "bytecode object must be a single-segment read-only buffer");
		return NULL;
	}

138 139 140 141 142 143 144 145 146
	if (freevars == NULL || cellvars == NULL) {
		empty = PyTuple_New(0);
		if (empty == NULL)
			return NULL;
		if (freevars == NULL)
			freevars = empty;
		if (cellvars == NULL)
			cellvars = empty;
	}
147 148

	co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
149 150
				      code, consts, names, varnames,
				      freevars, cellvars, filename, name,
151
				      firstlineno, lnotab);
152
	Py_XDECREF(empty);
153
	return co;
154 155
}

Guido van Rossum's avatar
Guido van Rossum committed
156
static void
157
code_dealloc(PyCodeObject *co)
Guido van Rossum's avatar
Guido van Rossum committed
158
{
159 160 161
	Py_XDECREF(co->co_code);
	Py_XDECREF(co->co_consts);
	Py_XDECREF(co->co_names);
162
	Py_XDECREF(co->co_varnames);
Jeremy Hylton's avatar
Jeremy Hylton committed
163 164
	Py_XDECREF(co->co_freevars);
	Py_XDECREF(co->co_cellvars);
165 166
	Py_XDECREF(co->co_filename);
	Py_XDECREF(co->co_name);
167
	Py_XDECREF(co->co_lnotab);
168
	PyObject_DEL(co);
Guido van Rossum's avatar
Guido van Rossum committed
169 170
}

171
static PyObject *
172
code_repr(PyCodeObject *co)
173 174 175 176
{
	char buf[500];
	int lineno = -1;
	char *filename = "???";
177
	char *name = "???";
178

179 180
	if (co->co_firstlineno != 0)
		lineno = co->co_firstlineno;
181
	if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton's avatar
Jeremy Hylton committed
182
		filename = PyString_AS_STRING(co->co_filename);
183
	if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton's avatar
Jeremy Hylton committed
184
		name = PyString_AS_STRING(co->co_name);
185 186 187
	PyOS_snprintf(buf, sizeof(buf),
		      "<code object %.100s at %p, file \"%.300s\", line %d>",
		      name, co, filename, lineno);
188
	return PyString_FromString(buf);
189 190
}

191
static int
192
code_compare(PyCodeObject *co, PyCodeObject *cp)
193 194
{
	int cmp;
195 196
	cmp = PyObject_Compare(co->co_name, cp->co_name);
	if (cmp) return cmp;
197
	cmp = co->co_argcount - cp->co_argcount;
198
	if (cmp) return (cmp<0)?-1:1;
199
	cmp = co->co_nlocals - cp->co_nlocals;
200
	if (cmp) return (cmp<0)?-1:1;
201
	cmp = co->co_flags - cp->co_flags;
202
	if (cmp) return (cmp<0)?-1:1;
203
	cmp = PyObject_Compare(co->co_code, cp->co_code);
204
	if (cmp) return cmp;
205
	cmp = PyObject_Compare(co->co_consts, cp->co_consts);
206
	if (cmp) return cmp;
207
	cmp = PyObject_Compare(co->co_names, cp->co_names);
208
	if (cmp) return cmp;
209
	cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton's avatar
Jeremy Hylton committed
210 211 212 213
	if (cmp) return cmp;
	cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
	if (cmp) return cmp;
	cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
214 215 216 217
	return cmp;
}

static long
218
code_hash(PyCodeObject *co)
219
{
Jeremy Hylton's avatar
Jeremy Hylton committed
220
	long h, h0, h1, h2, h3, h4, h5, h6;
221 222
	h0 = PyObject_Hash(co->co_name);
	if (h0 == -1) return -1;
223
	h1 = PyObject_Hash(co->co_code);
224
	if (h1 == -1) return -1;
225
	h2 = PyObject_Hash(co->co_consts);
226
	if (h2 == -1) return -1;
227
	h3 = PyObject_Hash(co->co_names);
228
	if (h3 == -1) return -1;
229
	h4 = PyObject_Hash(co->co_varnames);
230
	if (h4 == -1) return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
231 232 233 234 235
	h5 = PyObject_Hash(co->co_freevars);
	if (h5 == -1) return -1;
	h6 = PyObject_Hash(co->co_cellvars);
	if (h6 == -1) return -1;
	h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
236
		co->co_argcount ^ co->co_nlocals ^ co->co_flags;
237 238 239 240
	if (h == -1) h = -2;
	return h;
}

241 242
/* XXX code objects need to participate in GC? */

243 244
PyTypeObject PyCode_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum's avatar
Guido van Rossum committed
245 246
	0,
	"code",
247
	sizeof(PyCodeObject),
Guido van Rossum's avatar
Guido van Rossum committed
248
	0,
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
	(destructor)code_dealloc, 	/* tp_dealloc */
	0,				/* tp_print */
	0, 				/* tp_getattr */
	0,				/* tp_setattr */
	(cmpfunc)code_compare, 		/* tp_compare */
	(reprfunc)code_repr,		/* tp_repr */
	0,				/* tp_as_number */
	0,				/* tp_as_sequence */
	0,				/* tp_as_mapping */
	(hashfunc)code_hash, 		/* tp_hash */
	0,				/* tp_call */
	0,				/* tp_str */
	PyObject_GenericGetAttr,	/* tp_getattro */
	0,				/* tp_setattro */
	0,				/* tp_as_buffer */
	Py_TPFLAGS_DEFAULT,		/* tp_flags */
265
	code_doc,			/* tp_doc */
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
	0,				/* tp_traverse */
	0,				/* tp_clear */
	0,				/* tp_richcompare */
	0,				/* tp_weaklistoffset */
	0,				/* tp_iter */
	0,				/* tp_iternext */
	0,				/* tp_methods */
	code_memberlist,		/* tp_members */
	0,				/* tp_getset */
	0,				/* tp_base */
	0,				/* tp_dict */
	0,				/* tp_descr_get */
	0,				/* tp_descr_set */
	0,				/* tp_dictoffset */
	0,				/* tp_init */
	0,				/* tp_alloc */
282
	code_new,			/* tp_new */
Guido van Rossum's avatar
Guido van Rossum committed
283 284
};

285 286 287
#define NAME_CHARS \
	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

288 289 290 291 292
/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */

static int
all_name_chars(unsigned char *s)
{
293 294 295 296 297 298 299 300 301 302 303 304 305
	static char ok_name_char[256];
	static unsigned char *name_chars = (unsigned char *)NAME_CHARS;

	if (ok_name_char[*name_chars] == 0) {
		unsigned char *p;
		for (p = name_chars; *p; p++)
			ok_name_char[*p] = 1;
	}
	while (*s) {
		if (ok_name_char[*s++] == 0)
			return 0;
	}
	return 1;
306 307
}

Jeremy Hylton's avatar
Jeremy Hylton committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
static int
intern_strings(PyObject *tuple)
{
	int i;

	for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
		PyObject *v = PyTuple_GET_ITEM(tuple, i);
		if (v == NULL || !PyString_Check(v)) {
			Py_FatalError("non-string found in code slot");
			PyErr_BadInternalCall();
			return -1;
		}
		PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
	}
	return 0;
}

325 326
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
#define UNCONDITIONAL_JUMP(op)  (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
327 328
#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
329 330 331 332 333 334 335 336 337 338 339 340 341 342
#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255

static PyObject *
optimize_code(PyObject *code, PyObject* consts)
{
	int i, j, codelen;
	int tgt, tgttgt, opcode;
	unsigned char *codestr;

	/* Make a modifiable copy of the code string */
	if (!PyString_Check(code))
		goto exitUnchanged;
	codelen = PyString_Size(code);
	codestr = PyMem_Malloc(codelen);
343
	if (codestr == NULL) 
344 345 346 347
		goto exitUnchanged;
	codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
	assert(PyTuple_Check(consts));

348
	for (i=0 ; i<codelen-7 ; i += HAS_ARG(codestr[i]) ? 3 : 1) {
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
		opcode = codestr[i];
		switch (opcode) {

		/* Skip over LOAD_CONST trueconst  JUMP_IF_FALSE xx  POP_TOP. 
		   Note, only the first opcode is changed, the others still
		   perform normally if they happen to be jump targets. */
		case LOAD_CONST:
			j = GETARG(codestr, i);
			if (codestr[i+3] != JUMP_IF_FALSE  ||
			    codestr[i+6] != POP_TOP  ||
			    !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
				continue;
			codestr[i] = JUMP_FORWARD;
			SETARG(codestr, i, 4);
			break;

		/* Replace jumps to unconditional jumps */
366
		case FOR_ITER:
367 368 369 370 371 372 373 374 375
		case JUMP_FORWARD:
		case JUMP_IF_FALSE:
		case JUMP_IF_TRUE:
		case JUMP_ABSOLUTE:
		case CONTINUE_LOOP:
		case SETUP_LOOP:
		case SETUP_EXCEPT:
		case SETUP_FINALLY:
			tgt = GETJUMPTGT(codestr, i);
376
			if (!UNCONDITIONAL_JUMP(codestr[tgt])) 
377 378 379 380
				continue;
			tgttgt = GETJUMPTGT(codestr, tgt);
			if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
				opcode = JUMP_ABSOLUTE;
381
			if (!ABSOLUTE_JUMP(opcode))
382 383 384 385 386 387 388 389 390 391 392 393
				tgttgt -= i + 3;     /* Calc relative jump addr */
			if (tgttgt < 0)           /* No backward relative jumps */
				 continue;
			codestr[i] = opcode;
			SETARG(codestr, i, tgttgt);
			break;

		case EXTENDED_ARG:
			PyMem_Free(codestr);
			goto exitUnchanged;
		}
	}
394
	code = PyString_FromStringAndSize((char *)codestr, codelen);
395 396 397 398 399 400 401 402
	PyMem_Free(codestr);
	return code;

exitUnchanged:
	Py_INCREF(code);
	return code;
}

403
PyCodeObject *
404 405
PyCode_New(int argcount, int nlocals, int stacksize, int flags,
	   PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton's avatar
Jeremy Hylton committed
406 407 408
	   PyObject *varnames, PyObject *freevars, PyObject *cellvars,
	   PyObject *filename, PyObject *name, int firstlineno,
	   PyObject *lnotab) 
Guido van Rossum's avatar
Guido van Rossum committed
409
{
410
	PyCodeObject *co;
Guido van Rossum's avatar
Guido van Rossum committed
411 412
	int i;
	/* Check argument types */
413
	if (argcount < 0 || nlocals < 0 ||
414
	    code == NULL ||
415 416 417
	    consts == NULL || !PyTuple_Check(consts) ||
	    names == NULL || !PyTuple_Check(names) ||
	    varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton's avatar
Jeremy Hylton committed
418 419
	    freevars == NULL || !PyTuple_Check(freevars) ||
	    cellvars == NULL || !PyTuple_Check(cellvars) ||
420 421
	    name == NULL || !PyString_Check(name) ||
	    filename == NULL || !PyString_Check(filename) ||
422 423
	    lnotab == NULL || !PyString_Check(lnotab) ||
	    !PyObject_CheckReadBuffer(code)) {
424 425 426
		PyErr_BadInternalCall();
		return NULL;
	}
Jeremy Hylton's avatar
Jeremy Hylton committed
427 428 429 430
	intern_strings(names);
	intern_strings(varnames);
	intern_strings(freevars);
	intern_strings(cellvars);
431
	/* Intern selected string constants */
432 433 434
	for (i = PyTuple_Size(consts); --i >= 0; ) {
		PyObject *v = PyTuple_GetItem(consts, i);
		if (!PyString_Check(v))
435
			continue;
Jeremy Hylton's avatar
Jeremy Hylton committed
436
		if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
437 438
			continue;
		PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum's avatar
Guido van Rossum committed
439
	}
440
	co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum's avatar
Guido van Rossum committed
441
	if (co != NULL) {
442 443
		co->co_argcount = argcount;
		co->co_nlocals = nlocals;
444
		co->co_stacksize = stacksize;
445
		co->co_flags = flags;
446
		co->co_code = optimize_code(code, consts);
447
		Py_INCREF(consts);
Guido van Rossum's avatar
Guido van Rossum committed
448
		co->co_consts = consts;
449
		Py_INCREF(names);
Guido van Rossum's avatar
Guido van Rossum committed
450
		co->co_names = names;
451
		Py_INCREF(varnames);
452
		co->co_varnames = varnames;
Jeremy Hylton's avatar
Jeremy Hylton committed
453 454 455 456
		Py_INCREF(freevars);
		co->co_freevars = freevars;
		Py_INCREF(cellvars);
		co->co_cellvars = cellvars;
457
		Py_INCREF(filename);
458
		co->co_filename = filename;
459
		Py_INCREF(name);
460
		co->co_name = name;
461
		co->co_firstlineno = firstlineno;
462
		Py_INCREF(lnotab);
463
		co->co_lnotab = lnotab;
464 465 466
		if (PyTuple_GET_SIZE(freevars) == 0 &&
		    PyTuple_GET_SIZE(cellvars) == 0)
		    co->co_flags |= CO_NOFREE;
Guido van Rossum's avatar
Guido van Rossum committed
467 468 469 470 471 472
	}
	return co;
}


/* Data structure used internally */
473

474 475 476 477 478 479 480 481 482 483 484 485 486
/* The compiler uses two passes to generate bytecodes.  The first pass
   builds the symbol table.  The second pass generates the bytecode.

   The first pass uses a single symtable struct.  The second pass uses
   a compiling struct for each code block.  The compiling structs
   share a reference to the symtable.

   The two passes communicate via symtable_load_symbols() and via
   is_local() and is_global().  The former initializes several slots
   in the compiling struct: c_varnames, c_locals, c_nlocals,
   c_argcount, c_globals, and c_flags.
*/

Tim Peters's avatar
Tim Peters committed
487 488
/* All about c_lnotab.

Michael W. Hudson's avatar
Michael W. Hudson committed
489 490 491 492
c_lnotab is an array of unsigned bytes disguised as a Python string.  Since
version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
mapped to source code line #s via c_lnotab instead.

Tim Peters's avatar
Tim Peters committed
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
The array is conceptually a list of
    (bytecode offset increment, line number increment)
pairs.  The details are important and delicate, best illustrated by example:

    byte code offset    source code line number
        0		    1
        6		    2
       50		    7
      350                 307
      361                 308

The first trick is that these numbers aren't stored, only the increments
from one row to the next (this doesn't really work, but it's a start):

    0, 1,  6, 1,  44, 5,  300, 300,  11, 1

The second trick is that an unsigned byte can't hold negative values, or
values larger than 255, so (a) there's a deep assumption that byte code
offsets and their corresponding line #s both increase monotonically, and (b)
if at least one column jumps by more than 255 from one row to the next, more
than one pair is written to the table. In case #b, there's no way to know
from looking at the table later how many were written.  That's the delicate
part.  A user of c_lnotab desiring to find the source line number
corresponding to a bytecode address A should do something like this

    lineno = addr = 0
    for addr_incr, line_incr in c_lnotab:
        addr += addr_incr
        if addr > A:
            return lineno
        lineno += line_incr

In order for this to work, when the addr field increments by more than 255,
the line # increment in each pair generated must be 0 until the remaining addr
increment is < 256.  So, in the example above, com_set_lineno should not (as
was actually done until 2.2) expand 300, 300 to 255, 255,  45, 45, but to
255, 0,  45, 255,  0, 45.
*/

Guido van Rossum's avatar
Guido van Rossum committed
532
struct compiling {
533
	PyObject *c_code;	/* string */
534
	PyObject *c_consts;	/* list of objects */
Guido van Rossum's avatar
Guido van Rossum committed
535
	PyObject *c_const_dict; /* inverse of c_consts */
536
	PyObject *c_names;	/* list of strings (names) */
Guido van Rossum's avatar
Guido van Rossum committed
537
	PyObject *c_name_dict;  /* inverse of c_names */
538
	PyObject *c_globals;	/* dictionary (value=None or True) */
539 540
	PyObject *c_locals;	/* dictionary (value=localID) */
	PyObject *c_varnames;	/* list (inverse of c_locals) */
Jeremy Hylton's avatar
Jeremy Hylton committed
541 542
	PyObject *c_freevars;	/* dictionary (value=None) */
	PyObject *c_cellvars;	/* list */
543 544 545
	int c_nlocals;		/* index of next local */
	int c_argcount;		/* number of top-level arguments */
	int c_flags;		/* same as co_flags */
Guido van Rossum's avatar
Guido van Rossum committed
546 547
	int c_nexti;		/* index into c_code */
	int c_errors;		/* counts errors occurred */
Guido van Rossum's avatar
Guido van Rossum committed
548
	int c_infunction;	/* set when compiling a function */
549
	int c_interactive;	/* generating code for interactive command */
Guido van Rossum's avatar
Guido van Rossum committed
550
	int c_loops;		/* counts nested loops */
551
	int c_begin;		/* begin of current loop, for 'continue' */
552
	int c_block[CO_MAXBLOCKS]; /* stack of block types */
553
	int c_nblocks;		/* current block stack level */
554
	const char *c_filename;	/* filename of current node */
555
	char *c_name;		/* name of object (e.g. function) */
556
	int c_lineno;		/* Current line number */
557 558
	int c_stacklevel;	/* Current stack level */
	int c_maxstacklevel;	/* Maximum stack level */
559
	int c_firstlineno;
560
	PyObject *c_lnotab;	/* Table mapping address to line number */
561
	int c_last_addr, c_last_line, c_lnotab_next;
562
	char *c_private;	/* for private name mangling */
Skip Montanaro's avatar
Skip Montanaro committed
563
	int c_tmpname;		/* temporary local name counter */
564 565 566
	int c_nested;		/* Is block nested funcdef or lamdef? */
	int c_closure;		/* Is nested w/freevars? */
	struct symtable *c_symtable; /* pointer to module symbol table */
567
        PyFutureFeatures *c_future; /* pointer to module's __future__ */
568
	char *c_encoding;	/* source encoding (a borrowed reference) */
569 570
};

571 572
static int
is_free(int v)
Jeremy Hylton's avatar
Jeremy Hylton committed
573 574 575 576 577 578 579 580
{
	if ((v & (USE | DEF_FREE))
	    && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
		return 1;
	if (v & DEF_FREE_CLASS)
		return 1;
	return 0;
}
581

582 583 584
static void
com_error(struct compiling *c, PyObject *exc, char *msg)
{
585 586
	PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;

587 588 589 590 591 592 593
	if (c == NULL) {
		/* Error occurred via symtable call to
		   is_constant_false */
		PyErr_SetString(exc, msg);
		return;
	}
	c->c_errors++;
594 595
	if (c->c_lineno < 1 || c->c_interactive) { 
		/* Unknown line number or interactive input */
596 597 598 599 600 601 602
		PyErr_SetString(exc, msg);
		return;
	}
	v = PyString_FromString(msg);
	if (v == NULL)
		return; /* MemoryError, too bad */

603
	line = PyErr_ProgramText(c->c_filename, c->c_lineno);
604 605 606 607
	if (line == NULL) {
		Py_INCREF(Py_None);
		line = Py_None;
	}
608 609 610 611 612
	if (exc == PyExc_SyntaxError) {
		t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
				  Py_None, line);
		if (t == NULL)
			goto exit;
613
		w = PyTuple_Pack(2, v, t);
614 615 616 617 618 619 620 621 622
		if (w == NULL)
			goto exit;
		PyErr_SetObject(exc, w);
	} else {
		/* Make sure additional exceptions are printed with
		   file and line, also. */
		PyErr_SetObject(exc, v);
		PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
	}
623 624 625 626 627
 exit:
	Py_XDECREF(t);
	Py_XDECREF(v);
	Py_XDECREF(w);
	Py_XDECREF(line);
628 629
}

630 631 632
/* Interface to the block stack */

static void
633
block_push(struct compiling *c, int type)
634
{
635
	if (c->c_nblocks >= CO_MAXBLOCKS) {
636 637
		com_error(c, PyExc_SystemError,
			  "too many statically nested blocks");
638 639 640 641 642 643 644
	}
	else {
		c->c_block[c->c_nblocks++] = type;
	}
}

static void
645
block_pop(struct compiling *c, int type)
646 647 648 649
{
	if (c->c_nblocks > 0)
		c->c_nblocks--;
	if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
650
		com_error(c, PyExc_SystemError, "bad block pop");
651 652 653
	}
}

654
/* Prototype forward declarations */
655

656 657
static int issue_warning(const char *, const char *, int);
static int com_init(struct compiling *, const char *);
658 659 660 661
static void com_free(struct compiling *);
static void com_push(struct compiling *, int);
static void com_pop(struct compiling *, int);
static void com_done(struct compiling *);
662 663
static void com_node(struct compiling *, node *);
static void com_factor(struct compiling *, node *);
664 665 666 667 668 669 670 671 672 673
static void com_addbyte(struct compiling *, int);
static void com_addint(struct compiling *, int);
static void com_addoparg(struct compiling *, int, int);
static void com_addfwref(struct compiling *, int, int *);
static void com_backpatch(struct compiling *, int);
static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
static int com_addconst(struct compiling *, PyObject *);
static int com_addname(struct compiling *, PyObject *);
static void com_addopname(struct compiling *, int, node *);
static void com_list(struct compiling *, node *, int);
Skip Montanaro's avatar
Skip Montanaro committed
674
static void com_list_iter(struct compiling *, node *, node *, char *);
675
static int com_argdefs(struct compiling *, node *);
676 677
static void com_assign(struct compiling *, node *, int, node *);
static void com_assign_name(struct compiling *, node *, int);
678
static PyCodeObject *icompile(node *, struct compiling *);
679
static PyCodeObject *jcompile(node *, const char *, struct compiling *,
680
			      PyCompilerFlags *);
681 682
static PyObject *parsestrplus(struct compiling*, node *);
static PyObject *parsestr(struct compiling *, char *);
683
static node *get_rawdocstring(node *);
Guido van Rossum's avatar
Guido van Rossum committed
684

Jeremy Hylton's avatar
Jeremy Hylton committed
685
static int get_ref_type(struct compiling *, char *);
686 687

/* symtable operations */
688 689
static struct symtable *symtable_build(node *, PyFutureFeatures *,
				       const char *filename);
690
static int symtable_load_symbols(struct compiling *);
691
static struct symtable *symtable_init(void);
692
static void symtable_enter_scope(struct symtable *, char *, int, int);
693 694
static int symtable_exit_scope(struct symtable *);
static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton's avatar
Jeremy Hylton committed
695
static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
696 697 698 699 700 701 702 703

static void symtable_node(struct symtable *, node *);
static void symtable_funcdef(struct symtable *, node *);
static void symtable_default_args(struct symtable *, node *);
static void symtable_params(struct symtable *, node *);
static void symtable_params_fplist(struct symtable *, node *n);
static void symtable_global(struct symtable *, node *);
static void symtable_import(struct symtable *, node *);
704
static void symtable_assign(struct symtable *, node *, int);
705
static void symtable_list_comprehension(struct symtable *, node *);
706
static void symtable_list_for(struct symtable *, node *);
707

Jeremy Hylton's avatar
Jeremy Hylton committed
708 709 710 711
static int symtable_update_free_vars(struct symtable *);
static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
static int symtable_check_global(struct symtable *, PyObject *, PyObject *);

712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
/* helper */
static void
do_pad(int pad)
{
	int i;
	for (i = 0; i < pad; ++i)
		fprintf(stderr, "  ");
}

static void
dump(node *n, int pad, int depth)
{
	int i;
	if (depth == 0)
	    return;
	do_pad(pad);
	fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
	if (depth > 0)
	    depth--;
	for (i = 0; i < NCH(n); ++i)
		dump(CHILD(n, i), pad + 1, depth);
}

#define DUMP(N) dump(N, 0, -1)

Guido van Rossum's avatar
Guido van Rossum committed
737
static int
738
com_init(struct compiling *c, const char *filename)
Guido van Rossum's avatar
Guido van Rossum committed
739
{
Guido van Rossum's avatar
Guido van Rossum committed
740
	memset((void *)c, '\0', sizeof(struct compiling));
741 742
	if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
						    1000)) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
743
		goto fail;
744
	if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
745 746 747
		goto fail;
	if ((c->c_const_dict = PyDict_New()) == NULL)
		goto fail;
748
	if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
749 750 751
		goto fail;
	if ((c->c_name_dict = PyDict_New()) == NULL)
		goto fail;
752
	if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
753
		goto fail;
754 755
	if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
						      1000)) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
756
		goto fail;
Jeremy Hylton's avatar
Jeremy Hylton committed
757
	c->c_globals = NULL;
758
	c->c_varnames = NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
759 760
	c->c_freevars = NULL;
	c->c_cellvars = NULL;
761 762 763
	c->c_nlocals = 0;
	c->c_argcount = 0;
	c->c_flags = 0;
Guido van Rossum's avatar
Guido van Rossum committed
764 765
	c->c_nexti = 0;
	c->c_errors = 0;
Guido van Rossum's avatar
Guido van Rossum committed
766
	c->c_infunction = 0;
767
	c->c_interactive = 0;
Guido van Rossum's avatar
Guido van Rossum committed
768
	c->c_loops = 0;
769 770
	c->c_begin = 0;
	c->c_nblocks = 0;
Guido van Rossum's avatar
Guido van Rossum committed
771
	c->c_filename = filename;
772
	c->c_name = "?";
773
	c->c_lineno = 0;
774 775
	c->c_stacklevel = 0;
	c->c_maxstacklevel = 0;
776 777 778
	c->c_firstlineno = 0;
	c->c_last_addr = 0;
	c->c_last_line = 0;
779
	c->c_lnotab_next = 0;
Skip Montanaro's avatar
Skip Montanaro committed
780
	c->c_tmpname = 0;
Jeremy Hylton's avatar
Jeremy Hylton committed
781 782
	c->c_nested = 0;
	c->c_closure = 0;
783
	c->c_symtable = NULL;
Guido van Rossum's avatar
Guido van Rossum committed
784 785
	return 1;
	
Guido van Rossum's avatar
Guido van Rossum committed
786 787
  fail:
	com_free(c);
Guido van Rossum's avatar
Guido van Rossum committed
788 789 790 791
 	return 0;
}

static void
792
com_free(struct compiling *c)
Guido van Rossum's avatar
Guido van Rossum committed
793
{
794 795
	Py_XDECREF(c->c_code);
	Py_XDECREF(c->c_consts);
Guido van Rossum's avatar
Guido van Rossum committed
796
	Py_XDECREF(c->c_const_dict);
797
	Py_XDECREF(c->c_names);
Guido van Rossum's avatar
Guido van Rossum committed
798
	Py_XDECREF(c->c_name_dict);
799 800 801
	Py_XDECREF(c->c_globals);
	Py_XDECREF(c->c_locals);
	Py_XDECREF(c->c_varnames);
Jeremy Hylton's avatar
Jeremy Hylton committed
802 803
	Py_XDECREF(c->c_freevars);
	Py_XDECREF(c->c_cellvars);
804
	Py_XDECREF(c->c_lnotab);
805
	if (c->c_future)
Andrew MacIntyre's avatar
Andrew MacIntyre committed
806
		PyObject_FREE((void *)c->c_future);
Guido van Rossum's avatar
Guido van Rossum committed
807 808
}

809
static void
810
com_push(struct compiling *c, int n)
811 812
{
	c->c_stacklevel += n;
813
	if (c->c_stacklevel > c->c_maxstacklevel) {
814
		c->c_maxstacklevel = c->c_stacklevel;
815 816 817 818 819 820
		/*
		fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
			c->c_filename, c->c_name, c->c_lineno,
			c->c_nexti, c->c_stacklevel, n);
		*/
	}
821 822 823
}

static void
824
com_pop(struct compiling *c, int n)
825
{
826
	if (c->c_stacklevel < n) 
827 828 829 830 831
		c->c_stacklevel = 0;
	else
		c->c_stacklevel -= n;
}

Guido van Rossum's avatar
Guido van Rossum committed
832
static void
833
com_done(struct compiling *c)
Guido van Rossum's avatar
Guido van Rossum committed
834 835
{
	if (c->c_code != NULL)
836
		_PyString_Resize(&c->c_code, c->c_nexti);
837
	if (c->c_lnotab != NULL)
838
		_PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum's avatar
Guido van Rossum committed
839 840
}

841 842 843 844 845 846 847 848 849
static int
com_check_size(PyObject **s, int offset)
{
	int len = PyString_GET_SIZE(*s);
	if (offset >= len) 
		return _PyString_Resize(s, len * 2);
	return 0;
}

Guido van Rossum's avatar
Guido van Rossum committed
850
static void
851
com_addbyte(struct compiling *c, int byte)
Guido van Rossum's avatar
Guido van Rossum committed
852
{
853
	/*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
854
	assert(byte >= 0 && byte <= 255);
855
	assert(c->c_code != 0);
856 857
	if (com_check_size(&c->c_code, c->c_nexti)) {
		c->c_errors++;
Guido van Rossum's avatar
Guido van Rossum committed
858 859
		return;
	}
860
	PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum's avatar
Guido van Rossum committed
861 862 863
}

static void
864
com_addint(struct compiling *c, int x)
Guido van Rossum's avatar
Guido van Rossum committed
865
{
Guido van Rossum's avatar
Guido van Rossum committed
866 867
	com_addbyte(c, x & 0xff);
	com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum's avatar
Guido van Rossum committed
868 869
}

870
static void
871
com_add_lnotab(struct compiling *c, int addr, int line)
872 873 874 875
{
	char *p;
	if (c->c_lnotab == NULL)
		return;
876 877 878
	if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
		c->c_errors++;
		return;
879
	}
880
	p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
881 882 883 884 885 886
	*p++ = addr;
	*p++ = line;
	c->c_lnotab_next += 2;
}

static void
887
com_set_lineno(struct compiling *c, int lineno)
888 889 890 891 892 893 894 895
{
	c->c_lineno = lineno;
	if (c->c_firstlineno == 0) {
		c->c_firstlineno = c->c_last_line = lineno;
	}
	else {
		int incr_addr = c->c_nexti - c->c_last_addr;
		int incr_line = lineno - c->c_last_line;
Tim Peters's avatar
Tim Peters committed
896 897 898 899 900 901 902 903
		while (incr_addr > 255) {
			com_add_lnotab(c, 255, 0);
			incr_addr -= 255;
		}
		while (incr_line > 255) {
			com_add_lnotab(c, incr_addr, 255);
			incr_line -=255;
			incr_addr = 0;
904
		}
Tim Peters's avatar
Tim Peters committed
905 906
		if (incr_addr > 0 || incr_line > 0)
			com_add_lnotab(c, incr_addr, incr_line);
907 908 909 910 911
		c->c_last_addr = c->c_nexti;
		c->c_last_line = lineno;
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
912
static void
913
com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum's avatar
Guido van Rossum committed
914
{
915 916 917 918 919 920
	int extended_arg = arg >> 16;
	if (extended_arg){
		com_addbyte(c, EXTENDED_ARG);
		com_addint(c, extended_arg);
		arg &= 0xffff;
	}
921 922
	com_addbyte(c, op);
	com_addint(c, arg);
Guido van Rossum's avatar
Guido van Rossum committed
923 924 925
}

static void
926
com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum's avatar
Guido van Rossum committed
927 928 929 930 931 932 933 934 935 936 937 938
{
	/* Compile a forward reference for backpatching */
	int here;
	int anchor;
	com_addbyte(c, op);
	here = c->c_nexti;
	anchor = *p_anchor;
	*p_anchor = here;
	com_addint(c, anchor == 0 ? 0 : here - anchor);
}

static void
939
com_backpatch(struct compiling *c, int anchor)
Guido van Rossum's avatar
Guido van Rossum committed
940
{
941
	unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum's avatar
Guido van Rossum committed
942 943 944 945 946
	int target = c->c_nexti;
	int dist;
	int prev;
	for (;;) {
		/* Make the JUMP instruction at anchor point to target */
Guido van Rossum's avatar
Guido van Rossum committed
947 948 949
		prev = code[anchor] + (code[anchor+1] << 8);
		dist = target - (anchor+2);
		code[anchor] = dist & 0xff;
950 951 952 953 954 955 956 957
		dist >>= 8;
		code[anchor+1] = dist;
		dist >>= 8;
		if (dist) {
			com_error(c, PyExc_SystemError,
				  "com_backpatch: offset too large");
			break;
		}
Guido van Rossum's avatar
Guido van Rossum committed
958 959 960 961 962 963
		if (!prev)
			break;
		anchor -= prev;
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
964
/* Handle literals and names uniformly */
Guido van Rossum's avatar
Guido van Rossum committed
965 966

static int
967
com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum's avatar
Guido van Rossum committed
968
{
Guido van Rossum's avatar
Guido van Rossum committed
969 970
	PyObject *w, *t, *np=NULL;
	long n;
971
	
972
	t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossum's avatar
Guido van Rossum committed
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
	if (t == NULL)
	    goto fail;
	w = PyDict_GetItem(dict, t);
	if (w != NULL) {
		n = PyInt_AsLong(w);
	} else {
		n = PyList_Size(list);
		np = PyInt_FromLong(n);
		if (np == NULL)
		    goto fail;
		if (PyList_Append(list, v) != 0)
		    goto fail;
		if (PyDict_SetItem(dict, t, np) != 0)
		    goto fail;
		Py_DECREF(np);
Guido van Rossum's avatar
Guido van Rossum committed
988
	}
Guido van Rossum's avatar
Guido van Rossum committed
989
	Py_DECREF(t);
Guido van Rossum's avatar
Guido van Rossum committed
990
	return n;
Guido van Rossum's avatar
Guido van Rossum committed
991 992 993 994 995
  fail:
	Py_XDECREF(np);
	Py_XDECREF(t);
	c->c_errors++;
	return 0;
Guido van Rossum's avatar
Guido van Rossum committed
996 997 998
}

static int
999
com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum's avatar
Guido van Rossum committed
1000
{
Guido van Rossum's avatar
Guido van Rossum committed
1001
	return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum's avatar
Guido van Rossum committed
1002 1003 1004
}

static int
1005
com_addname(struct compiling *c, PyObject *v)
Guido van Rossum's avatar
Guido van Rossum committed
1006
{
Guido van Rossum's avatar
Guido van Rossum committed
1007
	return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum's avatar
Guido van Rossum committed
1008 1009
}

1010 1011
int
_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
1012
{
1013
	/* Name mangling: __private becomes _classname__private.
1014
	   This is independent from how the name is used. */
1015
	size_t nlen, plen;
1016 1017
	if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
		return 0;
1018
	nlen = strlen(name);
1019
	if (nlen+2 >= maxlen)
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
		return 0; /* Don't mangle __extremely_long_names */
	if (name[nlen-1] == '_' && name[nlen-2] == '_')
		return 0; /* Don't mangle __whatever__ */
	/* Strip leading underscores from class name */
	while (*p == '_')
		p++;
	if (*p == '\0')
		return 0; /* Don't mangle if class is just underscores */
	plen = strlen(p);
	if (plen + nlen >= maxlen)
1030 1031
		plen = maxlen-nlen-2; /* Truncate class name if too long */
	/* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
1032 1033
	buffer[0] = '_';
	strncpy(buffer+1, p, plen);
1034
	strcpy(buffer+1+plen, name);
1035 1036
	return 1;
}
1037

Guido van Rossum's avatar
Guido van Rossum committed
1038
static void
1039
com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum's avatar
Guido van Rossum committed
1040
{
1041
	PyObject *v;
Guido van Rossum's avatar
Guido van Rossum committed
1042
	int i;
1043
	char buffer[MANGLE_LEN];
1044

1045
	if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
1046
		name = buffer;
1047
	if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
1048 1049 1050 1051 1052
		c->c_errors++;
		i = 255;
	}
	else {
		i = com_addname(c, v);
1053
		Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
1054
	}
1055 1056 1057
	com_addoparg(c, op, i);
}

Jeremy Hylton's avatar
Jeremy Hylton committed
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
#define NAME_LOCAL 0
#define NAME_GLOBAL 1
#define NAME_DEFAULT 2
#define NAME_CLOSURE 3

static int
com_lookup_arg(PyObject *dict, PyObject *name)
{
	PyObject *v = PyDict_GetItem(dict, name);
	if (v == NULL)
		return -1;
	else
		return PyInt_AS_LONG(v);
}

1073 1074 1075 1076 1077 1078
static int
none_assignment_check(struct compiling *c, char *name, int assigning)
{
	if (name[0] == 'N' && strcmp(name, "None") == 0) {
		char *msg;
		if (assigning)
1079
			msg = "assignment to None";
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
		else
			msg = "deleting None";
		if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
			c->c_errors++;
			return -1;
		}
	}
	return 0;
}

1090 1091 1092 1093
static void
com_addop_varname(struct compiling *c, int kind, char *name)
{
	PyObject *v;
Jeremy Hylton's avatar
Jeremy Hylton committed
1094 1095
	int i, reftype;
	int scope = NAME_DEFAULT;
1096 1097 1098
	int op = STOP_CODE;
	char buffer[MANGLE_LEN];

1099 1100 1101 1102 1103 1104 1105
	if (kind != VAR_LOAD &&
	    none_assignment_check(c, name, kind == VAR_STORE))
	{
		c->c_errors++;
		i = 255;
		goto done;
	}
1106
	if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
1107 1108 1109 1110 1111 1112 1113
		name = buffer;
	if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
		c->c_errors++;
		i = 255;
		goto done;
	}

Jeremy Hylton's avatar
Jeremy Hylton committed
1114 1115 1116
	reftype = get_ref_type(c, name);
	switch (reftype) {
	case LOCAL:
1117
		if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton's avatar
Jeremy Hylton committed
1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
			scope = NAME_LOCAL;
		break;
	case GLOBAL_EXPLICIT:
		scope = NAME_GLOBAL;
		break;
	case GLOBAL_IMPLICIT:
		if (c->c_flags & CO_OPTIMIZED)
			scope = NAME_GLOBAL;
		break;
	case FREE:
	case CELL:
		scope = NAME_CLOSURE;
		break;
1131 1132 1133
	}

	i = com_addname(c, v);
Jeremy Hylton's avatar
Jeremy Hylton committed
1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
	if (scope == NAME_LOCAL)
		i = com_lookup_arg(c->c_locals, v);
	else if (reftype == FREE)
		i = com_lookup_arg(c->c_freevars, v);
	else if (reftype == CELL)
		i = com_lookup_arg(c->c_cellvars, v);
	if (i == -1) {
		c->c_errors++; /* XXX no exception set */
		i = 255;
		goto done;
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
	}
	Py_DECREF(v);

	switch (kind) {
	case VAR_LOAD:
		switch (scope) {
		case NAME_LOCAL:
			op = LOAD_FAST;
			break;
		case NAME_GLOBAL:
			op = LOAD_GLOBAL;
			break;
		case NAME_DEFAULT:
			op = LOAD_NAME;
Jeremy Hylton's avatar
Jeremy Hylton committed
1158 1159 1160 1161
			break;
		case NAME_CLOSURE:
			op = LOAD_DEREF;
			break;
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
		}
		break;
	case VAR_STORE:
		switch (scope) {
		case NAME_LOCAL:
			op = STORE_FAST;
			break;
		case NAME_GLOBAL:
			op = STORE_GLOBAL;
			break;
		case NAME_DEFAULT:
			op = STORE_NAME;
Jeremy Hylton's avatar
Jeremy Hylton committed
1174 1175 1176 1177
			break;
		case NAME_CLOSURE:
			op = STORE_DEREF;
			break;
1178
		}
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
		break;
	case VAR_DELETE:
		switch (scope) {
		case NAME_LOCAL:
			op = DELETE_FAST;
			break;
		case NAME_GLOBAL:
			op = DELETE_GLOBAL;
			break;
		case NAME_DEFAULT:
			op = DELETE_NAME;
Jeremy Hylton's avatar
Jeremy Hylton committed
1190 1191
			break;
		case NAME_CLOSURE: {
1192
			char buf[500];
1193 1194
			PyOS_snprintf(buf, sizeof(buf),
				      DEL_CLOSURE_ERROR, name);
Jeremy Hylton's avatar
Jeremy Hylton committed
1195 1196 1197 1198
			com_error(c, PyExc_SyntaxError, buf);
			i = 255;
			break;
		}
1199 1200
		}
		break;
1201
	}
1202
done:
Guido van Rossum's avatar
Guido van Rossum committed
1203 1204 1205
	com_addoparg(c, op, i);
}

Guido van Rossum's avatar
Guido van Rossum committed
1206
static void
1207
com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
{
	char *name;
	char buffer[1000];
	/* XXX it is possible to write this code without the 1000
	   chars on the total length of dotted names, I just can't be
	   bothered right now */
	if (TYPE(n) == STAR)
		name = "*";
	else if (TYPE(n) == dotted_name) {
		char *p = buffer;
		int i;
		name = buffer;
		for (i = 0; i < NCH(n); i += 2) {
			char *s = STR(CHILD(n, i));
			if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
1223
				com_error(c, PyExc_MemoryError,
1224
					  "dotted_name too long");
1225
				name = NULL;
Guido van Rossum's avatar
Guido van Rossum committed
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
				break;
			}
			if (p != buffer)
				*p++ = '.';
			strcpy(p, s);
			p = strchr(p, '\0');
		}
	}
	else {
		REQ(n, NAME);
		name = STR(n);
	}
1238
	com_addop_name(c, op, name);
Guido van Rossum's avatar
Guido van Rossum committed
1239 1240
}

1241
static PyObject *
1242
parsenumber(struct compiling *c, char *s)
Guido van Rossum's avatar
Guido van Rossum committed
1243
{
1244
	char *end;
Guido van Rossum's avatar
Guido van Rossum committed
1245
	long x;
1246
	double dx;
1247 1248 1249 1250
#ifndef WITHOUT_COMPLEX
	int imflag;
#endif

1251
	errno = 0;
1252
	end = s + strlen(s) - 1;
1253
#ifndef WITHOUT_COMPLEX
1254
	imflag = *end == 'j' || *end == 'J';
1255
#endif
Guido van Rossum's avatar
Guido van Rossum committed
1256
	if (*end == 'l' || *end == 'L')
1257
		return PyLong_FromString(s, (char **)0, 0);
1258
	if (s[0] == '0') {
1259
		x = (long) PyOS_strtoul(s, &end, 0);
1260
		if (x < 0 && errno == 0) {
1261
			if (PyErr_WarnExplicit(
1262
				    PyExc_FutureWarning,
1263 1264 1265
				    "hex/oct constants > sys.maxint "
				    "will return positive values "
				    "in Python 2.4 and up",
1266 1267 1268
				    /* XXX: Give WarnExplicit
				       a const char* argument. */
				    (char*)c->c_filename,
1269
				    c->c_lineno,
1270 1271
				    NULL,
				    NULL) < 0)
1272
				return NULL;
1273
			errno = 0; /* Might be changed by PyErr_Warn() */
1274 1275
		}
	}
1276
	else
1277
		x = PyOS_strtol(s, &end, 0);
1278
	if (*end == '\0') {
1279 1280
		if (errno != 0)
			return PyLong_FromString(s, (char **)0, 0);
1281
		return PyInt_FromLong(x);
1282
	}
1283
	/* XXX Huge floats may silently fail */
1284 1285
#ifndef WITHOUT_COMPLEX
	if (imflag) {
1286 1287
		Py_complex z;
		z.real = 0.;
1288
		PyFPE_START_PROTECT("atof", return 0)
1289 1290 1291
		z.imag = atof(s);
		PyFPE_END_PROTECT(z)
		return PyComplex_FromCComplex(z);
1292
	}
1293
	else
1294
#endif
1295
	{
1296 1297
		PyFPE_START_PROTECT("atof", return 0)
		dx = atof(s);
1298
		PyFPE_END_PROTECT(dx)
1299
		return PyFloat_FromDouble(dx);
1300
	}
Guido van Rossum's avatar
Guido van Rossum committed
1301 1302
}

1303 1304 1305
static PyObject *
decode_utf8(char **sPtr, char *end, char* encoding)
{
1306
#ifndef Py_USING_UNICODE
1307 1308
	Py_FatalError("decode_utf8 should not be called in this build.");
        return NULL;
1309
#else
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321
	PyObject *u, *v;
	char *s, *t;
	t = s = *sPtr;
	/* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
	while (s < end && (*s & 0x80)) s++;
	*sPtr = s;
	u = PyUnicode_DecodeUTF8(t, s - t, NULL);
	if (u == NULL)
		return NULL;
	v = PyUnicode_AsEncodedString(u, encoding, NULL);
	Py_DECREF(u);
	return v;
1322
#endif
1323 1324
}

1325 1326 1327
/* compiler.transformer.Transformer.decode_literal depends on what 
   might seem like minor details of this function -- changes here 
   must be reflected there. */
1328
static PyObject *
1329
parsestr(struct compiling *c, char *s)
Guido van Rossum's avatar
Guido van Rossum committed
1330
{
1331
	PyObject *v;
1332
	size_t len;
1333
	int quote = *s;
1334
	int rawmode = 0;
1335
	char* encoding = ((c == NULL) ? NULL : c->c_encoding);
1336
	int need_encoding;
1337
	int unicode = 0;
1338

1339 1340 1341 1342 1343 1344 1345 1346 1347 1348
	if (isalpha(quote) || quote == '_') {
		if (quote == 'u' || quote == 'U') {
			quote = *++s;
			unicode = 1;
		}
		if (quote == 'r' || quote == 'R') {
			quote = *++s;
			rawmode = 1;
		}
	}
1349
	if (quote != '\'' && quote != '\"') {
1350
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
1351 1352 1353 1354
		return NULL;
	}
	s++;
	len = strlen(s);
1355
	if (len > INT_MAX) {
1356
		com_error(c, PyExc_OverflowError, 
1357
			  "string to parse is too long");
1358 1359
		return NULL;
	}
1360
	if (s[--len] != quote) {
1361
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
1362 1363
		return NULL;
	}
1364 1365 1366 1367
	if (len >= 4 && s[0] == quote && s[1] == quote) {
		s += 2;
		len -= 2;
		if (s[--len] != quote || s[--len] != quote) {
1368
			PyErr_BadInternalCall();
1369 1370 1371
			return NULL;
		}
	}
1372
#ifdef Py_USING_UNICODE
Guido van Rossum's avatar
Guido van Rossum committed
1373
	if (unicode || Py_UnicodeFlag) {
1374
		PyObject *u, *w;
1375 1376 1377
		char *buf;
		char *p;
		char *end;
1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
		if (encoding == NULL) {
			buf = s;
			u = NULL;
		} else if (strcmp(encoding, "iso-8859-1") == 0) {
			buf = s;
			u = NULL;
		} else {
			/* "\XX" may become "\u005c\uHHLL" (12 bytes) */
			u = PyString_FromStringAndSize((char *)NULL, len * 4);
			if (u == NULL)
				return NULL;
			p = buf = PyString_AsString(u);
			end = s + len;
			while (s < end) {
				if (*s == '\\') {
					*p++ = *s++;
					if (*s & 0x80) {
						strcpy(p, "u005c");
						p += 5;
					}
				}
				if (*s & 0x80) { /* XXX inefficient */
					char *r;
					int rn, i;
					w = decode_utf8(&s, end, "utf-16-be");
					if (w == NULL) {
						Py_DECREF(u);
						return NULL;
					}
					r = PyString_AsString(w);
					rn = PyString_Size(w);
					assert(rn % 2 == 0);
					for (i = 0; i < rn; i += 2) {
						sprintf(p, "\\u%02x%02x",
							r[i + 0] & 0xFF,
							r[i + 1] & 0xFF);
						p += 6;
					}
					Py_DECREF(w);
				} else {
					*p++ = *s++;
				}
			}
			len = p - buf;
		}
1423
		if (rawmode)
1424
			v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
1425
		else
1426 1427
			v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
		Py_XDECREF(u);
1428
		if (v == NULL)
1429
			PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1430 1431
		return v;
			
1432
	}
1433
#endif
1434 1435 1436 1437 1438
	need_encoding = (encoding != NULL &&
			 strcmp(encoding, "utf-8") != 0 &&
			 strcmp(encoding, "iso-8859-1") != 0);
	if (rawmode || strchr(s, '\\') == NULL) {
		if (need_encoding) {
1439 1440 1441
#ifndef Py_USING_UNICODE
			/* This should not happen - we never see any other
			   encoding. */
1442
			Py_FatalError("cannot deal with encodings in this build.");
1443
#else
1444 1445 1446 1447 1448 1449
			PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
			if (u == NULL)
				return NULL;
			v = PyUnicode_AsEncodedString(u, encoding, NULL);
			Py_DECREF(u);
			return v;
1450
#endif
1451 1452 1453 1454
		} else {
			return PyString_FromStringAndSize(s, len);
		}
	}
1455 1456 1457

	v = PyString_DecodeEscape(s, len, NULL, unicode,
				  need_encoding ? encoding : NULL);
1458
	if (v == NULL)
1459
		PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum's avatar
Guido van Rossum committed
1460 1461 1462
	return v;
}

1463
static PyObject *
1464
parsestrplus(struct compiling* c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
1465
{
1466
	PyObject *v;
Guido van Rossum's avatar
Guido van Rossum committed
1467 1468
	int i;
	REQ(CHILD(n, 0), STRING);
1469
	if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
1470
		/* String literal concatenation */
Fred Drake's avatar
Fred Drake committed
1471 1472
		for (i = 1; i < NCH(n); i++) {
		    PyObject *s;
1473
		    s = parsestr(c, STR(CHILD(n, i)));
Fred Drake's avatar
Fred Drake committed
1474 1475 1476 1477 1478 1479 1480
		    if (s == NULL)
			goto onError;
		    if (PyString_Check(v) && PyString_Check(s)) {
			PyString_ConcatAndDel(&v, s);
			if (v == NULL)
			    goto onError;
		    }
1481
#ifdef Py_USING_UNICODE
Fred Drake's avatar
Fred Drake committed
1482 1483 1484 1485 1486 1487 1488 1489 1490
		    else {
			PyObject *temp;
			temp = PyUnicode_Concat(v, s);
			Py_DECREF(s);
			if (temp == NULL)
			    goto onError;
			Py_DECREF(v);
			v = temp;
		    }
1491
#endif
Guido van Rossum's avatar
Guido van Rossum committed
1492 1493 1494
		}
	}
	return v;
Fred Drake's avatar
Fred Drake committed
1495 1496 1497 1498

 onError:
	Py_XDECREF(v);
	return NULL;
Guido van Rossum's avatar
Guido van Rossum committed
1499 1500
}

Guido van Rossum's avatar
Guido van Rossum committed
1501
static void
Skip Montanaro's avatar
Skip Montanaro committed
1502
com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum's avatar
Guido van Rossum committed
1503
{
Skip Montanaro's avatar
Skip Montanaro committed
1504 1505 1506 1507 1508
	int anchor = 0;
	int save_begin = c->c_begin;

	/* list_iter: for v in expr [list_iter] */
	com_node(c, CHILD(n, 3)); /* expr */
1509
	com_addbyte(c, GET_ITER);
Skip Montanaro's avatar
Skip Montanaro committed
1510
	c->c_begin = c->c_nexti;
1511
	com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro's avatar
Skip Montanaro committed
1512
	com_push(c, 1);
1513
	com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro's avatar
Skip Montanaro committed
1514 1515 1516 1517 1518 1519
	c->c_loops++;
	com_list_iter(c, n, e, t);
	c->c_loops--;
	com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
	c->c_begin = save_begin;
	com_backpatch(c, anchor);
1520
	com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro's avatar
Skip Montanaro committed
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
}  

static void
com_list_if(struct compiling *c, node *n, node *e, char *t)
{
	int anchor = 0;
	int a = 0;
	/* list_iter: 'if' test [list_iter] */
	com_node(c, CHILD(n, 1));
	com_addfwref(c, JUMP_IF_FALSE, &a);
	com_addbyte(c, POP_TOP);
	com_pop(c, 1);
	com_list_iter(c, n, e, t);
	com_addfwref(c, JUMP_FORWARD, &anchor);
	com_backpatch(c, a);
	/* We jump here with an extra entry which we now pop */
	com_addbyte(c, POP_TOP);
	com_backpatch(c, anchor);
}

static void
com_list_iter(struct compiling *c,
	      node *p,		/* parent of list_iter node */
	      node *e,		/* element expression node */
	      char *t		/* name of result list temp local */)
{
	/* list_iter is the last child in a listmaker, list_for, or list_if */
	node *n = CHILD(p, NCH(p)-1);
	if (TYPE(n) == list_iter) {
		n = CHILD(n, 0);
		switch (TYPE(n)) {
		case list_for: 
			com_list_for(c, n, e, t);
			break;
		case list_if:
			com_list_if(c, n, e, t);
			break;
		default:
			com_error(c, PyExc_SystemError,
				  "invalid list_iter node type");
		}
	}
	else {
1564
		com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro's avatar
Skip Montanaro committed
1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575
		com_push(c, 1);
		com_node(c, e);
		com_addoparg(c, CALL_FUNCTION, 1);
		com_addbyte(c, POP_TOP);
		com_pop(c, 2);
	}
}

static void
com_list_comprehension(struct compiling *c, node *n)
{
1576
	/* listmaker: test list_for */
1577
	char tmpname[30];
1578 1579

	REQ(n, listmaker);
1580
	PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro's avatar
Skip Montanaro committed
1581 1582 1583
	com_addoparg(c, BUILD_LIST, 0);
	com_addbyte(c, DUP_TOP); /* leave the result on the stack */
	com_push(c, 2);
1584 1585
	com_addop_name(c, LOAD_ATTR, "append");
	com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro's avatar
Skip Montanaro committed
1586
	com_pop(c, 1);
1587
	com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
1588
	com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro's avatar
Skip Montanaro committed
1589 1590 1591 1592 1593 1594
	--c->c_tmpname;
}

static void
com_listmaker(struct compiling *c, node *n)
{
1595 1596
	/* listmaker: test ( list_for | (',' test)* [','] ) */
	if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro's avatar
Skip Montanaro committed
1597 1598 1599 1600 1601 1602 1603 1604 1605
		com_list_comprehension(c, n);
	else {
		int len = 0;
		int i;
		for (i = 0; i < NCH(n); i += 2, len++)
			com_node(c, CHILD(n, i));
		com_addoparg(c, BUILD_LIST, len);
		com_pop(c, len-1);
	}
Guido van Rossum's avatar
Guido van Rossum committed
1606 1607
}

1608
static void
1609
com_dictmaker(struct compiling *c, node *n)
1610 1611 1612 1613 1614 1615 1616
{
	int i;
	/* dictmaker: test ':' test (',' test ':' value)* [','] */
	for (i = 0; i+2 < NCH(n); i += 4) {
		/* We must arrange things just right for STORE_SUBSCR.
		   It wants the stack to look like (value) (dict) (key) */
		com_addbyte(c, DUP_TOP);
1617
		com_push(c, 1);
1618
		com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer's avatar
Gustavo Niemeyer committed
1619 1620
		com_node(c, CHILD(n, i+2)); /* value */
		com_addbyte(c, ROT_THREE);
1621
		com_addbyte(c, STORE_SUBSCR);
1622
		com_pop(c, 3);
1623 1624 1625
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
1626
static void
1627
com_atom(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
1628 1629
{
	node *ch;
1630
	PyObject *v;
Guido van Rossum's avatar
Guido van Rossum committed
1631 1632 1633 1634 1635
	int i;
	REQ(n, atom);
	ch = CHILD(n, 0);
	switch (TYPE(ch)) {
	case LPAR:
1636
		if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum's avatar
Guido van Rossum committed
1637
			com_addoparg(c, BUILD_TUPLE, 0);
1638 1639
			com_push(c, 1);
		}
Guido van Rossum's avatar
Guido van Rossum committed
1640 1641 1642
		else
			com_node(c, CHILD(n, 1));
		break;
Skip Montanaro's avatar
Skip Montanaro committed
1643
	case LSQB: /* '[' [listmaker] ']' */
1644
		if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum's avatar
Guido van Rossum committed
1645
			com_addoparg(c, BUILD_LIST, 0);
1646 1647
			com_push(c, 1);
		}
Guido van Rossum's avatar
Guido van Rossum committed
1648
		else
Skip Montanaro's avatar
Skip Montanaro committed
1649
			com_listmaker(c, CHILD(n, 1));
Guido van Rossum's avatar
Guido van Rossum committed
1650
		break;
1651
	case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum's avatar
Guido van Rossum committed
1652
		com_addoparg(c, BUILD_MAP, 0);
1653
		com_push(c, 1);
Skip Montanaro's avatar
Skip Montanaro committed
1654
		if (TYPE(CHILD(n, 1)) == dictmaker)
1655
			com_dictmaker(c, CHILD(n, 1));
Guido van Rossum's avatar
Guido van Rossum committed
1656 1657 1658 1659 1660 1661
		break;
	case BACKQUOTE:
		com_node(c, CHILD(n, 1));
		com_addbyte(c, UNARY_CONVERT);
		break;
	case NUMBER:
1662
		if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
1663 1664 1665 1666
			i = 255;
		}
		else {
			i = com_addconst(c, v);
1667
			Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
1668 1669
		}
		com_addoparg(c, LOAD_CONST, i);
1670
		com_push(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
1671 1672
		break;
	case STRING:
1673
		v = parsestrplus(c, n);
1674
		if (v == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
1675 1676 1677 1678 1679
			c->c_errors++;
			i = 255;
		}
		else {
			i = com_addconst(c, v);
1680
			Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
1681 1682
		}
		com_addoparg(c, LOAD_CONST, i);
1683
		com_push(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
1684 1685
		break;
	case NAME:
1686
		com_addop_varname(c, VAR_LOAD, STR(ch));
1687
		com_push(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
1688 1689
		break;
	default:
1690 1691
		com_error(c, PyExc_SystemError,
			  "com_atom: unexpected node type");
Guido van Rossum's avatar
Guido van Rossum committed
1692 1693 1694 1695
	}
}

static void
1696
com_slice(struct compiling *c, node *n, int op)
Guido van Rossum's avatar
Guido van Rossum committed
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
{
	if (NCH(n) == 1) {
		com_addbyte(c, op);
	}
	else if (NCH(n) == 2) {
		if (TYPE(CHILD(n, 0)) != COLON) {
			com_node(c, CHILD(n, 0));
			com_addbyte(c, op+1);
		}
		else {
			com_node(c, CHILD(n, 1));
			com_addbyte(c, op+2);
		}
1710
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
1711 1712 1713 1714 1715
	}
	else {
		com_node(c, CHILD(n, 0));
		com_node(c, CHILD(n, 2));
		com_addbyte(c, op+3);
1716
		com_pop(c, 2);
Guido van Rossum's avatar
Guido van Rossum committed
1717 1718 1719
	}
}

1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
static void
com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
{
	if (NCH(n) == 1) {
		com_addbyte(c, DUP_TOP);
		com_push(c, 1);
		com_addbyte(c, SLICE);
		com_node(c, augn);
		com_addbyte(c, opcode);
		com_pop(c, 1);
		com_addbyte(c, ROT_TWO);
		com_addbyte(c, STORE_SLICE);
		com_pop(c, 2);
	} else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
		com_node(c, CHILD(n, 0));
		com_addoparg(c, DUP_TOPX, 2);
		com_push(c, 2);
		com_addbyte(c, SLICE+1);
		com_pop(c, 1);
		com_node(c, augn);
		com_addbyte(c, opcode);
		com_pop(c, 1);
		com_addbyte(c, ROT_THREE);
		com_addbyte(c, STORE_SLICE+1);
		com_pop(c, 3);
	} else if (NCH(n) == 2) {
		com_node(c, CHILD(n, 1));
		com_addoparg(c, DUP_TOPX, 2);
		com_push(c, 2);
		com_addbyte(c, SLICE+2);
		com_pop(c, 1);
		com_node(c, augn);
		com_addbyte(c, opcode);
		com_pop(c, 1);
		com_addbyte(c, ROT_THREE);
		com_addbyte(c, STORE_SLICE+2);
		com_pop(c, 3);
	} else {
		com_node(c, CHILD(n, 0));
		com_node(c, CHILD(n, 2));
		com_addoparg(c, DUP_TOPX, 3);
		com_push(c, 3);
		com_addbyte(c, SLICE+3);
		com_pop(c, 2);
		com_node(c, augn);
		com_addbyte(c, opcode);
		com_pop(c, 1);
		com_addbyte(c, ROT_FOUR);
		com_addbyte(c, STORE_SLICE+3);
		com_pop(c, 4);
	}
}

1773
static void
1774
com_argument(struct compiling *c, node *n, PyObject **pkeywords)
1775 1776
{
	node *m;
1777
	REQ(n, argument); /* [test '='] test; really [keyword '='] test */
1778
	if (NCH(n) == 1) {
1779
		if (*pkeywords != NULL) {
1780
			com_error(c, PyExc_SyntaxError,
1781
				  "non-keyword arg after keyword arg");
1782 1783 1784 1785
		}
		else {
			com_node(c, CHILD(n, 0));
		}
1786
		return;
1787 1788 1789 1790 1791 1792
	}
	m = n;
	do {
		m = CHILD(m, 0);
	} while (NCH(m) == 1);
	if (TYPE(m) != NAME) {
1793 1794 1795 1796 1797
		/* f(lambda x: x[0] = 3) ends up getting parsed with
		 * LHS test = lambda x: x[0], and RHS test = 3.
		 * SF bug 132313 points out that complaining about a keyword
		 * then is very confusing.
		 */
1798
		com_error(c, PyExc_SyntaxError,
1799 1800 1801
			  TYPE(m) == lambdef ?
				  "lambda cannot contain assignment" :
				  "keyword can't be an expression");
1802 1803
	}
	else {
1804
		PyObject *v = PyString_InternFromString(STR(m));
1805
		(void) none_assignment_check(c, STR(m), 1);
1806
		if (v != NULL && *pkeywords == NULL)
1807
			*pkeywords = PyDict_New();
1808
		if (v == NULL)
1809
			c->c_errors++;
1810 1811 1812 1813
		else if (*pkeywords == NULL) {
			c->c_errors++;
			Py_DECREF(v);
		} else {
1814 1815
			if (PyDict_GetItem(*pkeywords, v) != NULL)
				com_error(c, PyExc_SyntaxError,
1816 1817
					  "duplicate keyword argument");
			else
1818
				if (PyDict_SetItem(*pkeywords, v, v) != 0)
1819
					c->c_errors++;
1820
			com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1821
			com_push(c, 1);
1822
			Py_DECREF(v);
1823 1824 1825 1826 1827
		}
	}
	com_node(c, CHILD(n, 2));
}

Guido van Rossum's avatar
Guido van Rossum committed
1828
static void
1829
com_call_function(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
1830 1831
{
	if (TYPE(n) == RPAR) {
1832
		com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum's avatar
Guido van Rossum committed
1833 1834
	}
	else {
1835
		PyObject *keywords = NULL;
1836
		int i, na, nk;
1837
		int lineno = n->n_lineno;
1838 1839 1840
		int star_flag = 0;
		int starstar_flag = 0;
		int opcode;
1841 1842 1843 1844
		REQ(n, arglist);
		na = 0;
		nk = 0;
		for (i = 0; i < NCH(n); i += 2) {
1845
			node *ch = CHILD(n, i);
1846 1847 1848
			if (TYPE(ch) == STAR ||
			    TYPE(ch) == DOUBLESTAR)
			  break;
1849 1850
			if (ch->n_lineno != lineno) {
				lineno = ch->n_lineno;
Michael W. Hudson's avatar
Michael W. Hudson committed
1851
				com_set_lineno(c, lineno);
1852 1853
			}
			com_argument(c, ch, &keywords);
1854
			if (keywords == NULL)
1855 1856 1857 1858
				na++;
			else
				nk++;
		}
1859
		Py_XDECREF(keywords);
1860 1861 1862 1863 1864 1865 1866 1867 1868 1869
		while (i < NCH(n)) {
		    node *tok = CHILD(n, i);
		    node *ch = CHILD(n, i+1);
		    i += 3;
		    switch (TYPE(tok)) {
		    case STAR:       star_flag = 1;     break;
		    case DOUBLESTAR: starstar_flag = 1;	break;
		    }
		    com_node(c, ch);
		}
1870
		if (na > 255 || nk > 255) {
1871 1872
			com_error(c, PyExc_SyntaxError,
				  "more than 255 arguments");
1873
		}
1874
		if (star_flag || starstar_flag)
1875
		    opcode = CALL_FUNCTION_VAR - 1 + 
1876 1877 1878 1879 1880
			star_flag + (starstar_flag << 1);
		else
		    opcode = CALL_FUNCTION;
		com_addoparg(c, opcode, na | (nk << 8));
		com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum's avatar
Guido van Rossum committed
1881 1882 1883 1884
	}
}

static void
1885
com_select_member(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
1886 1887 1888 1889
{
	com_addopname(c, LOAD_ATTR, n);
}

1890
static void
1891
com_sliceobj(struct compiling *c, node *n)
1892 1893 1894 1895 1896 1897 1898
{
	int i=0;
	int ns=2; /* number of slice arguments */
	node *ch;

	/* first argument */
	if (TYPE(CHILD(n,i)) == COLON) {
1899
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
1900
		com_push(c, 1);
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913
		i++;
	}
	else {
		com_node(c, CHILD(n,i));
		i++;
		REQ(CHILD(n,i),COLON);
		i++;
	}
	/* second argument */
	if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
		com_node(c, CHILD(n,i));
		i++;
	}
1914
	else {
1915
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
1916 1917
		com_push(c, 1);
	}
1918 1919 1920 1921 1922 1923 1924
	/* remaining arguments */
	for (; i < NCH(n); i++) {
		ns++;
		ch=CHILD(n,i);
		REQ(ch, sliceop);
		if (NCH(ch) == 1) {
			/* right argument of ':' missing */
1925
			com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
1926
			com_push(c, 1);
1927 1928 1929 1930 1931
		}
		else
			com_node(c, CHILD(ch,1));
	}
	com_addoparg(c, BUILD_SLICE, ns);
1932
	com_pop(c, 1 + (ns == 3));
1933 1934 1935
}

static void
1936
com_subscript(struct compiling *c, node *n)
1937 1938 1939 1940 1941
{
	node *ch;
	REQ(n, subscript);
	ch = CHILD(n,0);
	/* check for rubber index */
1942
	if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
1943
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
1944 1945
		com_push(c, 1);
	}
1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957
	else {
		/* check for slice */
		if ((TYPE(ch) == COLON || NCH(n) > 1))
			com_sliceobj(c, n);
		else {
			REQ(ch, test);
			com_node(c, ch);
		}
	}
}

static void
1958
com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
1959 1960 1961 1962 1963 1964
{
	int i, op;
	REQ(n, subscriptlist);
	/* Check to make backward compatible slice behavior for '[i:j]' */
	if (NCH(n) == 1) {
		node *sub = CHILD(n, 0); /* subscript */
1965 1966 1967 1968 1969
		/* 'Basic' slice, should have exactly one colon. */
		if ((TYPE(CHILD(sub, 0)) == COLON
		     || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
		    && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
		{
1970 1971 1972 1973 1974 1975 1976 1977
			switch (assigning) {
			case OP_DELETE:
				op = DELETE_SLICE;
				break;
			case OP_ASSIGN:
				op = STORE_SLICE;
				break;
			case OP_APPLY:
1978
				op = SLICE;
1979 1980 1981 1982 1983
				break;
			default:
				com_augassign_slice(c, sub, assigning, augn);
				return;
			}
1984
			com_slice(c, sub, op);
1985 1986 1987 1988
			if (op == STORE_SLICE)
				com_pop(c, 2);
			else if (op == DELETE_SLICE)
				com_pop(c, 1);
1989 1990 1991 1992 1993 1994 1995
			return;
		}
	}
	/* Else normal subscriptlist.  Compile each subscript. */
	for (i = 0; i < NCH(n); i += 2)
		com_subscript(c, CHILD(n, i));
	/* Put multiple subscripts into a tuple */
1996 1997 1998 1999 2000
	if (NCH(n) > 1) {
		i = (NCH(n)+1) / 2;
		com_addoparg(c, BUILD_TUPLE, i);
		com_pop(c, i-1);
	}
2001 2002 2003 2004 2005 2006 2007
	switch (assigning) {
	case OP_DELETE:
		op = DELETE_SUBSCR;
		i = 2;
		break;
	default:
	case OP_ASSIGN:
2008 2009
		op = STORE_SUBSCR;
		i = 3;
2010 2011 2012 2013 2014
		break;
	case OP_APPLY:
		op = BINARY_SUBSCR;
		i = 1;
		break;
2015
	}
2016 2017 2018 2019 2020 2021 2022 2023 2024
	if (assigning > OP_APPLY) {
		com_addoparg(c, DUP_TOPX, 2);
		com_push(c, 2);
		com_addbyte(c, BINARY_SUBSCR);
		com_pop(c, 1);
		com_node(c, augn);
		com_addbyte(c, assigning);
		com_pop(c, 1);
		com_addbyte(c, ROT_THREE);
2025
	}
2026
	com_addbyte(c, op);
2027
	com_pop(c, i);
2028 2029
}

Guido van Rossum's avatar
Guido van Rossum committed
2030
static void
2031
com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2032 2033 2034 2035 2036 2037 2038 2039 2040 2041
{
	REQ(n, trailer);
	switch (TYPE(CHILD(n, 0))) {
	case LPAR:
		com_call_function(c, CHILD(n, 1));
		break;
	case DOT:
		com_select_member(c, CHILD(n, 1));
		break;
	case LSQB:
2042
		com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum's avatar
Guido van Rossum committed
2043 2044
		break;
	default:
2045
		com_error(c, PyExc_SystemError,
2046
			  "com_apply_trailer: unknown trailer type");
Guido van Rossum's avatar
Guido van Rossum committed
2047 2048 2049
	}
}

2050
static void
2051
com_power(struct compiling *c, node *n)
2052 2053 2054 2055 2056 2057 2058 2059
{
	int i;
	REQ(n, power);
	com_atom(c, CHILD(n, 0));
	for (i = 1; i < NCH(n); i++) {
		if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
			com_factor(c, CHILD(n, i+1));
			com_addbyte(c, BINARY_POWER);
2060
			com_pop(c, 1);
2061 2062 2063 2064 2065 2066 2067
			break;
		}
		else
			com_apply_trailer(c, CHILD(n, i));
	}
}

2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098
static void
com_invert_constant(struct compiling *c, node *n)
{
	/* Compute the inverse of int and longs and use them directly,
	   but be prepared to generate code for all other
	   possibilities (invalid numbers, floats, complex).
	*/
	PyObject *num, *inv = NULL;
	int i;

	REQ(n, NUMBER);
	num = parsenumber(c, STR(n));
	if (num == NULL) 
		i = 255;
	else {
		inv = PyNumber_Invert(num);
		if (inv == NULL) {
			PyErr_Clear();
			i = com_addconst(c, num);
		} else {
			i = com_addconst(c, inv);
			Py_DECREF(inv);
		}
		Py_DECREF(num);
	}
	com_addoparg(c, LOAD_CONST, i);
	com_push(c, 1);
	if (num != NULL && inv == NULL)
		com_addbyte(c, UNARY_INVERT);
}

2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
static int
is_float_zero(const char *p)
{
	int found_radix_point = 0;
	int ch;
	while ((ch = Py_CHARMASK(*p++)) != '\0') {
		switch (ch) {
		case '0':
			/* no reason to believe it's not 0 -- continue */
			break;

		case 'e': case 'E': case 'j': case 'J':
			/* If this was a hex constant, we already would have
			   returned 0 due to the 'x' or 'X', so 'e' or 'E'
			   must be an exponent marker, and we haven't yet
			   seen a non-zero digit, and it doesn't matter what
			   the exponent is then.  For 'j' or 'J' similarly,
			   except that this is an imaginary 0 then. */
			return 1;

		case '.':
			found_radix_point = 1;
			break;

		default:
			return 0;
		}
	}
	return found_radix_point;
}

Guido van Rossum's avatar
Guido van Rossum committed
2130
static void
2131
com_factor(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2132
{
2133
	int childtype = TYPE(CHILD(n, 0));
2134
	node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum's avatar
Guido van Rossum committed
2135
	REQ(n, factor);
2136
	/* If the unary +, -, or ~ operator is applied to a constant,
2137
	   don't generate a UNARY_xxx opcode.  Just store the
2138 2139
	   approriate value as a constant.  If the value is negative,
	   extend the string containing the constant and insert a
2140 2141 2142
	   negative in the 0th position -- unless we're doing unary minus
	   of a floating zero!  In that case the sign is significant, but
	   the const dict can't distinguish +0.0 from -0.0.
2143 2144
	 */
	if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
2145
	    && NCH(n) == 2
2146 2147 2148 2149 2150 2151
	    && TYPE((pfactor = CHILD(n, 1))) == factor
 	    && NCH(pfactor) == 1
	    && TYPE((ppower = CHILD(pfactor, 0))) == power
 	    && NCH(ppower) == 1
	    && TYPE((patom = CHILD(ppower, 0))) == atom
	    && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2152 2153
	    && !(childtype == MINUS &&
		 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
2154
		if (childtype == TILDE) {
2155
			com_invert_constant(c, pnum);
2156 2157 2158
			return;
		}
		if (childtype == MINUS) {
Andrew MacIntyre's avatar
Andrew MacIntyre committed
2159
			char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
2160 2161 2162 2163 2164 2165
			if (s == NULL) {
				com_error(c, PyExc_MemoryError, "");
				com_addbyte(c, 255);
				return;
			}
			s[0] = '-';
2166
			strcpy(s + 1, STR(pnum));
Andrew MacIntyre's avatar
Andrew MacIntyre committed
2167
			PyObject_FREE(STR(pnum));
2168
			STR(pnum) = s;
2169
		}
2170
		com_atom(c, patom);
2171 2172
	}
	else if (childtype == PLUS) {
Guido van Rossum's avatar
Guido van Rossum committed
2173 2174 2175
		com_factor(c, CHILD(n, 1));
		com_addbyte(c, UNARY_POSITIVE);
	}
2176
	else if (childtype == MINUS) {
Guido van Rossum's avatar
Guido van Rossum committed
2177 2178 2179
		com_factor(c, CHILD(n, 1));
		com_addbyte(c, UNARY_NEGATIVE);
	}
2180
	else if (childtype == TILDE) {
Guido van Rossum's avatar
Guido van Rossum committed
2181 2182 2183
		com_factor(c, CHILD(n, 1));
		com_addbyte(c, UNARY_INVERT);
	}
Guido van Rossum's avatar
Guido van Rossum committed
2184
	else {
2185
		com_power(c, CHILD(n, 0));
Guido van Rossum's avatar
Guido van Rossum committed
2186 2187 2188 2189
	}
}

static void
2190
com_term(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202
{
	int i;
	int op;
	REQ(n, term);
	com_factor(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_factor(c, CHILD(n, i));
		switch (TYPE(CHILD(n, i-1))) {
		case STAR:
			op = BINARY_MULTIPLY;
			break;
		case SLASH:
2203 2204 2205 2206
			if (c->c_flags & CO_FUTURE_DIVISION)
				op = BINARY_TRUE_DIVIDE;
			else
				op = BINARY_DIVIDE;
Guido van Rossum's avatar
Guido van Rossum committed
2207 2208 2209 2210
			break;
		case PERCENT:
			op = BINARY_MODULO;
			break;
2211 2212 2213
		case DOUBLESLASH:
			op = BINARY_FLOOR_DIVIDE;
			break;
Guido van Rossum's avatar
Guido van Rossum committed
2214
		default:
2215
			com_error(c, PyExc_SystemError,
2216
				  "com_term: operator not *, /, // or %");
Guido van Rossum's avatar
Guido van Rossum committed
2217 2218 2219
			op = 255;
		}
		com_addbyte(c, op);
2220
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2221 2222 2223 2224
	}
}

static void
2225
com_arith_expr(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2226 2227 2228
{
	int i;
	int op;
Guido van Rossum's avatar
Guido van Rossum committed
2229
	REQ(n, arith_expr);
Guido van Rossum's avatar
Guido van Rossum committed
2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240
	com_term(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_term(c, CHILD(n, i));
		switch (TYPE(CHILD(n, i-1))) {
		case PLUS:
			op = BINARY_ADD;
			break;
		case MINUS:
			op = BINARY_SUBTRACT;
			break;
		default:
2241
			com_error(c, PyExc_SystemError,
2242
				  "com_arith_expr: operator not + or -");
Guido van Rossum's avatar
Guido van Rossum committed
2243 2244 2245
			op = 255;
		}
		com_addbyte(c, op);
2246
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2247 2248 2249 2250
	}
}

static void
2251
com_shift_expr(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266
{
	int i;
	int op;
	REQ(n, shift_expr);
	com_arith_expr(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_arith_expr(c, CHILD(n, i));
		switch (TYPE(CHILD(n, i-1))) {
		case LEFTSHIFT:
			op = BINARY_LSHIFT;
			break;
		case RIGHTSHIFT:
			op = BINARY_RSHIFT;
			break;
		default:
2267
			com_error(c, PyExc_SystemError,
2268
				  "com_shift_expr: operator not << or >>");
Guido van Rossum's avatar
Guido van Rossum committed
2269 2270 2271
			op = 255;
		}
		com_addbyte(c, op);
2272
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2273 2274 2275 2276
	}
}

static void
2277
com_and_expr(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288
{
	int i;
	int op;
	REQ(n, and_expr);
	com_shift_expr(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_shift_expr(c, CHILD(n, i));
		if (TYPE(CHILD(n, i-1)) == AMPER) {
			op = BINARY_AND;
		}
		else {
2289
			com_error(c, PyExc_SystemError,
2290
				  "com_and_expr: operator not &");
Guido van Rossum's avatar
Guido van Rossum committed
2291 2292 2293
			op = 255;
		}
		com_addbyte(c, op);
2294
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2295 2296 2297 2298
	}
}

static void
2299
com_xor_expr(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310
{
	int i;
	int op;
	REQ(n, xor_expr);
	com_and_expr(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_and_expr(c, CHILD(n, i));
		if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
			op = BINARY_XOR;
		}
		else {
2311
			com_error(c, PyExc_SystemError,
2312
				  "com_xor_expr: operator not ^");
Guido van Rossum's avatar
Guido van Rossum committed
2313 2314 2315
			op = 255;
		}
		com_addbyte(c, op);
2316
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2317 2318 2319 2320
	}
}

static void
2321
com_expr(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332
{
	int i;
	int op;
	REQ(n, expr);
	com_xor_expr(c, CHILD(n, 0));
	for (i = 2; i < NCH(n); i += 2) {
		com_xor_expr(c, CHILD(n, i));
		if (TYPE(CHILD(n, i-1)) == VBAR) {
			op = BINARY_OR;
		}
		else {
2333
			com_error(c, PyExc_SystemError,
2334
				  "com_expr: expr operator not |");
Guido van Rossum's avatar
Guido van Rossum committed
2335 2336 2337
			op = 255;
		}
		com_addbyte(c, op);
2338
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2339 2340 2341 2342
	}
}

static enum cmp_op
2343
cmp_type(node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2344 2345
{
	REQ(n, comp_op);
2346
	/* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum's avatar
Guido van Rossum committed
2347 2348 2349 2350
	          | 'in' | 'not' 'in' | 'is' | 'is' not' */
	if (NCH(n) == 1) {
		n = CHILD(n, 0);
		switch (TYPE(n)) {
2351 2352
		case LESS:	return PyCmp_LT;
		case GREATER:	return PyCmp_GT;
2353
		case EQEQUAL:	return PyCmp_EQ;
2354 2355 2356 2357 2358
		case LESSEQUAL:	return PyCmp_LE;
		case GREATEREQUAL: return PyCmp_GE;
		case NOTEQUAL:	return PyCmp_NE;	/* <> or != */
		case NAME:	if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
				if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum's avatar
Guido van Rossum committed
2359 2360 2361 2362 2363
		}
	}
	else if (NCH(n) == 2) {
		switch (TYPE(CHILD(n, 0))) {
		case NAME:	if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2364
					return PyCmp_NOT_IN;
Guido van Rossum's avatar
Guido van Rossum committed
2365
				if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2366
					return PyCmp_IS_NOT;
Guido van Rossum's avatar
Guido van Rossum committed
2367 2368
		}
	}
2369
	return PyCmp_BAD;
Guido van Rossum's avatar
Guido van Rossum committed
2370 2371 2372
}

static void
2373
com_comparison(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412
{
	int i;
	enum cmp_op op;
	int anchor;
	REQ(n, comparison); /* comparison: expr (comp_op expr)* */
	com_expr(c, CHILD(n, 0));
	if (NCH(n) == 1)
		return;
	
	/****************************************************************
	   The following code is generated for all but the last
	   comparison in a chain:
	   
	   label:	on stack:	opcode:		jump to:
	   
			a		<code to load b>
			a, b		DUP_TOP
			a, b, b		ROT_THREE
			b, a, b		COMPARE_OP
			b, 0-or-1	JUMP_IF_FALSE	L1
			b, 1		POP_TOP
			b		
	
	   We are now ready to repeat this sequence for the next
	   comparison in the chain.
	   
	   For the last we generate:
	   
	   		b		<code to load c>
	   		b, c		COMPARE_OP
	   		0-or-1		
	   
	   If there were any jumps to L1 (i.e., there was more than one
	   comparison), we generate:
	   
	   		0-or-1		JUMP_FORWARD	L2
	   L1:		b, 0		ROT_TWO
	   		0, b		POP_TOP
	   		0
2413
	   L2:		0-or-1
Guido van Rossum's avatar
Guido van Rossum committed
2414 2415 2416 2417 2418 2419 2420 2421
	****************************************************************/
	
	anchor = 0;
	
	for (i = 2; i < NCH(n); i += 2) {
		com_expr(c, CHILD(n, i));
		if (i+2 < NCH(n)) {
			com_addbyte(c, DUP_TOP);
2422
			com_push(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2423 2424 2425
			com_addbyte(c, ROT_THREE);
		}
		op = cmp_type(CHILD(n, i-1));
2426
		if (op == PyCmp_BAD) {
2427
			com_error(c, PyExc_SystemError,
2428
				  "com_comparison: unknown comparison op");
Guido van Rossum's avatar
Guido van Rossum committed
2429 2430
		}
		com_addoparg(c, COMPARE_OP, op);
2431
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2432 2433 2434
		if (i+2 < NCH(n)) {
			com_addfwref(c, JUMP_IF_FALSE, &anchor);
			com_addbyte(c, POP_TOP);
2435
			com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449
		}
	}
	
	if (anchor) {
		int anchor2 = 0;
		com_addfwref(c, JUMP_FORWARD, &anchor2);
		com_backpatch(c, anchor);
		com_addbyte(c, ROT_TWO);
		com_addbyte(c, POP_TOP);
		com_backpatch(c, anchor2);
	}
}

static void
2450
com_not_test(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462
{
	REQ(n, not_test); /* 'not' not_test | comparison */
	if (NCH(n) == 1) {
		com_comparison(c, CHILD(n, 0));
	}
	else {
		com_not_test(c, CHILD(n, 1));
		com_addbyte(c, UNARY_NOT);
	}
}

static void
2463
com_and_test(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475
{
	int i;
	int anchor;
	REQ(n, and_test); /* not_test ('and' not_test)* */
	anchor = 0;
	i = 0;
	for (;;) {
		com_not_test(c, CHILD(n, i));
		if ((i += 2) >= NCH(n))
			break;
		com_addfwref(c, JUMP_IF_FALSE, &anchor);
		com_addbyte(c, POP_TOP);
2476
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2477 2478 2479 2480 2481
	}
	if (anchor)
		com_backpatch(c, anchor);
}

Jeremy Hylton's avatar
Jeremy Hylton committed
2482 2483 2484
static int
com_make_closure(struct compiling *c, PyCodeObject *co)
{
2485
	int i, free = PyCode_GetNumFree(co);
Jeremy Hylton's avatar
Jeremy Hylton committed
2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506
	if (free == 0)
		return 0;
	for (i = 0; i < free; ++i) {
		/* Bypass com_addop_varname because it will generate
		   LOAD_DEREF but LOAD_CLOSURE is needed. 
		*/
		PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
		int arg, reftype;

		/* Special case: If a class contains a method with a
		   free variable that has the same name as a method,
		   the name will be considered free *and* local in the
		   class.  It should be handled by the closure, as
		   well as by the normal name loookup logic.
		*/
		reftype = get_ref_type(c, PyString_AS_STRING(name));	
		if (reftype == CELL)
			arg = com_lookup_arg(c->c_cellvars, name);
		else /* (reftype == FREE) */
			arg = com_lookup_arg(c->c_freevars, name);
		if (arg == -1) {
2507 2508 2509 2510 2511 2512 2513
			fprintf(stderr, "lookup %s in %s %d %d\n"
				"freevars of %s: %s\n",
				PyObject_REPR(name), 
				c->c_name, 
				reftype, arg,
				PyString_AS_STRING(co->co_name),
				PyObject_REPR(co->co_freevars));
Jeremy Hylton's avatar
Jeremy Hylton committed
2514 2515 2516 2517 2518 2519 2520 2521 2522
			Py_FatalError("com_make_closure()");
		}
		com_addoparg(c, LOAD_CLOSURE, arg);

	}
	com_push(c, free);
	return 1;
}

Guido van Rossum's avatar
Guido van Rossum committed
2523
static void
2524
com_test(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2525
{
2526
	REQ(n, test); /* and_test ('or' and_test)* | lambdef */
2527
	if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
2528
		PyCodeObject *co;
Jeremy Hylton's avatar
Jeremy Hylton committed
2529
		int i, closure;
2530
		int ndefs = com_argdefs(c, CHILD(n, 0));
2531 2532
		symtable_enter_scope(c->c_symtable, "lambda", lambdef,
				     n->n_lineno);
2533
		co = icompile(CHILD(n, 0), c);
2534 2535 2536 2537
		if (co == NULL) {
			c->c_errors++;
			return;
		}
2538
		symtable_exit_scope(c->c_symtable);
2539 2540
		i = com_addconst(c, (PyObject *)co);
		closure = com_make_closure(c, co);
2541
		com_addoparg(c, LOAD_CONST, i);
2542
		com_push(c, 1);
2543
		if (closure) {
Jeremy Hylton's avatar
Jeremy Hylton committed
2544
			com_addoparg(c, MAKE_CLOSURE, ndefs);
2545
			com_pop(c, PyCode_GetNumFree(co));
2546
		} else
Jeremy Hylton's avatar
Jeremy Hylton committed
2547
			com_addoparg(c, MAKE_FUNCTION, ndefs);
2548
		Py_DECREF(co);
2549
		com_pop(c, ndefs);
2550 2551 2552 2553 2554 2555 2556 2557 2558 2559
	}
	else {
		int anchor = 0;
		int i = 0;
		for (;;) {
			com_and_test(c, CHILD(n, i));
			if ((i += 2) >= NCH(n))
				break;
			com_addfwref(c, JUMP_IF_TRUE, &anchor);
			com_addbyte(c, POP_TOP);
2560
			com_pop(c, 1);
2561 2562 2563
		}
		if (anchor)
			com_backpatch(c, anchor);
Guido van Rossum's avatar
Guido van Rossum committed
2564 2565 2566 2567
	}
}

static void
2568
com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum's avatar
Guido van Rossum committed
2569 2570
{
	/* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum's avatar
Guido van Rossum committed
2571
	if (NCH(n) == 1 && !toplevel) {
Guido van Rossum's avatar
Guido van Rossum committed
2572 2573 2574 2575 2576 2577 2578 2579 2580
		com_node(c, CHILD(n, 0));
	}
	else {
		int i;
		int len;
		len = (NCH(n) + 1) / 2;
		for (i = 0; i < NCH(n); i += 2)
			com_node(c, CHILD(n, i));
		com_addoparg(c, BUILD_TUPLE, len);
2581
		com_pop(c, len-1);
Guido van Rossum's avatar
Guido van Rossum committed
2582 2583 2584 2585 2586 2587
	}
}


/* Begin of assignment compilation */

2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601

static void
com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
{
	com_addbyte(c, DUP_TOP);
	com_push(c, 1);
	com_addopname(c, LOAD_ATTR, n);
	com_node(c, augn);
	com_addbyte(c, opcode);
	com_pop(c, 1);
	com_addbyte(c, ROT_TWO);
	com_addopname(c, STORE_ATTR, n);
	com_pop(c, 2);
}
Guido van Rossum's avatar
Guido van Rossum committed
2602 2603

static void
2604
com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum's avatar
Guido van Rossum committed
2605
{
2606 2607
	if (none_assignment_check(c, STR(n), assigning))
		return;
Guido van Rossum's avatar
Guido van Rossum committed
2608
	com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
2609
	com_pop(c, assigning ? 2 : 1);
Guido van Rossum's avatar
Guido van Rossum committed
2610 2611 2612
}

static void
2613
com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum's avatar
Guido van Rossum committed
2614 2615 2616 2617
{
	REQ(n, trailer);
	switch (TYPE(CHILD(n, 0))) {
	case LPAR: /* '(' [exprlist] ')' */
2618 2619 2620 2621 2622 2623
		if (assigning == OP_DELETE)
			com_error(c, PyExc_SyntaxError,
				  "can't delete function call");
		else
			com_error(c, PyExc_SyntaxError,
				  "can't assign to function call");
Guido van Rossum's avatar
Guido van Rossum committed
2624 2625
		break;
	case DOT: /* '.' NAME */
2626 2627 2628 2629
		if (assigning > OP_APPLY)
			com_augassign_attr(c, CHILD(n, 1), assigning, augn);
		else
			com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum's avatar
Guido van Rossum committed
2630
		break;
2631
	case LSQB: /* '[' subscriptlist ']' */
2632
		com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum's avatar
Guido van Rossum committed
2633 2634
		break;
	default:
2635
		com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum's avatar
Guido van Rossum committed
2636 2637 2638 2639
	}
}

static void
2640
com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum's avatar
Guido van Rossum committed
2641 2642
{
	int i;
2643
	if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum's avatar
Guido van Rossum committed
2644
		REQ(n, exprlist);
2645 2646
	if (assigning) {
		i = (NCH(n)+1)/2;
2647
		com_addoparg(c, UNPACK_SEQUENCE, i);
2648 2649
		com_push(c, i-1);
	}
Guido van Rossum's avatar
Guido van Rossum committed
2650
	for (i = 0; i < NCH(n); i += 2)
2651 2652 2653 2654 2655 2656 2657
		com_assign(c, CHILD(n, i), assigning, NULL);
}

static void
com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
{
	REQ(n, NAME);
2658
	com_addop_varname(c, VAR_LOAD, STR(n));
2659 2660 2661 2662 2663
	com_push(c, 1);
	com_node(c, augn);
	com_addbyte(c, opcode);
	com_pop(c, 1);
	com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum's avatar
Guido van Rossum committed
2664 2665 2666
}

static void
2667
com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum's avatar
Guido van Rossum committed
2668 2669
{
	REQ(n, NAME);
2670
	com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
2671 2672
	if (assigning)
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2673 2674 2675
}

static void
2676
com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum's avatar
Guido van Rossum committed
2677 2678 2679 2680
{
	/* Loop to avoid trivial recursion */
	for (;;) {
		switch (TYPE(n)) {
Guido van Rossum's avatar
Guido van Rossum committed
2681
		
Guido van Rossum's avatar
Guido van Rossum committed
2682 2683
		case exprlist:
		case testlist:
2684
		case testlist1:
Guido van Rossum's avatar
Guido van Rossum committed
2685
			if (NCH(n) > 1) {
2686 2687
				if (assigning > OP_APPLY) {
					com_error(c, PyExc_SyntaxError,
2688
				  "augmented assign to tuple not possible");
2689 2690
					return;
				}
2691
				com_assign_sequence(c, n, assigning);
Guido van Rossum's avatar
Guido van Rossum committed
2692 2693 2694 2695
				return;
			}
			n = CHILD(n, 0);
			break;
Guido van Rossum's avatar
Guido van Rossum committed
2696
		
Guido van Rossum's avatar
Guido van Rossum committed
2697 2698 2699 2700 2701
		case test:
		case and_test:
		case not_test:
		case comparison:
		case expr:
Guido van Rossum's avatar
Guido van Rossum committed
2702 2703 2704 2705
		case xor_expr:
		case and_expr:
		case shift_expr:
		case arith_expr:
Guido van Rossum's avatar
Guido van Rossum committed
2706
		case term:
2707
		case factor:
Guido van Rossum's avatar
Guido van Rossum committed
2708
			if (NCH(n) > 1) {
2709
				com_error(c, PyExc_SyntaxError,
2710
					  "can't assign to operator");
Guido van Rossum's avatar
Guido van Rossum committed
2711 2712 2713 2714
				return;
			}
			n = CHILD(n, 0);
			break;
Guido van Rossum's avatar
Guido van Rossum committed
2715
		
2716 2717
		case power: /* atom trailer* ('**' power)*
                              ('+'|'-'|'~') factor | atom trailer* */
2718
			if (TYPE(CHILD(n, 0)) != atom) {
2719
				com_error(c, PyExc_SyntaxError,
2720
					  "can't assign to operator");
Guido van Rossum's avatar
Guido van Rossum committed
2721 2722
				return;
			}
2723
			if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum's avatar
Guido van Rossum committed
2724 2725 2726
				int i;
				com_node(c, CHILD(n, 0));
				for (i = 1; i+1 < NCH(n); i++) {
2727
					if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2728
						com_error(c, PyExc_SyntaxError,
2729
						  "can't assign to operator");
2730 2731
						return;
					}
Guido van Rossum's avatar
Guido van Rossum committed
2732 2733 2734
					com_apply_trailer(c, CHILD(n, i));
				} /* NB i is still alive */
				com_assign_trailer(c,
2735
						CHILD(n, i), assigning, augn);
Guido van Rossum's avatar
Guido van Rossum committed
2736 2737 2738 2739
				return;
			}
			n = CHILD(n, 0);
			break;
Guido van Rossum's avatar
Guido van Rossum committed
2740
		
Guido van Rossum's avatar
Guido van Rossum committed
2741 2742 2743 2744 2745 2746
		case atom:
			switch (TYPE(CHILD(n, 0))) {
			case LPAR:
				n = CHILD(n, 1);
				if (TYPE(n) == RPAR) {
					/* XXX Should allow () = () ??? */
2747
					com_error(c, PyExc_SyntaxError,
2748
						  "can't assign to ()");
Guido van Rossum's avatar
Guido van Rossum committed
2749 2750
					return;
				}
2751 2752
				if (assigning > OP_APPLY) {
					com_error(c, PyExc_SyntaxError,
2753
				  "augmented assign to tuple literal not possible");
2754 2755
					return;
				}
Guido van Rossum's avatar
Guido van Rossum committed
2756 2757 2758 2759
				break;
			case LSQB:
				n = CHILD(n, 1);
				if (TYPE(n) == RSQB) {
2760
					com_error(c, PyExc_SyntaxError,
2761
						  "can't assign to []");
Guido van Rossum's avatar
Guido van Rossum committed
2762 2763
					return;
				}
2764 2765
				if (assigning > OP_APPLY) {
					com_error(c, PyExc_SyntaxError,
2766
				  "augmented assign to list literal not possible");
2767 2768 2769 2770 2771
					return;
				}
				if (NCH(n) > 1 
				    && TYPE(CHILD(n, 1)) == list_for) {
					com_error(c, PyExc_SyntaxError,
Jeremy Hylton's avatar
Jeremy Hylton committed
2772
				  "can't assign to list comprehension");
2773 2774
					return;
				}
2775
				com_assign_sequence(c, n, assigning);
Guido van Rossum's avatar
Guido van Rossum committed
2776 2777
				return;
			case NAME:
2778 2779 2780 2781 2782 2783
				if (assigning > OP_APPLY)
					com_augassign_name(c, CHILD(n, 0),
							   assigning, augn);
				else
					com_assign_name(c, CHILD(n, 0),
							assigning);
Guido van Rossum's avatar
Guido van Rossum committed
2784 2785
				return;
			default:
2786
				com_error(c, PyExc_SyntaxError,
2787
					  "can't assign to literal");
Guido van Rossum's avatar
Guido van Rossum committed
2788 2789 2790
				return;
			}
			break;
2791 2792

		case lambdef:
2793 2794
			com_error(c, PyExc_SyntaxError,
				  "can't assign to lambda");
2795
			return;
Guido van Rossum's avatar
Guido van Rossum committed
2796
		
Guido van Rossum's avatar
Guido van Rossum committed
2797
		default:
2798 2799
			com_error(c, PyExc_SystemError,
				  "com_assign: bad node");
Guido van Rossum's avatar
Guido van Rossum committed
2800
			return;
Guido van Rossum's avatar
Guido van Rossum committed
2801
		
Guido van Rossum's avatar
Guido van Rossum committed
2802 2803 2804
		}
	}
}
2805

2806 2807 2808 2809 2810 2811 2812 2813
static void
com_augassign(struct compiling *c, node *n)
{
	int opcode;

	switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
	case '+': opcode = INPLACE_ADD; break;
	case '-': opcode = INPLACE_SUBTRACT; break;
2814 2815 2816 2817 2818 2819 2820 2821
	case '/':
		if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
			opcode = INPLACE_FLOOR_DIVIDE;
		else if (c->c_flags & CO_FUTURE_DIVISION)
			opcode = INPLACE_TRUE_DIVIDE;
		else
			opcode = INPLACE_DIVIDE;
		break;
2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839
	case '%': opcode = INPLACE_MODULO; break;
	case '<': opcode = INPLACE_LSHIFT; break;
	case '>': opcode = INPLACE_RSHIFT; break;
	case '&': opcode = INPLACE_AND; break;
	case '^': opcode = INPLACE_XOR; break;
	case '|': opcode = INPLACE_OR; break;
	case '*':
		if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
			opcode = INPLACE_POWER;
		else
			opcode = INPLACE_MULTIPLY;
		break;
	default:
		com_error(c, PyExc_SystemError, "com_augassign: bad operator");
		return;
	}
	com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
}
Guido van Rossum's avatar
Guido van Rossum committed
2840 2841

static void
2842
com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2843
{
2844 2845
	REQ(n, expr_stmt);
	/* testlist (('=' testlist)* | augassign testlist) */
2846
	/* Forget it if we have just a doc string here */
2847
	if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
2848
		return;
2849 2850
 	if (NCH(n) == 1) {
		com_node(c, CHILD(n, NCH(n)-1));
2851 2852 2853 2854
		if (c->c_interactive)
			com_addbyte(c, PRINT_EXPR);
		else
			com_addbyte(c, POP_TOP);
2855
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
2856
	}
2857 2858
	else if (TYPE(CHILD(n,1)) == augassign)
		com_augassign(c, n);
Guido van Rossum's avatar
Guido van Rossum committed
2859 2860
	else {
		int i;
2861
		com_node(c, CHILD(n, NCH(n)-1));
2862
		for (i = 0; i < NCH(n)-2; i+=2) {
2863
			if (i+2 < NCH(n)-2) {
Guido van Rossum's avatar
Guido van Rossum committed
2864
				com_addbyte(c, DUP_TOP);
2865 2866
				com_push(c, 1);
			}
2867
			com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum's avatar
Guido van Rossum committed
2868 2869 2870 2871
		}
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
2872
static void
2873
com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2874
{
2875
	int a = 0;
Guido van Rossum's avatar
Guido van Rossum committed
2876 2877
	int i;
	REQ(n, assert_stmt); /* 'assert' test [',' test] */
2878 2879 2880
	if (Py_OptimizeFlag)
		return;
	/* Generate code like
Guido van Rossum's avatar
Guido van Rossum committed
2881
	   
2882
	     if not <test>:
Guido van Rossum's avatar
Guido van Rossum committed
2883 2884 2885 2886 2887
	         raise AssertionError [, <message>]

	   where <message> is the second test, if present.
	*/
	com_node(c, CHILD(n, 1));
2888
	com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum's avatar
Guido van Rossum committed
2889 2890 2891
	com_addbyte(c, POP_TOP);
	com_pop(c, 1);
	/* Raise that exception! */
2892
	com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum's avatar
Guido van Rossum committed
2893 2894 2895 2896 2897 2898 2899
	com_push(c, 1);
	i = NCH(n)/2; /* Either 2 or 4 */
	if (i > 1)
		com_node(c, CHILD(n, 3));
	com_addoparg(c, RAISE_VARARGS, i);
	com_pop(c, i);
	/* The interpreter does not fall through */
2900
	/* Jump ends up here */
Guido van Rossum's avatar
Guido van Rossum committed
2901 2902 2903 2904
	com_backpatch(c, a);
	com_addbyte(c, POP_TOP);
}

Guido van Rossum's avatar
Guido van Rossum committed
2905
static void
2906
com_print_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2907
{
2908 2909 2910
	int i = 1;
	node* stream = NULL;

2911
	REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2912 2913 2914 2915

	/* are we using the extended print form? */
	if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
		stream = CHILD(n, 2);
2916 2917 2918
		com_node(c, stream);
		/* stack: [...] => [... stream] */
		com_push(c, 1);
2919 2920 2921 2922 2923 2924 2925
		if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
			i = 4;
		else
			i = 3;
	}
	for (; i < NCH(n); i += 2) {
		if (stream != NULL) {
2926 2927 2928
			com_addbyte(c, DUP_TOP);
			/* stack: [stream] => [stream stream] */
			com_push(c, 1);
2929
			com_node(c, CHILD(n, i));
2930 2931 2932
			/* stack: [stream stream] => [stream stream obj] */
			com_addbyte(c, ROT_TWO);
			/* stack: [stream stream obj] => [stream obj stream] */
2933
			com_addbyte(c, PRINT_ITEM_TO);
2934
			/* stack: [stream obj stream] => [stream] */
2935 2936 2937 2938
			com_pop(c, 2);
		}
		else {
			com_node(c, CHILD(n, i));
2939
			/* stack: [...] => [... obj] */
2940 2941 2942 2943 2944
			com_addbyte(c, PRINT_ITEM);
			com_pop(c, 1);
		}
	}
	/* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
2945 2946 2947 2948 2949 2950 2951 2952 2953
	if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
		if (stream != NULL) {
			/* must pop the extra stream object off the stack */
			com_addbyte(c, POP_TOP);
			/* stack: [... stream] => [...] */
			com_pop(c, 1);
		}
	}
	else {
2954
		if (stream != NULL) {
2955
			/* this consumes the last stream object on stack */
2956
			com_addbyte(c, PRINT_NEWLINE_TO);
2957
			/* stack: [... stream] => [...] */
2958 2959 2960 2961
			com_pop(c, 1);
		}
		else
			com_addbyte(c, PRINT_NEWLINE);
Guido van Rossum's avatar
Guido van Rossum committed
2962 2963 2964 2965
	}
}

static void
2966
com_return_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
2967
{
2968
	REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum's avatar
Guido van Rossum committed
2969
	if (!c->c_infunction) {
2970
		com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum's avatar
Guido van Rossum committed
2971
	}
2972 2973 2974 2975 2976 2977
	if (c->c_flags & CO_GENERATOR) {
		if (NCH(n) > 1) {
			com_error(c, PyExc_SyntaxError,
				  "'return' with argument inside generator");
		}
	}
2978 2979 2980
	if (NCH(n) < 2) {
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
		com_push(c, 1);
2981
	}
2982 2983 2984
	else
		com_node(c, CHILD(n, 1));
	com_addbyte(c, RETURN_VALUE);
2985 2986 2987 2988 2989 2990
	com_pop(c, 1);
}

static void
com_yield_stmt(struct compiling *c, node *n)
{
2991
	int i;
2992 2993 2994 2995
	REQ(n, yield_stmt); /* 'yield' testlist */
	if (!c->c_infunction) {
		com_error(c, PyExc_SyntaxError, "'yield' outside function");
	}
2996 2997 2998 2999 3000 3001 3002 3003 3004
	
	for (i = 0; i < c->c_nblocks; ++i) {
		if (c->c_block[i] == SETUP_FINALLY) {
			com_error(c, PyExc_SyntaxError,
				  "'yield' not allowed in a 'try' block "
				  "with a 'finally' clause");
			return;
		}
	}
3005 3006
	com_node(c, CHILD(n, 1));
	com_addbyte(c, YIELD_VALUE);
3007
	com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
3008 3009 3010
}

static void
3011
com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3012
{
3013
	int i;
3014 3015 3016 3017 3018 3019 3020 3021
	REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
	if (NCH(n) > 1) {
		com_node(c, CHILD(n, 1));
		if (NCH(n) > 3) {
			com_node(c, CHILD(n, 3));
			if (NCH(n) > 5)
				com_node(c, CHILD(n, 5));
		}
3022
	}
3023 3024 3025
	i = NCH(n)/2;
	com_addoparg(c, RAISE_VARARGS, i);
	com_pop(c, i);
Guido van Rossum's avatar
Guido van Rossum committed
3026 3027
}

3028 3029 3030 3031 3032 3033 3034 3035 3036 3037
static void
com_from_import(struct compiling *c, node *n)
{
	com_addopname(c, IMPORT_FROM, CHILD(n, 0));
	com_push(c, 1);
	if (NCH(n) > 1) {
		if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
			com_error(c, PyExc_SyntaxError, "invalid syntax");
			return;
		}
3038
		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
3039
	} else
3040
		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
3041 3042 3043
	com_pop(c, 1);
}

Guido van Rossum's avatar
Guido van Rossum committed
3044
static void
3045
com_import_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3046 3047 3048
{
	int i;
	REQ(n, import_stmt);
Guido van Rossum's avatar
Guido van Rossum committed
3049 3050
	/* 'import' dotted_name (',' dotted_name)* |
	   'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum's avatar
Guido van Rossum committed
3051
	if (STR(CHILD(n, 0))[0] == 'f') {
3052
		PyObject *tup;
Guido van Rossum's avatar
Guido van Rossum committed
3053 3054
		/* 'from' dotted_name 'import' ... */
		REQ(CHILD(n, 1), dotted_name);
3055 3056 3057 3058 3059 3060 3061
		
		if (TYPE(CHILD(n, 3)) == STAR) {
			tup = Py_BuildValue("(s)", "*");
		} else {
			tup = PyTuple_New((NCH(n) - 2)/2);
			for (i = 3; i < NCH(n); i += 2) {
				PyTuple_SET_ITEM(tup, (i-3)/2, 
3062 3063
					PyString_FromString(STR(
						CHILD(CHILD(n, i), 0))));
3064 3065 3066
			}
		}
		com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
3067
		Py_DECREF(tup);
3068
		com_push(c, 1);
3069
		com_addopname(c, IMPORT_NAME, CHILD(n, 1));
3070 3071 3072 3073 3074 3075 3076
		if (TYPE(CHILD(n, 3)) == STAR) 
			com_addbyte(c, IMPORT_STAR);
		else {
			for (i = 3; i < NCH(n); i += 2) 
				com_from_import(c, CHILD(n, i));
			com_addbyte(c, POP_TOP);
		}
3077
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
3078 3079
	}
	else {
Guido van Rossum's avatar
Guido van Rossum committed
3080
		/* 'import' ... */
Guido van Rossum's avatar
Guido van Rossum committed
3081
		for (i = 1; i < NCH(n); i += 2) {
3082 3083
			node *subn = CHILD(n, i);
			REQ(subn, dotted_as_name);
3084
			com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3085
			com_push(c, 1);
3086
			com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
3087
			if (NCH(subn) > 1) {
3088 3089
				int j;
				if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
3090 3091 3092 3093
					com_error(c, PyExc_SyntaxError,
						  "invalid syntax");
					return;
				}
3094 3095
				for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
					com_addopname(c, LOAD_ATTR,
3096 3097 3098 3099
						      CHILD(CHILD(subn, 0),
							    j));
				com_addop_varname(c, VAR_STORE,
						  STR(CHILD(subn, 2)));
3100
			} else
3101 3102 3103
				com_addop_varname(c, VAR_STORE,
						  STR(CHILD(CHILD(subn, 0),
							    0))); 
3104
			com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
3105 3106 3107 3108
		}
	}
}

3109
static void
3110
com_exec_stmt(struct compiling *c, node *n)
3111 3112 3113 3114 3115 3116
{
	REQ(n, exec_stmt);
	/* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
	com_node(c, CHILD(n, 1));
	if (NCH(n) >= 4)
		com_node(c, CHILD(n, 3));
3117
	else {
3118
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3119 3120
		com_push(c, 1);
	}
3121 3122
	if (NCH(n) >= 6)
		com_node(c, CHILD(n, 5));
3123
	else {
3124
		com_addbyte(c, DUP_TOP);
3125 3126
		com_push(c, 1);
	}
3127
	com_addbyte(c, EXEC_STMT);
3128
	com_pop(c, 3);
3129 3130
}

3131
static int
3132
is_constant_false(struct compiling *c, node *n)
3133
{
3134
	PyObject *v;
3135
	int i;
3136
	/* argument c will be NULL when called from symtable_node() */
3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165

  /* Label to avoid tail recursion */
  next:
	switch (TYPE(n)) {

	case suite:
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto next;
		}
		/* Fall through */
	case file_input:
		for (i = 0; i < NCH(n); i++) {
			node *ch = CHILD(n, i);
			if (TYPE(ch) == stmt) {
				n = ch;
				goto next;
			}
		}
		break;

	case stmt:
	case simple_stmt:
	case small_stmt:
		n = CHILD(n, 0);
		goto next;

	case expr_stmt:
	case testlist:
3166
	case testlist1:
3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193
	case test:
	case and_test:
	case not_test:
	case comparison:
	case expr:
	case xor_expr:
	case and_expr:
	case shift_expr:
	case arith_expr:
	case term:
	case factor:
	case power:
	case atom:
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto next;
		}
		break;

	case NAME:
		if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
			return 1;
		break;

	case NUMBER:
		v = parsenumber(c, STR(n));
		if (v == NULL) {
3194
			PyErr_Clear();
3195 3196
			break;
		}
3197 3198
		i = PyObject_IsTrue(v);
		Py_DECREF(v);
3199 3200 3201
		return i == 0;

	case STRING:
3202
		v = parsestr(c, STR(n));
3203
		if (v == NULL) {
3204
			PyErr_Clear();
3205 3206
			break;
		}
3207 3208
		i = PyObject_IsTrue(v);
		Py_DECREF(v);
3209 3210 3211 3212 3213 3214
		return i == 0;

	}
	return 0;
}

3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253

/* Look under n for a return stmt with an expression.
 * This hack is used to find illegal returns under "if 0:" blocks in
 * functions already known to be generators (as determined by the symtable
 * pass).
 * Return the offending return node if found, else NULL.
 */
static node *
look_for_offending_return(node *n)
{
	int i;

	for (i = 0; i < NCH(n); ++i) {
		node *kid = CHILD(n, i);

		switch (TYPE(kid)) {
			case classdef:
			case funcdef:
			case lambdef:
				/* Stuff in nested functions & classes doesn't
				   affect the code block we started in. */
				return NULL;

			case return_stmt:
				if (NCH(kid) > 1)
					return kid;
				break;

			default: {
				node *bad = look_for_offending_return(kid);
				if (bad != NULL)
					return bad;
			}
		}
	}

	return NULL;
}			

Guido van Rossum's avatar
Guido van Rossum committed
3254
static void
3255
com_if_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3256 3257 3258 3259 3260 3261 3262
{
	int i;
	int anchor = 0;
	REQ(n, if_stmt);
	/*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
	for (i = 0; i+3 < NCH(n); i+=4) {
		int a = 0;
Guido van Rossum's avatar
Guido van Rossum committed
3263
		node *ch = CHILD(n, i+1);
3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279
		if (is_constant_false(c, ch)) {
			/* We're going to skip this block.  However, if this
			   is a generator, we have to check the dead code
			   anyway to make sure there aren't any return stmts
			   with expressions, in the same scope. */
			if (c->c_flags & CO_GENERATOR) {
				node *p = look_for_offending_return(n);
				if (p != NULL) {
					int savelineno = c->c_lineno;
					c->c_lineno = p->n_lineno;
					com_error(c, PyExc_SyntaxError,
			  	   		"'return' with argument "
			  	   		"inside generator");
			  	   	c->c_lineno = savelineno;
				}
			}
3280
			continue;
3281
		}
Guido van Rossum's avatar
Guido van Rossum committed
3282
		if (i > 0)
Michael W. Hudson's avatar
Michael W. Hudson committed
3283
			com_set_lineno(c, ch->n_lineno);
3284
		com_node(c, ch);
Guido van Rossum's avatar
Guido van Rossum committed
3285 3286
		com_addfwref(c, JUMP_IF_FALSE, &a);
		com_addbyte(c, POP_TOP);
3287
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
3288 3289 3290
		com_node(c, CHILD(n, i+3));
		com_addfwref(c, JUMP_FORWARD, &anchor);
		com_backpatch(c, a);
3291
		/* We jump here with an extra entry which we now pop */
Guido van Rossum's avatar
Guido van Rossum committed
3292 3293 3294 3295
		com_addbyte(c, POP_TOP);
	}
	if (i+2 < NCH(n))
		com_node(c, CHILD(n, i+2));
3296 3297
	if (anchor)
		com_backpatch(c, anchor);
Guido van Rossum's avatar
Guido van Rossum committed
3298 3299 3300
}

static void
3301
com_while_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3302 3303 3304
{
	int break_anchor = 0;
	int anchor = 0;
3305
	int save_begin = c->c_begin;
Guido van Rossum's avatar
Guido van Rossum committed
3306 3307
	REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
	com_addfwref(c, SETUP_LOOP, &break_anchor);
3308 3309
	block_push(c, SETUP_LOOP);
	c->c_begin = c->c_nexti;
Michael W. Hudson's avatar
Michael W. Hudson committed
3310
	com_set_lineno(c, n->n_lineno);
Guido van Rossum's avatar
Guido van Rossum committed
3311 3312 3313
	com_node(c, CHILD(n, 1));
	com_addfwref(c, JUMP_IF_FALSE, &anchor);
	com_addbyte(c, POP_TOP);
3314
	com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
3315
	c->c_loops++;
Guido van Rossum's avatar
Guido van Rossum committed
3316
	com_node(c, CHILD(n, 3));
Guido van Rossum's avatar
Guido van Rossum committed
3317
	c->c_loops--;
3318 3319
	com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
	c->c_begin = save_begin;
Guido van Rossum's avatar
Guido van Rossum committed
3320
	com_backpatch(c, anchor);
3321
	/* We jump here with one entry more on the stack */
Guido van Rossum's avatar
Guido van Rossum committed
3322 3323
	com_addbyte(c, POP_TOP);
	com_addbyte(c, POP_BLOCK);
3324
	block_pop(c, SETUP_LOOP);
Guido van Rossum's avatar
Guido van Rossum committed
3325 3326 3327 3328 3329 3330
	if (NCH(n) > 4)
		com_node(c, CHILD(n, 6));
	com_backpatch(c, break_anchor);
}

static void
3331
com_for_stmt(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3332 3333 3334
{
	int break_anchor = 0;
	int anchor = 0;
3335
	int save_begin = c->c_begin;
Guido van Rossum's avatar
Guido van Rossum committed
3336 3337 3338
	REQ(n, for_stmt);
	/* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
	com_addfwref(c, SETUP_LOOP, &break_anchor);
3339
	block_push(c, SETUP_LOOP);
Guido van Rossum's avatar
Guido van Rossum committed
3340
	com_node(c, CHILD(n, 3));
3341
	com_addbyte(c, GET_ITER);
3342
	c->c_begin = c->c_nexti;
3343
	com_set_lineno(c, c->c_last_line);
3344
	com_addfwref(c, FOR_ITER, &anchor);
3345
	com_push(c, 1);
3346
	com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum's avatar
Guido van Rossum committed
3347
	c->c_loops++;
Guido van Rossum's avatar
Guido van Rossum committed
3348
	com_node(c, CHILD(n, 5));
Guido van Rossum's avatar
Guido van Rossum committed
3349
	c->c_loops--;
3350 3351
	com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
	c->c_begin = save_begin;
Guido van Rossum's avatar
Guido van Rossum committed
3352
	com_backpatch(c, anchor);
3353
	com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum's avatar
Guido van Rossum committed
3354
	com_addbyte(c, POP_BLOCK);
3355
	block_pop(c, SETUP_LOOP);
Guido van Rossum's avatar
Guido van Rossum committed
3356 3357 3358 3359 3360
	if (NCH(n) > 8)
		com_node(c, CHILD(n, 8));
	com_backpatch(c, break_anchor);
}

3361
/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossum's avatar
Guido van Rossum committed
3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382
   
		SETUP_FINALLY	L
		<code for S>
		POP_BLOCK
		LOAD_CONST	<nil>
	L:	<code for Sf>
		END_FINALLY
   
   The special instructions use the block stack.  Each block
   stack entry contains the instruction that created it (here
   SETUP_FINALLY), the level of the value stack at the time the
   block stack entry was created, and a label (here L).
   
   SETUP_FINALLY:
	Pushes the current value stack level and the label
	onto the block stack.
   POP_BLOCK:
	Pops en entry from the block stack, and pops the value
	stack until its level is the same as indicated on the
	block stack.  (The label is ignored.)
   END_FINALLY:
Guido van Rossum's avatar
Guido van Rossum committed
3383 3384 3385
	Pops a variable number of entries from the *value* stack
	and re-raises the exception they specify.  The number of
	entries popped depends on the (pseudo) exception type.
Guido van Rossum's avatar
Guido van Rossum committed
3386 3387 3388 3389 3390 3391 3392 3393
   
   The block stack is unwound when an exception is raised:
   when a SETUP_FINALLY entry is found, the exception is pushed
   onto the value stack (and the exception condition is cleared),
   and the interpreter jumps to the label gotten from the block
   stack.
   
   Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum's avatar
Guido van Rossum committed
3394 3395 3396
   (The contents of the value stack is shown in [], with the top
   at the right; 'tb' is trace-back info, 'val' the exception's
   associated value, and 'exc' the exception.)
Guido van Rossum's avatar
Guido van Rossum committed
3397 3398 3399 3400 3401 3402 3403
   
   Value stack		Label	Instruction	Argument
   []				SETUP_EXCEPT	L1
   []				<code for S>
   []				POP_BLOCK
   []				JUMP_FORWARD	L0
   
Guido van Rossum's avatar
Guido van Rossum committed
3404 3405 3406 3407 3408 3409 3410 3411
   [tb, val, exc]	L1:	DUP				)
   [tb, val, exc, exc]		<evaluate E1>			)
   [tb, val, exc, exc, E1]	COMPARE_OP	EXC_MATCH	) only if E1
   [tb, val, exc, 1-or-0]	JUMP_IF_FALSE	L2		)
   [tb, val, exc, 1]		POP				)
   [tb, val, exc]		POP
   [tb, val]			<assign to V1>	(or POP if no V1)
   [tb]				POP
Guido van Rossum's avatar
Guido van Rossum committed
3412 3413 3414
   []				<code for S1>
   				JUMP_FORWARD	L0
   
Guido van Rossum's avatar
Guido van Rossum committed
3415 3416
   [tb, val, exc, 0]	L2:	POP
   [tb, val, exc]		DUP
Guido van Rossum's avatar
Guido van Rossum committed
3417 3418
   .............................etc.......................

Guido van Rossum's avatar
Guido van Rossum committed
3419 3420
   [tb, val, exc, 0]	Ln+1:	POP
   [tb, val, exc]	   	END_FINALLY	# re-raise exception
Guido van Rossum's avatar
Guido van Rossum committed
3421 3422 3423 3424 3425 3426
   
   []			L0:	<next statement>
   
   Of course, parts are not generated if Vi or Ei is not present.
*/

Guido van Rossum's avatar
Guido van Rossum committed
3427
static void
3428
com_try_except(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3429 3430
{
	int except_anchor = 0;
3431 3432 3433 3434
	int end_anchor = 0;
	int else_anchor = 0;
	int i;
	node *ch;
3435

3436 3437
	com_addfwref(c, SETUP_EXCEPT, &except_anchor);
	block_push(c, SETUP_EXCEPT);
Guido van Rossum's avatar
Guido van Rossum committed
3438
	com_node(c, CHILD(n, 2));
3439 3440 3441 3442 3443 3444 3445
	com_addbyte(c, POP_BLOCK);
	block_pop(c, SETUP_EXCEPT);
	com_addfwref(c, JUMP_FORWARD, &else_anchor);
	com_backpatch(c, except_anchor);
	for (i = 3;
	     i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
	     i += 3) {
3446
		/* except_clause: 'except' [expr [',' var]] */
3447
		if (except_anchor == 0) {
3448
			com_error(c, PyExc_SyntaxError,
3449
				  "default 'except:' must be last");
3450 3451 3452
			break;
		}
		except_anchor = 0;
3453
		com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudson's avatar
Michael W. Hudson committed
3454
		com_set_lineno(c, ch->n_lineno);
3455 3456
		if (NCH(ch) > 1) {
			com_addbyte(c, DUP_TOP);
3457
			com_push(c, 1);
3458
			com_node(c, CHILD(ch, 1));
3459
			com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
3460
			com_pop(c, 1);
3461 3462
			com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
			com_addbyte(c, POP_TOP);
3463
			com_pop(c, 1);
3464 3465
		}
		com_addbyte(c, POP_TOP);
3466
		com_pop(c, 1);
3467
		if (NCH(ch) > 3)
3468
			com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
3469
		else {
Guido van Rossum's avatar
Guido van Rossum committed
3470
			com_addbyte(c, POP_TOP);
3471 3472
			com_pop(c, 1);
		}
3473
		com_addbyte(c, POP_TOP);
3474
		com_pop(c, 1);
3475 3476 3477 3478
		com_node(c, CHILD(n, i+2));
		com_addfwref(c, JUMP_FORWARD, &end_anchor);
		if (except_anchor) {
			com_backpatch(c, except_anchor);
3479 3480 3481
			/* We come in with [tb, val, exc, 0] on the
			   stack; one pop and it's the same as
			   expected at the start of the loop */
Guido van Rossum's avatar
Guido van Rossum committed
3482
			com_addbyte(c, POP_TOP);
Guido van Rossum's avatar
Guido van Rossum committed
3483 3484
		}
	}
3485 3486 3487 3488
	/* We actually come in here with [tb, val, exc] but the
	   END_FINALLY will zap those and jump around.
	   The c_stacklevel does not reflect them so we need not pop
	   anything. */
3489 3490 3491 3492 3493 3494 3495 3496
	com_addbyte(c, END_FINALLY);
	com_backpatch(c, else_anchor);
	if (i < NCH(n))
		com_node(c, CHILD(n, i+2));
	com_backpatch(c, end_anchor);
}

static void
3497
com_try_finally(struct compiling *c, node *n)
3498 3499 3500 3501 3502 3503 3504 3505 3506 3507
{
	int finally_anchor = 0;
	node *ch;

	com_addfwref(c, SETUP_FINALLY, &finally_anchor);
	block_push(c, SETUP_FINALLY);
	com_node(c, CHILD(n, 2));
	com_addbyte(c, POP_BLOCK);
	block_pop(c, SETUP_FINALLY);
	block_push(c, END_FINALLY);
3508
	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3509 3510 3511 3512 3513
	/* While the generated code pushes only one item,
	   the try-finally handling can enter here with
	   up to three items.  OK, here are the details:
	   3 for an exception, 2 for RETURN, 1 for BREAK. */
	com_push(c, 3);
3514 3515
	com_backpatch(c, finally_anchor);
	ch = CHILD(n, NCH(n)-1);
Michael W. Hudson's avatar
Michael W. Hudson committed
3516
	com_set_lineno(c, ch->n_lineno);
3517 3518 3519
	com_node(c, ch);
	com_addbyte(c, END_FINALLY);
	block_pop(c, END_FINALLY);
3520
	com_pop(c, 3); /* Matches the com_push above */
3521 3522 3523
}

static void
3524
com_try_stmt(struct compiling *c, node *n)
3525 3526 3527 3528 3529 3530 3531 3532
{
	REQ(n, try_stmt);
	/* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
	 | 'try' ':' suite 'finally' ':' suite */
	if (TYPE(CHILD(n, 3)) != except_clause)
		com_try_finally(c, n);
	else
		com_try_except(c, n);
Guido van Rossum's avatar
Guido van Rossum committed
3533 3534
}

3535
static node *
3536
get_rawdocstring(node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3537
{
3538 3539
	int i;

3540 3541
  /* Label to avoid tail recursion */
  next:
Guido van Rossum's avatar
Guido van Rossum committed
3542 3543 3544
	switch (TYPE(n)) {

	case suite:
3545 3546 3547
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto next;
Guido van Rossum's avatar
Guido van Rossum committed
3548
		}
3549
		/* Fall through */
3550 3551 3552
	case file_input:
		for (i = 0; i < NCH(n); i++) {
			node *ch = CHILD(n, i);
3553 3554 3555 3556
			if (TYPE(ch) == stmt) {
				n = ch;
				goto next;
			}
3557 3558 3559
		}
		break;

Guido van Rossum's avatar
Guido van Rossum committed
3560 3561 3562
	case stmt:
	case simple_stmt:
	case small_stmt:
3563 3564
		n = CHILD(n, 0);
		goto next;
Guido van Rossum's avatar
Guido van Rossum committed
3565 3566 3567

	case expr_stmt:
	case testlist:
3568
	case testlist1:
Guido van Rossum's avatar
Guido van Rossum committed
3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579
	case test:
	case and_test:
	case not_test:
	case comparison:
	case expr:
	case xor_expr:
	case and_expr:
	case shift_expr:
	case arith_expr:
	case term:
	case factor:
3580
	case power:
3581 3582 3583 3584
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto next;
		}
Guido van Rossum's avatar
Guido van Rossum committed
3585 3586 3587 3588
		break;

	case atom:
		if (TYPE(CHILD(n, 0)) == STRING)
3589
			return n;
Guido van Rossum's avatar
Guido van Rossum committed
3590 3591 3592 3593 3594 3595
		break;

	}
	return NULL;
}

3596
static PyObject *
3597
get_docstring(struct compiling *c, node *n)
3598
{
3599 3600 3601
	/* Don't generate doc-strings if run with -OO */
	if (Py_OptimizeFlag > 1)
		return NULL;
3602 3603 3604
	n = get_rawdocstring(n);
	if (n == NULL)
		return NULL;
3605
	return parsestrplus(c, n);
3606 3607
}

Guido van Rossum's avatar
Guido van Rossum committed
3608
static void
3609
com_suite(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3610 3611 3612 3613 3614 3615 3616 3617
{
	REQ(n, suite);
	/* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
	if (NCH(n) == 1) {
		com_node(c, CHILD(n, 0));
	}
	else {
		int i;
3618
		for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum's avatar
Guido van Rossum committed
3619 3620 3621 3622 3623 3624 3625
			node *ch = CHILD(n, i);
			if (TYPE(ch) == stmt)
				com_node(c, ch);
		}
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
3626
/* ARGSUSED */
3627
static void
3628
com_continue_stmt(struct compiling *c, node *n)
3629 3630 3631 3632 3633
{
	int i = c->c_nblocks;
	if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
		com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
	}
3634 3635 3636 3637 3638
	else if (i <= 0) {
		/* at the outer level */
		com_error(c, PyExc_SyntaxError,
			  "'continue' not properly in loop");
	}
3639
	else {
3640
		int j;
3641
		for (j = i-1; j >= 0; --j) {
3642 3643 3644
			if (c->c_block[j] == SETUP_LOOP)
				break;
		}
3645
		if (j >= 0) {
3646
			/* there is a loop, but something interferes */
3647 3648 3649 3650 3651
			for (; i > j; --i) {
				if (c->c_block[i] == SETUP_EXCEPT ||
				    c->c_block[i] == SETUP_FINALLY) {
					com_addoparg(c, CONTINUE_LOOP,
						     c->c_begin);
3652 3653
					return;
				}
3654 3655 3656 3657 3658
				if (c->c_block[i] == END_FINALLY) {
					com_error(c, PyExc_SyntaxError,
			  "'continue' not supported inside 'finally' clause");
			  		return;
			  	}
3659 3660
			}
		}
3661 3662
		com_error(c, PyExc_SyntaxError,
			  "'continue' not properly in loop");
3663 3664 3665 3666 3667
	}
	/* XXX Could allow it inside a 'finally' clause
	   XXX if we could pop the exception still on the stack */
}

3668 3669 3670 3671 3672 3673
/* Return the number of default values in the argument list.

   If a non-default argument follows a default argument, set an
   exception and return -1.
*/

3674
static int
3675
com_argdefs(struct compiling *c, node *n)
3676
{
3677
	int i, nch, ndefs;
3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688
	if (TYPE(n) == lambdef) {
		/* lambdef: 'lambda' [varargslist] ':' test */
		n = CHILD(n, 1);
	}
	else {
		REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
		n = CHILD(n, 2);
		REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
		n = CHILD(n, 1);
	}
	if (TYPE(n) != varargslist)
3689
		    return 0;
3690
	/* varargslist:
3691
		(fpdef ['=' test] ',')* '*' ....... |
3692 3693 3694 3695 3696
		fpdef ['=' test] (',' fpdef ['=' test])* [','] */
	nch = NCH(n);
	ndefs = 0;
	for (i = 0; i < nch; i++) {
		int t;
3697 3698
		if (TYPE(CHILD(n, i)) == STAR ||
		    TYPE(CHILD(n, i)) == DOUBLESTAR)
3699
			break;
3700 3701
		i++;
		if (i >= nch)
3702 3703 3704
			t = RPAR; /* Anything except EQUAL or COMMA */
		else
			t = TYPE(CHILD(n, i));
3705 3706 3707 3708 3709 3710 3711 3712 3713 3714
		if (t == EQUAL) {
			i++;
			ndefs++;
			com_node(c, CHILD(n, i));
			i++;
			if (i >= nch)
				break;
			t = TYPE(CHILD(n, i));
		}
		else {
3715
			/* Treat "(a=1, b)" as an error */
3716
			if (ndefs) {
3717
				com_error(c, PyExc_SyntaxError,
3718
			    "non-default argument follows default argument");
3719 3720
				return -1;
			}
3721 3722 3723 3724 3725 3726 3727
		}
		if (t != COMMA)
			break;
	}
	return ndefs;
}

Guido van Rossum's avatar
Guido van Rossum committed
3728
static void
3729
com_funcdef(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3730
{
Jeremy Hylton's avatar
Jeremy Hylton committed
3731
	PyObject *co;
3732
	int ndefs;
Guido van Rossum's avatar
Guido van Rossum committed
3733
	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
3734
	ndefs = com_argdefs(c, n);
3735 3736
	if (ndefs < 0)
		return;
3737 3738
	symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
			     n->n_lineno);
Jeremy Hylton's avatar
Jeremy Hylton committed
3739
	co = (PyObject *)icompile(n, c);
3740
	symtable_exit_scope(c->c_symtable);
Jeremy Hylton's avatar
Jeremy Hylton committed
3741
	if (co == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
3742 3743
		c->c_errors++;
	else {
Jeremy Hylton's avatar
Jeremy Hylton committed
3744 3745
		int closure = com_make_closure(c, (PyCodeObject *)co);
		int i = com_addconst(c, co);
Guido van Rossum's avatar
Guido van Rossum committed
3746
		com_addoparg(c, LOAD_CONST, i);
3747
		com_push(c, 1);
Jeremy Hylton's avatar
Jeremy Hylton committed
3748 3749 3750 3751
		if (closure)
			com_addoparg(c, MAKE_CLOSURE, ndefs);
		else
			com_addoparg(c, MAKE_FUNCTION, ndefs);
3752
		com_pop(c, ndefs);
3753
		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
3754
		com_pop(c, 1);
Jeremy Hylton's avatar
Jeremy Hylton committed
3755
		Py_DECREF(co);
Guido van Rossum's avatar
Guido van Rossum committed
3756 3757 3758
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
3759
static void
3760
com_bases(struct compiling *c, node *n)
3761
{
Guido van Rossum's avatar
Guido van Rossum committed
3762
	int i;
3763 3764 3765 3766
	REQ(n, testlist);
	/* testlist: test (',' test)* [','] */
	for (i = 0; i < NCH(n); i += 2)
		com_node(c, CHILD(n, i));
3767 3768 3769
	i = (NCH(n)+1) / 2;
	com_addoparg(c, BUILD_TUPLE, i);
	com_pop(c, i-1);
3770 3771
}

Guido van Rossum's avatar
Guido van Rossum committed
3772
static void
3773
com_classdef(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3774
{
Guido van Rossum's avatar
Guido van Rossum committed
3775
	int i;
3776 3777
	PyObject *v;
	PyCodeObject *co;
3778 3779
	char *name;

Guido van Rossum's avatar
Guido van Rossum committed
3780
	REQ(n, classdef);
Guido van Rossum's avatar
Guido van Rossum committed
3781
	/* classdef: class NAME ['(' testlist ')'] ':' suite */
3782
	if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
3783 3784
		c->c_errors++;
		return;
3785
	}
Guido van Rossum's avatar
Guido van Rossum committed
3786 3787 3788
	/* Push the class name on the stack */
	i = com_addconst(c, v);
	com_addoparg(c, LOAD_CONST, i);
3789
	com_push(c, 1);
3790
	Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
3791
	/* Push the tuple of base classes on the stack */
3792
	if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossum's avatar
Guido van Rossum committed
3793
		com_addoparg(c, BUILD_TUPLE, 0);
3794 3795
		com_push(c, 1);
	}
Guido van Rossum's avatar
Guido van Rossum committed
3796 3797
	else
		com_bases(c, CHILD(n, 3));
3798
	name = STR(CHILD(n, 1));
3799
	symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
3800
	co = icompile(n, c);
3801
	symtable_exit_scope(c->c_symtable);
Jeremy Hylton's avatar
Jeremy Hylton committed
3802
	if (co == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
3803 3804
		c->c_errors++;
	else {
3805 3806
		int closure = com_make_closure(c, co);
		i = com_addconst(c, (PyObject *)co);
Guido van Rossum's avatar
Guido van Rossum committed
3807
		com_addoparg(c, LOAD_CONST, i);
3808
		com_push(c, 1);
3809
		if (closure) {
Jeremy Hylton's avatar
Jeremy Hylton committed
3810
			com_addoparg(c, MAKE_CLOSURE, 0);
3811
			com_pop(c, PyCode_GetNumFree(co));
3812
		} else
Jeremy Hylton's avatar
Jeremy Hylton committed
3813
			com_addoparg(c, MAKE_FUNCTION, 0);
3814
		com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum's avatar
Guido van Rossum committed
3815
		com_addbyte(c, BUILD_CLASS);
3816
		com_pop(c, 2);
3817
		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
3818
		com_pop(c, 1);
Jeremy Hylton's avatar
Jeremy Hylton committed
3819
		Py_DECREF(co);
Guido van Rossum's avatar
Guido van Rossum committed
3820
	}
Guido van Rossum's avatar
Guido van Rossum committed
3821 3822 3823
}

static void
3824
com_node(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3825
{
3826
 loop:
3827 3828
	if (c->c_errors)
		return;
Guido van Rossum's avatar
Guido van Rossum committed
3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842
	switch (TYPE(n)) {
	
	/* Definition nodes */
	
	case funcdef:
		com_funcdef(c, n);
		break;
	case classdef:
		com_classdef(c, n);
		break;
	
	/* Trivial parse tree nodes */
	
	case stmt:
3843
	case small_stmt:
Guido van Rossum's avatar
Guido van Rossum committed
3844
	case flow_stmt:
3845 3846
		n = CHILD(n, 0);
		goto loop;
Guido van Rossum's avatar
Guido van Rossum committed
3847 3848

	case simple_stmt:
3849
		/* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudson's avatar
Michael W. Hudson committed
3850
		com_set_lineno(c, n->n_lineno);
3851 3852 3853 3854 3855 3856 3857
		{
			int i;
			for (i = 0; i < NCH(n)-1; i += 2)
				com_node(c, CHILD(n, i));
		}
		break;
	
Guido van Rossum's avatar
Guido van Rossum committed
3858
	case compound_stmt:
Michael W. Hudson's avatar
Michael W. Hudson committed
3859
		com_set_lineno(c, n->n_lineno);
3860 3861
		n = CHILD(n, 0);
		goto loop;
Guido van Rossum's avatar
Guido van Rossum committed
3862 3863 3864 3865 3866 3867 3868 3869 3870

	/* Statement nodes */
	
	case expr_stmt:
		com_expr_stmt(c, n);
		break;
	case print_stmt:
		com_print_stmt(c, n);
		break;
3871
	case del_stmt: /* 'del' exprlist */
3872
		com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum's avatar
Guido van Rossum committed
3873 3874 3875 3876
		break;
	case pass_stmt:
		break;
	case break_stmt:
Guido van Rossum's avatar
Guido van Rossum committed
3877
		if (c->c_loops == 0) {
3878 3879
			com_error(c, PyExc_SyntaxError,
				  "'break' outside loop");
Guido van Rossum's avatar
Guido van Rossum committed
3880
		}
Guido van Rossum's avatar
Guido van Rossum committed
3881 3882
		com_addbyte(c, BREAK_LOOP);
		break;
3883 3884 3885
	case continue_stmt:
		com_continue_stmt(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3886 3887 3888
	case return_stmt:
		com_return_stmt(c, n);
		break;
3889 3890 3891
	case yield_stmt:
		com_yield_stmt(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3892 3893 3894 3895 3896 3897
	case raise_stmt:
		com_raise_stmt(c, n);
		break;
	case import_stmt:
		com_import_stmt(c, n);
		break;
3898 3899
	case global_stmt:
		break;
3900 3901 3902
	case exec_stmt:
		com_exec_stmt(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3903 3904 3905
	case assert_stmt:
		com_assert_stmt(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924
	case if_stmt:
		com_if_stmt(c, n);
		break;
	case while_stmt:
		com_while_stmt(c, n);
		break;
	case for_stmt:
		com_for_stmt(c, n);
		break;
	case try_stmt:
		com_try_stmt(c, n);
		break;
	case suite:
		com_suite(c, n);
		break;
	
	/* Expression nodes */
	
	case testlist:
3925
	case testlist1:
3926
	case testlist_safe:
Guido van Rossum's avatar
Guido van Rossum committed
3927
		com_list(c, n, 0);
Guido van Rossum's avatar
Guido van Rossum committed
3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941
		break;
	case test:
		com_test(c, n);
		break;
	case and_test:
		com_and_test(c, n);
		break;
	case not_test:
		com_not_test(c, n);
		break;
	case comparison:
		com_comparison(c, n);
		break;
	case exprlist:
Guido van Rossum's avatar
Guido van Rossum committed
3942
		com_list(c, n, 0);
Guido van Rossum's avatar
Guido van Rossum committed
3943 3944 3945 3946
		break;
	case expr:
		com_expr(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958
	case xor_expr:
		com_xor_expr(c, n);
		break;
	case and_expr:
		com_and_expr(c, n);
		break;
	case shift_expr:
		com_shift_expr(c, n);
		break;
	case arith_expr:
		com_arith_expr(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3959 3960 3961 3962 3963 3964
	case term:
		com_term(c, n);
		break;
	case factor:
		com_factor(c, n);
		break;
3965 3966 3967
	case power:
		com_power(c, n);
		break;
Guido van Rossum's avatar
Guido van Rossum committed
3968 3969 3970 3971 3972
	case atom:
		com_atom(c, n);
		break;
	
	default:
3973 3974
		com_error(c, PyExc_SystemError,
			  "com_node: unexpected node type");
Guido van Rossum's avatar
Guido van Rossum committed
3975 3976 3977
	}
}

3978
static void com_fplist(struct compiling *, node *);
Guido van Rossum's avatar
Guido van Rossum committed
3979 3980

static void
3981
com_fpdef(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3982 3983 3984 3985
{
	REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
	if (TYPE(CHILD(n, 0)) == LPAR)
		com_fplist(c, CHILD(n, 1));
3986
	else {
3987
		com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
3988 3989
		com_pop(c, 1);
	}
Guido van Rossum's avatar
Guido van Rossum committed
3990 3991 3992
}

static void
3993
com_fplist(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
3994
{
Guido van Rossum's avatar
Guido van Rossum committed
3995
	REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum's avatar
Guido van Rossum committed
3996 3997 3998 3999
	if (NCH(n) == 1) {
		com_fpdef(c, CHILD(n, 0));
	}
	else {
4000
		int i = (NCH(n)+1)/2;
4001
		com_addoparg(c, UNPACK_SEQUENCE, i);
4002
		com_push(c, i-1);
Guido van Rossum's avatar
Guido van Rossum committed
4003 4004 4005 4006 4007
		for (i = 0; i < NCH(n); i += 2)
			com_fpdef(c, CHILD(n, i));
	}
}

Guido van Rossum's avatar
Guido van Rossum committed
4008
static void
4009
com_arglist(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
4010
{
4011
	int nch, i, narg;
4012
	int complex = 0;
4013
	char nbuf[30];
Guido van Rossum's avatar
Guido van Rossum committed
4014
	REQ(n, varargslist);
4015
	/* varargslist:
4016
		(fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
4017 4018 4019 4020 4021 4022
	nch = NCH(n);
	/* Enter all arguments in table of locals */
	for (i = 0, narg = 0; i < nch; i++) {
		node *ch = CHILD(n, i);
		node *fp;
		if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum's avatar
Guido van Rossum committed
4023
			break;
4024 4025 4026 4027 4028
		REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
		fp = CHILD(ch, 0);
		if (TYPE(fp) != NAME) {
			PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
			complex = 1;
4029
		}
4030 4031 4032 4033 4034 4035 4036 4037 4038 4039
		narg++;
		/* all name updates handled by symtable */
		if (++i >= nch)
			break;
		ch = CHILD(n, i);
		if (TYPE(ch) == EQUAL)
			i += 2;
		else
			REQ(ch, COMMA);
	}
4040 4041 4042 4043
	if (complex) {
		/* Generate code for complex arguments only after
		   having counted the simple arguments */
		int ilocal = 0;
4044
		for (i = 0; i < nch; i++) {
4045 4046
			node *ch = CHILD(n, i);
			node *fp;
4047
			if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
4048
				break;
4049 4050 4051 4052
			REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
			fp = CHILD(ch, 0);
			if (TYPE(fp) != NAME) {
				com_addoparg(c, LOAD_FAST, ilocal);
4053
				com_push(c, 1);
4054 4055 4056
				com_fpdef(c, ch);
			}
			ilocal++;
4057
			if (++i >= nch)
4058 4059 4060 4061 4062 4063
				break;
			ch = CHILD(n, i);
			if (TYPE(ch) == EQUAL)
				i += 2;
			else
				REQ(ch, COMMA);
4064 4065
		}
	}
Guido van Rossum's avatar
Guido van Rossum committed
4066 4067
}

Guido van Rossum's avatar
Guido van Rossum committed
4068
static void
4069
com_file_input(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
4070 4071
{
	int i;
4072
	PyObject *doc;
Guido van Rossum's avatar
Guido van Rossum committed
4073
	REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
4074
	doc = get_docstring(c, n);
Guido van Rossum's avatar
Guido van Rossum committed
4075 4076
	if (doc != NULL) {
		int i = com_addconst(c, doc);
4077
		Py_DECREF(doc);
Guido van Rossum's avatar
Guido van Rossum committed
4078
		com_addoparg(c, LOAD_CONST, i);
4079
		com_push(c, 1);
4080
		com_addop_name(c, STORE_NAME, "__doc__");
4081
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4082
	}
Guido van Rossum's avatar
Guido van Rossum committed
4083 4084 4085 4086 4087 4088 4089 4090 4091 4092
	for (i = 0; i < NCH(n); i++) {
		node *ch = CHILD(n, i);
		if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
			com_node(c, ch);
	}
}

/* Top-level compile-node interface */

static void
4093
compile_funcdef(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
4094
{
4095
	PyObject *doc;
Guido van Rossum's avatar
Guido van Rossum committed
4096 4097
	node *ch;
	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
4098
	c->c_name = STR(CHILD(n, 1));
4099
	doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum's avatar
Guido van Rossum committed
4100 4101
	if (doc != NULL) {
		(void) com_addconst(c, doc);
4102
		Py_DECREF(doc);
Guido van Rossum's avatar
Guido van Rossum committed
4103
	}
4104
	else
4105
		(void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum's avatar
Guido van Rossum committed
4106 4107
	ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
	ch = CHILD(ch, 1); /* ')' | varargslist */
4108
	if (TYPE(ch) == varargslist)
Guido van Rossum's avatar
Guido van Rossum committed
4109
		com_arglist(c, ch);
Guido van Rossum's avatar
Guido van Rossum committed
4110
	c->c_infunction = 1;
Guido van Rossum's avatar
Guido van Rossum committed
4111
	com_node(c, CHILD(n, 4));
Guido van Rossum's avatar
Guido van Rossum committed
4112
	c->c_infunction = 0;
4113 4114 4115 4116
	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
	com_push(c, 1);
	com_addbyte(c, RETURN_VALUE);
	com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4117 4118
}

4119
static void
4120
compile_lambdef(struct compiling *c, node *n)
4121
{
4122
	node *ch;
4123
	REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
4124
	c->c_name = "<lambda>";
4125 4126

	ch = CHILD(n, 1);
4127
	(void) com_addconst(c, Py_None); /* No docstring */
4128
	if (TYPE(ch) == varargslist) {
4129
		com_arglist(c, ch);
4130
		ch = CHILD(n, 3);
4131
	}
4132 4133 4134
	else
		ch = CHILD(n, 2);
	com_node(c, ch);
4135
	com_addbyte(c, RETURN_VALUE);
4136
	com_pop(c, 1);
4137 4138
}

Guido van Rossum's avatar
Guido van Rossum committed
4139
static void
4140
compile_classdef(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
4141 4142
{
	node *ch;
4143
	PyObject *doc;
Guido van Rossum's avatar
Guido van Rossum committed
4144 4145 4146
	REQ(n, classdef);
	/* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
	c->c_name = STR(CHILD(n, 1));
4147
	c->c_private = c->c_name;
4148 4149 4150
	/* Initialize local __module__ from global __name__ */
	com_addop_name(c, LOAD_GLOBAL, "__name__");
	com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum's avatar
Guido van Rossum committed
4151
	ch = CHILD(n, NCH(n)-1); /* The suite */
4152
	doc = get_docstring(c, ch);
Guido van Rossum's avatar
Guido van Rossum committed
4153 4154
	if (doc != NULL) {
		int i = com_addconst(c, doc);
4155
		Py_DECREF(doc);
Guido van Rossum's avatar
Guido van Rossum committed
4156
		com_addoparg(c, LOAD_CONST, i);
4157
		com_push(c, 1);
4158
		com_addop_name(c, STORE_NAME, "__doc__");
4159
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4160 4161
	}
	else
4162
		(void) com_addconst(c, Py_None);
Guido van Rossum's avatar
Guido van Rossum committed
4163 4164
	com_node(c, ch);
	com_addbyte(c, LOAD_LOCALS);
4165
	com_push(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4166
	com_addbyte(c, RETURN_VALUE);
4167
	com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4168 4169
}

Guido van Rossum's avatar
Guido van Rossum committed
4170
static void
4171
compile_node(struct compiling *c, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
4172
{
Michael W. Hudson's avatar
Michael W. Hudson committed
4173
	com_set_lineno(c, n->n_lineno);
Guido van Rossum's avatar
Guido van Rossum committed
4174
	
Guido van Rossum's avatar
Guido van Rossum committed
4175 4176
	switch (TYPE(n)) {
	
4177
	case single_input: /* One interactive command */
Guido van Rossum's avatar
Guido van Rossum committed
4178
		/* NEWLINE | simple_stmt | compound_stmt NEWLINE */
4179
		c->c_interactive++;
Guido van Rossum's avatar
Guido van Rossum committed
4180 4181 4182
		n = CHILD(n, 0);
		if (TYPE(n) != NEWLINE)
			com_node(c, n);
4183 4184 4185 4186
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
		com_push(c, 1);
		com_addbyte(c, RETURN_VALUE);
		com_pop(c, 1);
4187
		c->c_interactive--;
Guido van Rossum's avatar
Guido van Rossum committed
4188 4189
		break;
	
4190
	case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum's avatar
Guido van Rossum committed
4191
		com_file_input(c, n);
4192 4193 4194 4195
		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
		com_push(c, 1);
		com_addbyte(c, RETURN_VALUE);
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4196 4197
		break;
	
4198
	case eval_input: /* Built-in function input() */
Guido van Rossum's avatar
Guido van Rossum committed
4199
		com_node(c, CHILD(n, 0));
Guido van Rossum's avatar
Guido van Rossum committed
4200
		com_addbyte(c, RETURN_VALUE);
4201
		com_pop(c, 1);
Guido van Rossum's avatar
Guido van Rossum committed
4202 4203
		break;
	
4204 4205 4206 4207
	case lambdef: /* anonymous function definition */
		compile_lambdef(c, n);
		break;

4208
	case funcdef: /* A function definition */
Guido van Rossum's avatar
Guido van Rossum committed
4209 4210 4211
		compile_funcdef(c, n);
		break;
	
4212
	case classdef: /* A class definition */
Guido van Rossum's avatar
Guido van Rossum committed
4213
		compile_classdef(c, n);
Guido van Rossum's avatar
Guido van Rossum committed
4214 4215
		break;
	
Guido van Rossum's avatar
Guido van Rossum committed
4216
	default:
4217
		com_error(c, PyExc_SystemError,
4218
			  "compile_node: unexpected node type");
Guido van Rossum's avatar
Guido van Rossum committed
4219 4220 4221
	}
}

Jeremy Hylton's avatar
Jeremy Hylton committed
4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233
static PyObject *
dict_keys_inorder(PyObject *dict, int offset)
{
	PyObject *tuple, *k, *v;
	int i, pos = 0, size = PyDict_Size(dict);

	tuple = PyTuple_New(size);
	if (tuple == NULL)
		return NULL;
	while (PyDict_Next(dict, &pos, &k, &v)) {
		i = PyInt_AS_LONG(v);
		Py_INCREF(k);
4234
		assert((i - offset) < size);
Jeremy Hylton's avatar
Jeremy Hylton committed
4235 4236 4237 4238 4239
		PyTuple_SET_ITEM(tuple, i - offset, k);
	}
	return tuple;
}

4240
PyCodeObject *
4241
PyNode_Compile(node *n, const char *filename)
4242
{
4243 4244 4245 4246
	return PyNode_CompileFlags(n, filename, NULL);
}

PyCodeObject *
4247
PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
4248 4249
{
	return jcompile(n, filename, NULL, flags);
4250 4251
}

4252
struct symtable *
4253
PyNode_CompileSymtable(node *n, const char *filename)
4254 4255
{
	struct symtable *st;
4256
	PyFutureFeatures *ff;
4257

4258 4259 4260
	ff = PyNode_Future(n, filename);
	if (ff == NULL)
		return NULL;
4261
	st = symtable_build(n, ff, filename);
4262
	if (st == NULL) {
Andrew MacIntyre's avatar
Andrew MacIntyre committed
4263
		PyObject_FREE((void *)ff);
4264
		return NULL;
4265
	}
4266 4267 4268
	return st;
}

4269
static PyCodeObject *
4270
icompile(node *n, struct compiling *base)
4271
{
4272
	return jcompile(n, base->c_filename, base, NULL);
4273 4274
}

4275
static PyCodeObject *
4276
jcompile(node *n, const char *filename, struct compiling *base,
4277
	 PyCompilerFlags *flags)
Guido van Rossum's avatar
Guido van Rossum committed
4278 4279
{
	struct compiling sc;
4280
	PyCodeObject *co;
4281
	if (!com_init(&sc, filename))
Guido van Rossum's avatar
Guido van Rossum committed
4282
		return NULL;
4283 4284 4285
	if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
		sc.c_encoding = "utf-8";
	} else if (TYPE(n) == encoding_decl) {
4286 4287 4288 4289 4290
		sc.c_encoding = STR(n);
		n = CHILD(n, 0);
	} else {
		sc.c_encoding = NULL;
	}
4291
	if (base) {
4292
		sc.c_private = base->c_private;
4293
		sc.c_symtable = base->c_symtable;
Jeremy Hylton's avatar
Jeremy Hylton committed
4294 4295
		/* c_symtable still points to parent's symbols */
		if (base->c_nested 
4296
		    || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton's avatar
Jeremy Hylton committed
4297
			sc.c_nested = 1;
4298
		sc.c_flags |= base->c_flags & PyCF_MASK;
4299 4300 4301 4302
		if (base->c_encoding != NULL) {
			assert(sc.c_encoding == NULL);
			sc.c_encoding = base->c_encoding;
		}
4303
	} else {
4304
		sc.c_private = NULL;
4305
		sc.c_future = PyNode_Future(n, filename);
4306 4307 4308 4309
		if (sc.c_future == NULL) {
			com_free(&sc);
			return NULL;
		}
4310 4311 4312 4313 4314 4315
		if (flags) {
			int merged = sc.c_future->ff_features |
				flags->cf_flags;
			sc.c_future->ff_features = merged;
			flags->cf_flags = merged;
		}
4316 4317
		sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
		if (sc.c_symtable == NULL) {
4318 4319 4320
			com_free(&sc);
			return NULL;
		}
4321 4322 4323
		/* reset symbol table for second pass */
		sc.c_symtable->st_nscopes = 1;
		sc.c_symtable->st_pass = 2;
4324
	}
4325
	co = NULL;
4326 4327
	if (symtable_load_symbols(&sc) < 0) {
		sc.c_errors++;
4328
		goto exit;
4329
	}
4330 4331
	compile_node(&sc, n);
	com_done(&sc);
4332
	if (sc.c_errors == 0) {
Jeremy Hylton's avatar
Jeremy Hylton committed
4333 4334
		PyObject *consts, *names, *varnames, *filename, *name,
			*freevars, *cellvars;
4335 4336 4337
		consts = PyList_AsTuple(sc.c_consts);
		names = PyList_AsTuple(sc.c_names);
		varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton's avatar
Jeremy Hylton committed
4338 4339 4340
		cellvars = dict_keys_inorder(sc.c_cellvars, 0);
		freevars = dict_keys_inorder(sc.c_freevars,
					     PyTuple_GET_SIZE(cellvars));
4341 4342
		filename = PyString_InternFromString(sc.c_filename);
		name = PyString_InternFromString(sc.c_name);
4343 4344
		if (!PyErr_Occurred())
			co = PyCode_New(sc.c_argcount,
Jeremy Hylton's avatar
Jeremy Hylton committed
4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357
					sc.c_nlocals,
					sc.c_maxstacklevel,
					sc.c_flags,
					sc.c_code,
					consts,
					names,
					varnames,
					freevars,
					cellvars,
					filename,
					name,
					sc.c_firstlineno,
					sc.c_lnotab);
4358 4359 4360
		Py_XDECREF(consts);
		Py_XDECREF(names);
		Py_XDECREF(varnames);
Jeremy Hylton's avatar
Jeremy Hylton committed
4361 4362
		Py_XDECREF(freevars);
		Py_XDECREF(cellvars);
4363 4364
		Py_XDECREF(filename);
		Py_XDECREF(name);
4365
	}
4366 4367 4368 4369 4370 4371 4372 4373
	else if (!PyErr_Occurred()) {
		/* This could happen if someone called PyErr_Clear() after an
		   error was reported above.  That's not supposed to happen,
		   but I just plugged one case and I'm not sure there can't be
		   others.  In that case, raise SystemError so that at least
		   it gets reported instead dumping core. */
		PyErr_SetString(PyExc_SystemError, "lost syntax error");
	}
4374
 exit:
4375
	if (base == NULL) {
4376
		PySymtable_Free(sc.c_symtable);
4377 4378
		sc.c_symtable = NULL;
	}
Guido van Rossum's avatar
Guido van Rossum committed
4379 4380 4381
	com_free(&sc);
	return co;
}
4382 4383

int
4384
PyCode_Addr2Line(PyCodeObject *co, int addrq)
4385 4386
{
	int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum's avatar
Guido van Rossum committed
4387
	unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
4388 4389 4390 4391 4392 4393 4394 4395 4396 4397
	int line = co->co_firstlineno;
	int addr = 0;
	while (--size >= 0) {
		addr += *p++;
		if (addr > addrq)
			break;
		line += *p++;
	}
	return line;
}
4398

Jeremy Hylton's avatar
Jeremy Hylton committed
4399 4400 4401 4402
/* The test for LOCAL must come before the test for FREE in order to
   handle classes where name is both local and free.  The local var is
   a method and the free var is a free var referenced within a method.
*/
4403 4404

static int
Jeremy Hylton's avatar
Jeremy Hylton committed
4405
get_ref_type(struct compiling *c, char *name)
4406
{
4407
	char buf[350];
4408
	PyObject *v;
4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421

	if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
		return CELL;
	if (PyDict_GetItemString(c->c_locals, name) != NULL)
		return LOCAL;
	if (PyDict_GetItemString(c->c_freevars, name) != NULL)
		return FREE;
	v = PyDict_GetItemString(c->c_globals, name);
	if (v) {
		if (v == Py_None)
			return GLOBAL_EXPLICIT;
		else {
			return GLOBAL_IMPLICIT;
Jeremy Hylton's avatar
Jeremy Hylton committed
4422 4423
		}
	}
4424
	PyOS_snprintf(buf, sizeof(buf),
4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436
		"unknown scope for %.100s in %.100s(%s) "
		"in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
		name, c->c_name, 
		PyObject_REPR(c->c_symtable->st_cur->ste_id),
		c->c_filename,
		PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
		PyObject_REPR(c->c_locals),
		PyObject_REPR(c->c_globals)
		);

	Py_FatalError(buf);
	return -1;
4437 4438
}

4439
/* Helper functions to issue warnings */
4440

4441
static int
4442
issue_warning(const char *msg, const char *filename, int lineno)
4443
{
4444 4445 4446 4447 4448 4449 4450 4451 4452
	if (PyErr_Occurred()) {
		/* This can happen because symtable_node continues
		   processing even after raising a SyntaxError.
		   Calling PyErr_WarnExplicit now would clobber the
		   pending exception; instead we fail and let that
		   exception propagate.
		*/
		return -1;
	}
4453 4454
	if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
			       lineno, NULL, NULL) < 0)	{
4455 4456
		if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
			PyErr_SetString(PyExc_SyntaxError, msg);
4457
			PyErr_SyntaxLocation(filename, lineno);
4458
		}
4459 4460 4461 4462 4463 4464 4465 4466 4467
		return -1;
	}
	return 0;
}

static int
symtable_warn(struct symtable *st, char *msg)
{
	if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
4468
		st->st_errors++;
4469
		return -1;
4470
	}
4471
	return 0;
4472 4473
}

4474 4475
/* Helper function for setting lineno and filename */

4476 4477
static struct symtable *
symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
4478
{
4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506
	struct symtable *st;

	st = symtable_init();
	if (st == NULL)
		return NULL;
	st->st_future = ff;
	st->st_filename = filename;
	symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
	if (st->st_errors > 0)
		goto fail;
	symtable_node(st, n);
	if (st->st_errors > 0)
		goto fail;
	return st;
 fail:
	if (!PyErr_Occurred()) {
		/* This could happen because after a syntax error is
		   detected, the symbol-table-building continues for
		   a while, and PyErr_Clear() might erroneously be
		   called during that process.  One such case has been
		   fixed, but there might be more (now or later).
		*/
		PyErr_SetString(PyExc_SystemError, "lost exception");
	}
	st->st_future = NULL;
	st->st_filename = NULL;
	PySymtable_Free(st);
	return NULL;
4507 4508 4509
}

static int
4510
symtable_init_compiling_symbols(struct compiling *c)
4511
{
4512
	PyObject *varnames;
Jeremy Hylton's avatar
Jeremy Hylton committed
4513

4514
	varnames = c->c_symtable->st_cur->ste_varnames;
4515 4516 4517 4518
	if (varnames == NULL) {
		varnames = PyList_New(0);
		if (varnames == NULL)
			return -1;
4519
		c->c_symtable->st_cur->ste_varnames = varnames;
4520
		Py_INCREF(varnames);
4521 4522 4523
	} else
		Py_INCREF(varnames);
	c->c_varnames = varnames;
Jeremy Hylton's avatar
Jeremy Hylton committed
4524 4525 4526

	c->c_globals = PyDict_New();
	if (c->c_globals == NULL)
4527
		return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
4528 4529
	c->c_freevars = PyDict_New();
	if (c->c_freevars == NULL)
4530
		return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
4531 4532
	c->c_cellvars = PyDict_New();
	if (c->c_cellvars == NULL)
4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553
		return -1;
	return 0;
}

struct symbol_info {
	int si_nlocals;
	int si_ncells;
	int si_nfrees;
	int si_nimplicit;
};

static void
symtable_init_info(struct symbol_info *si)
{
	si->si_nlocals = 0;
	si->si_ncells = 0;
	si->si_nfrees = 0;
	si->si_nimplicit = 0;
}

static int
4554
symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
4555 4556 4557 4558 4559 4560 4561 4562 4563 4564
		      struct symbol_info *si)
{
	PyObject *dict, *v;

	/* Seperate logic for DEF_FREE.  If it occurs in a function,
	   it indicates a local that we must allocate storage for (a
	   cell var).  If it occurs in a class, then the class has a
	   method and a free variable with the same name.
	*/
	if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4565 4566 4567
		/* If it isn't declared locally, it can't be a cell. */
		if (!(flags & (DEF_LOCAL | DEF_PARAM)))
			return 0;
4568 4569 4570
		v = PyInt_FromLong(si->si_ncells++);
		dict = c->c_cellvars;
	} else {
4571 4572 4573 4574
		/* If it is free anyway, then there is no need to do
		   anything here.
		*/
		if (is_free(flags ^ DEF_FREE_CLASS) 
4575
		    || (flags == DEF_FREE_CLASS))
4576
			return 0;
4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589
		v = PyInt_FromLong(si->si_nfrees++);
		dict = c->c_freevars;
	}
	if (v == NULL)
		return -1;
	if (PyDict_SetItem(dict, name, v) < 0) {
		Py_DECREF(v);
		return -1;
	}
	Py_DECREF(v);
	return 0;
}

4590 4591 4592 4593 4594 4595 4596 4597 4598
/* If a variable is a cell and an argument, make sure that appears in
   co_cellvars before any variable to its right in varnames. 
*/


static int
symtable_cellvar_offsets(PyObject **cellvars, int argcount, 
			 PyObject *varnames, int flags) 
{
4599 4600
	PyObject *v = NULL;
	PyObject *w, *d, *list = NULL;
4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615
	int i, pos;

	if (flags & CO_VARARGS)
		argcount++;
	if (flags & CO_VARKEYWORDS)
		argcount++;
	for (i = argcount; --i >= 0; ) {
		v = PyList_GET_ITEM(varnames, i);
		if (PyDict_GetItem(*cellvars, v)) {
			if (list == NULL) {
				list = PyList_New(1);
				if (list == NULL)
					return -1;
				PyList_SET_ITEM(list, 0, v);
				Py_INCREF(v);
4616 4617 4618 4619 4620 4621
			} else {
				if (PyList_Insert(list, 0, v) < 0) {
					Py_DECREF(list);
					return -1;
				}
			}
4622 4623
		}
	}
4624 4625 4626
	if (list == NULL)
		return 0;

4627 4628 4629 4630
	/* There are cellvars that are also arguments.  Create a dict
	   to replace cellvars and put the args at the front.
	*/
	d = PyDict_New();
4631 4632
	if (d == NULL)
		return -1;
4633 4634 4635 4636 4637 4638 4639 4640
	for (i = PyList_GET_SIZE(list); --i >= 0; ) {
		v = PyInt_FromLong(i);
		if (v == NULL) 
			goto fail;
		if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
			goto fail;
		if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
			goto fail;
4641
		Py_DECREF(v);
4642 4643 4644 4645 4646 4647
	}
	pos = 0;
	i = PyList_GET_SIZE(list);
	Py_DECREF(list);
	while (PyDict_Next(*cellvars, &pos, &v, &w)) {
		w = PyInt_FromLong(i++);  /* don't care about the old key */
4648 4649
		if (w == NULL)
			goto fail;
4650 4651
		if (PyDict_SetItem(d, v, w) < 0) {
			Py_DECREF(w);
4652
			v = NULL;
4653 4654 4655 4656 4657 4658 4659 4660 4661
			goto fail;
		}
		Py_DECREF(w);
	}
	Py_DECREF(*cellvars);
	*cellvars = d;
	return 1;
 fail:
	Py_DECREF(d);
4662
	Py_XDECREF(v);
4663 4664 4665
	return -1;
}

4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689
static int
symtable_freevar_offsets(PyObject *freevars, int offset)
{
	PyObject *name, *v;
	int pos;

	/* The cell vars are the first elements of the closure,
	   followed by the free vars.  Update the offsets in
	   c_freevars to account for number of cellvars. */  
	pos = 0;
	while (PyDict_Next(freevars, &pos, &name, &v)) {
		int i = PyInt_AS_LONG(v) + offset;
		PyObject *o = PyInt_FromLong(i);
		if (o == NULL)
			return -1;
		if (PyDict_SetItem(freevars, name, o) < 0) {
			Py_DECREF(o);
			return -1;
		}
		Py_DECREF(o);
	}
	return 0;
}

4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700
static int
symtable_check_unoptimized(struct compiling *c,
			   PySymtableEntryObject *ste, 
			   struct symbol_info *si)
{
	char buf[300];

	if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
	      || (ste->ste_nested && si->si_nimplicit)))
		return 0;

4701 4702 4703 4704
#define ILLEGAL_CONTAINS "contains a nested function with free variables"

#define ILLEGAL_IS "is a nested function"

4705
#define ILLEGAL_IMPORT_STAR \
4706
"import * is not allowed in function '%.100s' because it %s"
4707 4708

#define ILLEGAL_BARE_EXEC \
4709
"unqualified exec is not allowed in function '%.100s' it %s"
4710 4711

#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4712
"function '%.100s' uses import * and bare exec, which are illegal " \
4713
"because it %s"
4714 4715 4716 4717

	/* XXX perhaps the linenos for these opt-breaking statements
	   should be stored so the exception can point to them. */

4718 4719
	if (ste->ste_child_free) {
		if (ste->ste_optimized == OPT_IMPORT_STAR)
4720 4721 4722 4723
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_IMPORT_STAR, 
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_CONTAINS);
4724
		else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4725 4726 4727 4728
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_BARE_EXEC,
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_CONTAINS);
4729
		else {
4730 4731 4732 4733
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_EXEC_AND_IMPORT_STAR,
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_CONTAINS);
4734 4735 4736
		}
	} else {
		if (ste->ste_optimized == OPT_IMPORT_STAR)
4737 4738 4739 4740
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_IMPORT_STAR, 
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_IS);
4741
		else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4742 4743 4744 4745
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_BARE_EXEC,
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_IS);
4746
		else {
4747 4748 4749 4750
			PyOS_snprintf(buf, sizeof(buf),
				      ILLEGAL_EXEC_AND_IMPORT_STAR,
				      PyString_AS_STRING(ste->ste_name),
				      ILLEGAL_IS);
4751
		}
4752
	}
4753

4754 4755 4756 4757
	PyErr_SetString(PyExc_SyntaxError, buf);
	PyErr_SyntaxLocation(c->c_symtable->st_filename,
			     ste->ste_opt_lineno);
	return -1;
4758 4759
}

4760 4761 4762 4763
static int
symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
		      struct symbol_info *si)
{
4764 4765
	if (c->c_future)
		c->c_flags |= c->c_future->ff_features;
4766 4767
	if (ste->ste_generator)
		c->c_flags |= CO_GENERATOR;
4768 4769 4770 4771 4772 4773
	if (ste->ste_type != TYPE_MODULE)
		c->c_flags |= CO_NEWLOCALS;
	if (ste->ste_type == TYPE_FUNCTION) {
		c->c_nlocals = si->si_nlocals;
		if (ste->ste_optimized == 0)
			c->c_flags |= CO_OPTIMIZED;
4774 4775
		else if (ste->ste_optimized != OPT_EXEC) 
			return symtable_check_unoptimized(c, ste, si);
4776 4777 4778 4779
	}
	return 0;
}

4780 4781 4782 4783 4784 4785 4786 4787 4788 4789
static int
symtable_error(struct symtable *st, int lineno)
{
	if (lineno == 0)
		lineno = st->st_cur->ste_lineno;
	PyErr_SyntaxLocation(st->st_filename, lineno);
	st->st_errors++;
	return -1;
}

4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801
static int
symtable_load_symbols(struct compiling *c)
{
	struct symtable *st = c->c_symtable;
	PySymtableEntryObject *ste = st->st_cur;
	PyObject *name, *varnames, *v;
	int i, flags, pos;
	struct symbol_info si;

	v = NULL;

	if (symtable_init_compiling_symbols(c) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4802
		goto fail;
4803 4804 4805 4806
	symtable_init_info(&si);
	varnames = st->st_cur->ste_varnames;
	si.si_nlocals = PyList_GET_SIZE(varnames);
	c->c_argcount = si.si_nlocals;
Jeremy Hylton's avatar
Jeremy Hylton committed
4807

4808
	for (i = 0; i < si.si_nlocals; ++i) {
4809
		v = PyInt_FromLong(i);
4810 4811
		if (v == NULL)
			goto fail;
4812 4813
		if (PyDict_SetItem(c->c_locals, 
				   PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4814 4815
			goto fail;
		Py_DECREF(v);
4816 4817 4818 4819 4820
	}

	/* XXX The cases below define the rules for whether a name is
	   local or global.  The logic could probably be clearer. */
	pos = 0;
4821 4822
	while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
		flags = PyInt_AS_LONG(v);
Jeremy Hylton's avatar
Jeremy Hylton committed
4823

4824
		if (flags & DEF_FREE_GLOBAL)
4825 4826
			/* undo the original DEF_FREE */
			flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton's avatar
Jeremy Hylton committed
4827

4828
		/* Deal with names that need two actions:
4829
		   1. Cell variables that are also locals.
4830 4831 4832
		   2. Free variables in methods that are also class
		   variables or declared global.
		*/
4833
		if (flags & (DEF_FREE | DEF_FREE_CLASS))
4834
			symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton's avatar
Jeremy Hylton committed
4835

4836
		if (flags & DEF_STAR) {
4837 4838
			c->c_argcount--;
			c->c_flags |= CO_VARARGS;
4839
		} else if (flags & DEF_DOUBLESTAR) {
4840 4841
			c->c_argcount--;
			c->c_flags |= CO_VARKEYWORDS;
4842
		} else if (flags & DEF_INTUPLE) 
4843
			c->c_argcount--;
4844
		else if (flags & DEF_GLOBAL) {
4845
			if (flags & DEF_PARAM) {
4846
				PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
4847
					     PyString_AS_STRING(name));
4848
				symtable_error(st, 0);
Jeremy Hylton's avatar
Jeremy Hylton committed
4849
				goto fail;
4850
			}
Jeremy Hylton's avatar
Jeremy Hylton committed
4851 4852
			if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
				goto fail;
4853
		} else if (flags & DEF_FREE_GLOBAL) {
4854
			si.si_nimplicit++;
4855
			if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4856
				goto fail;
4857
		} else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
4858
			v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton's avatar
Jeremy Hylton committed
4859 4860
			if (v == NULL)
				goto fail;
4861
			if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4862 4863
				goto fail;
			Py_DECREF(v);
4864
			if (ste->ste_type != TYPE_CLASS) 
4865
				if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4866
					goto fail;
4867
		} else if (is_free(flags)) {
4868
			if (ste->ste_nested) {
4869
				v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton's avatar
Jeremy Hylton committed
4870 4871
				if (v == NULL)
					goto fail;
4872
				if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton's avatar
Jeremy Hylton committed
4873 4874 4875
					goto fail;
				Py_DECREF(v);
			} else {
4876
				si.si_nimplicit++;
4877
 				if (PyDict_SetItem(c->c_globals, name,
4878
 						   Py_True) < 0)
4879 4880 4881
 					goto fail;
 				if (st->st_nscopes != 1) {
 					v = PyInt_FromLong(flags);
4882 4883
					if (v == NULL)
						goto fail;
4884 4885 4886 4887 4888
 					if (PyDict_SetItem(st->st_global, 
 							   name, v)) 
 						goto fail;
 					Py_DECREF(v);
 				}
Jeremy Hylton's avatar
Jeremy Hylton committed
4889
			}
4890 4891 4892
		}
	}

4893 4894
	assert(PyDict_Size(c->c_freevars) == si.si_nfrees);

4895 4896 4897 4898 4899
	if (si.si_ncells > 1) { /* one cell is always in order */
		if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
					     c->c_varnames, c->c_flags) < 0)
			return -1;
	}
4900 4901 4902
	if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
		return -1;
	return symtable_update_flags(c, ste, &si);
Jeremy Hylton's avatar
Jeremy Hylton committed
4903 4904 4905 4906
 fail:
	/* is this always the right thing to do? */
	Py_XDECREF(v);
	return -1;
4907 4908 4909
}

static struct symtable *
4910
symtable_init()
4911 4912 4913
{
	struct symtable *st;

Andrew MacIntyre's avatar
Andrew MacIntyre committed
4914
	st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
4915 4916
	if (st == NULL)
		return NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
4917
	st->st_pass = 1;
4918

4919
	st->st_filename = NULL;
4920
	st->st_symbols = NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
4921
	if ((st->st_stack = PyList_New(0)) == NULL)
4922 4923 4924 4925
		goto fail;
	if ((st->st_symbols = PyDict_New()) == NULL)
		goto fail; 
	st->st_cur = NULL;
4926
	st->st_nscopes = 0;
4927 4928 4929 4930
	st->st_errors = 0;
	st->st_private = NULL;
	return st;
 fail:
4931
	PySymtable_Free(st);
4932 4933 4934
	return NULL;
}

4935 4936
void
PySymtable_Free(struct symtable *st)
4937 4938
{
	Py_XDECREF(st->st_symbols);
Jeremy Hylton's avatar
Jeremy Hylton committed
4939
	Py_XDECREF(st->st_stack);
4940
	Py_XDECREF(st->st_cur);
Andrew MacIntyre's avatar
Andrew MacIntyre committed
4941
	PyObject_FREE((void *)st);
4942 4943
}

Jeremy Hylton's avatar
Jeremy Hylton committed
4944 4945 4946 4947 4948 4949 4950
/* When the compiler exits a scope, it must should update the scope's
   free variable information with the list of free variables in its
   children.

   Variables that are free in children and defined in the current
   scope are cellvars.

4951
   If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton's avatar
Jeremy Hylton committed
4952 4953 4954 4955
   false), free variables in children that are not defined here are
   implicit globals.

*/
4956 4957

static int
Jeremy Hylton's avatar
Jeremy Hylton committed
4958 4959
symtable_update_free_vars(struct symtable *st)
{
4960 4961
	int i, j, def;
	PyObject *o, *name, *list = NULL;
4962
	PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton's avatar
Jeremy Hylton committed
4963

4964
	if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton's avatar
Jeremy Hylton committed
4965 4966 4967
		def = DEF_FREE_CLASS;
	else
		def = DEF_FREE;
4968
	for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton's avatar
Jeremy Hylton committed
4969 4970
		int pos = 0;

4971 4972
		if (list && PyList_SetSlice(list, 0, 
					    PyList_GET_SIZE(list), 0) < 0)
4973
				return -1;
4974
		child = (PySymtableEntryObject *)
4975 4976
			PyList_GET_ITEM(ste->ste_children, i);
		while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
4977 4978
			int flags = PyInt_AS_LONG(o);
			if (!(is_free(flags)))
Jeremy Hylton's avatar
Jeremy Hylton committed
4979
				continue; /* avoids indentation */
4980 4981 4982 4983 4984
			if (list == NULL) {
				list = PyList_New(0);
				if (list == NULL)
					return -1;
			}
4985
			ste->ste_child_free = 1;
4986 4987 4988 4989 4990 4991
			if (PyList_Append(list, name) < 0) {
				Py_DECREF(list);
				return -1;
			}
		}
		for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4992
			PyObject *v;
4993
			name = PyList_GET_ITEM(list, j);
4994 4995 4996 4997 4998
			v = PyDict_GetItem(ste->ste_symbols, name);
			/* If a name N is declared global in scope A and
			   referenced in scope B contained (perhaps
			   indirectly) in A and there are no scopes
			   with bindings for N between B and A, then N
4999 5000 5001
			   is global in B.  Unless A is a class scope,
			   because class scopes are not considered for
			   nested scopes.
5002
			*/
5003
			if (v && (ste->ste_type != TYPE_CLASS)) {
5004 5005 5006 5007 5008 5009 5010
				int flags = PyInt_AS_LONG(v); 
				if (flags & DEF_GLOBAL) {
					symtable_undo_free(st, child->ste_id,
							   name);
					continue;
				}
			}
5011 5012
			if (ste->ste_nested) {
				if (symtable_add_def_o(st, ste->ste_symbols,
5013 5014 5015 5016
						       name, def) < 0) {
				    Py_DECREF(list);
				    return -1;
				}
Jeremy Hylton's avatar
Jeremy Hylton committed
5017
			} else {
5018
				if (symtable_check_global(st, child->ste_id, 
5019 5020 5021 5022
							  name) < 0) {
				    Py_DECREF(list);
				    return -1;
				}
Jeremy Hylton's avatar
Jeremy Hylton committed
5023 5024 5025
			}
		}
	}
5026 5027

	Py_XDECREF(list);
Jeremy Hylton's avatar
Jeremy Hylton committed
5028 5029 5030 5031 5032 5033 5034 5035 5036 5037
	return 0;
}

/* If the current scope is a non-nested class or if name is not
   defined in the current, non-nested scope, then it is an implicit
   global in all nested scopes.
*/

static int
symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5038 5039
{
	PyObject *o;
Jeremy Hylton's avatar
Jeremy Hylton committed
5040
	int v;
5041
	PySymtableEntryObject *ste = st->st_cur;
5042
			
5043
	if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton's avatar
Jeremy Hylton committed
5044
		return symtable_undo_free(st, child, name);
5045
	o = PyDict_GetItem(ste->ste_symbols, name);
5046
	if (o == NULL)
Jeremy Hylton's avatar
Jeremy Hylton committed
5047 5048
		return symtable_undo_free(st, child, name);
	v = PyInt_AS_LONG(o);
5049

5050
	if (is_free(v) || (v & DEF_GLOBAL)) 
Jeremy Hylton's avatar
Jeremy Hylton committed
5051 5052
		return symtable_undo_free(st, child, name);
	else
5053 5054
		return symtable_add_def_o(st, ste->ste_symbols,
					  name, DEF_FREE);
Jeremy Hylton's avatar
Jeremy Hylton committed
5055 5056 5057 5058 5059 5060 5061
}

static int
symtable_undo_free(struct symtable *st, PyObject *id, 
		      PyObject *name)
{
	int i, v, x;
5062 5063
	PyObject *info;
	PySymtableEntryObject *ste;
Jeremy Hylton's avatar
Jeremy Hylton committed
5064

5065 5066
	ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
	if (ste == NULL)
5067
		return -1;
5068

5069
	info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton's avatar
Jeremy Hylton committed
5070 5071 5072 5073
	if (info == NULL)
		return 0;
	v = PyInt_AS_LONG(info);
	if (is_free(v)) {
5074
		if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton's avatar
Jeremy Hylton committed
5075 5076 5077 5078 5079 5080 5081
				       DEF_FREE_GLOBAL) < 0)
			return -1;
	} else
		/* If the name is defined here or declared global,
		   then the recursion stops. */
		return 0;
	
5082 5083
	for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
		PySymtableEntryObject *child;
5084
		child = (PySymtableEntryObject *)
5085 5086
			PyList_GET_ITEM(ste->ste_children, i);
		x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton's avatar
Jeremy Hylton committed
5087 5088 5089 5090 5091 5092
		if (x < 0)
			return x;
	}
	return 0;
}

5093 5094 5095 5096 5097
/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
   This reference is released when the scope is exited, via the DECREF
   in symtable_exit_scope().
*/

Jeremy Hylton's avatar
Jeremy Hylton committed
5098 5099 5100 5101 5102
static int
symtable_exit_scope(struct symtable *st)
{
	int end;

5103
	if (st->st_pass == 1)
Jeremy Hylton's avatar
Jeremy Hylton committed
5104
		symtable_update_free_vars(st);
5105
	Py_DECREF(st->st_cur);
Jeremy Hylton's avatar
Jeremy Hylton committed
5106
	end = PyList_GET_SIZE(st->st_stack) - 1;
5107 5108
	st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack, 
							      end);
Jeremy Hylton's avatar
Jeremy Hylton committed
5109
	if (PySequence_DelItem(st->st_stack, end) < 0)
5110
		return -1;
5111
	return 0;
Jeremy Hylton's avatar
Jeremy Hylton committed
5112 5113
}

5114 5115 5116
static void
symtable_enter_scope(struct symtable *st, char *name, int type,
		     int lineno)
Jeremy Hylton's avatar
Jeremy Hylton committed
5117
{
5118
	PySymtableEntryObject *prev = NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
5119 5120

	if (st->st_cur) {
5121 5122
		prev = st->st_cur;
		if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
5123 5124 5125
			st->st_errors++;
			return;
		}
Jeremy Hylton's avatar
Jeremy Hylton committed
5126
	}
5127
	st->st_cur = (PySymtableEntryObject *)
5128
		PySymtableEntry_New(st, name, type, lineno);
5129 5130 5131 5132
	if (st->st_cur == NULL) {
		st->st_errors++;
		return;
	}
5133 5134
	if (strcmp(name, TOP) == 0)
		st->st_global = st->st_cur->ste_symbols;
5135
	if (prev && st->st_pass == 1) {
5136 5137
		if (PyList_Append(prev->ste_children, 
				  (PyObject *)st->st_cur) < 0)
5138
			st->st_errors++;
5139
	}
5140 5141
}

5142 5143 5144 5145 5146 5147 5148
static int
symtable_lookup(struct symtable *st, char *name)
{
	char buffer[MANGLE_LEN];
	PyObject *v;
	int flags;

5149
	if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162
		name = buffer;
	v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
	if (v == NULL) {
		if (PyErr_Occurred())
			return -1;
		else
			return 0;
	}

	flags = PyInt_AS_LONG(v);
	return flags;
}

5163
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
5164
symtable_add_def(struct symtable *st, char *name, int flag)
5165
{
Jeremy Hylton's avatar
Jeremy Hylton committed
5166
	PyObject *s;
5167
	char buffer[MANGLE_LEN];
5168
	int ret;
5169

5170 5171 5172 5173 5174 5175 5176 5177
	/* Warn about None, except inside a tuple (where the assignment
	   code already issues a warning). */
	if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
	    *name == 'N' && strcmp(name, "None") == 0)
	{
		if (symtable_warn(st, "argument named None"))
			return -1;
	}
5178
	if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
5179 5180 5181
		name = buffer;
	if ((s = PyString_InternFromString(name)) == NULL)
		return -1;
5182 5183 5184
	ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
	Py_DECREF(s);
	return ret;
Jeremy Hylton's avatar
Jeremy Hylton committed
5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196
}

/* Must only be called with mangled names */

static int
symtable_add_def_o(struct symtable *st, PyObject *dict, 
		   PyObject *name, int flag) 
{
	PyObject *o;
	int val;

	if ((o = PyDict_GetItem(dict, name))) {
5197
	    val = PyInt_AS_LONG(o);
Jeremy Hylton's avatar
Jeremy Hylton committed
5198
	    if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
5199
		    PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
5200
				 PyString_AsString(name));
5201
		    return symtable_error(st, 0);
5202
	    }
Jeremy Hylton's avatar
Jeremy Hylton committed
5203
	    val |= flag;
5204
	} else
Jeremy Hylton's avatar
Jeremy Hylton committed
5205
	    val = flag;
5206
	o = PyInt_FromLong(val);
5207 5208
	if (o == NULL)
		return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
5209
	if (PyDict_SetItem(dict, name, o) < 0) {
5210 5211 5212 5213 5214
		Py_DECREF(o);
		return -1;
	}
	Py_DECREF(o);

Jeremy Hylton's avatar
Jeremy Hylton committed
5215
	if (flag & DEF_PARAM) {
5216
		if (PyList_Append(st->st_cur->ste_varnames, name) < 0) 
5217
			return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
5218 5219 5220 5221
	} else	if (flag & DEF_GLOBAL) {
		/* XXX need to update DEF_GLOBAL for other flags too;
		   perhaps only DEF_FREE_GLOBAL */
		if ((o = PyDict_GetItem(st->st_global, name))) {
5222
			val = PyInt_AS_LONG(o);
Jeremy Hylton's avatar
Jeremy Hylton committed
5223
			val |= flag;
5224
		} else
Jeremy Hylton's avatar
Jeremy Hylton committed
5225
			val = flag;
5226
		o = PyInt_FromLong(val);
5227 5228
		if (o == NULL)
			return -1;
Jeremy Hylton's avatar
Jeremy Hylton committed
5229
		if (PyDict_SetItem(st->st_global, name, o) < 0) {
5230 5231 5232 5233 5234 5235 5236 5237
			Py_DECREF(o);
			return -1;
		}
		Py_DECREF(o);
	}
	return 0;
}

Jeremy Hylton's avatar
Jeremy Hylton committed
5238
#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
5239

5240 5241 5242 5243
/* Look for a yield stmt under n.  Return 1 if found, else 0.
   This hack is used to look inside "if 0:" blocks (which are normally
   ignored) in case those are the only places a yield occurs (so that this
   function is a generator). */
5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255
static int
look_for_yield(node *n)
{
	int i;

	for (i = 0; i < NCH(n); ++i) {
		node *kid = CHILD(n, i);

		switch (TYPE(kid)) {

		case classdef:
		case funcdef:
5256
		case lambdef:
5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271
			/* Stuff in nested functions and classes can't make
			   the parent a generator. */
			return 0;

		case yield_stmt:
			return 1;

		default:
			if (look_for_yield(kid))
				return 1;
		}
	}
	return 0;
}			

5272 5273 5274
static void
symtable_node(struct symtable *st, node *n)
{
5275
	int i;
5276 5277 5278 5279 5280 5281 5282

 loop:
	switch (TYPE(n)) {
	case funcdef: {
		char *func_name = STR(CHILD(n, 1));
		symtable_add_def(st, func_name, DEF_LOCAL);
		symtable_default_args(st, CHILD(n, 2));
5283
		symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
5284 5285 5286 5287 5288 5289 5290
		symtable_funcdef(st, n);
		symtable_exit_scope(st);
		break;
	}
	case lambdef:
		if (NCH(n) == 4)
			symtable_default_args(st, CHILD(n, 1));
5291
		symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304
		symtable_funcdef(st, n);
		symtable_exit_scope(st);
		break;
	case classdef: {
		char *tmp, *class_name = STR(CHILD(n, 1));
		symtable_add_def(st, class_name, DEF_LOCAL);
		if (TYPE(CHILD(n, 2)) == LPAR) {
			node *bases = CHILD(n, 3);
			int i;
			for (i = 0; i < NCH(bases); i += 2) {
				symtable_node(st, CHILD(bases, i));
			}
		}
5305
		symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
5306 5307 5308 5309 5310 5311 5312 5313 5314
		tmp = st->st_private;
		st->st_private = class_name;
		symtable_node(st, CHILD(n, NCH(n) - 1));
		st->st_private = tmp;
		symtable_exit_scope(st);
		break;
	}
	case if_stmt:
		for (i = 0; i + 3 < NCH(n); i += 4) {
5315 5316 5317 5318
			if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
				if (st->st_cur->ste_generator == 0)
					st->st_cur->ste_generator =
						look_for_yield(CHILD(n, i+3));
5319
				continue;
5320
			}
5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332
			symtable_node(st, CHILD(n, i + 1));
			symtable_node(st, CHILD(n, i + 3));
		}
		if (i + 2 < NCH(n))
			symtable_node(st, CHILD(n, i + 2));
		break;
	case global_stmt:
		symtable_global(st, n);
		break;
	case import_stmt:
		symtable_import(st, n);
		break;
5333
	case exec_stmt: {
5334
		st->st_cur->ste_optimized |= OPT_EXEC;
5335 5336 5337
		symtable_node(st, CHILD(n, 1));
		if (NCH(n) > 2)
			symtable_node(st, CHILD(n, 3));
5338
		else {
5339
			st->st_cur->ste_optimized |= OPT_BARE_EXEC;
5340 5341
			st->st_cur->ste_opt_lineno = n->n_lineno;
		}
5342 5343 5344
		if (NCH(n) > 4)
			symtable_node(st, CHILD(n, 5));
		break;
5345 5346

	}
5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357
	case assert_stmt: 
		if (Py_OptimizeFlag)
			return;
		if (NCH(n) == 2) {
			n = CHILD(n, 1);
			goto loop;
		} else {
			symtable_node(st, CHILD(n, 1));
			n = CHILD(n, 3);
			goto loop;
		}
5358 5359
	case except_clause:
		if (NCH(n) == 4)
5360
			symtable_assign(st, CHILD(n, 3), 0);
5361 5362 5363 5364 5365 5366
		if (NCH(n) > 1) {
			n = CHILD(n, 1);
			goto loop;
		}
		break;
	case del_stmt:
5367
		symtable_assign(st, CHILD(n, 1), 0);
5368
		break;
5369 5370 5371 5372
	case yield_stmt:
		st->st_cur->ste_generator = 1;
		n = CHILD(n, 1);
		goto loop;
5373 5374 5375 5376 5377
	case expr_stmt:
		if (NCH(n) == 1)
			n = CHILD(n, 0);
		else {
			if (TYPE(CHILD(n, 1)) == augassign) {
5378
				symtable_assign(st, CHILD(n, 0), 0);
5379 5380 5381 5382 5383
				symtable_node(st, CHILD(n, 2));
				break;
			} else {
				int i;
				for (i = 0; i < NCH(n) - 2; i += 2) 
5384
					symtable_assign(st, CHILD(n, i), 0);
5385 5386 5387 5388
				n = CHILD(n, NCH(n) - 1);
			}
		}
		goto loop;
5389
	case list_iter:
5390 5391
		/* only occurs when there are multiple for loops
		   in a list comprehension */
5392
		n = CHILD(n, 0);
5393 5394 5395
		if (TYPE(n) == list_for)
			symtable_list_for(st, n);
		else {
5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414
			REQ(n, list_if);
			symtable_node(st, CHILD(n, 1));
			if (NCH(n) == 3) {
				n = CHILD(n, 2); 
				goto loop;
			}
		}
		break;
	case for_stmt:
		symtable_assign(st, CHILD(n, 1), 0);
		for (i = 3; i < NCH(n); ++i)
			if (TYPE(CHILD(n, i)) >= single_input)
				symtable_node(st, CHILD(n, i));
		break;
	/* The remaining cases fall through to default except in
	   special circumstances.  This requires the individual cases
	   to be coded with great care, even though they look like
	   rather innocuous.  Each case must double-check TYPE(n).
	*/
Jeremy Hylton's avatar
Jeremy Hylton committed
5415
	case argument:
5416
		if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton's avatar
Jeremy Hylton committed
5417 5418 5419
			n = CHILD(n, 2);
			goto loop;
		}
5420
		/* fall through */
5421 5422
	case listmaker:
		if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5423
			symtable_list_comprehension(st, n);
5424
			break;
5425
		}
5426
		/* fall through */
5427 5428 5429 5430 5431
	case atom:
		if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
			symtable_add_use(st, STR(CHILD(n, 0)));
			break;
		}
5432
		/* fall through */
5433
	default:
5434 5435 5436
		/* Walk over every non-token child with a special case
		   for one child.
		*/
5437 5438 5439 5440
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto loop;
		}
5441
		for (i = 0; i < NCH(n); ++i)
5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461
			if (TYPE(CHILD(n, i)) >= single_input)
				symtable_node(st, CHILD(n, i));
	}
}

static void
symtable_funcdef(struct symtable *st, node *n)
{
	node *body;

	if (TYPE(n) == lambdef) {
		if (NCH(n) == 4)
			symtable_params(st, CHILD(n, 1));
	} else
		symtable_params(st, CHILD(n, 2));
	body = CHILD(n, NCH(n) - 1);
	symtable_node(st, body);
}

/* The next two functions parse the argument tuple.
5462
   symtable_default_args() checks for names in the default arguments,
5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496
   which are references in the defining scope.  symtable_params()
   parses the parameter names, which are defined in the function's
   body. 

   varargslist: 
       (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) 
	| fpdef ['=' test] (',' fpdef ['=' test])* [',']
*/

static void
symtable_default_args(struct symtable *st, node *n)
{
	node *c;
	int i;

	if (TYPE(n) == parameters) {
		n = CHILD(n, 1);
		if (TYPE(n) == RPAR)
			return;
	}
	REQ(n, varargslist);
	for (i = 0; i < NCH(n); i += 2) {
		c = CHILD(n, i);
		if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
			break;
		}
		if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
			symtable_node(st, CHILD(n, i));
	}
}

static void
symtable_params(struct symtable *st, node *n)
{
5497
	int i, complex = -1, ext = 0;
5498
	node *c = NULL;
5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514

	if (TYPE(n) == parameters) {
		n = CHILD(n, 1);
		if (TYPE(n) == RPAR)
			return;
	}
	REQ(n, varargslist);
	for (i = 0; i < NCH(n); i += 2) {
		c = CHILD(n, i);
		if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
			ext = 1;
			break;
		}
		if (TYPE(c) == test) {
			continue;
		}
5515
		if (TYPE(CHILD(c, 0)) == NAME)
5516
			symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5517
		else {
5518 5519
			char nbuf[30];
			PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
5520
			symtable_add_def(st, nbuf, DEF_PARAM);
5521
			complex = i;
5522 5523 5524 5525 5526 5527 5528 5529 5530
		}
	}
	if (ext) {
		c = CHILD(n, i);
		if (TYPE(c) == STAR) {
			i++;
			symtable_add_def(st, STR(CHILD(n, i)), 
					 DEF_PARAM | DEF_STAR);
			i += 2;
5531
			if (i >= NCH(n))
5532 5533
				c = NULL;
			else
Jeremy Hylton's avatar
Jeremy Hylton committed
5534
				c = CHILD(n, i);
5535
		}
5536
		if (c && TYPE(c) == DOUBLESTAR) {
5537 5538 5539 5540 5541
			i++;
			symtable_add_def(st, STR(CHILD(n, i)), 
					 DEF_PARAM | DEF_DOUBLESTAR);
		}
	}
5542 5543 5544 5545 5546
	if (complex >= 0) {
		int j;
		for (j = 0; j <= complex; j++) {
			c = CHILD(n, j);
			if (TYPE(c) == COMMA)
5547 5548 5549
				c = CHILD(n, ++j);
			else if (TYPE(c) == EQUAL)
				c = CHILD(n, j += 3);
5550 5551 5552 5553
			if (TYPE(CHILD(c, 0)) == LPAR)
				symtable_params_fplist(st, CHILD(c, 1));
		} 
	}
5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579
}

static void
symtable_params_fplist(struct symtable *st, node *n)
{
	int i;
	node *c;

	REQ(n, fplist);
	for (i = 0; i < NCH(n); i += 2) {
		c = CHILD(n, i);
		REQ(c, fpdef);
		if (NCH(c) == 1)
			symtable_add_def(st, STR(CHILD(c, 0)), 
					 DEF_PARAM | DEF_INTUPLE);
		else
			symtable_params_fplist(st, CHILD(c, 1));
	}
	
}

static void
symtable_global(struct symtable *st, node *n)
{
	int i;

5580 5581 5582 5583
	/* XXX It might be helpful to warn about module-level global
	   statements, but it's hard to tell the difference between
	   module-level and a string passed to exec.
	*/
5584

5585 5586
	for (i = 1; i < NCH(n); i += 2) {
		char *name = STR(CHILD(n, i));
5587 5588 5589
		int flags;

		flags = symtable_lookup(st, name);
5590 5591
		if (flags < 0)
			continue;
5592 5593 5594
		if (flags && flags != DEF_GLOBAL) {
			char buf[500];
			if (flags & DEF_PARAM) {
5595
				PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
5596
					     name);
5597
				symtable_error(st, 0);
5598
				return;
5599 5600 5601
			}
			else {
				if (flags & DEF_LOCAL)
5602 5603 5604
					PyOS_snprintf(buf, sizeof(buf),
						      GLOBAL_AFTER_ASSIGN,
						      name);
5605
				else
5606 5607
					PyOS_snprintf(buf, sizeof(buf),
						      GLOBAL_AFTER_USE, name);
5608
				symtable_warn(st, buf);
5609 5610
			}
		}
5611 5612
		symtable_add_def(st, name, DEF_GLOBAL);
	}
5613 5614 5615 5616 5617
}

static void
symtable_list_comprehension(struct symtable *st, node *n)
{
5618
	/* listmaker: test list_for */
5619
	char tmpname[30];
5620

5621 5622 5623
	REQ(n, listmaker);
	PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", 
		      ++st->st_cur->ste_tmpname);
5624
	symtable_add_def(st, tmpname, DEF_LOCAL);
5625 5626 5627 5628 5629 5630 5631 5632 5633 5634
	symtable_list_for(st, CHILD(n, 1));
	symtable_node(st, CHILD(n, 0));
	--st->st_cur->ste_tmpname;
}

static void
symtable_list_for(struct symtable *st, node *n)
{
	REQ(n, list_for);
	/* list_for: for v in expr [list_iter] */
5635
	symtable_assign(st, CHILD(n, 1), 0);
5636 5637 5638 5639 5640 5641 5642 5643 5644
	symtable_node(st, CHILD(n, 3));
	if (NCH(n) == 5)
		symtable_node(st, CHILD(n, 4));
}

static void
symtable_import(struct symtable *st, node *n)
{
	int i;
5645
	/* import_stmt: 'import' dotted_as_name (',' dotted_as_name)* 
5646 5647
              | 'from' dotted_name 'import' 
                                ('*' | import_as_name (',' import_as_name)*)
5648
	   import_as_name: NAME [NAME NAME]
5649 5650
	*/
	if (STR(CHILD(n, 0))[0] == 'f') {  /* from */
5651 5652 5653 5654 5655 5656
		node *dotname = CHILD(n, 1);
		if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
			/* check for bogus imports */
			if (n->n_lineno >= st->st_future->ff_last_lineno) {
				PyErr_SetString(PyExc_SyntaxError,
						LATE_FUTURE);
5657
				symtable_error(st, n->n_lineno);
5658 5659 5660
				return;
			}
		}
5661
		if (TYPE(CHILD(n, 3)) == STAR) {
5662
			if (st->st_cur->ste_type != TYPE_MODULE) {
5663 5664 5665
				if (symtable_warn(st,
				  "import * only allowed at module level") < 0)
					return;
5666
			}
5667
			st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
5668
			st->st_cur->ste_opt_lineno = n->n_lineno;
5669 5670 5671 5672
		} else {
			for (i = 3; i < NCH(n); i += 2) {
				node *c = CHILD(n, i);
				if (NCH(c) > 1) /* import as */
5673 5674
					symtable_assign(st, CHILD(c, 2),
							DEF_IMPORT);
5675
				else
5676 5677
					symtable_assign(st, CHILD(c, 0),
							DEF_IMPORT);
5678 5679
			}
		}
5680
	} else { 
5681
		for (i = 1; i < NCH(n); i += 2) {
5682
			symtable_assign(st, CHILD(n, i), DEF_IMPORT);
5683 5684 5685 5686
		}
	}
}

5687 5688 5689 5690 5691 5692
/* The third argument to symatble_assign() is a flag to be passed to
   symtable_add_def() if it is eventually called.  The flag is useful
   to specify the particular type of assignment that should be
   recorded, e.g. an assignment caused by import.
 */

5693
static void 
5694
symtable_assign(struct symtable *st, node *n, int def_flag)
5695 5696 5697 5698
{
	node *tmp;
	int i;

Jeremy Hylton's avatar
Jeremy Hylton committed
5699 5700 5701
 loop:
	switch (TYPE(n)) {
	case lambdef:
5702 5703
		/* invalid assignment, e.g. lambda x:x=2.  The next
		   pass will catch this error. */
Jeremy Hylton's avatar
Jeremy Hylton committed
5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719
		return;
	case power:
		if (NCH(n) > 2) {
			for (i = 2; i < NCH(n); ++i)
				if (TYPE(CHILD(n, i)) != DOUBLESTAR)
					symtable_node(st, CHILD(n, i));
		}
		if (NCH(n) > 1) { 
			symtable_node(st, CHILD(n, 0));
			symtable_node(st, CHILD(n, 1));
		} else {
			n = CHILD(n, 0);
			goto loop;
		}
		return;
	case listmaker:
5720 5721 5722 5723 5724
		if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
			/* XXX This is an error, but the next pass
			   will catch it. */ 
			return;
		} else {
Jeremy Hylton's avatar
Jeremy Hylton committed
5725
			for (i = 0; i < NCH(n); i += 2)
5726
				symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton's avatar
Jeremy Hylton committed
5727 5728 5729 5730
		}
		return;
	case exprlist:
	case testlist:
5731
	case testlist1:
Jeremy Hylton's avatar
Jeremy Hylton committed
5732 5733 5734 5735 5736 5737 5738
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto loop;
		}
		else {
			int i;
			for (i = 0; i < NCH(n); i += 2)
5739
				symtable_assign(st, CHILD(n, i), def_flag);
5740
			return;
Jeremy Hylton's avatar
Jeremy Hylton committed
5741 5742 5743 5744 5745 5746
		}
	case atom:
		tmp = CHILD(n, 0);
		if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
			n = CHILD(n, 1);
			goto loop;
5747
		} else if (TYPE(tmp) == NAME) {
5748 5749 5750
			if (strcmp(STR(tmp), "__debug__") == 0) {
				PyErr_SetString(PyExc_SyntaxError, 
						ASSIGN_DEBUG);
5751 5752
				symtable_error(st, n->n_lineno);
				return;
5753
			}
5754
			symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
5755
		}
Jeremy Hylton's avatar
Jeremy Hylton committed
5756 5757 5758 5759
		return;
	case dotted_as_name:
		if (NCH(n) == 3)
			symtable_add_def(st, STR(CHILD(n, 2)),
5760
					 DEF_LOCAL | def_flag);
Jeremy Hylton's avatar
Jeremy Hylton committed
5761 5762 5763 5764
		else
			symtable_add_def(st,
					 STR(CHILD(CHILD(n,
							 0), 0)),
5765
					 DEF_LOCAL | def_flag);
Jeremy Hylton's avatar
Jeremy Hylton committed
5766 5767
		return;
	case dotted_name:
5768
		symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton's avatar
Jeremy Hylton committed
5769 5770
		return;
	case NAME:
5771
		symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton's avatar
Jeremy Hylton committed
5772 5773 5774
		return;
	default:
		if (NCH(n) == 0)
5775
			return;
5776 5777 5778
		if (NCH(n) == 1) {
			n = CHILD(n, 0);
			goto loop;
5779
		}
5780 5781 5782 5783
		/* Should only occur for errors like x + 1 = 1,
		   which will be caught in the next pass. */
		for (i = 0; i < NCH(n); ++i)
			if (TYPE(CHILD(n, i)) >= single_input)
5784
				symtable_assign(st, CHILD(n, i), def_flag);
5785 5786
	}
}