2 // (C) Sergey Chaban (serge@wildwestsoftware.com)
\r
5 using System.Reflection;
\r
6 using System.Reflection.Emit;
\r
8 namespace Mono.ILASM {
\r
13 public class InstrNone : InstrBase {
\r
17 /// <param name="tok"></param>
\r
18 public InstrNone (OpCode op) : base (op)
\r
24 /// <param name="ilgen"></param>
\r
25 public override void Emit (ILGenerator ilgen)
\r
27 ilgen.Emit (this.Opcode);
\r
34 public class InstrVar : InstrBase {
\r
36 private object operand;
\r
40 /// <param name="tok"></param>
\r
41 public InstrVar (OpCode op, object operand) : base (op)
\r
43 this.operand = operand;
\r
49 /// <param name="ilgen"></param>
\r
50 public override void Emit (ILGenerator ilgen)
\r
52 if (operand is string) {
\r
53 ilgen.Emit (Opcode, operand as string);
\r
54 } else if (operand is Int32) {
\r
55 ilgen.Emit (Opcode, (Int32)operand);
\r
63 public class InstrI : InstrBase {
\r
65 private int operand;
\r
69 /// <param name="tok"></param>
\r
70 public InstrI (OpCode op, int operand) : base (op) {
\r
71 this.operand = operand;
\r
77 /// <param name="ilgen"></param>
\r
78 public override void Emit (ILGenerator ilgen) {
\r
79 ilgen.Emit (Opcode, operand);
\r
86 public class InstrI8 : InstrBase {
\r
88 private long operand;
\r
92 /// <param name="tok"></param>
\r
93 public InstrI8 (OpCode op, long operand) : base (op) {
\r
94 this.operand = operand;
\r
100 /// <param name="ilgen"></param>
\r
101 public override void Emit (ILGenerator ilgen) {
\r
102 ilgen.Emit (Opcode, operand);
\r
109 public class InstrR : InstrBase {
\r
111 private double operand;
\r
115 /// <param name="tok"></param>
\r
116 public InstrR (OpCode op, double operand) : base (op) {
\r
117 this.operand = operand;
\r
123 /// <param name="ilgen"></param>
\r
124 public override void Emit (ILGenerator ilgen) {
\r
125 if (Opcode.Name.IndexOf (".r4") != -1) {
\r
126 ilgen.Emit (Opcode, (float) operand);
\r
128 ilgen.Emit (Opcode, operand);
\r
137 public class InstrString : InstrBase {
\r
139 private string operand;
\r
143 /// <param name="tok"></param>
\r
144 public InstrString (OpCode op, string operand) : base (op) {
\r
145 this.operand = operand;
\r
151 /// <param name="ilgen"></param>
\r
152 public override void Emit (ILGenerator ilgen) {
\r
153 ilgen.Emit (Opcode, operand);
\r
160 /// void System.Console::WriteLine(string)
\r
162 public class InstrCall : InstrBase {
\r
164 private string return_type;
\r
165 private string assembly_name;
\r
166 private string calling_type;
\r
167 private string method_name;
\r
168 private string args;
\r
172 /// <param name="tok"></param>
\r
173 public InstrCall (OpCode op, string return_type, string assembly_name,
\r
174 string calling_type, string method_name, string args) : base (op) {
\r
176 this.return_type = return_type;
\r
177 this.assembly_name = assembly_name;
\r
178 this.calling_type = calling_type;
\r
179 this.method_name = method_name;
\r
187 /// <param name="ilgen"></param>
\r
188 public override void Emit (ILGenerator ilgen) {
\r
189 // Create MethodInfo
\r
190 Assembly assembly = Assembly.LoadWithPartialName (assembly_name);
\r
191 Type type_to_call = assembly.GetType (calling_type);
\r
192 MethodInfo calling_method = type_to_call.GetMethod (method_name, TypeArray ());
\r
194 ilgen.Emit (Opcode, calling_method);
\r
198 private Type[] TypeArray ()
\r
200 string[] type_name_list = args.Split (',');
\r
201 Type[] type_list = new Type[type_name_list.Length];
\r
202 Types type_manager = new Types ();
\r
204 for (int i=0; i<type_name_list.Length; i++) {
\r
205 type_list[i] = type_manager.Lookup (type_name_list[i]);
\r