Branch: Tag:

2000-09-05

2000-09-05 02:18:13 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

duplicate local variables now generates an error

Rev: src/language.yacc:1.210
Rev: src/las.h:1.43
Rev: src/program.c:1.270

110:   /* This is the grammar definition of Pike. */      #include "global.h" - RCSID("$Id: language.yacc,v 1.209 2000/08/30 21:58:15 grubba Exp $"); + RCSID("$Id: language.yacc,v 1.210 2000/09/05 02:18:12 hubbe Exp $");   #ifdef HAVE_MEMORY_H   #include <memory.h>   #endif
1518:    $<number>1=Pike_compiler->num_used_modules;    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    statements end_block    {    unuse_modules(Pike_compiler->num_used_modules - $<number>1);    pop_local_variables($<number>2); -  $$=$3; +  Pike_compiler->compiler_frame->last_block_level=$<number>3; +  $$=$4;    }    ;   
2181:    {    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    '(' safe_comma_expr end_cond statement optional_else_part    { -  $$=mknode('?',$4,mknode(':',$6,$7)); +  $$=mknode('?',$5,mknode(':',$7,$8));    $$->line_number=$1;    $$=mkcastnode(void_type_string,$$);    $$->line_number=$1;    pop_local_variables($<number>2); -  +  Pike_compiler->compiler_frame->last_block_level=$<number>3;    }    ;   
2217:    {    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    '(' expr0 ',' safe_lvalue end_cond statement    { -  if ($6) { -  $$=mknode(F_FOREACH, mknode(F_VAL_LVAL,$4,$6),$8); +  if ($7) { +  $$=mknode(F_FOREACH, mknode(F_VAL_LVAL,$5,$7),$9);    $$->line_number=$1;    } else {    /* Error in lvalue */ -  free_node($4); -  $$=$8; +  free_node($5); +  $$=$9;    }    pop_local_variables($<number>2); -  +  Pike_compiler->compiler_frame->last_block_level=$<number>3;    }    ;   
2262:    {    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    '(' unused expected_semicolon for_expr expected_semicolon unused end_cond    statement    {    int i=lex.current_line;    lex.current_line=$1; -  $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string,$4), -  mknode(F_FOR,$6,mknode(':',$10,$8))); +  $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string,$5), +  mknode(F_FOR,$7,mknode(':',$11,$9)));    lex.current_line=i;    pop_local_variables($<number>2); -  +  Pike_compiler->compiler_frame->last_block_level=$<number>3;    }    ;   
2279:    {    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    '(' safe_comma_expr end_cond statement    {    int i=lex.current_line;    lex.current_line=$1; -  $$=mknode(F_FOR,$4,mknode(':',$6,NULL)); +  $$=mknode(F_FOR,$5,mknode(':',$7,NULL));    lex.current_line=i;    pop_local_variables($<number>2); -  +  Pike_compiler->compiler_frame->last_block_level=$<number>3;    }    ;   
2297:    {    $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;    } +  { +  /* Trick to store more than one number on compiler stack - Hubbe */ +  $<number>$=Pike_compiler->compiler_frame->last_block_level; +  Pike_compiler->compiler_frame->last_block_level=$<number>2; +  }    '(' safe_comma_expr end_cond statement    { -  $$=mknode(F_SWITCH,$4,$6); +  $$=mknode(F_SWITCH,$5,$7);    $$->line_number=$1;    pop_local_variables($<number>2); -  +  Pike_compiler->compiler_frame->last_block_level=$<number>3;    }    ;   
3279:    struct pike_string *type,    node *def)   { +  int tmp=islocal(str); +  if(tmp >= frame->last_block_level) +  { +  if(str->size_shift) +  my_yyerror("Duplicate local variable, previous declaration on line %d\n", +  frame->variable[tmp].line); +  else +  my_yyerror("Duplicate local variable '%s', previous declaration on line %d\n",STR0(str),frame->variable[tmp].line); +  } +     debug_malloc_touch(def);    debug_malloc_touch(type);    debug_malloc_touch(str);
3302:    frame->variable[frame->current_number_of_locals].type = type;    frame->variable[frame->current_number_of_locals].name = str;    frame->variable[frame->current_number_of_locals].def = def; +  +  frame->variable[frame->current_number_of_locals].line=lex.current_line; +  frame->variable[frame->current_number_of_locals].file=lex.current_file; +  add_ref(lex.current_file); +     frame->current_number_of_locals++;    if(frame->current_number_of_locals >    frame->max_number_of_locals)