frameobject.c 26.3 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2
/* Frame object implementation */

Guido van Rossum's avatar
Guido van Rossum committed
3
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
4

Jeremy Hylton's avatar
Jeremy Hylton committed
5
#include "code.h"
Guido van Rossum's avatar
Guido van Rossum committed
6 7 8 9
#include "frameobject.h"
#include "opcode.h"
#include "structmember.h"

10 11
#undef MIN
#undef MAX
12 13 14
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

Guido van Rossum's avatar
Guido van Rossum committed
15
#define OFF(x) offsetof(PyFrameObject, x)
Guido van Rossum's avatar
Guido van Rossum committed
16

17
static PyMemberDef frame_memberlist[] = {
18 19 20 21 22
	{"f_back",	T_OBJECT,	OFF(f_back),	READONLY},
	{"f_code",	T_OBJECT,	OFF(f_code),	READONLY},
	{"f_builtins",	T_OBJECT,	OFF(f_builtins),READONLY},
	{"f_globals",	T_OBJECT,	OFF(f_globals),	READONLY},
	{"f_lasti",	T_INT,		OFF(f_lasti),	READONLY},
Guido van Rossum's avatar
Guido van Rossum committed
23 24 25
	{NULL}	/* Sentinel */
};

Guido van Rossum's avatar
Guido van Rossum committed
26
static PyObject *
27
frame_getlocals(PyFrameObject *f, void *closure)
Guido van Rossum's avatar
Guido van Rossum committed
28
{
29 30 31
	PyFrame_FastToLocals(f);
	Py_INCREF(f->f_locals);
	return f->f_locals;
Guido van Rossum's avatar
Guido van Rossum committed
32 33
}

Michael W. Hudson's avatar
Michael W. Hudson committed
34 35 36 37 38
static PyObject *
frame_getlineno(PyFrameObject *f, void *closure)
{
	int lineno;

39 40 41 42
	if (f->f_trace)
		lineno = f->f_lineno;
	else
		lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
Michael W. Hudson's avatar
Michael W. Hudson committed
43

44
	return PyLong_FromLong(lineno);
Michael W. Hudson's avatar
Michael W. Hudson committed
45 46
}

47
/* Setter for f_lineno - you can set f_lineno from within a trace function in
48
 * order to jump to a given line of code, subject to some restrictions.	 Most
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
 * lines are OK to jump to because they don't make any assumptions about the
 * state of the stack (obvious because you could remove the line and the code
 * would still work without any stack errors), but there are some constructs
 * that limit jumping:
 *
 *  o Lines with an 'except' statement on them can't be jumped to, because
 *    they expect an exception to be on the top of the stack.
 *  o Lines that live in a 'finally' block can't be jumped from or to, since
 *    the END_FINALLY expects to clean up the stack after the 'try' block.
 *  o 'try'/'for'/'while' blocks can't be jumped into because the blockstack
 *    needs to be set up before their code runs, and for 'for' loops the
 *    iterator needs to be on the stack.
 */
static int
frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
{
	int new_lineno = 0;		/* The new value of f_lineno */
66 67
	long l_new_lineno;
	int overflow;
68 69
	int new_lasti = 0;		/* The new value of f_lasti */
	int new_iblock = 0;		/* The new value of f_iblock */
70
	unsigned char *code = NULL;	/* The bytecode for the frame... */
Martin v. Löwis's avatar
Martin v. Löwis committed
71
	Py_ssize_t code_len = 0;	/* ...and its length */
72
	unsigned char *lnotab = NULL;	/* Iterating over co_lnotab */
Martin v. Löwis's avatar
Martin v. Löwis committed
73
	Py_ssize_t lnotab_len = 0;	/* (ditto) */
74 75 76 77 78 79 80 81 82 83 84 85 86
	int offset = 0;			/* (ditto) */
	int line = 0;			/* (ditto) */
	int addr = 0;			/* (ditto) */
	int min_addr = 0;		/* Scanning the SETUPs and POPs */
	int max_addr = 0;		/* (ditto) */
	int delta_iblock = 0;		/* (ditto) */
	int min_delta_iblock = 0;	/* (ditto) */
	int min_iblock = 0;		/* (ditto) */
	int f_lasti_setup_addr = 0;	/* Policing no-jump-into-finally */
	int new_lasti_setup_addr = 0;	/* (ditto) */
	int blockstack[CO_MAXBLOCKS];	/* Walking the 'finally' blocks */
	int in_finally[CO_MAXBLOCKS];	/* (ditto) */
	int blockstack_top = 0;		/* (ditto) */
87
	unsigned char setup_op = 0;	/* (ditto) */
88 89

	/* f_lineno must be an integer. */
90
	if (!PyLong_CheckExact(p_new_lineno)) {
91 92 93 94 95 96 97 98 99 100
		PyErr_SetString(PyExc_ValueError,
				"lineno must be an integer");
		return -1;
	}

	/* You can only do this from within a trace function, not via
	 * _getframe or similar hackery. */
	if (!f->f_trace)
	{
		PyErr_Format(PyExc_ValueError,
101 102
			     "f_lineno can only be set by a"
			     " line trace function");
103 104 105 106
		return -1;
	}

	/* Fail if the line comes before the start of the code block. */
107 108 109 110 111 112 113 114 115 116 117 118 119
	l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow);
	if (overflow
#if SIZEOF_LONG > SIZEOF_INT
	    || l_new_lineno > INT_MAX
	    || l_new_lineno < INT_MIN
#endif
	   ) {
		PyErr_SetString(PyExc_ValueError,
				"lineno out of range");
		return -1;
	}
	new_lineno = (int)l_new_lineno;
	    
120 121 122 123 124 125
	if (new_lineno < f->f_code->co_firstlineno) {
		PyErr_Format(PyExc_ValueError,
			     "line %d comes before the current code block",
			     new_lineno);
		return -1;
	}
126 127 128 129 130 131 132
	else if (new_lineno == f->f_code->co_firstlineno) {
		new_lasti = 0;
		new_lineno = f->f_code->co_firstlineno;
	}
	else {
		/* Find the bytecode offset for the start of the given
		 * line, or the first code-owning line after it. */
133
		char *tmp;
134
		PyBytes_AsStringAndSize(f->f_code->co_lnotab,
135 136
					&tmp, &lnotab_len);
		lnotab = (unsigned char *) tmp;
137 138 139 140 141 142 143 144 145 146 147
		addr = 0;
		line = f->f_code->co_firstlineno;
		new_lasti = -1;
		for (offset = 0; offset < lnotab_len; offset += 2) {
			addr += lnotab[offset];
			line += lnotab[offset+1];
			if (line >= new_lineno) {
				new_lasti = addr;
				new_lineno = line;
				break;
			}
148 149 150 151 152 153 154 155 156 157 158 159
		}
	}

	/* If we didn't reach the requested line, return an error. */
	if (new_lasti == -1) {
		PyErr_Format(PyExc_ValueError,
			     "line %d comes after the current code block",
			     new_lineno);
		return -1;
	}

	/* We're now ready to look at the bytecode. */
160
	PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
	min_addr = MIN(new_lasti, f->f_lasti);
	max_addr = MAX(new_lasti, f->f_lasti);

	/* You can't jump onto a line with an 'except' statement on it -
	 * they expect to have an exception on the top of the stack, which
	 * won't be true if you jump to them.  They always start with code
	 * that either pops the exception using POP_TOP (plain 'except:'
	 * lines do this) or duplicates the exception on the stack using
	 * DUP_TOP (if there's an exception type specified).  See compile.c,
	 * 'com_try_except' for the full details.  There aren't any other
	 * cases (AFAIK) where a line's code can start with DUP_TOP or
	 * POP_TOP, but if any ever appear, they'll be subject to the same
	 * restriction (but with a different error message). */
	if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) {
		PyErr_SetString(PyExc_ValueError,
		    "can't jump to 'except' line as there's no exception");
		return -1;
	}

	/* You can't jump into or out of a 'finally' block because the 'try'
	 * block leaves something on the stack for the END_FINALLY to clean
182
	 * up.	So we walk the bytecode, maintaining a simulated blockstack.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
	 * When we reach the old or new address and it's in a 'finally' block
	 * we note the address of the corresponding SETUP_FINALLY.  The jump
	 * is only legal if neither address is in a 'finally' block or
	 * they're both in the same one.  'blockstack' is a stack of the
	 * bytecode addresses of the SETUP_X opcodes, and 'in_finally' tracks
	 * whether we're in a 'finally' block at each blockstack level. */
	f_lasti_setup_addr = -1;
	new_lasti_setup_addr = -1;
	memset(blockstack, '\0', sizeof(blockstack));
	memset(in_finally, '\0', sizeof(in_finally));
	blockstack_top = 0;
	for (addr = 0; addr < code_len; addr++) {
		unsigned char op = code[addr];
		switch (op) {
		case SETUP_LOOP:
		case SETUP_EXCEPT:
		case SETUP_FINALLY:
			blockstack[blockstack_top++] = addr;
			in_finally[blockstack_top-1] = 0;
			break;

		case POP_BLOCK:
205
			assert(blockstack_top > 0);
206 207 208 209 210 211 212 213 214 215 216 217
			setup_op = code[blockstack[blockstack_top-1]];
			if (setup_op == SETUP_FINALLY) {
				in_finally[blockstack_top-1] = 1;
			}
			else {
				blockstack_top--;
			}
			break;

		case END_FINALLY:
			/* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
			 * in the bytecode but don't correspond to an actual
218 219 220 221 222 223 224
			 * 'finally' block.  (If blockstack_top is 0, we must
			 * be seeing such an END_FINALLY.) */
			if (blockstack_top > 0) {
				setup_op = code[blockstack[blockstack_top-1]];
				if (setup_op == SETUP_FINALLY) {
					blockstack_top--;
				}
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
			}
			break;
		}

		/* For the addresses we're interested in, see whether they're
		 * within a 'finally' block and if so, remember the address
		 * of the SETUP_FINALLY. */
		if (addr == new_lasti || addr == f->f_lasti) {
			int i = 0;
			int setup_addr = -1;
			for (i = blockstack_top-1; i >= 0; i--) {
				if (in_finally[i]) {
					setup_addr = blockstack[i];
					break;
				}
			}

			if (setup_addr != -1) {
				if (addr == new_lasti) {
					new_lasti_setup_addr = setup_addr;
				}

				if (addr == f->f_lasti) {
					f_lasti_setup_addr = setup_addr;
				}
			}
		}

		if (op >= HAVE_ARGUMENT) {
			addr += 2;
		}
	}

258 259 260 261
	/* Verify that the blockstack tracking code didn't get lost. */
	assert(blockstack_top == 0);

	/* After all that, are we jumping into / out of a 'finally' block? */
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
	if (new_lasti_setup_addr != f_lasti_setup_addr) {
		PyErr_SetString(PyExc_ValueError,
			    "can't jump into or out of a 'finally' block");
		return -1;
	}


	/* Police block-jumping (you can't jump into the middle of a block)
	 * and ensure that the blockstack finishes up in a sensible state (by
	 * popping any blocks we're jumping out of).  We look at all the
	 * blockstack operations between the current position and the new
	 * one, and keep track of how many blocks we drop out of on the way.
	 * By also keeping track of the lowest blockstack position we see, we
	 * can tell whether the jump goes into any blocks without coming out
	 * again - in that case we raise an exception below. */
	delta_iblock = 0;
	for (addr = min_addr; addr < max_addr; addr++) {
		unsigned char op = code[addr];
		switch (op) {
		case SETUP_LOOP:
		case SETUP_EXCEPT:
		case SETUP_FINALLY:
			delta_iblock++;
			break;

		case POP_BLOCK:
			delta_iblock--;
			break;
		}

		min_delta_iblock = MIN(min_delta_iblock, delta_iblock);

		if (op >= HAVE_ARGUMENT) {
			addr += 2;
		}
	}

	/* Derive the absolute iblock values from the deltas. */
	min_iblock = f->f_iblock + min_delta_iblock;
	if (new_lasti > f->f_lasti) {
		/* Forwards jump. */
		new_iblock = f->f_iblock + delta_iblock;
	}
	else {
		/* Backwards jump. */
		new_iblock = f->f_iblock - delta_iblock;
	}

	/* Are we jumping into a block? */
	if (new_iblock > min_iblock) {
		PyErr_SetString(PyExc_ValueError,
				"can't jump into the middle of a block");
		return -1;
	}

	/* Pop any blocks that we're jumping out of. */
	while (f->f_iblock > new_iblock) {
		PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
		while ((f->f_stacktop - f->f_valuestack) > b->b_level) {
			PyObject *v = (*--f->f_stacktop);
			Py_DECREF(v);
		}
	}

	/* Finally set the new f_lineno and f_lasti and return OK. */
	f->f_lineno = new_lineno;
	f->f_lasti = new_lasti;
	return 0;
}

332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
static PyObject *
frame_gettrace(PyFrameObject *f, void *closure)
{
	PyObject* trace = f->f_trace;

	if (trace == NULL)
		trace = Py_None;

	Py_INCREF(trace);

	return trace;
}

static int
frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
{
	/* We rely on f_lineno being accurate when f_trace is set. */

	PyObject* old_value = f->f_trace;

	Py_XINCREF(v);
	f->f_trace = v;
354

355 356 357 358 359 360 361 362
	if (v != NULL)
		f->f_lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);

	Py_XDECREF(old_value);

	return 0;
}

363

364
static PyGetSetDef frame_getsetlist[] = {
365
	{"f_locals",	(getter)frame_getlocals, NULL, NULL},
366 367
	{"f_lineno",	(getter)frame_getlineno,
			(setter)frame_setlineno, NULL},
368
	{"f_trace",	(getter)frame_gettrace, (setter)frame_settrace, NULL},
369 370
	{0}
};
371

372
/* Stack frames are allocated and deallocated at a considerable rate.
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
   In an attempt to improve the speed of function calls, we:

   1. Hold a single "zombie" frame on each code object. This retains
   the allocated and initialised frame object from an invocation of
   the code object. The zombie is reanimated the next time we need a
   frame object for that code object. Doing this saves the malloc/
   realloc required when using a free_list frame that isn't the
   correct size. It also saves some field initialisation.

   In zombie mode, no field of PyFrameObject holds a reference, but
   the following fields are still valid:

     * ob_type, ob_size, f_code, f_valuestack;
       
     * f_locals, f_trace,
       f_exc_type, f_exc_value, f_exc_traceback are NULL;

     * f_localsplus does not require re-allocation and
       the local variables in f_localsplus are NULL.

   2. We also maintain a separate free list of stack frames (just like
   integers are allocated in a special way -- see intobject.c).  When
   a stack frame is on the free list, only the following members have
   a meaning:
397 398
	ob_type		== &Frametype
	f_back		next item on free list, or NULL
399
	f_stacksize	size of value stack
400
	ob_size		size of localsplus
401 402 403 404 405 406 407 408
   Note that the value and block stacks are preserved -- this can save
   another malloc() call or two (and two free() calls as well!).
   Also note that, unlike for integers, each frame object is a
   malloc'ed object in its own right -- it is only the actual calls to
   malloc() that we are trying to save here, not the administration.
   After all, while a typical program may make millions of calls, a
   call depth of more than 20 or 30 is probably already exceptional
   unless the program contains run-away recursion.  I hope.
409

Christian Heimes's avatar
Christian Heimes committed
410
   Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
411 412
   free_list.  Else programs creating lots of cyclic trash involving
   frames could provoke free_list into growing without bound.
413 414
*/

Guido van Rossum's avatar
Guido van Rossum committed
415
static PyFrameObject *free_list = NULL;
416
static int numfree = 0;		/* number of frames currently in free_list */
Christian Heimes's avatar
Christian Heimes committed
417 418
/* max value for numfree */
#define PyFrame_MAXFREELIST 200	
419

Guido van Rossum's avatar
Guido van Rossum committed
420
static void
421
frame_dealloc(PyFrameObject *f)
Guido van Rossum's avatar
Guido van Rossum committed
422
{
423 424
	PyObject **p, **valuestack;
	PyCodeObject *co;
425

426
	PyObject_GC_UnTrack(f);
427
	Py_TRASHCAN_SAFE_BEGIN(f)
428
	/* Kill all local variables */
429 430 431
	valuestack = f->f_valuestack;
	for (p = f->f_localsplus; p < valuestack; p++)
		Py_CLEAR(*p);
432

433
	/* Free stack */
434
	if (f->f_stacktop != NULL) {
435
		for (p = valuestack; p < f->f_stacktop; p++)
436
			Py_XDECREF(*p);
437
	}
438

Guido van Rossum's avatar
Guido van Rossum committed
439
	Py_XDECREF(f->f_back);
440 441
	Py_DECREF(f->f_builtins);
	Py_DECREF(f->f_globals);
442 443 444 445 446 447
	Py_CLEAR(f->f_locals);
	Py_CLEAR(f->f_trace);
	Py_CLEAR(f->f_exc_type);
	Py_CLEAR(f->f_exc_value);
	Py_CLEAR(f->f_exc_traceback);

448 449 450
	co = f->f_code;
	if (co->co_zombieframe == NULL)
		co->co_zombieframe = f;
Christian Heimes's avatar
Christian Heimes committed
451
	else if (numfree < PyFrame_MAXFREELIST) {
452 453 454
		++numfree;
		f->f_back = free_list;
		free_list = f;
455
	}
456
	else 
457
		PyObject_GC_Del(f);
458

459
	Py_DECREF(co);
460
	Py_TRASHCAN_SAFE_END(f)
Guido van Rossum's avatar
Guido van Rossum committed
461 462
}

Neil Schemenauer's avatar
Neil Schemenauer committed
463 464 465 466
static int
frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
{
	PyObject **fastlocals, **p;
467 468 469 470 471 472 473 474 475 476 477
	int i, slots;

	Py_VISIT(f->f_back);
	Py_VISIT(f->f_code);
	Py_VISIT(f->f_builtins);
	Py_VISIT(f->f_globals);
	Py_VISIT(f->f_locals);
	Py_VISIT(f->f_trace);
	Py_VISIT(f->f_exc_type);
	Py_VISIT(f->f_exc_value);
	Py_VISIT(f->f_exc_traceback);
Neil Schemenauer's avatar
Neil Schemenauer committed
478 479

	/* locals */
480
	slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
Neil Schemenauer's avatar
Neil Schemenauer committed
481
	fastlocals = f->f_localsplus;
482 483
	for (i = slots; --i >= 0; ++fastlocals)
		Py_VISIT(*fastlocals);
Neil Schemenauer's avatar
Neil Schemenauer committed
484 485 486 487

	/* stack */
	if (f->f_stacktop != NULL) {
		for (p = f->f_valuestack; p < f->f_stacktop; p++)
488
			Py_VISIT(*p);
Neil Schemenauer's avatar
Neil Schemenauer committed
489 490 491 492 493 494 495
	}
	return 0;
}

static void
frame_clear(PyFrameObject *f)
{
496
	PyObject **fastlocals, **p, **oldtop;
Neil Schemenauer's avatar
Neil Schemenauer committed
497 498
	int i, slots;

499
	/* Before anything else, make sure that this frame is clearly marked
500 501 502 503
	 * as being defunct!  Else, e.g., a generator reachable from this
	 * frame may also point to this frame, believe itself to still be
	 * active, and try cleaning up this frame again.
	 */
504
	oldtop = f->f_stacktop;
505
	f->f_stacktop = NULL;
Neil Schemenauer's avatar
Neil Schemenauer committed
506

507 508 509 510
	Py_CLEAR(f->f_exc_type);
	Py_CLEAR(f->f_exc_value);
	Py_CLEAR(f->f_exc_traceback);
	Py_CLEAR(f->f_trace);
Neil Schemenauer's avatar
Neil Schemenauer committed
511 512

	/* locals */
513
	slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
Neil Schemenauer's avatar
Neil Schemenauer committed
514
	fastlocals = f->f_localsplus;
515 516
	for (i = slots; --i >= 0; ++fastlocals)
		Py_CLEAR(*fastlocals);
Neil Schemenauer's avatar
Neil Schemenauer committed
517 518

	/* stack */
519 520 521
	if (oldtop != NULL) {
		for (p = f->f_valuestack; p < oldtop; p++)
			Py_CLEAR(*p);
Neil Schemenauer's avatar
Neil Schemenauer committed
522 523 524
	}
}

525 526 527 528 529 530 531 532 533
static PyObject *
frame_sizeof(PyFrameObject *f)
{
	Py_ssize_t res, extras, ncells, nfrees;

	ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars);
	nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars);
	extras = f->f_code->co_stacksize + f->f_code->co_nlocals +
		 ncells + nfrees;
534
	/* subtract one as it is already included in PyFrameObject */
535 536 537 538 539 540 541 542 543 544 545 546 547
	res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *);

	return PyLong_FromSsize_t(res);
}

PyDoc_STRVAR(sizeof__doc__,
"F.__sizeof__() -> size of F in memory, in bytes");

static PyMethodDef frame_methods[] = {
	{"__sizeof__",	(PyCFunction)frame_sizeof,	METH_NOARGS,
	 sizeof__doc__},
	{NULL,		NULL}	/* sentinel */
};
Neil Schemenauer's avatar
Neil Schemenauer committed
548

Guido van Rossum's avatar
Guido van Rossum committed
549
PyTypeObject PyFrame_Type = {
550
	PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum's avatar
Guido van Rossum committed
551
	"frame",
552 553
	sizeof(PyFrameObject),
	sizeof(PyObject *),
554
	(destructor)frame_dealloc,		/* tp_dealloc */
Neil Schemenauer's avatar
Neil Schemenauer committed
555
	0,					/* tp_print */
556 557
	0,					/* tp_getattr */
	0,					/* tp_setattr */
558
	0,					/* tp_reserved */
Neil Schemenauer's avatar
Neil Schemenauer committed
559 560 561 562 563 564 565
	0,					/* tp_repr */
	0,					/* tp_as_number */
	0,					/* tp_as_sequence */
	0,					/* tp_as_mapping */
	0,					/* tp_hash */
	0,					/* tp_call */
	0,					/* tp_str */
566 567
	PyObject_GenericGetAttr,		/* tp_getattro */
	PyObject_GenericSetAttr,		/* tp_setattro */
Neil Schemenauer's avatar
Neil Schemenauer committed
568
	0,					/* tp_as_buffer */
569
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
570 571
	0,					/* tp_doc */
	(traverseproc)frame_traverse,		/* tp_traverse */
Neil Schemenauer's avatar
Neil Schemenauer committed
572
	(inquiry)frame_clear,			/* tp_clear */
573 574 575 576
	0,					/* tp_richcompare */
	0,					/* tp_weaklistoffset */
	0,					/* tp_iter */
	0,					/* tp_iternext */
577
	frame_methods,				/* tp_methods */
578 579 580 581
	frame_memberlist,			/* tp_members */
	frame_getsetlist,			/* tp_getset */
	0,					/* tp_base */
	0,					/* tp_dict */
Guido van Rossum's avatar
Guido van Rossum committed
582 583
};

584 585
static PyObject *builtin_object;

586
int _PyFrame_Init()
587
{
588
	builtin_object = PyUnicode_InternFromString("__builtins__");
589 590 591
	if (builtin_object == NULL)
		return 0;
	return 1;
592 593
}

Guido van Rossum's avatar
Guido van Rossum committed
594
PyFrameObject *
595
PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
596
	    PyObject *locals)
Guido van Rossum's avatar
Guido van Rossum committed
597
{
598
	PyFrameObject *back = tstate->frame;
Guido van Rossum's avatar
Guido van Rossum committed
599 600
	PyFrameObject *f;
	PyObject *builtins;
601
	Py_ssize_t i;
602

603 604
#ifdef Py_DEBUG
	if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
605
	    (locals != NULL && !PyMapping_Check(locals))) {
Guido van Rossum's avatar
Guido van Rossum committed
606
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
607 608
		return NULL;
	}
609
#endif
610 611
	if (back == NULL || back->f_globals != globals) {
		builtins = PyDict_GetItem(globals, builtin_object);
612 613 614 615 616 617 618 619 620
		if (builtins) {
			if (PyModule_Check(builtins)) {
				builtins = PyModule_GetDict(builtins);
				assert(!builtins || PyDict_Check(builtins));
			}
			else if (!PyDict_Check(builtins))
				builtins = NULL;
		}
		if (builtins == NULL) {
621
			/* No builtins!	 Make up a minimal one
622 623
			   Give them 'None', at least. */
			builtins = PyDict_New();
624
			if (builtins == NULL ||
625 626 627 628 629 630 631
			    PyDict_SetItemString(
				    builtins, "None", Py_None) < 0)
				return NULL;
		}
		else
			Py_INCREF(builtins);

632 633 634 635 636
	}
	else {
		/* If we share the globals, we share the builtins.
		   Save a lookup and a call. */
		builtins = back->f_builtins;
637 638
		assert(builtins != NULL && PyDict_Check(builtins));
		Py_INCREF(builtins);
639
	}
640
	if (code->co_zombieframe != NULL) {
641 642 643 644
		f = code->co_zombieframe;
		code->co_zombieframe = NULL;
		_Py_NewReference((PyObject *)f);
		assert(f->f_code == code);
645
	}
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
	else {
		Py_ssize_t extras, ncells, nfrees;
		ncells = PyTuple_GET_SIZE(code->co_cellvars);
		nfrees = PyTuple_GET_SIZE(code->co_freevars);
		extras = code->co_stacksize + code->co_nlocals + ncells +
		    nfrees;
		if (free_list == NULL) {
		    f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
			extras);
		    if (f == NULL) {
			    Py_DECREF(builtins);
			    return NULL;
		    }
		}
		else {
		    assert(numfree > 0);
		    --numfree;
		    f = free_list;
		    free_list = free_list->f_back;
665
		    if (Py_SIZE(f) < extras) {
666 667 668 669 670 671 672 673
			    f = PyObject_GC_Resize(PyFrameObject, f, extras);
			    if (f == NULL) {
				    Py_DECREF(builtins);
				    return NULL;
			    }
		    }
		    _Py_NewReference((PyObject *)f);
		}
674 675 676 677 678 679 680 681

		f->f_code = code;
		extras = code->co_nlocals + ncells + nfrees;
		f->f_valuestack = f->f_localsplus + extras;
		for (i=0; i<extras; i++)
			f->f_localsplus[i] = NULL;
		f->f_locals = NULL;
		f->f_trace = NULL;
682
		f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
683
	}
684
	f->f_stacktop = f->f_valuestack;
685
	f->f_builtins = builtins;
Guido van Rossum's avatar
Guido van Rossum committed
686
	Py_XINCREF(back);
687
	f->f_back = back;
Guido van Rossum's avatar
Guido van Rossum committed
688 689
	Py_INCREF(code);
	Py_INCREF(globals);
690
	f->f_globals = globals;
691
	/* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
692
	if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
693
		(CO_NEWLOCALS | CO_OPTIMIZED))
694
		; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
695 696 697 698 699
	else if (code->co_flags & CO_NEWLOCALS) {
		locals = PyDict_New();
		if (locals == NULL) {
			Py_DECREF(f);
			return NULL;
700
		}
701
		f->f_locals = locals;
702 703 704 705
	}
	else {
		if (locals == NULL)
			locals = globals;
Guido van Rossum's avatar
Guido van Rossum committed
706
		Py_INCREF(locals);
707
		f->f_locals = locals;
708
	}
709
	f->f_tstate = tstate;
710

Michael W. Hudson's avatar
Michael W. Hudson committed
711
	f->f_lasti = -1;
712
	f->f_lineno = code->co_firstlineno;
713
	f->f_iblock = 0;
714

715
	_PyObject_GC_TRACK(f);
716
	return f;
717 718
}

Guido van Rossum's avatar
Guido van Rossum committed
719 720 721
/* Block management */

void
722
PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
Guido van Rossum's avatar
Guido van Rossum committed
723
{
Guido van Rossum's avatar
Guido van Rossum committed
724
	PyTryBlock *b;
725
	if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum's avatar
Guido van Rossum committed
726
		Py_FatalError("XXX block stack overflow");
Guido van Rossum's avatar
Guido van Rossum committed
727 728 729 730 731 732
	b = &f->f_blockstack[f->f_iblock++];
	b->b_type = type;
	b->b_level = level;
	b->b_handler = handler;
}

Guido van Rossum's avatar
Guido van Rossum committed
733
PyTryBlock *
734
PyFrame_BlockPop(PyFrameObject *f)
Guido van Rossum's avatar
Guido van Rossum committed
735
{
Guido van Rossum's avatar
Guido van Rossum committed
736
	PyTryBlock *b;
737
	if (f->f_iblock <= 0)
Guido van Rossum's avatar
Guido van Rossum committed
738
		Py_FatalError("XXX block stack underflow");
Guido van Rossum's avatar
Guido van Rossum committed
739 740 741
	b = &f->f_blockstack[--f->f_iblock];
	return b;
}
742

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
/* Convert between "fast" version of locals and dictionary version.
   
   map and values are input arguments.	map is a tuple of strings.
   values is an array of PyObject*.  At index i, map[i] is the name of
   the variable with value values[i].  The function copies the first
   nmap variable from map/values into dict.  If values[i] is NULL,
   the variable is deleted from dict.

   If deref is true, then the values being copied are cell variables
   and the value is extracted from the cell variable before being put
   in dict.

   Exceptions raised while modifying the dict are silently ignored,
   because there is no good way to report them.
 */
758

759
static void
Martin v. Löwis's avatar
Martin v. Löwis committed
760
map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
761
	    int deref)
762
{
Martin v. Löwis's avatar
Martin v. Löwis committed
763
	Py_ssize_t j;
764 765 766
	assert(PyTuple_Check(map));
	assert(PyDict_Check(dict));
	assert(PyTuple_Size(map) >= nmap);
767
	for (j = nmap; --j >= 0; ) {
768
		PyObject *key = PyTuple_GET_ITEM(map, j);
769
		PyObject *value = values[j];
770
		assert(PyUnicode_Check(key));
771 772
		if (deref) {
			assert(PyCell_Check(value));
773
			value = PyCell_GET(value);
774
		}
775
		if (value == NULL) {
776
			if (PyObject_DelItem(dict, key) != 0)
777 778 779
				PyErr_Clear();
		}
		else {
780
			if (PyObject_SetItem(dict, key, value) != 0)
781 782 783 784 785
				PyErr_Clear();
		}
	}
}

786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
/* Copy values from the "locals" dict into the fast locals.

   dict is an input argument containing string keys representing
   variables names and arbitrary PyObject* as values.

   map and values are input arguments.	map is a tuple of strings.
   values is an array of PyObject*.  At index i, map[i] is the name of
   the variable with value values[i].  The function copies the first
   nmap variable from map/values into dict.  If values[i] is NULL,
   the variable is deleted from dict.

   If deref is true, then the values being copied are cell variables
   and the value is extracted from the cell variable before being put
   in dict.  If clear is true, then variables in map but not in dict
   are set to NULL in map; if clear is false, variables missing in
   dict are ignored.

   Exceptions raised while modifying the dict are silently ignored,
   because there is no good way to report them.
*/

807
static void
Martin v. Löwis's avatar
Martin v. Löwis committed
808
dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
809
	    int deref, int clear)
810
{
Martin v. Löwis's avatar
Martin v. Löwis committed
811
	Py_ssize_t j;
812 813 814
	assert(PyTuple_Check(map));
	assert(PyDict_Check(dict));
	assert(PyTuple_Size(map) >= nmap);
815
	for (j = nmap; --j >= 0; ) {
816
		PyObject *key = PyTuple_GET_ITEM(map, j);
817
		PyObject *value = PyObject_GetItem(dict, key);
818
		assert(PyUnicode_Check(key));
819 820
		/* We only care about NULLs if clear is true. */
		if (value == NULL) {
821
			PyErr_Clear();
822 823 824
			if (!clear)
				continue;
		}
825
		if (deref) {
826 827 828 829
			assert(PyCell_Check(values[j]));
			if (PyCell_GET(values[j]) != value) {
				if (PyCell_Set(values[j], value) < 0)
					PyErr_Clear();
830
			}
831 832 833 834
		} else if (values[j] != value) {
			Py_XINCREF(value);
			Py_XDECREF(values[j]);
			values[j] = value;
835
		}
836
		Py_XDECREF(value);
837 838
	}
}
839

840
void
841
PyFrame_FastToLocals(PyFrameObject *f)
842
{
843
	/* Merge fast locals into f->f_locals */
Guido van Rossum's avatar
Guido van Rossum committed
844 845 846
	PyObject *locals, *map;
	PyObject **fast;
	PyObject *error_type, *error_value, *error_traceback;
847
	PyCodeObject *co;
Martin v. Löwis's avatar
Martin v. Löwis committed
848
	Py_ssize_t j;
849
	int ncells, nfreevars;
850 851
	if (f == NULL)
		return;
852 853
	locals = f->f_locals;
	if (locals == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
854
		locals = f->f_locals = PyDict_New();
855
		if (locals == NULL) {
Guido van Rossum's avatar
Guido van Rossum committed
856
			PyErr_Clear(); /* Can't report it :-( */
857 858 859
			return;
		}
	}
860 861
	co = f->f_code;
	map = co->co_varnames;
862
	if (!PyTuple_Check(map))
863
		return;
Guido van Rossum's avatar
Guido van Rossum committed
864
	PyErr_Fetch(&error_type, &error_value, &error_traceback);
865
	fast = f->f_localsplus;
866
	j = PyTuple_GET_SIZE(map);
867 868 869
	if (j > co->co_nlocals)
		j = co->co_nlocals;
	if (co->co_nlocals)
Jeremy Hylton's avatar
Jeremy Hylton committed
870
		map_to_dict(map, j, locals, fast, 0);
871 872 873 874 875
	ncells = PyTuple_GET_SIZE(co->co_cellvars);
	nfreevars = PyTuple_GET_SIZE(co->co_freevars);
	if (ncells || nfreevars) {
		map_to_dict(co->co_cellvars, ncells,
			    locals, fast + co->co_nlocals, 1);
876 877 878 879 880 881 882 883 884 885 886 887
		/* If the namespace is unoptimized, then one of the 
		   following cases applies:
		   1. It does not contain free variables, because it
		      uses import * or is a top-level namespace.
		   2. It is a class namespace.
		   We don't want to accidentally copy free variables
		   into the locals dict used by the class.
		*/
		if (co->co_flags & CO_OPTIMIZED) {
			map_to_dict(co->co_freevars, nfreevars,
				    locals, fast + co->co_nlocals + ncells, 1);
		}
888
	}
Guido van Rossum's avatar
Guido van Rossum committed
889
	PyErr_Restore(error_type, error_value, error_traceback);
890 891 892
}

void
893
PyFrame_LocalsToFast(PyFrameObject *f, int clear)
894
{
895
	/* Merge f->f_locals into fast locals */
Guido van Rossum's avatar
Guido van Rossum committed
896 897 898
	PyObject *locals, *map;
	PyObject **fast;
	PyObject *error_type, *error_value, *error_traceback;
899
	PyCodeObject *co;
Martin v. Löwis's avatar
Martin v. Löwis committed
900
	Py_ssize_t j;
901
	int ncells, nfreevars;
902 903 904
	if (f == NULL)
		return;
	locals = f->f_locals;
905 906
	co = f->f_code;
	map = co->co_varnames;
907
	if (locals == NULL)
908
		return;
909
	if (!PyTuple_Check(map))
910
		return;
Guido van Rossum's avatar
Guido van Rossum committed
911
	PyErr_Fetch(&error_type, &error_value, &error_traceback);
912
	fast = f->f_localsplus;
913
	j = PyTuple_GET_SIZE(map);
914 915 916 917 918 919 920 921 922
	if (j > co->co_nlocals)
		j = co->co_nlocals;
	if (co->co_nlocals)
	    dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
	ncells = PyTuple_GET_SIZE(co->co_cellvars);
	nfreevars = PyTuple_GET_SIZE(co->co_freevars);
	if (ncells || nfreevars) {
		dict_to_map(co->co_cellvars, ncells,
			    locals, fast + co->co_nlocals, 1, clear);
Georg Brandl's avatar
Georg Brandl committed
923 924 925 926 927 928
		/* Same test as in PyFrame_FastToLocals() above. */
		if (co->co_flags & CO_OPTIMIZED) {
			dict_to_map(co->co_freevars, nfreevars,
			        locals, fast + co->co_nlocals + ncells, 1, 
			        clear);
		}
929
	}
Guido van Rossum's avatar
Guido van Rossum committed
930
	PyErr_Restore(error_type, error_value, error_traceback);
931
}
932 933

/* Clear out the free list */
Christian Heimes's avatar
Christian Heimes committed
934 935
int
PyFrame_ClearFreeList(void)
936
{
Christian Heimes's avatar
Christian Heimes committed
937 938
	int freelist_size = numfree;
	
939 940 941
	while (free_list != NULL) {
		PyFrameObject *f = free_list;
		free_list = free_list->f_back;
942
		PyObject_GC_Del(f);
943
		--numfree;
944
	}
945
	assert(numfree == 0);
Christian Heimes's avatar
Christian Heimes committed
946 947 948 949 950 951 952
	return freelist_size;
}

void
PyFrame_Fini(void)
{
	(void)PyFrame_ClearFreeList();
953 954
	Py_XDECREF(builtin_object);
	builtin_object = NULL;
955
}