Merge pull request #4246 from Unity-Technologies/mcs-generic-constraint-enumerator
[mono.git] / mcs / ilasm / codegen / BaseMethodRef.cs
1 //
2 // Mono.ILASM.BaseMethodRef
3 //
4 // Author(s):
5 //  Ankit Jain  <JAnkit@novell.com>
6 //
7 // Copyright 2006 Novell, Inc (http://www.novell.com)
8 //
9
10
11 using System;
12 using System.Collections;
13
14 namespace Mono.ILASM {
15        public abstract class BaseMethodRef {
16
17                 protected BaseTypeRef owner;
18                 protected PEAPI.CallConv call_conv;
19                 protected BaseTypeRef ret_type;
20                 protected string name;
21                 protected BaseTypeRef[] param;
22
23                 protected PEAPI.Method peapi_method;
24                 protected bool is_resolved;
25                 protected int gen_param_count;
26
27                 protected Hashtable gen_method_table;
28
29                 public BaseMethodRef (BaseTypeRef owner, PEAPI.CallConv call_conv,
30                         BaseTypeRef ret_type, string name, BaseTypeRef[] param, int gen_param_count)
31                 {
32                         this.owner = owner;
33                         this.call_conv = call_conv;
34                         this.ret_type = ret_type;
35                         this.name = name;
36                         this.param = param;
37                         this.gen_param_count = gen_param_count;
38                         if (gen_param_count > 0)
39                                 CallConv |= PEAPI.CallConv.Generic;
40                         is_resolved = false;
41                 }
42
43                 public virtual PEAPI.Method PeapiMethod {
44                         get { return peapi_method; }
45                 }
46
47                 public virtual PEAPI.CallConv CallConv {
48                         get { return call_conv; }
49                         set { call_conv = value; }
50                 }
51
52                 public virtual BaseTypeRef Owner {
53                         get { return owner; }
54                 }
55
56                 public abstract void Resolve (CodeGen code_gen);
57
58                 public GenericMethodRef GetGenericMethodRef (GenericArguments gen_args)
59                 {
60                         GenericMethodRef methref = null;
61
62                         if (gen_method_table == null)
63                                 gen_method_table = new Hashtable ();
64                         else
65                                 methref = (GenericMethodRef) gen_method_table [gen_args.ToString ()];
66
67                         if (methref == null) {
68                                 methref = new GenericMethodRef (this, GenericMethodSig.GetInstance (gen_args));
69                                 gen_method_table [gen_args.ToString ()] = methref;
70                         }
71
72                         return methref;
73                 }
74
75        }
76 }
77
78
79