From 120d84d972923dd0f8cbf9a11fc3f8cca88bb0bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Wed, 8 Nov 2000 14:21:32 -0800
Subject: [PATCH] improved local variable checks

Rev: src/language.yacc:1.219
Rev: src/program.c:1.281
---
 src/language.yacc | 32 ++++++++++++++++++++++----------
 src/program.c     |  4 ++--
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/language.yacc b/src/language.yacc
index d75016dc53..6dc676e417 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.218 2000/11/04 17:43:02 grubba Exp $");
+RCSID("$Id: language.yacc,v 1.219 2000/11/08 22:21:32 hubbe Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -1517,7 +1517,11 @@ block:'{'
   {
     /* 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;
+
+    if($<number>$ == -1) /* if 'first block' */
+      Pike_compiler->compiler_frame->last_block_level=0; /* all variables */
+    else
+      Pike_compiler->compiler_frame->last_block_level=$<number>2;
   }
   statements end_block
   {
@@ -3369,6 +3373,17 @@ void yyerror(char *str)
   }
 }
 
+static int low_islocal(struct compiler_frame *f,
+		       struct pike_string *str)
+{
+  int e;
+  for(e=f->current_number_of_locals-1;e>=0;e--)
+    if(f->variable[e].name==str)
+      return e;
+  return -1;
+}
+
+
 
 int low_add_local_name(struct compiler_frame *frame,
 			struct pike_string *str,
@@ -3377,8 +3392,8 @@ int low_add_local_name(struct compiler_frame *frame,
 {
 
   if (str->len && !TEST_COMPAT(7,0)) {
-    int tmp=islocal(str);
-    if(tmp >= frame->last_block_level)
+    int tmp=low_islocal(frame,str);
+    if(tmp>=0 && tmp >= frame->last_block_level)
     {
       if(str->size_shift)
 	my_yyerror("Duplicate local variable, "
@@ -3453,14 +3468,11 @@ int add_local_name(struct pike_string *str,
 			    def);
 }
 
-/* argument must be a shared string */
+
+
 int islocal(struct pike_string *str)
 {
-  int e;
-  for(e=Pike_compiler->compiler_frame->current_number_of_locals-1;e>=0;e--)
-    if(Pike_compiler->compiler_frame->variable[e].name==str)
-      return e;
-  return -1;
+  return low_islocal(Pike_compiler->compiler_frame, str);
 }
 
 /* argument must be a shared string */
diff --git a/src/program.c b/src/program.c
index 38fc70f984..a336149af0 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: program.c,v 1.280 2000/11/02 14:43:18 grubba Exp $");
+RCSID("$Id: program.c,v 1.281 2000/11/08 22:21:32 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -3987,7 +3987,7 @@ void push_compiler_frame(int lexical_scope)
 
   f->current_number_of_locals=0;
   f->max_number_of_locals=0;
-  f->last_block_level=0;
+  f->last_block_level=-1;
 
   f->current_function_number=-2; /* no function */
   f->recur_label=-1;
-- 
GitLab