2002-01-05 Ravi Pratap <ravi@ximian.com>
[mono.git] / mcs / class / corlib / System.Reflection.Emit / MethodBuilder.cs
1
2 //
3 // System.Reflection.Emit/MethodBuilder.cs
4 //
5 // Author:
6 //   Paolo Molaro (lupus@ximian.com)
7 //
8 // (C) 2001 Ximian, Inc.  http://www.ximian.com
9 //
10
11 using System;
12 using System.Reflection;
13 using System.Reflection.Emit;
14 using System.Globalization;
15 using System.Runtime.CompilerServices;
16 using System.Runtime.InteropServices;
17
18 namespace System.Reflection.Emit {
19         public sealed class MethodBuilder : MethodInfo {
20                 private RuntimeMethodHandle mhandle;
21                 private Type rtype;
22                 private Type[] parameters;
23                 private MethodAttributes attrs;
24                 private MethodImplAttributes iattrs;
25                 private string name;
26                 private int table_idx;
27                 private byte[] code;
28                 private ILGenerator ilgen;
29                 private TypeBuilder type;
30                 private ParameterBuilder[] pinfo;
31                 private MethodInfo override_method;
32                 private string pi_dll;
33                 private string pi_entry;
34                 private CharSet ncharset;
35                 private CallingConvention native_cc;
36                 private CallingConventions call_conv;
37
38                 internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) {
39                         this.name = name;
40                         this.attrs = attributes;
41                         this.call_conv = callingConvention;
42                         this.rtype = returnType;
43                         if (parameterTypes != null) {
44                                 this.parameters = new Type [parameterTypes.Length];
45                                 System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length);
46                         }
47                         type = tb;
48                         table_idx = get_next_table_index (0x06, true);
49                 }
50
51                 internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, 
52                         CallingConventions callingConvention, Type returnType, Type[] parameterTypes, 
53                         String dllName, String entryName, CallingConvention nativeCConv, CharSet nativeCharset) 
54                         : this (tb, name, attributes, callingConvention, returnType, parameterTypes) {
55                         pi_dll = dllName;
56                         pi_entry = entryName;
57                         native_cc = nativeCConv;
58                         ncharset = nativeCharset;
59                 }
60
61                 internal TypeBuilder TypeBuilder {
62                         get {return type;}
63                 }
64                 
65                 public override Type ReturnType {get {return rtype;}}
66                 public override Type ReflectedType {get {return type;}}
67                 public override Type DeclaringType {get {return type;}}
68                 public override string Name {get {return name;}}
69                 public override RuntimeMethodHandle MethodHandle {get {return mhandle;}}
70                 public override MethodAttributes Attributes {get {return attrs;}}
71                 public override ICustomAttributeProvider ReturnTypeCustomAttributes {
72                         get {return null;}
73                 }
74                 public MethodToken GetToken() {
75                         return new MethodToken(0x06000000 | table_idx);
76                 }
77                 
78                 public override MethodInfo GetBaseDefinition() {
79                         return null;
80                 }
81                 public override MethodImplAttributes GetMethodImplementationFlags() {
82                         return iattrs;
83                 }
84                 public override ParameterInfo[] GetParameters() {
85                         return null;
86                 }
87                 
88                 public void CreateMethodBody( byte[] il, int count) {
89                         code = new byte [count];
90                         System.Array.Copy(il, code, count);
91                 }
92                 public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) {
93                         return null;
94                 }
95                 public override bool IsDefined (Type attribute_type, bool inherit) {
96                         return false;
97                 }
98                 public override object[] GetCustomAttributes( bool inherit) {
99                         return null;
100                 }
101                 public override object[] GetCustomAttributes( Type attributeType, bool inherit) {
102                         return null;
103                 }
104                 public ILGenerator GetILGenerator () {
105                         return GetILGenerator (256);
106                 }
107                 public ILGenerator GetILGenerator (int size) {
108                         ilgen = new ILGenerator (this, size);
109                         return ilgen;
110                 }
111                 
112                 [MonoTODO]
113                 public ParameterBuilder DefineParameter (int position, ParameterAttributes attributes, string strParamName)
114                 {
115                         ParameterBuilder pb = new ParameterBuilder (this, position, attributes, strParamName);
116                         /* FIXME: add it to pinfo */
117                         return pb;
118                 }
119
120                 internal void fixup () {
121                         if (ilgen != null)
122                                 ilgen.label_fixup ();
123                 }
124
125                 public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
126                 }
127                 public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) {
128                 }
129                 public void SetImplementationFlags( MethodImplAttributes attributes) {
130                         iattrs = attributes;
131                 }
132                 internal override int get_next_table_index (int table, bool inc) {
133                         return type.get_next_table_index (table, inc);
134                 }
135
136                 internal void set_override (MethodInfo mdecl) {
137                         override_method = mdecl;
138                 }
139         }
140 }
141