1 /** 2 * \file 3 * Functions for creating IL methods at runtime. 4 * 5 * Author: 6 * Paolo Molaro (lupus@ximian.com) 7 * 8 * (C) 2002 Ximian, Inc. http://www.ximian.com 9 * 10 */ 11 12 #ifndef __MONO_METHOD_BUILDER_H__ 13 #define __MONO_METHOD_BUILDER_H__ 14 15 #include "config.h" 16 #include <mono/metadata/class.h> 17 #include <mono/metadata/object-internals.h> 18 #include <mono/metadata/class-internals.h> 19 #include <mono/metadata/opcodes.h> 20 #include <mono/metadata/reflection.h> 21 22 G_BEGIN_DECLS 23 24 typedef struct _MonoMethodBuilder { 25 MonoMethod *method; 26 char *name; 27 gboolean no_dup_name; 28 #ifdef ENABLE_ILGEN 29 GList *locals_list; 30 int locals; 31 gboolean dynamic; 32 gboolean skip_visibility, init_locals; 33 guint32 code_size, pos; 34 unsigned char *code; 35 int num_clauses; 36 MonoExceptionClause *clauses; 37 const char **param_names; 38 #endif 39 } MonoMethodBuilder; 40 41 MonoMethodBuilder * 42 mono_mb_new (MonoClass *klass, const char *name, MonoWrapperType type); 43 44 MonoMethodBuilder * 45 mono_mb_new_no_dup_name (MonoClass *klass, const char *name, MonoWrapperType type); 46 47 void 48 mono_mb_free (MonoMethodBuilder *mb); 49 50 MonoMethod * 51 mono_mb_create_method (MonoMethodBuilder *mb, MonoMethodSignature *signature, int max_stack); 52 53 guint32 54 mono_mb_add_data (MonoMethodBuilder *mb, gpointer data); 55 56 #ifdef ENABLE_ILGEN 57 void 58 mono_mb_patch_addr (MonoMethodBuilder *mb, int pos, int value); 59 60 void 61 mono_mb_patch_addr_s (MonoMethodBuilder *mb, int pos, gint8 value); 62 63 void 64 mono_mb_patch_branch (MonoMethodBuilder *mb, guint32 pos); 65 66 void 67 mono_mb_patch_short_branch (MonoMethodBuilder *mb, guint32 pos); 68 69 int 70 mono_mb_get_label (MonoMethodBuilder *mb); 71 72 int 73 mono_mb_get_pos (MonoMethodBuilder *mb); 74 75 void 76 mono_mb_emit_ptr (MonoMethodBuilder *mb, gpointer ptr); 77 78 void 79 mono_mb_emit_calli (MonoMethodBuilder *mb, MonoMethodSignature *sig); 80 81 void 82 mono_mb_emit_native_call (MonoMethodBuilder *mb, MonoMethodSignature *sig, gpointer func); 83 84 void 85 mono_mb_emit_managed_call (MonoMethodBuilder *mb, MonoMethod *method, MonoMethodSignature *opt_sig); 86 87 void 88 mono_mb_emit_icall (MonoMethodBuilder *mb, gpointer func); 89 90 int 91 mono_mb_add_local (MonoMethodBuilder *mb, MonoType *type); 92 93 void 94 mono_mb_emit_ldarg (MonoMethodBuilder *mb, guint argnum); 95 96 void 97 mono_mb_emit_ldarg_addr (MonoMethodBuilder *mb, guint argnum); 98 99 void 100 mono_mb_emit_ldloc (MonoMethodBuilder *mb, guint num); 101 102 void 103 mono_mb_emit_ldloc_addr (MonoMethodBuilder *mb, guint locnum); 104 105 void 106 mono_mb_emit_stloc (MonoMethodBuilder *mb, guint num); 107 108 void 109 mono_mb_emit_exception (MonoMethodBuilder *mb, const char *exc_name, const char *msg); 110 111 void 112 mono_mb_emit_exception_full (MonoMethodBuilder *mb, const char *exc_nspace, const char *exc_name, const char *msg); 113 114 void 115 mono_mb_emit_exception_for_error (MonoMethodBuilder *mb, MonoError *error); 116 117 void 118 mono_mb_emit_icon (MonoMethodBuilder *mb, gint32 value); 119 120 void 121 mono_mb_emit_icon8 (MonoMethodBuilder *mb, gint64 value); 122 123 guint32 124 mono_mb_emit_branch (MonoMethodBuilder *mb, guint8 op); 125 126 guint32 127 mono_mb_emit_short_branch (MonoMethodBuilder *mb, guint8 op); 128 129 void 130 mono_mb_emit_branch_label (MonoMethodBuilder *mb, guint8 op, guint32 label); 131 132 void 133 mono_mb_emit_add_to_local (MonoMethodBuilder *mb, guint16 local, gint32 incr); 134 135 void 136 mono_mb_emit_ldflda (MonoMethodBuilder *mb, gint32 offset); 137 138 void 139 mono_mb_emit_byte (MonoMethodBuilder *mb, guint8 op); 140 141 void 142 mono_mb_emit_i2 (MonoMethodBuilder *mb, gint16 data); 143 144 void 145 mono_mb_emit_i4 (MonoMethodBuilder *mb, gint32 data); 146 147 void 148 mono_mb_emit_i8 (MonoMethodBuilder *mb, gint64 data); 149 150 void 151 mono_mb_emit_op (MonoMethodBuilder *mb, guint8 op, gpointer data); 152 153 void 154 mono_mb_emit_ldstr (MonoMethodBuilder *mb, char *str); 155 156 void 157 mono_mb_set_clauses (MonoMethodBuilder *mb, int num_clauses, MonoExceptionClause *clauses); 158 159 void 160 mono_mb_set_param_names (MonoMethodBuilder *mb, const char **param_names); 161 162 #endif 163 164 G_END_DECLS 165 166 #endif /* __MONO_METHOD_BUILDER_H__ */ 167 168