diff --git a/src/language.yacc b/src/language.yacc index ef124c23ba096e67eb6d1a052d182a5b605730af..f9f622ec37f49f5ab0575e8669d8fb6ebf00a0f0 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -110,7 +110,7 @@ /* 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,11 +1518,17 @@ block:'{' $<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,13 +2187,19 @@ cond: TOK_IF { $<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,17 +2229,23 @@ foreach: TOK_FOREACH { $<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,15 +2280,21 @@ for: TOK_FOR { $<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,13 +2303,19 @@ while: TOK_WHILE { $<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,11 +2327,17 @@ switch: TOK_SWITCH { $<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,6 +3315,16 @@ int low_add_local_name(struct compiler_frame *frame, 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,6 +3348,11 @@ int low_add_local_name(struct compiler_frame *frame, 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) diff --git a/src/las.h b/src/las.h index 6e77ba1fad1f792a06bbf8e94de4f52cc64fa008..df07df3990004ed3f1280172b30de94323b3ea6d 100644 --- a/src/las.h +++ b/src/las.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: las.h,v 1.42 2000/08/30 21:58:16 grubba Exp $ + * $Id: las.h,v 1.43 2000/09/05 02:18:13 hubbe Exp $ */ #ifndef LAS_H #define LAS_H @@ -38,6 +38,8 @@ struct local_variable struct pike_string *name; struct pike_string *type; node *def; + struct pike_string *file; + int line; }; struct compiler_frame @@ -48,6 +50,7 @@ struct compiler_frame struct pike_string *current_return_type; int current_number_of_locals; int max_number_of_locals; + int last_block_level; /* used to detect variables declared in same block */ int num_args; int lexical_scope; int current_function_number; diff --git a/src/program.c b/src/program.c index d8c28753c9677d8dfe15759f5f64ad0f49695917..10d6bacceccb2a22cd26b01e7b29884d18f2cbbc 100644 --- a/src/program.c +++ b/src/program.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: program.c,v 1.269 2000/08/31 12:23:34 grubba Exp $"); +RCSID("$Id: program.c,v 1.270 2000/09/05 02:18:13 hubbe Exp $"); #include "program.h" #include "object.h" #include "dynamic_buffer.h" @@ -1740,6 +1740,16 @@ void low_inherit(struct program *p, struct inherit inherit; struct pike_string *s; +#if 0 + fprintf(stderr,"LOW_INHERIT(pid=%d, parent=%p, parid=%d, paroff=%d, flags=0x%x, name=%s);\n", + p->id, + parent, + parent_identifier, + parent_offset, + flags, + name? name->str : ""); +#endif + if(!p) { yyerror("Illegal program pointer."); @@ -3928,8 +3938,11 @@ void push_compiler_frame(int lexical_scope) f->lexical_scope=lexical_scope; f->current_type=0; f->current_return_type=0; + f->current_number_of_locals=0; f->max_number_of_locals=0; + f->last_block_level=0; + f->current_function_number=-2; /* no function */ f->recur_label=-1; f->is_inline=0; @@ -3948,6 +3961,8 @@ void pop_local_variables(int level) free_string(Pike_compiler->compiler_frame->variable[e].type); if(Pike_compiler->compiler_frame->variable[e].def) free_node(Pike_compiler->compiler_frame->variable[e].def); + + free_string(Pike_compiler->compiler_frame->variable[e].file); } }