2 // Mono.ILASM.MethodPointerTypeRef
5 // Jackson Harper (jackson@ximian.com)
7 // Copyright 2004 Novell, Inc (http://www.novell.com)
12 using System.Collections;
14 namespace Mono.ILASM {
16 public class MethodPointerTypeRef : BaseTypeRef {
18 private PEAPI.CallConv callconv;
19 private BaseTypeRef ret;
20 private ArrayList param_list;
22 public MethodPointerTypeRef (PEAPI.CallConv callconv, BaseTypeRef ret, ArrayList param_list)
25 this.callconv = callconv;
27 this.param_list = param_list;
29 // We just need these to not break the interface
30 //full_name = String.Empty;
31 sig_mod = String.Empty;
34 public override void Resolve (CodeGen code_gen)
39 PEAPI.Type [] arg_array;
40 PEAPI.Type [] opt_array;
41 bool is_vararg = false;
43 if (param_list != null) {
44 ArrayList opt_list = new ArrayList ();
45 ArrayList arg_list = new ArrayList ();
48 int max = param_list.Count;
50 for (int i = 0; i < max; i++) {
51 ParamDef param = (ParamDef) param_list [i];
53 if (param.IsSentinel ()) {
56 param.Type.Resolve (code_gen);
58 param.Type.Resolve (code_gen);
59 opt_list.Add (param.Type.PeapiType);
61 param.Type.Resolve (code_gen);
62 arg_list.Add (param.Type.PeapiType);
66 arg_array = (PEAPI.Type []) arg_list.ToArray (typeof (PEAPI.Type));
67 opt_array = (PEAPI.Type []) opt_list.ToArray (typeof (PEAPI.Type));
69 arg_array = new PEAPI.Type [0];
70 opt_array = new PEAPI.Type [0];
73 ret.Resolve (code_gen);
75 type = new PEAPI.MethPtrType (callconv, ret.PeapiType, arg_array, is_vararg, opt_array);
76 type = Modify (code_gen, type);
81 protected override BaseMethodRef CreateMethodRef (BaseTypeRef ret_type, PEAPI.CallConv call_conv,
82 string name, BaseTypeRef[] param, int gen_param_count)
84 return new TypeSpecMethodRef (this, call_conv, ret_type, name, param, gen_param_count);
87 protected override IFieldRef CreateFieldRef (BaseTypeRef ret_type, string name)
89 return new TypeSpecFieldRef (this, ret_type, name);