public int code_pos;
}
+ internal interface TokenGenerator {
+ int GetToken (string str);
+
+ int GetToken (MemberInfo member);
+
+ int GetToken (SignatureHelper helper);
+ }
+
public class ILGenerator: Object {
private struct LabelFixup {
public int size;
public int label_idx;
};
static Type void_type = typeof (void);
+ #region Sync with reflection.h
private byte[] code;
- private MethodBase mbuilder; /* a MethodBuilder or ConstructorBuilder */
private int code_len;
private int max_stack;
private int cur_stack;
private int num_labels;
private LabelFixup[] fixups;
private int num_fixups;
- internal ModuleBuilder module;
+ #endregion
+ internal Module module;
internal IMonoSymbolWriter sym_writer;
private Stack scopes;
private int cur_block;
private Stack open_blocks;
+ private TokenGenerator token_gen;
- internal ILGenerator (MethodBase mb, int size)
+ internal ILGenerator (Module m, TokenGenerator token_gen, int size)
{
if (size < 0)
size = 128;
code_len = 0;
code = new byte [size];
- mbuilder = mb;
cur_stack = max_stack = 0;
num_fixups = num_labels = 0;
label_to_addr = new int [8];
fixups = new LabelFixup [8];
token_fixups = new ILTokenInfo [8];
num_token_fixups = 0;
- if (mb is MethodBuilder) {
- module = (ModuleBuilder)((MethodBuilder)mb).TypeBuilder.Module;
- } else if (mb is ConstructorBuilder) {
- module = (ModuleBuilder)((ConstructorBuilder)mb).TypeBuilder.Module;
- }
- sym_writer = module.symbol_writer;
+ module = m;
+ if (module is ModuleBuilder)
+ sym_writer = ((ModuleBuilder)module).symbol_writer;
open_blocks = new Stack ();
+ this.token_gen = token_gen;
}
private void add_token_fixup (MemberInfo mi)
public virtual void Emit (OpCode opcode, ConstructorInfo constructor)
{
- int token = module.GetToken (constructor);
+ int token = token_gen.GetToken (constructor);
make_room (6);
ll_emit (opcode);
if (constructor.DeclaringType.Module == module)
public virtual void Emit (OpCode opcode, FieldInfo field)
{
- int token = module.GetToken (field);
+ int token = token_gen.GetToken (field);
make_room (6);
ll_emit (opcode);
if (field.DeclaringType.Module == module)
if (method == null)
throw new ArgumentNullException ("method");
- int token = module.GetToken (method);
+ int token = token_gen.GetToken (method);
make_room (6);
ll_emit (opcode);
if (method.DeclaringType.Module == module)
public virtual void Emit (OpCode opcode, SignatureHelper shelper)
{
- int token = module.GetToken (shelper);
+ int token = token_gen.GetToken (shelper);
make_room (6);
ll_emit (opcode);
emit_int (token);
public virtual void Emit (OpCode opcode, string val)
{
- int token = module.GetToken (val);
+ int token = token_gen.GetToken (val);
make_room (6);
ll_emit (opcode);
emit_int (token);
{
make_room (6);
ll_emit (opcode);
- emit_int (module.GetToken (type));
+ emit_int (token_gen.GetToken (type));
}
[MonoTODO ("Do something about varargs method")]
Hashtable us_string_cache = new Hashtable ();
private int[] table_indexes;
bool transient;
+ ModuleBuilderTokenGenerator token_gen;
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void basic_init (ModuleBuilder ab);
return getToken (this, helper);
}
+ internal TokenGenerator GetTokenGenerator () {
+ if (token_gen == null)
+ token_gen = new ModuleBuilderTokenGenerator (this);
+ return token_gen;
+ }
+
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void build_metadata (ModuleBuilder mb);
}
}
}
+
+ internal class ModuleBuilderTokenGenerator : TokenGenerator {
+
+ private ModuleBuilder mb;
+
+ public ModuleBuilderTokenGenerator (ModuleBuilder mb) {
+ this.mb = mb;
+ }
+
+ public int GetToken (string str) {
+ return mb.GetToken (str);
+ }
+
+ public int GetToken (MemberInfo member) {
+ return mb.GetToken (member);
+ }
+
+ public int GetToken (SignatureHelper helper) {
+ return mb.GetToken (helper);
+ }
+ }
}