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
);