narray first check in
[cacao.git] / jit / parse.c
index ea00cfae13b90e365ca43754783acb36e9c3d37c..958068eb3b8b424da749681b4ce8741b08fec16a 100644 (file)
@@ -8,13 +8,12 @@
        
        Author: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: 1998/05/07
+       Last Change: $Id: parse.c 132 1999-09-27 15:54:42Z chris $
 
 *******************************************************************************/
 
 #include "math.h"
 
-
 /* macros for byte code fetching ***********************************************
 
        fetch a byte code of given size from position p in code array jcode
@@ -289,7 +288,7 @@ static void parse()
        /* 1 additional for TRACEBUILTIN and 4 for MONITORENTER/EXIT */
        /* additional MONITOREXITS are reached by branches which are 3 bytes */
        
-       iptr = instr = DMNEW(instruction, jcodelength + 5);
+       iptr = instr = DMNEW(instruction, jcodelength + 5); 
        
        /* initialize block_index table (unrolled four times) */
 
@@ -306,19 +305,34 @@ static void parse()
 
        /* compute branch targets of exception table */
 
+       extable = DMNEW(xtable, exceptiontablelength + 1);
+
        for (i = 0; i < exceptiontablelength; i++) {
-               p = extable[i].startpc;
+
+               p = extable[i].startpc = raw_extable[i].startpc;
                bound_check(p);
                block_insert(p);
-               p = extable[i].endpc;
+
+               p = extable[i].endpc = raw_extable[i].endpc;
                bound_check1(p);
                if (p < jcodelength)
                        block_insert(p);
-               p = extable[i].handlerpc;
+
+               p = extable[i].handlerpc = raw_extable[i].handlerpc;
                bound_check(p);
                block_insert(p);
+
+               extable[i].catchtype  = raw_extable[i].catchtype;
+
+               extable[i].next = NULL;
+               extable[i].down = &extable[i+1];
                }
 
+       if (exceptiontablelength > 0)
+               extable[exceptiontablelength-1].down = NULL;
+       else
+               extable = NULL;
+
        s_count = 1 + exceptiontablelength; /* initialize stack element counter   */
 
 #ifdef USE_THREADS
@@ -1067,6 +1081,7 @@ static void parse()
        bptr = block = DMNEW(basicblock, b_count + 1);    /* one more for end ipc */
 
        b_count = 0;
+       c_debug_nr = 0;
        
        /* additional block if target 0 is not first intermediate instruction     */
 
@@ -1077,37 +1092,69 @@ static void parse()
                bptr->type = BBTYPE_STD;
                bptr->branchrefs = NULL;
                bptr->pre_count = 0;
+               bptr->debug_nr = c_debug_nr++;
                bptr++;
                b_count++;
+               (bptr - 1)->next = bptr;
+       
                }
 
        /* allocate blocks */
 
+
        for (p = 0; p < jcodelength; p++)
+               
                if (block_index[p] & 1) {
                        bptr->iinstr = instr + (block_index[p] >> 1);
+                       bptr->debug_nr = c_debug_nr++;
                        if (b_count != 0)
                                (bptr - 1)->icount = bptr->iinstr - (bptr - 1)->iinstr;
                        bptr->mpc = -1;
                        bptr->flags = -1;
+                       bptr->lflags = 0;
                        bptr->type = BBTYPE_STD;
                        bptr->branchrefs = NULL;
                        block_index[p] = b_count;
                        bptr->pre_count = 0;
                        bptr++;
                        b_count++;
+
+                       (bptr - 1)->next = bptr;
                        }
 
        /* allocate additional block at end */
 
+       
+       bptr->instack = bptr->outstack = NULL;
+       bptr->indepth = bptr->outdepth = 0;
        bptr->iinstr = NULL;
        (bptr - 1)->icount = (instr + instr_count) - (bptr - 1)->iinstr;
        bptr->icount = 0;
        bptr->mpc = -1;
        bptr->flags = -1;
+       bptr->lflags = 0;
        bptr->type = BBTYPE_STD;
        bptr->branchrefs = NULL;
        bptr->pre_count = 0;
+       bptr->debug_nr = c_debug_nr++;
+                       
+       (bptr - 1)->next = bptr;
+       bptr->next = NULL;
+
+       last_block = bptr;
+
+
+
+       for (i = 0; i < exceptiontablelength; ++i) {
+               p = extable[i].startpc;
+               extable[i].start = block + block_index[p];
+
+               p = extable[i].endpc;
+               extable[i].end = block + block_index[p]; 
+
+               p = extable[i].handlerpc;
+               extable[i].handler = block + block_index[p];
+           }
        }
 }