2002-07-19 Martin Baulig <martin@gnome.org>
authorMartin Baulig <martin@novell.com>
Fri, 19 Jul 2002 12:52:28 +0000 (12:52 -0000)
committerMartin Baulig <martin@novell.com>
Fri, 19 Jul 2002 12:52:28 +0000 (12:52 -0000)
* ILGenerator.cs (Emit (OpCode, LocalBuilder)): Throw an exception
when trying to emit a local that was defined in a different ILGenerator.

* LocalBuilder.cs (LocalBuilder): Added `ILGenetator' argument to
the constructor.

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

mcs/class/corlib/System.Reflection.Emit/ChangeLog
mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs
mcs/class/corlib/System.Reflection.Emit/LocalBuilder.cs

index 87de726c336b4098754fc18f615a68882f32569e..86e232065465aa5e637db4d69b19263f4c9916e5 100644 (file)
@@ -1,3 +1,10 @@
+2002-07-19  Martin Baulig  <martin@gnome.org>
+
+       * ILGenerator.cs (Emit (OpCode, LocalBuilder)): Throw an exception
+       when trying to emit a local that was defined in a different ILGenerator.
+
+       * LocalBuilder.cs (LocalBuilder): Added `ILGenetator' argument to
+       the constructor.
 
 Tue Jul 16 19:32:08 CEST 2002 Paolo Molaro <lupus@ximian.com>
 
index b265e309ca823e4a8f38351a31eba81adf9f2a7b..554ad58fd08c87fbd90df5b41c05876298c21d5c 100644 (file)
@@ -311,7 +311,7 @@ namespace System.Reflection.Emit {
                                scopes.Push (sym_writer.OpenScope (code_len));
                }
                public LocalBuilder DeclareLocal (Type localType) {
-                       LocalBuilder res = new LocalBuilder (module, localType);
+                       LocalBuilder res = new LocalBuilder (module, localType, this);
                        if (locals != null) {
                                LocalBuilder[] new_l = new LocalBuilder [locals.Length + 1];
                                System.Array.Copy (locals, new_l, locals.Length);
@@ -445,6 +445,10 @@ namespace System.Reflection.Emit {
                        bool load_addr = false;
                        bool is_store = false;
                        make_room (6);
+
+                       if (lbuilder.ilgen != this)
+                               throw new Exception ("Trying to emit a local from a different ILGenerator.");
+
                        /* inline the code from ll_emit () to optimize il code size */
                        if (opcode.StackBehaviourPop == StackBehaviour.Pop1) {
                                cur_stack --;
index db7f05c30ec24a51570c9b6c2eae9447a38f12ed..9e8fd9dabd1b315d4cafa5535c71ed9df5e7efcc 100755 (executable)
@@ -32,11 +32,13 @@ namespace System.Reflection.Emit {
                //
                private ModuleBuilder module;
                internal uint position;
+               internal ILGenerator ilgen;
 
-               internal LocalBuilder (ModuleBuilder m, Type t)
+               internal LocalBuilder (ModuleBuilder m, Type t, ILGenerator ilgen)
                {
                        this.module = m;
                        this.type = t;
+                       this.ilgen = ilgen;
                }
                public void SetLocalSymInfo (string lname, int startOffset, int endOffset)
                {