[Python-checkins] python/dist/src/Python symtable.c,2.10.8.5,2.10.8.6

jhylton@users.sourceforge.net jhylton@users.sourceforge.net
Fri, 30 Aug 2002 13:04:52 -0700


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

Modified Files:
      Tag: ast-branch
	symtable.c 
Log Message:
Cleanup symbol table.

Add public PySymtable_Lookup() function that returns an entry for a
block given the address of its AST node.

Remove lookup code from PySTEntry_New() since we only call this when
the symbol table is created.

Track change in asdl_seq_ API, e.g. get -> GET.




Index: symtable.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/symtable.c,v
retrieving revision 2.10.8.5
retrieving revision 2.10.8.6
diff -C2 -d -r2.10.8.5 -r2.10.8.6
*** symtable.c	23 Aug 2002 22:51:51 -0000	2.10.8.5
--- symtable.c	30 Aug 2002 20:04:49 -0000	2.10.8.6
***************
*** 16,28 ****
  	if (k == NULL)
  		goto fail;
- 	/* XXX do we need the lookup code anymore? */
- 	v = PyDict_GetItem(st->st_symbols, k);
- 	if (v) {
- 		assert(PySTEntry_Check(v));
- 		Py_DECREF(k);
- 		Py_INCREF(v);
- 		return (PySTEntryObject *)v;
- 	}
- 	
  	ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
  					      &PySTEntry_Type);
--- 16,19 ----
***************
*** 196,208 ****
  }
  
- void
- PySymtable_Free(struct symtable *st)
- {
- 	Py_XDECREF(st->st_symbols);
- 	Py_XDECREF(st->st_stack);
- 	Py_XDECREF(st->st_cur);
- 	PyMem_Free((void *)st);
- }
- 
  struct symtable *
  PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
--- 187,190 ----
***************
*** 218,240 ****
  	/* Any other top-level initialization? */
  	switch (mod->kind) {
! 	case Module_kind: 
! 	{
  		int i;
  		asdl_seq *seq = mod->v.Module.body;
  		for (i = 0; i < asdl_seq_LEN(seq); i++)
! 			if (!symtable_visit_stmt(st, asdl_seq_get(seq, i))) {
! 				PySymtable_Free(st);
! 				return NULL;
! 			}
  	}
- 	break;
  	case Expression_kind:
! 		symtable_visit_expr(st, mod->v.Expression.body);
  		break;
! 	default:
  		return NULL;
  	}
  	symtable_exit_block(st, (void *)mod);
  	return st;
  }
  
--- 200,260 ----
  	/* Any other top-level initialization? */
  	switch (mod->kind) {
! 	case Module_kind: {
  		int i;
  		asdl_seq *seq = mod->v.Module.body;
  		for (i = 0; i < asdl_seq_LEN(seq); i++)
! 			if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
! 				goto error;
! 		break;
  	}
  	case Expression_kind:
! 		if (!symtable_visit_expr(st, mod->v.Expression.body))
! 			goto error;
  		break;
! 	case Interactive_kind:
! 		if (!symtable_visit_stmt(st, mod->v.Interactive.body)) 
! 			goto error;
! 		break;
! 	case Suite_kind:
! 		PyErr_SetString(PyExc_RuntimeError,
! 				"this compiler does not handle Suites");
  		return NULL;
  	}
  	symtable_exit_block(st, (void *)mod);
  	return st;
+  error:
+ 	PySymtable_Free(st);
+ 	return NULL;
+ }
+ 
+ void
+ PySymtable_Free(struct symtable *st)
+ {
+ 	Py_XDECREF(st->st_symbols);
+ 	Py_XDECREF(st->st_stack);
+ 	Py_XDECREF(st->st_cur);
+ 	PyMem_Free((void *)st);
+ }
+ 
+ PySTEntryObject *
+ PySymtable_Lookup(struct symtable *st, void *key)
+ {
+ 	PyObject *k, *v;
+ 
+ 	k = PyLong_FromVoidPtr(key);
+ 	if (k == NULL)
+ 		return NULL;
+ 	v = PyDict_GetItem(st->st_symbols, k);
+ 	if (v) {
+ 		assert(PySTEntry_Check(v));
+ 		Py_DECREF(k);
+ 		Py_INCREF(v);
+ 		return (PySTEntryObject *)v;
+ 	}
+ 	else {
+ 		PyErr_SetString(PyExc_KeyError,
+ 				"unknown symbol table entry");
+ 		return NULL;
+ 	}
  }
  
***************
*** 579,583 ****
  	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
  	for (i = 0; i < asdl_seq_LEN(seq); i++) { \
! 		TYPE ## _ty elt = asdl_seq_get(seq, i); \
  		if (!symtable_visit_ ## TYPE((ST), elt)) \
  			return 0; \
--- 599,603 ----
  	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
  	for (i = 0; i < asdl_seq_LEN(seq); i++) { \
! 		TYPE ## _ty elt = asdl_seq_GET(seq, i); \
  		if (!symtable_visit_ ## TYPE((ST), elt)) \
  			return 0; \
***************
*** 692,696 ****
  		asdl_seq *seq = s->v.Global.names;
  		for (i = 0; i < asdl_seq_LEN(seq); i++)
! 			symtable_add_def(st, asdl_seq_get(seq, i), DEF_GLOBAL);
  		
  		break;
--- 712,717 ----
  		asdl_seq *seq = s->v.Global.names;
  		for (i = 0; i < asdl_seq_LEN(seq); i++)
! 			symtable_add_def(st, asdl_seq_GET(seq, i), 
! 					 DEF_GLOBAL);
  		
  		break;
***************
*** 800,804 ****
  	
  	for (i = 0; i < asdl_seq_LEN(args); i++) {
! 		expr_ty arg = asdl_seq_get(args, i);
  		if (arg->kind == Name_kind) {
  			assert(arg->v.Name.ctx == Load);
--- 821,825 ----
  	
  	for (i = 0; i < asdl_seq_LEN(args); i++) {
! 		expr_ty arg = asdl_seq_GET(args, i);
  		if (arg->kind == Name_kind) {
  			assert(arg->v.Name.ctx == Load);
***************
*** 830,835 ****
  	   XXX should ast be different?
  	*/
! 	if (!symtable_visit_params(st, a->args, 1))
! 		return 0;
  
  	if (a->vararg)
--- 851,857 ----
  	   XXX should ast be different?
  	*/
! 	if (a->args)
! 		if (!symtable_visit_params(st, a->args, 1))
! 			return 0;
  
  	if (a->vararg)
***************
*** 911,914 ****
  	return 1;
  }
- 
  
--- 933,935 ----