[Python-checkins] python/dist/src/Python newcompile.c, 1.1.2.102, 1.1.2.103

nascheme at users.sourceforge.net nascheme at users.sourceforge.net
Sat Feb 19 04:42:39 CET 2005


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30888/Python

Modified Files:
      Tag: ast-branch
	newcompile.c 
Log Message:
Store basic blocks in a linked list rather than an array.  The code is a
little simpler that way.


Index: newcompile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.c,v
retrieving revision 1.1.2.102
retrieving revision 1.1.2.103
diff -u -d -r1.1.2.102 -r1.1.2.103
--- newcompile.c	19 Feb 2005 02:43:45 -0000	1.1.2.102
+++ newcompile.c	19 Feb 2005 03:42:35 -0000	1.1.2.103
@@ -65,6 +65,9 @@
 };
 
 typedef struct basicblock_ {
+	/* next block in the list of blocks for a unit (don't confuse with
+	 * b_next) */
+	struct basicblock_ *b_list;
 	/* number of instructions used */
 	int b_iused;
 	/* length of instruction array (b_instr) */
@@ -118,12 +121,9 @@
 	PyObject *u_private;	/* for private name mangling */
 
 	int u_argcount;    /* number of arguments for block */ 
-	int u_nblocks;     /* number of used blocks in u_blocks
-			      u_nblocks < u_nalloc */
-	int u_nalloc;      /* current alloc count for u_blocks */
-	basicblock *u_curblock; /* pointer to current block (from u_blocks) */
+	basicblock *u_blocks; /* pointer to list of blocks */
+	basicblock *u_curblock; /* pointer to current block */
 	int u_tmpname;     /* temporary variables for list comps */
-	basicblock **u_blocks;
 
 	int u_nfblocks;
 	struct fblockinfo u_fblock[CO_MAXBLOCKS];
@@ -438,18 +438,12 @@
 	u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
                                    PyDict_Size(u->u_cellvars));
 
-	u->u_nblocks = 0;
-	u->u_nalloc = DEFAULT_BLOCKS;
-	u->u_blocks = (basicblock **)PyObject_Malloc(
-		sizeof(basicblock *) * DEFAULT_BLOCKS);
-	if (!u->u_blocks)
-		return 0;
+	u->u_blocks = NULL;
 	u->u_tmpname = 0;
 	u->u_nfblocks = 0;
 	u->u_firstlineno = lineno;
 	u->u_lineno = 0;
 	u->u_lineno_set = false;
-	memset(u->u_blocks, 0, sizeof(basicblock *) * DEFAULT_BLOCKS);
 	u->u_consts = PyDict_New();
 	if (!u->u_consts)
 		return 0;
@@ -484,11 +478,8 @@
 static void
 compiler_unit_check(struct compiler_unit *u)
 {
-	int i;
-	assert(u->u_nblocks <= u->u_nalloc);
-	for (i = 0; i < u->u_nblocks; i++) {
-		basicblock *block = u->u_blocks[i];
-		assert(block);
+	basicblock *block;
+	for (block = u->u_blocks; block != NULL; block = block->b_list) {
 		assert(block != (void *)0xcbcbcbcb);
 		assert(block != (void *)0xfbfbfbfb);
 		assert(block != (void *)0xdbdbdbdb);
@@ -507,17 +498,17 @@
 static void
 compiler_unit_free(struct compiler_unit *u)
 {
-	int i;
+	basicblock *b, *next;
 
 	compiler_unit_check(u);
-	for (i = 0; i < u->u_nblocks; i++) {
-		basicblock *b = u->u_blocks[i];
+	b = u->u_blocks;
+	while (b != NULL) {
 		if (b->b_instr)
 			PyObject_Free((void *)b->b_instr);
+		next = b->b_list;
 		PyObject_Free((void *)b);
+		b = next;
 	}
-	if (u->u_blocks)
-		PyObject_Free((void *)u->u_blocks);
 	Py_XDECREF(u->u_ste);
 	Py_XDECREF(u->u_name);
 	Py_XDECREF(u->u_consts);
@@ -561,28 +552,15 @@
 {
 	basicblock *b;
 	struct compiler_unit *u;
-	int i;
 
 	u = c->u;
-	if (u->u_nblocks == u->u_nalloc) {
-		int newsize = ((u->u_nalloc + u->u_nalloc)
-			       * sizeof(basicblock *));
-		u->u_blocks = (basicblock **)PyObject_Realloc(
-			u->u_blocks, newsize);
-		if (u->u_blocks == NULL)
-			return NULL;
-		memset(u->u_blocks + u->u_nalloc, 0,
-		       sizeof(basicblock *) * u->u_nalloc);
-		u->u_nalloc += u->u_nalloc;
-	}
 	b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
 	if (b == NULL)
 		return NULL;
 	memset((void *)b, 0, sizeof(basicblock));
 	assert (b->b_next == NULL);
-	i = u->u_nblocks++;
-	assert(u->u_blocks[i] == NULL);
-	u->u_blocks[i] = b;
+	b->b_list = u->u_blocks;
+	u->u_blocks = b;
 	return b;
 }
 
@@ -2886,12 +2864,14 @@
 static int
 stackdepth(struct compiler *c)
 {
-	int i;
-	for (i = 0; i < c->u->u_nblocks; i++) {
-		c->u->u_blocks[i]->b_seen = 0;
-		c->u->u_blocks[i]->b_startdepth = INT_MIN;
+	basicblock *b, *entryblock;
+	entryblock = NULL;
+	for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
+		b->b_seen = 0;
+		b->b_startdepth = INT_MIN;
+		entryblock = b;
 	}
-	return stackdepth_walk(c, c->u->u_blocks[0], 0, 0);
+	return stackdepth_walk(c, entryblock, 0, 0);
 }
 
 static int
@@ -3134,23 +3114,22 @@
 static int
 assemble_jump_offsets(struct assembler *a, struct compiler *c)
 {
+	basicblock *b;
 	int bsize, totsize = 0;
-	int i, j;
+	int i;
 
 	/* Compute the size of each block and fixup jump args.
 	   Replace block pointer with position in bytecode. */
-	assert(a->a_nblocks <= c->u->u_nblocks);
 	for (i = a->a_nblocks - 1; i >= 0; i--) {
 		basicblock *b = a->a_postorder[i];
 		bsize = blocksize(b);
 		b->b_offset = totsize;
 		totsize += bsize;
 	}
-	for (i = 0; i < c->u->u_nblocks; i++) {
-		basicblock *b = c->u->u_blocks[i];
+	for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
 		bsize = b->b_offset;
-		for (j = 0; j < b->b_iused; j++) {
-			struct instr *instr = &b->b_instr[j];
+		for (i = 0; i < b->b_iused; i++) {
+			struct instr *instr = &b->b_instr[i];
 			/* Relative jumps are computed relative to
 			   the instruction pointer after fetching
 			   the jump instruction.
@@ -3278,8 +3257,9 @@
 static PyCodeObject *
 assemble(struct compiler *c, int addNone)
 {
+	basicblock *b, *entryblock;
 	struct assembler a;
-	int i, j;
+	int i, j, nblocks;
 	PyCodeObject *co = NULL;
 
 	/* Make sure every block that falls off the end returns None.
@@ -3291,9 +3271,16 @@
             ADDOP_O(c, LOAD_CONST, Py_None, consts);
 	ADDOP(c, RETURN_VALUE);
 
-	if (!assemble_init(&a, c->u->u_nblocks))
+	nblocks = 0;
+	entryblock = NULL;
+	for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
+		nblocks++;
+		entryblock = b; 
+	}
+
+	if (!assemble_init(&a, nblocks))
 		goto error;
-	dfs(c, c->u->u_blocks[0], &a);
+	dfs(c, entryblock, &a);
 
 	/* Can't modify the bytecode after computing jump offsets. */
 	if (!assemble_jump_offsets(&a, c))



More information about the Python-checkins mailing list