[Python-checkins] python/dist/src/Python symtable.c,2.10.8.9,2.10.8.10

jhylton@users.sourceforge.net jhylton@users.sourceforge.net
Mon, 21 Oct 2002 14:31:13 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv27294/Python

Modified Files:
      Tag: ast-branch
	symtable.c 
Log Message:
Hook up symbol table analysis code.

After analyzing the AST, call symtable_analyze() to determine what
variables are free and what variables are globals.  The analysis
hasn't been tested thoroughly, but it is much simpler than the old
symtable analysis code.

Add st_top alias for the first ste.  The symtable_analyze() function
mistakenly passed st_globals, which is a dictionary of symbols not a
symbol table entry.  (The cast should have been a warning.)

Remove two Python-visible attributes of a symtable, because I changed
them to bitfields.  XXX I'm probably going to remove the Python-level
API entirely.







Index: symtable.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/symtable.c,v
retrieving revision 2.10.8.9
retrieving revision 2.10.8.10
diff -C2 -d -r2.10.8.9 -r2.10.8.10
*** symtable.c	2 Oct 2002 11:50:14 -0000	2.10.8.9
--- symtable.c	21 Oct 2002 21:31:11 -0000	2.10.8.10
***************
*** 97,102 ****
  	{"type",     T_INT,    OFF(ste_type), READONLY},
  	{"lineno",   T_INT,    OFF(ste_lineno), READONLY},
- 	{"optimized",T_INT,    OFF(ste_optimized), READONLY},
- 	{"nested",   T_INT,    OFF(ste_nested), READONLY},
  	{NULL}
  };
--- 97,100 ----
***************
*** 144,147 ****
--- 142,146 ----
  };
  
+ static int symtable_analyze(struct symtable *st);
  static int symtable_enter_block(struct symtable *st, identifier name, 
  				block_ty block, void *ast, int lineno);
***************
*** 198,201 ****
--- 197,201 ----
  	symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock, 
  			     (void *)mod, 0);
+ 	st->st_top = st->st_cur;
  	/* Any other top-level initialization? */
  	switch (mod->kind) {
***************
*** 226,229 ****
--- 226,231 ----
  	}
  	symtable_exit_block(st, (void *)mod);
+ 	if (!symtable_analyze(st))
+ 	    goto error;
  	return st;
   error:
***************
*** 237,241 ****
  	Py_XDECREF(st->st_symbols);
  	Py_XDECREF(st->st_stack);
- 	Py_XDECREF(st->st_cur);
  	PyMem_Free((void *)st);
  }
--- 239,242 ----
***************
*** 417,421 ****
  		flags |= (i << SCOPE_OFF);
  		u = PyInt_FromLong(flags);
! 		if (!PyDict_SetItem(symbols, name, u)) {
  			Py_DECREF(u);
  			return 0;
--- 418,422 ----
  		flags |= (i << SCOPE_OFF);
  		u = PyInt_FromLong(flags);
! 		if (PyDict_SetItem(symbols, name, u) < 0) {
  			Py_DECREF(u);
  			return 0;
***************
*** 439,442 ****
--- 440,445 ----
  		goto error;
  
+ 	assert(PySTEntry_Check(ste));
+ 	assert(PyDict_Check(ste->ste_symbols));
  	while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
  		flags = PyInt_AS_LONG(v);
***************
*** 458,466 ****
  	}
  
- 	/* call analyze_block() on each child */
  	for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
! 		PyObject *c;
! 		c = PyDict_GetItem(ste->ste_table->st_symbols,
! 				   PyList_GET_ITEM(ste->ste_children, i));
  		assert(c && PySTEntry_Check(c));
  		if (!analyze_block((PySTEntryObject *)c, local, free))
--- 461,466 ----
  	}
  
  	for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
! 		PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
  		assert(c && PySTEntry_Check(c));
  		if (!analyze_block((PySTEntryObject *)c, local, free))
***************
*** 477,485 ****
  	Py_XDECREF(scope);
  	Py_XDECREF(newbound);
  	return success;
  }
  
  int
! PySymtable_Analyze(struct symtable *st)
  {
  	PyObject *free;
--- 477,487 ----
  	Py_XDECREF(scope);
  	Py_XDECREF(newbound);
+ 	if (!success)
+ 		assert(PyErr_Occurred());
  	return success;
  }
  
  int
! symtable_analyze(struct symtable *st)
  {
  	PyObject *free;
***************
*** 489,493 ****
  	if (!free)
  		return 0;
! 	r = analyze_block((PySTEntryObject *)st->st_global, NULL, free);
  	Py_DECREF(free);
  	return r;
--- 491,495 ----
  	if (!free)
  		return 0;
! 	r = analyze_block(st->st_top, NULL, free);
  	Py_DECREF(free);
  	return r;
***************
*** 521,524 ****
--- 523,529 ----
  {
  	PySTEntryObject *prev = NULL;
+ 
+ 	fprintf(stderr, "enter block %s %d\n",
+ 		PyString_AS_STRING(name), lineno);
  
  	if (st->st_cur) {