2003-11-24 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Mon, 24 Nov 2003 13:45:09 +0000 (13:45 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 24 Nov 2003 13:45:09 +0000 (13:45 -0000)
* ILGenerator.cs MethodBuilder.cs ConstructorBuilder.cs: Retrieve
tokens from a token generator object instead of from the ModuleBuilder,
to support the implementation of DynamicMethod. Also get rid of the
unused 'mbuilder' field.

* ModuleBuilder.cs: Create a token generator object which can be
passed to ILGenerator.

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

mcs/class/corlib/System.Reflection.Emit/ChangeLog
mcs/class/corlib/System.Reflection.Emit/ConstructorBuilder.cs
mcs/class/corlib/System.Reflection.Emit/ILGenerator.cs
mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs
mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs

index e224df920177e662ec2d6a1d006d29ece4909d7a..8acb2eb959a6a05f565cbea699e2833d0588b5e9 100644 (file)
@@ -1,5 +1,13 @@
 2003-11-24  Zoltan Varga  <vargaz@freemail.hu>
 
+       * ILGenerator.cs MethodBuilder.cs ConstructorBuilder.cs: Retrieve 
+       tokens from a token generator object instead of from the ModuleBuilder,
+       to support the implementation of DynamicMethod. Also get rid of the 
+       unused 'mbuilder' field.
+
+       * ModuleBuilder.cs: Create a token generator object which can be
+       passed to ILGenerator.
+
        * LocalBuilder.cs ILGenerator.cs: Get rid of 'module' field, obtain 
        needed objects from the ilgen object instead.
 
index 3e57d23590381561e380d3a8c0f413fb68d46456..418e03a843e9073cf757712496fc93eb50839e02 100644 (file)
@@ -127,7 +127,7 @@ namespace System.Reflection.Emit {
                        return GetILGenerator (64);
                }
                internal ILGenerator GetILGenerator (int size) {
-                       ilgen = new ILGenerator (this, size);
+                       ilgen = new ILGenerator (type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator (), size);
                        return ilgen;
                }
 
index dc4645a13178d6c156537c46f24c4d40a3361d17..6ff8e5bd3f485a65c4156e6729d86e0dd348c80b 100644 (file)
@@ -117,6 +117,14 @@ namespace System.Reflection.Emit {
                public int code_pos;
        }
 
+       internal interface TokenGenerator {
+               int GetToken (string str);
+
+               int GetToken (MemberInfo member);
+
+               int GetToken (SignatureHelper helper);
+       }               
+
        public class ILGenerator: Object {
                private struct LabelFixup {
                        public int size;
@@ -125,8 +133,8 @@ namespace System.Reflection.Emit {
                        public int label_idx;
                };
                static Type void_type = typeof (void);
+               #region Sync with reflection.h
                private byte[] code;
-               private MethodBase mbuilder; /* a MethodBuilder or ConstructorBuilder */
                private int code_len;
                private int max_stack;
                private int cur_stack;
@@ -139,19 +147,20 @@ namespace System.Reflection.Emit {
                private int num_labels;
                private LabelFixup[] fixups;
                private int num_fixups;
-               internal ModuleBuilder module;
+               #endregion
+               internal Module module;
                internal IMonoSymbolWriter sym_writer;
                private Stack scopes;
                private int cur_block;
                private Stack open_blocks;
+               private TokenGenerator token_gen;
 
-               internal ILGenerator (MethodBase mb, int size)
+               internal ILGenerator (Module m, TokenGenerator token_gen, int size)
                {
                        if (size < 0)
                                size = 128;
                        code_len = 0;
                        code = new byte [size];
-                       mbuilder = mb;
                        cur_stack = max_stack = 0;
                        num_fixups = num_labels = 0;
                        label_to_addr = new int [8];
@@ -159,13 +168,11 @@ namespace System.Reflection.Emit {
                        fixups = new LabelFixup [8];
                        token_fixups = new ILTokenInfo [8];
                        num_token_fixups = 0;
-                       if (mb is MethodBuilder) {
-                               module = (ModuleBuilder)((MethodBuilder)mb).TypeBuilder.Module;
-                       } else if (mb is ConstructorBuilder) {
-                               module = (ModuleBuilder)((ConstructorBuilder)mb).TypeBuilder.Module;
-                       }
-                       sym_writer = module.symbol_writer;
+                       module = m;
+                       if (module is ModuleBuilder)
+                               sym_writer = ((ModuleBuilder)module).symbol_writer;
                        open_blocks = new Stack ();
+                       this.token_gen = token_gen;
                }
 
                private void add_token_fixup (MemberInfo mi)
@@ -393,7 +400,7 @@ namespace System.Reflection.Emit {
                
                public virtual void Emit (OpCode opcode, ConstructorInfo constructor)
                {
-                       int token = module.GetToken (constructor);
+                       int token = token_gen.GetToken (constructor);
                        make_room (6);
                        ll_emit (opcode);
                        if (constructor.DeclaringType.Module == module)
@@ -428,7 +435,7 @@ namespace System.Reflection.Emit {
                
                public virtual void Emit (OpCode opcode, FieldInfo field)
                {
-                       int token = module.GetToken (field);
+                       int token = token_gen.GetToken (field);
                        make_room (6);
                        ll_emit (opcode);
                        if (field.DeclaringType.Module == module)
@@ -578,7 +585,7 @@ namespace System.Reflection.Emit {
                        if (method == null)
                                throw new ArgumentNullException ("method");
 
-                       int token = module.GetToken (method);
+                       int token = token_gen.GetToken (method);
                        make_room (6);
                        ll_emit (opcode);
                        if (method.DeclaringType.Module == module)
@@ -601,7 +608,7 @@ namespace System.Reflection.Emit {
 
                public virtual void Emit (OpCode opcode, SignatureHelper shelper)
                {
-                       int token = module.GetToken (shelper);
+                       int token = token_gen.GetToken (shelper);
                        make_room (6);
                        ll_emit (opcode);
                        emit_int (token);
@@ -625,7 +632,7 @@ namespace System.Reflection.Emit {
 
                public virtual void Emit (OpCode opcode, string val)
                {
-                       int token = module.GetToken (val);
+                       int token = token_gen.GetToken (val);
                        make_room (6);
                        ll_emit (opcode);
                        emit_int (token);
@@ -635,7 +642,7 @@ namespace System.Reflection.Emit {
                {
                        make_room (6);
                        ll_emit (opcode);
-                       emit_int (module.GetToken (type));
+                       emit_int (token_gen.GetToken (type));
                }
 
                [MonoTODO ("Do something about varargs method")]
index b499428874731fe2899de91de350352815cd01cc..f5bd829957eecc729cc974563cea5fc1d6a19c43 100755 (executable)
@@ -167,7 +167,7 @@ namespace System.Reflection.Emit {
                                throw new InvalidOperationException ("Method body should not exist.");
                        if (ilgen != null)
                                return ilgen;
-                       ilgen = new ILGenerator (this, size);
+                       ilgen = new ILGenerator (type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator (), size);
                        return ilgen;
                }
                
index 23300a07f2778410052fcd2ac80dedb4af6c71b8..05beefed5d74d5f62831d7882366ec534ba31717 100644 (file)
@@ -35,6 +35,7 @@ namespace System.Reflection.Emit {
                Hashtable us_string_cache = new Hashtable ();
                private int[] table_indexes;
                bool transient;
+               ModuleBuilderTokenGenerator token_gen;
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern void basic_init (ModuleBuilder ab);
@@ -397,6 +398,12 @@ namespace System.Reflection.Emit {
                        return getToken (this, helper);
                }
 
+               internal TokenGenerator GetTokenGenerator () {
+                       if (token_gen == null)
+                               token_gen = new ModuleBuilderTokenGenerator (this);
+                       return token_gen;
+               }
+
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern void build_metadata (ModuleBuilder mb);
 
@@ -455,4 +462,25 @@ namespace System.Reflection.Emit {
                        }
                }
        }
+
+       internal class ModuleBuilderTokenGenerator : TokenGenerator {
+
+               private ModuleBuilder mb;
+
+               public ModuleBuilderTokenGenerator (ModuleBuilder mb) {
+                       this.mb = mb;
+               }
+
+               public int GetToken (string str) {
+                       return mb.GetToken (str);
+               }
+
+               public int GetToken (MemberInfo member) {
+                       return mb.GetToken (member);
+               }
+
+               public int GetToken (SignatureHelper helper) {
+                       return mb.GetToken (helper);
+               }
+       }
 }