Fix bug #494219.
authorAnkit Jain <radical@corewars.org>
Wed, 15 Apr 2009 07:56:30 +0000 (07:56 -0000)
committerAnkit Jain <radical@corewars.org>
Wed, 15 Apr 2009 07:56:30 +0000 (07:56 -0000)
In ilasm/codegen:

* MethodDef.cs (GetNamedLocalSlot): Return -1 if local var not found.

In ilasm/parser:

* ILParser.jay (instr): Handle unidentified local var id.

In ilasm/scanner:

* StringHelper.cs (startIdChars): New. Set of chars that can start an
identifier.
(Start): Use startIdChars instead of idchars.

svn path=/trunk/mcs/; revision=131736

mcs/ilasm/codegen/ChangeLog
mcs/ilasm/codegen/MethodDef.cs
mcs/ilasm/parser/ChangeLog
mcs/ilasm/parser/ILParser.jay
mcs/ilasm/scanner/ChangeLog
mcs/ilasm/scanner/StringHelper.cs

index d909a075d2306bd1f8011196618518953ff99c0a..9f97aea87372a6211076bd9b319bd688c847ce0a 100644 (file)
@@ -1,3 +1,7 @@
+2009-04-15  Ankit Jain  <jankit@novell.com>
+
+       * MethodDef.cs (GetNamedLocalSlot): Return -1 if local var not found.
+
 2009-03-31  Rodrigo Kumpera  <rkumpera@novell.com>
 
        * MethodDef.cs (WriteCode): Emit labels which use offsets as absolute PEAPI
index e048f6b709a00f33499090834bc433c809bf2885..55984b406da76a0ca7507696dfb856b1d1b99bc0 100644 (file)
@@ -241,6 +241,8 @@ namespace Mono.ILASM {
                 public int GetNamedLocalSlot (string name)
                 {
                         Local local = (Local) named_local_table[name];
+                        if (local == null)
+                                return -1;
 
                         return local.Slot;
                 }
index 4af096b13e62bde50dc52f82e6cd35f2a96c4450..7af2a0c62df69ceceb8bbb9b3edae2fe72fcdca8 100644 (file)
@@ -1,3 +1,7 @@
+2009-04-15  Ankit Jain  <jankit@novell.com>
+
+       * ILParser.jay (instr): Handle unidentified local var id.
+
 2009-03-31  Rodrigo Kumpera  <rkumpera@novell.com>
 
        * ILParser.jay: Fix integer labels in handler blocks.
index d7ae1701ad6e7166f3db8c03de3b43e2b0dab789..ee1fc14f52b870f0199b30a5480fed1a2787bf0a 100644 (file)
@@ -2382,6 +2382,8 @@ instr                     : INSTR_NONE
                         | INSTR_LOCAL id\r
                           {\r
                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                if (slot < 0)\r
+                                        Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
                                 codegen.CurrentMethodDef.AddInstr (\r
                                         new IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
                           }\r
@@ -2407,6 +2409,8 @@ instr                     : INSTR_NONE
                        | INSTR_I id\r
                           {\r
                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                if (slot < 0)\r
+                                        Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
                                 codegen.CurrentMethodDef.AddInstr (new\r
                                         IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
                           }\r
index a4754c1e8083addb6672ebea556f6860c342b76b..b169b242b902db222b9aded94d6508ae2f154542 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-15  Ankit Jain  <jankit@novell.com>
+
+       * StringHelper.cs (startIdChars): New. Set of chars that can start an
+       identifier.
+       (Start): Use startIdChars instead of idchars.
+
 2009-04-08  Ankit Jain  <jankit@novell.com>
 
        Fix bug #487155.
index abd5132773776059411b012a898bb2e7b95cff23..32d0fc69765cdf6263ac1e17a00e374baccbdd12 100644 (file)
@@ -10,6 +10,7 @@ namespace Mono.ILASM {
        /// </summary>\r
        internal class StringHelper : StringHelperBase {\r
 \r
+               private static readonly string startIdChars = "#$@_";\r
                private static readonly string idChars = "_$@?`";\r
 \r
                /// <summary>\r
@@ -27,7 +28,7 @@ namespace Mono.ILASM {
                {\r
                        mode = Token.UNKNOWN;\r
 \r
-                       if (Char.IsLetter (ch) || idChars.IndexOf (ch) != -1) {\r
+                       if (Char.IsLetter (ch) || startIdChars.IndexOf (ch) != -1) {\r
                                mode = Token.ID;\r
                        } else if (ch == '\'') {\r
                                mode = Token.SQSTRING;\r