X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Finterpreter%2Finterp.h;h=0953e5a54cfb93f1448dd9a80a815952469127bb;hb=e2b2d181084848f3c5dde2788370db1b79893c69;hp=973bcec98e9d05c0a8a14eaedf1d859a61586592;hpb=f1e7aca3bda6493863ed1e5e93790039cd651df2;p=mono.git diff --git a/mono/interpreter/interp.h b/mono/interpreter/interp.h index 973bcec98e9..0953e5a54cf 100644 --- a/mono/interpreter/interp.h +++ b/mono/interpreter/interp.h @@ -1,7 +1,10 @@ - +#include #include #include #include +#include +#include +#include "config.h" enum { VAL_I32 = 0, @@ -12,8 +15,7 @@ enum { VAL_NATI = 0 + VAL_POINTER, VAL_MP = 1 + VAL_POINTER, VAL_TP = 2 + VAL_POINTER, - VAL_OBJ = 3 + VAL_POINTER, - VAL_VALUETA = 8 + VAL_OBJ = 3 + VAL_POINTER }; #if SIZEOF_VOID_P == 4 @@ -37,43 +39,100 @@ typedef struct { /* native size integer and pointer types */ gpointer p; mono_u nati; - struct { - gpointer vt; - MonoClass *klass; - } vt; + gpointer vt; } data; - unsigned int type; +#if defined(__ppc__) || defined(__powerpc__) + int pad; +#endif } stackval; typedef struct _MonoInvocation MonoInvocation; +typedef void (*MonoFunc) (void); +typedef void (*MonoPIFunc) (MonoFunc callme, void *retval, void *obj_this, stackval *arguments); + +/* + * Structure representing a method transformed for the interpreter + * This is domain specific + */ +typedef struct _RuntimeMethod +{ + /* NOTE: These first two elements (method and + next_jit_code_hash) must be in the same order and at the + same offset as in MonoJitInfo, because of the jit_code_hash + internal hash table in MonoDomain. */ + MonoMethod *method; + struct _RuntimeMethod *next_jit_code_hash; + guint32 locals_size; + guint32 args_size; + guint32 stack_size; + guint32 vt_stack_size; + guint32 alloca_size; + unsigned short *code; + unsigned short *new_body_start; /* after all STINARG instrs */ + MonoPIFunc func; + int num_clauses; + MonoExceptionClause *clauses; + void **data_items; + int transformed; + guint32 *arg_offsets; + guint32 *local_offsets; + unsigned int param_count; + unsigned int hasthis; + unsigned int valuetype; +} RuntimeMethod; + struct _MonoInvocation { MonoInvocation *parent; /* parent */ - MonoInvocation *child; + RuntimeMethod *runtime_method; /* parent */ MonoMethod *method; /* parent */ stackval *retval; /* parent */ void *obj; /* this - parent */ - char *locals; char *args; stackval *stack_args; /* parent */ stackval *stack; + stackval *sp; /* For GC stack marking */ /* exception info */ - const unsigned char *ip; + unsigned char invoke_trap; + const unsigned short *ip; MonoException *ex; MonoExceptionClause *ex_handler; }; +typedef struct { + MonoDomain *domain; + MonoInvocation *base_frame; + MonoInvocation *current_frame; + MonoInvocation *env_frame; + jmp_buf *current_env; + unsigned char search_for_handler; + unsigned char managed_code; +} ThreadContext; + void mono_init_icall (void); -void inline stackval_from_data (MonoType *type, stackval *result, char *data); -void ves_exec_method (MonoInvocation *frame); +MonoException * +mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *context); -typedef void (*MonoFunc) (void); -typedef void (*MonoPIFunc) (MonoFunc callme, void *retval, void *obj_this, stackval *arguments); +MonoDelegate* +mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn); + +void +mono_interp_transform_init (void); + +void inline stackval_from_data (MonoType *type, stackval *result, char *data, gboolean pinvoke); +void inline stackval_to_data (MonoType *type, stackval *val, char *data, gboolean pinvoke); +void ves_exec_method (MonoInvocation *frame); /* * defined in an arch specific file. */ MonoPIFunc -mono_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor); -void *mono_create_method_pointer (MonoMethod *method); +mono_arch_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor); + +RuntimeMethod * +mono_interp_get_runtime_method (MonoMethod *method); + +void *mono_arch_create_method_pointer (MonoMethod *method); + +extern int mono_interp_traceopt;