pike.git / src / docode.c

version» Context lines:

pike.git/src/docode.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: docode.c,v 1.26 1998/01/29 00:30:33 hubbe Exp $"); + RCSID("$Id: docode.c,v 1.27 1998/01/29 01:55:34 hubbe Exp $");   #include "las.h"   #include "program.h"   #include "language.h"   #include "pike_types.h"   #include "stralloc.h"   #include "interpret.h"   #include "constants.h"   #include "array.h"   #include "pike_macros.h"   #include "error.h"
pike.git/src/docode.c:757:    current_break=alloc_label();       cases=count_cases(CDR(n));       tmp1=emit(F_SWITCH,0);    emit(F_ALIGN,sizeof(INT32));       current_switch_values_on_stack=0;    current_switch_case=0;    current_switch_default=-1; -  current_switch_jumptable=(INT32 *)xalloc(sizeof(INT32)*(cases*2+1)); -  jumptable=(INT32 *)xalloc(sizeof(INT32)*(cases*2+1)); +  current_switch_jumptable=(INT32 *)xalloc(sizeof(INT32)*(cases*2+2)); +  jumptable=(INT32 *)xalloc(sizeof(INT32)*(cases*2+2));    -  for(e=0; e<cases*2+1; e++) +  for(e=1; e<cases*2+2; e++)    {    jumptable[e]=emit(F_POINTER, 0);    current_switch_jumptable[e]=-1;    }       current_switch_jumptable[current_switch_case++]=-1;       DO_CODE_BLOCK(CDR(n));      #ifdef DEBUG
pike.git/src/docode.c:783:   #endif       f_aggregate(cases);    order=get_switch_order(sp[-1].u.array);       /* Check for cases inside a range */    for(e=0; e<cases-1; e++)    {    if(order[e] < cases-1)    { -  int o1=order[e]*2+1; +  int o1=order[e]*2+2;    if(current_switch_jumptable[o1]==current_switch_jumptable[o1+1] &&    current_switch_jumptable[o1]==current_switch_jumptable[o1+2])    {    if(order[e]+1 != order[e+1])    yyerror("Case inside range.");    e++;    }    }    }       if(current_switch_default < 0)    current_switch_default = ins_label(-1);    -  for(e=0;e<cases*2+1;e++) +  for(e=1;e<cases*2+2;e++)    if(current_switch_jumptable[e]==-1)    current_switch_jumptable[e]=current_switch_default;       order_array(sp[-1].u.array,order);    -  reorder((void *)(current_switch_jumptable+1),cases,sizeof(INT32)*2,order); +  reorder((void *)(current_switch_jumptable+2),cases,sizeof(INT32)*2,order);    free((char *)order);    -  for(e=0; e<cases*2+1; e++) +  for(e=1; e<cases*2+2; e++)    update_arg(jumptable[e], current_switch_jumptable[e]);       update_arg(tmp1, store_constant(sp-1,1));       pop_stack();    free((char *)jumptable);    free((char *)current_switch_jumptable);       current_switch_jumptable = prev_switch_jumptable;    current_switch_default = prev_switch_default;