projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add full-aot support for runtime invokes to array Get/Set methods.
[mono.git]
/
mono
/
interpreter
/
transform.c
diff --git
a/mono/interpreter/transform.c
b/mono/interpreter/transform.c
index f28203df6401c22b401d22ac66ff6bb400e43eea..b47e594ef4959764748f33a6cc370aaaae7b55a9 100644
(file)
--- a/
mono/interpreter/transform.c
+++ b/
mono/interpreter/transform.c
@@
-436,7
+436,7
@@
load_arg(TransformData *td, int n)
{
int mt;
MonoClass *klass = NULL;
{
int mt;
MonoClass *klass = NULL;
- if (n == 0 &&
td->method->signature
->hasthis) {
+ if (n == 0 &&
mono_method_signature (td->method)
->hasthis) {
if (td->method->klass->valuetype)
mt = MINT_TYPE_P;
else {
if (td->method->klass->valuetype)
mt = MINT_TYPE_P;
else {
@@
-446,12
+446,12
@@
load_arg(TransformData *td, int n)
ADD_CODE(td, MINT_LDTHIS);
} else {
MonoType *type;
ADD_CODE(td, MINT_LDTHIS);
} else {
MonoType *type;
- n -=
td->method->signature
->hasthis;
- type =
td->method->signature
->params [n];
+ n -=
mono_method_signature (td->method)
->hasthis;
+ type =
mono_method_signature (td->method)
->params [n];
mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
- if (
td->method->signature
->pinvoke)
+ if (
mono_method_signature (td->method)
->pinvoke)
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
@@
-475,16
+475,16
@@
store_arg(TransformData *td, int n)
{
int mt;
CHECK_STACK (td, 1);
{
int mt;
CHECK_STACK (td, 1);
- if (n == 0 &&
td->method->signature
->hasthis)
+ if (n == 0 &&
mono_method_signature (td->method)
->hasthis)
ADD_CODE(td, MINT_STTHIS);
else {
MonoType *type;
ADD_CODE(td, MINT_STTHIS);
else {
MonoType *type;
- n -=
td->method->signature
->hasthis;
- type =
td->method->signature
->params [n];
+ n -=
mono_method_signature (td->method)
->hasthis;
+ type =
mono_method_signature (td->method)
->params [n];
mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
- if (
td->method->signature
->pinvoke)
+ if (
mono_method_signature (td->method)
->pinvoke)
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
@@
-504,11
+504,11
@@
store_arg(TransformData *td, int n)
static void
store_inarg(TransformData *td, int n)
{
static void
store_inarg(TransformData *td, int n)
{
- MonoType *type =
td->method->signature
->params [n];
+ MonoType *type =
mono_method_signature (td->method)
->params [n];
int mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
int mt = mint_type (type);
if (mt == MINT_TYPE_VT) {
gint32 size;
- if (
td->method->signature
->pinvoke)
+ if (
mono_method_signature (td->method)
->pinvoke)
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
size = mono_class_native_size (type->data.klass, NULL);
else
size = mono_class_value_size (type->data.klass, NULL);
@@
-611,8
+611,8
@@
get_data_item_index (TransformData *td, void *ptr)
static void
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
{
static void
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
{
- MonoMethodHeader *header =
((MonoMethodNormal*)method)->header
;
- MonoMethodSignature *signature = m
ethod->signature
;
+ MonoMethodHeader *header =
mono_method_get_header (method)
;
+ MonoMethodSignature *signature = m
ono_method_signature (method)
;
MonoImage *image = method->klass->image;
MonoDomain *domain = mono_domain_get ();
MonoGenericContext *generic_context = NULL;
MonoImage *image = method->klass->image;
MonoDomain *domain = mono_domain_get ();
MonoGenericContext *generic_context = NULL;
@@
-629,7
+629,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
TransformData td;
int generating_code = 1;
TransformData td;
int generating_code = 1;
- if (m
ethod->signature
->is_inflated)
+ if (m
ono_method_signature (method)
->is_inflated)
generic_context = ((MonoMethodInflated *) method)->context;
memset(&td, 0, sizeof(td));
generic_context = ((MonoMethodInflated *) method)->context;
memset(&td, 0, sizeof(td));
@@
-759,7
+759,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
td.is_bb_start [td.ip - td.il_code] == 3 ? "<>" :
td.is_bb_start [td.ip - td.il_code] == 2 ? "< " :
td.is_bb_start [td.ip - td.il_code] == 1 ? " >" : " ",
td.is_bb_start [td.ip - td.il_code] == 3 ? "<>" :
td.is_bb_start [td.ip - td.il_code] == 2 ? "< " :
td.is_bb_start [td.ip - td.il_code] == 1 ? " >" : " ",
- mono_opcode_name
s [*td.ip]
, td.new_ip - td.new_code, td.sp - td.stack,
+ mono_opcode_name
(*td.ip)
, td.new_ip - td.new_code, td.sp - td.stack,
td.sp > td.stack ? stack_type_string [td.sp [-1].type] : " ",
(td.sp > td.stack && (td.sp [-1].type == STACK_TYPE_O || td.sp [-1].type == STACK_TYPE_VT)) ? (td.sp [-1].klass == NULL ? "?" : td.sp [-1].klass->name) : "",
td.vt_sp, td.max_vt_sp);
td.sp > td.stack ? stack_type_string [td.sp [-1].type] : " ",
(td.sp > td.stack && (td.sp [-1].type == STACK_TYPE_O || td.sp [-1].type == STACK_TYPE_VT)) ? (td.sp [-1].klass == NULL ? "?" : td.sp [-1].klass->name) : "",
td.vt_sp, td.max_vt_sp);
@@
-971,7
+971,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
m = mono_get_method_full (image, token, NULL, generic_context);
else
m = (MonoMethod *)mono_method_get_wrapper_data (method, token);
m = mono_get_method_full (image, token, NULL, generic_context);
else
m = (MonoMethod *)mono_method_get_wrapper_data (method, token);
- csignature = m
->signature
;
+ csignature = m
ono_method_signature (m)
;
if (m->klass == mono_defaults.string_class) {
if (m->name [0] == 'g') {
if (strcmp (m->name, "get_Chars") == 0)
if (m->klass == mono_defaults.string_class) {
if (m->name [0] == 'g') {
if (strcmp (m->name, "get_Chars") == 0)
@@
-991,7
+991,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
(m->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) == 0 &&
(m->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) == 0) {
int called_inited = mono_class_vtable (domain, m->klass)->initialized;
(m->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) == 0 &&
(m->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) == 0) {
int called_inited = mono_class_vtable (domain, m->klass)->initialized;
- MonoMethodHeader *mheader =
((MonoMethodNormal*)m)->header
;
+ MonoMethodHeader *mheader =
mono_method_get_header (m)
;
if (/*mono_metadata_signature_equal (method->signature, m->signature) */ method == m && *(td.ip + 5) == CEE_RET) {
int offset;
if (/*mono_metadata_signature_equal (method->signature, m->signature) */ method == m && *(td.ip + 5) == CEE_RET) {
int offset;
@@
-1012,8
+1012,8
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
td.ip += 5;
break;
} else {
td.ip += 5;
break;
} else {
-
- if (*mheader->code == CEE_RET && called_inited) {
+ /* mheader might not exist if this is a delegate invoc, etc */
+ if (
mheader &&
*mheader->code == CEE_RET && called_inited) {
if (mono_interp_traceopt)
g_print ("Inline (empty) call of %s.%s\n", m->klass->name, m->name);
for (i = 0; i < csignature->param_count; i++)
if (mono_interp_traceopt)
g_print ("Inline (empty) call of %s.%s\n", m->klass->name, m->name);
for (i = 0; i < csignature->param_count; i++)
@@
-1718,7
+1718,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
else
m = mono_get_method_full (image, token, NULL, generic_context);
else
m = mono_get_method_full (image, token, NULL, generic_context);
- csignature = m
->signature
;
+ csignature = m
ono_method_signature (m)
;
klass = m->klass;
td.sp -= csignature->param_count;
ADD_CODE(&td, MINT_NEWOBJ);
klass = m->klass;
td.sp -= csignature->param_count;
ADD_CODE(&td, MINT_NEWOBJ);
@@
-2398,6
+2398,12
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
CHECK_STACK (&td, info->sig->param_count);
switch (info->sig->param_count) {
CHECK_STACK (&td, info->sig->param_count);
switch (info->sig->param_count) {
+ case 0:
+ if (MONO_TYPE_IS_VOID (info->sig->ret))
+ ADD_CODE (&td,MINT_ICALL_V_V);
+ else
+ g_assert_not_reached();
+ break;
case 1:
if (MONO_TYPE_IS_VOID (info->sig->ret))
ADD_CODE (&td,MINT_ICALL_P_V);
case 1:
if (MONO_TYPE_IS_VOID (info->sig->ret))
ADD_CODE (&td,MINT_ICALL_P_V);
@@
-2455,6
+2461,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
break;
}
case CEE_MONO_LDPTR:
break;
}
case CEE_MONO_LDPTR:
+ case CEE_MONO_CLASSCONST:
token = read32 (td.ip + 1);
td.ip += 5;
ADD_CODE(&td, MINT_MONO_LDPTR);
token = read32 (td.ip + 1);
td.ip += 5;
ADD_CODE(&td, MINT_MONO_LDPTR);
@@
-2499,6
+2506,7
@@
generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
break;
case CEE_MONO_SAVE_LMF:
case CEE_MONO_RESTORE_LMF:
break;
case CEE_MONO_SAVE_LMF:
case CEE_MONO_RESTORE_LMF:
+ case CEE_MONO_NOT_TAKEN:
++td.ip;
break;
default:
++td.ip;
break;
default:
@@
-2797,8
+2805,8
@@
mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
int i, align, size, offset;
MonoMethod *method = runtime_method->method;
MonoImage *image = method->klass->image;
int i, align, size, offset;
MonoMethod *method = runtime_method->method;
MonoImage *image = method->klass->image;
- MonoMethodHeader *header =
((MonoMethodNormal*)method)->header
;
- MonoMethodSignature *signature = m
ethod->signature
;
+ MonoMethodHeader *header =
mono_method_get_header (method)
;
+ MonoMethodSignature *signature = m
ono_method_signature (method)
;
register const unsigned char *ip, *end;
const MonoOpcode *opcode;
MonoMethod *m;
register const unsigned char *ip, *end;
const MonoOpcode *opcode;
MonoMethod *m;
@@
-2832,7
+2840,7
@@
mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
mono_profiler_method_jit (method); /* sort of... */
mono_profiler_method_jit (method); /* sort of... */
- if (m
ethod->signature
->is_inflated)
+ if (m
ono_method_signature (method)
->is_inflated)
generic_context = ((MonoMethodInflated *) method)->context;
if (method->iflags & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)) {
generic_context = ((MonoMethodInflated *) method)->context;
if (method->iflags & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)) {
@@
-2846,12
+2854,12
@@
mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
/* assumes all internal calls with an array this are built in... */
if (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL &&
/* assumes all internal calls with an array this are built in... */
if (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL &&
- (!
method->signature
->hasthis || method->klass->rank == 0)) {
+ (!
mono_method_signature (method)
->hasthis || method->klass->rank == 0)) {
runtime_method->code = g_malloc(sizeof(short));
runtime_method->code[0] = MINT_CALLINT;
runtime_method->code = g_malloc(sizeof(short));
runtime_method->code[0] = MINT_CALLINT;
- if (
method
->addr == NULL)
-
method
->addr = mono_lookup_internal_call (method);
- runtime_method->func = mono_arch_create_trampoline (m
ethod->signature
, method->string_ctor);
+ if (
((MonoMethodPInvoke*) method)
->addr == NULL)
+
((MonoMethodPInvoke*) method)
->addr = mono_lookup_internal_call (method);
+ runtime_method->func = mono_arch_create_trampoline (m
ono_method_signature (method)
, method->string_ctor);
} else {
const char *name = method->name;
if (method->klass->parent == mono_defaults.multicastdelegate_class) {
} else {
const char *name = method->name;
if (method->klass->parent == mono_defaults.multicastdelegate_class) {
@@
-2877,7
+2885,7
@@
mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
return NULL;
}
method = nm;
return NULL;
}
method = nm;
- header =
((MonoMethodNormal *)nm)->header
;
+ header =
mono_method_get_header (nm)
;
LeaveCriticalSection(&calc_section);
}
g_assert ((signature->param_count + signature->hasthis) < 1000);
LeaveCriticalSection(&calc_section);
}
g_assert ((signature->param_count + signature->hasthis) < 1000);