2 // Mono.ILASM.ExternMethodRef
5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper, All rights reserved
12 using System.Collections;
14 namespace Mono.ILASM {
16 public class ExternMethodRef : BaseMethodRef {
18 public ExternMethodRef (ExternTypeRef owner, BaseTypeRef ret_type,
19 PEAPI.CallConv call_conv, string name, BaseTypeRef[] param, int gen_param_count)
20 : base (owner, call_conv, ret_type, name, param, gen_param_count)
24 public override void Resolve (CodeGen code_gen)
29 if ((call_conv & PEAPI.CallConv.Vararg) != 0) {
30 ResolveVararg (code_gen);
34 PEAPI.Type[] param_list = new PEAPI.Type[param.Length];
37 ret_type.Resolve (code_gen);
40 foreach (BaseTypeRef typeref in param) {
41 typeref.Resolve (code_gen);
42 param_list[count++] = typeref.PeapiType;
50 owner.Resolve (code_gen);
52 if (owner.UseTypeSpec) {
53 PEAPI.Type owner_ref = owner.PeapiType;
54 peapi_method = code_gen.PEFile.AddMethodToTypeSpec (owner_ref, write_name,
55 ret_type.PeapiType, param_list, gen_param_count);
57 PEAPI.ClassRef owner_ref;
58 owner_ref = (PEAPI.ClassRef) owner.PeapiType;
59 peapi_method = owner_ref.AddMethod (write_name,
60 ret_type.PeapiType, param_list, gen_param_count);
63 peapi_method.AddCallConv (call_conv);
68 protected void ResolveVararg (CodeGen code_gen)
73 ArrayList param_list = new ArrayList ();
74 ArrayList opt_list = new ArrayList ();
78 ret_type.Resolve (code_gen);
80 foreach (BaseTypeRef typeref in param) {
82 typeref.Resolve (code_gen);
83 opt_list.Add (typeref.PeapiType);
84 } else if (typeref is SentinelTypeRef) {
87 typeref.Resolve (code_gen);
88 param_list.Add (typeref.PeapiType);
98 Report.Error ("Vararg methods on arrays are not supported yet.");
100 owner.Resolve (code_gen);
102 if (owner.UseTypeSpec) {
103 PEAPI.Type owner_ref = owner.PeapiType;
104 peapi_method = code_gen.PEFile.AddVarArgMethodToTypeSpec (owner_ref,
105 write_name, ret_type.PeapiType,
106 (PEAPI.Type[]) param_list.ToArray (typeof (PEAPI.Type)),
107 (PEAPI.Type[]) opt_list.ToArray (typeof (PEAPI.Type)));
109 PEAPI.ClassRef owner_ref;
110 owner_ref = (PEAPI.ClassRef) owner.PeapiType;
111 peapi_method = owner_ref.AddVarArgMethod (write_name,
113 (PEAPI.Type[]) param_list.ToArray (typeof (PEAPI.Type)),
114 (PEAPI.Type[]) opt_list.ToArray (typeof (PEAPI.Type)));
118 peapi_method.AddCallConv (call_conv);