2010-03-17 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / ilasm / codegen / GenericMethodSig.cs
index c862bfc8acab121c1d0d2e4ef1fcf6fa5f50e152..e8c74bec130a96f1542b8da63ca148d29fa16576 100644 (file)
@@ -8,18 +8,21 @@
 //
 
 using System;
+using System.Collections;
 
 namespace Mono.ILASM {
 
         public class GenericMethodSig {
 
-                private ITypeRef[] type_list;
+                private GenericArguments gen_args;
                 private bool is_resolved;
                 private PEAPI.GenericMethodSig sig;
 
-                public GenericMethodSig (ITypeRef[] type_list)
+                private static Hashtable sig_table;
+
+                public GenericMethodSig (GenericArguments gen_args)
                 {
-                        this.type_list = type_list;
+                        this.gen_args = gen_args;
                         is_resolved = false;
                 }
 
@@ -32,18 +35,28 @@ namespace Mono.ILASM {
                         if (is_resolved)
                                 return sig;
 
-                        PEAPI.Type[] p_type_list = new PEAPI.Type[type_list.Length];
-                        for (int i=0; i<p_type_list.Length; i++) {
-                                type_list[i].Resolve (code_gen);
-                                p_type_list[i] = type_list[i].PeapiType;
-                        }
-
-                        sig = new PEAPI.GenericMethodSig (p_type_list);
+                        sig = new PEAPI.GenericMethodSig (gen_args.Resolve (code_gen));
                         is_resolved = true;
 
                         return sig;
                 }
 
+                public static GenericMethodSig GetInstance (GenericArguments gen_args)
+                {
+                        GenericMethodSig sig = null;
+
+                        if (sig_table == null)
+                                sig_table = new Hashtable ();
+                        else
+                                sig = (GenericMethodSig) sig_table [gen_args.ToString ()];
+
+                        if (sig == null) {
+                                sig = new GenericMethodSig (gen_args);
+                                sig_table [gen_args.ToString ()] = sig;
+                        }
+                        
+                        return sig;
+                }
         }
 
 }