static int
ret_type_to_call_opcode (MonoType *type, int calli, int virt)
{
- int t = type->type;
-
if (type->byref)
return calli? OP_CALL_REG: virt? CEE_CALLVIRT: CEE_CALL;
handle_enum:
- switch (t) {
+ switch (type->type) {
case MONO_TYPE_VOID:
return calli? OP_VOIDCALL_REG: virt? OP_VOIDCALLVIRT: OP_VOIDCALL;
case MONO_TYPE_I1:
return calli? OP_FCALL_REG: virt? OP_FCALLVIRT: OP_FCALL;
case MONO_TYPE_VALUETYPE:
if (type->data.klass->enumtype) {
- t = type->data.klass->enum_basetype->type;
+ type = type->data.klass->enum_basetype;
goto handle_enum;
} else
return calli? OP_VCALL_REG: virt? OP_VCALLVIRT: OP_VCALL;
case MONO_TYPE_TYPEDBYREF:
return calli? OP_VCALL_REG: virt? OP_VCALLVIRT: OP_VCALL;
case MONO_TYPE_GENERICINST:
- t = type->data.generic_inst->generic_type->type;
+ type = type->data.generic_inst->generic_type;
goto handle_enum;
default:
g_error ("unknown type 0x%02x in ret_type_to_call_opcode", type->type);
static int
check_call_signature (MonoCompile *cfg, MonoMethodSignature *sig, MonoInst **args)
{
- int i, simple_type;
+ MonoType *simple_type;
+ int i;
if (sig->hasthis) {
if (args [0]->type != STACK_OBJ && args [0]->type != STACK_MP && args [0]->type != STACK_PTR)
return 1;
continue;
}
- simple_type = sig->params [i]->type;
+ simple_type = sig->params [i];
handle_enum:
- switch (simple_type) {
+ switch (simple_type->type) {
case MONO_TYPE_VOID:
return 1;
continue;
return 1;
continue;
case MONO_TYPE_VALUETYPE:
- if (sig->params [i]->data.klass->enumtype) {
- simple_type = sig->params [i]->data.klass->enum_basetype->type;
+ if (simple_type->data.klass->enumtype) {
+ simple_type = simple_type->data.klass->enum_basetype;
goto handle_enum;
}
if (args [i]->type != STACK_VTYPE)
return 1;
continue;
case MONO_TYPE_GENERICINST:
- simple_type = sig->params [i]->data.generic_inst->generic_type->type;
+ simple_type = sig->params [i]->data.generic_inst->generic_type;
goto handle_enum;
default:
- g_error ("unknown type 0x%02x in check_call_signature", simple_type);
+ g_error ("unknown type 0x%02x in check_call_signature",
+ simple_type->type);
}
}
return 0;
res = mono_metadata_signature_alloc (mono_defaults.corlib, arity + 1);
res->pinvoke = 1;
+#ifdef MONO_ARCH_VARARG_ICALLS
+ /* Only set this only some archs since not all backends can handle varargs+pinvoke */
+ res->call_convention = MONO_CALL_VARARG;
+#endif
res->params [0] = &mono_defaults.array_class->byval_arg;
for (i = 1; i <= arity; i++)
res = mono_metadata_signature_alloc (mono_defaults.corlib, arity + 1);
res->pinvoke = 1;
+#ifdef MONO_ARCH_VARARG_ICALLS
+ /* Only set this only some archs since not all backends can handle varargs+pinvoke */
+ res->call_convention = MONO_CALL_VARARG;
+#endif
res->params [0] = &mono_defaults.int_class->byval_arg;
for (i = 0; i < arity; i++)
}
NEW_TEMPLOAD (cfg, dest, temp);
NEW_ICONST (cfg, vtoffset, sizeof (MonoObject));
- MONO_INST_NEW (cfg, add, CEE_ADD);
+ MONO_INST_NEW (cfg, add, OP_PADD);
add->inst_left = dest;
add->inst_right = vtoffset;
add->cil_code = ip;
ins->inst_newa_class = klass;
ins->cil_code = ip;
- MONO_INST_NEW (cfg, add, CEE_ADD);
+ MONO_INST_NEW (cfg, add, OP_PADD);
NEW_ICONST (cfg, vtoffset, sizeof (MonoObject));
add->inst_left = ins;
add->inst_right = vtoffset;
ins->inst_newa_class = klass;
ins->cil_code = ip;
- MONO_INST_NEW (cfg, add, CEE_ADD);
+ MONO_INST_NEW (cfg, add, OP_PADD);
NEW_ICONST (cfg, vtoffset, sizeof (MonoObject));
add->inst_left = ins;
add->inst_right = vtoffset;
} else {
MonoInst *store;
NEW_ICONST (cfg, offset_ins, foffset);
- MONO_INST_NEW (cfg, ins, CEE_ADD);
+ MONO_INST_NEW (cfg, ins, OP_PADD);
ins->cil_code = ip;
ins->inst_left = *sp;
ins->inst_right = offset_ins;
}
} else {
NEW_ICONST (cfg, offset_ins, foffset);
- MONO_INST_NEW (cfg, ins, CEE_ADD);
+ MONO_INST_NEW (cfg, ins, OP_PADD);
ins->cil_code = ip;
ins->inst_left = *sp;
ins->inst_right = offset_ins;
*sp++ = ins;
ip += 5;
break;
- case CEE_LDELEM: {
+ case CEE_LDELEM_ANY: {
MonoInst *load;
CHECK_STACK (2);
sp -= 2;
inline_costs += 1;
break;
}
- case CEE_STELEM: {
+ case CEE_STELEM_ANY: {
MonoInst *load;
/*
* translate to:
MONO_INST_NEW (cfg, ins, OP_LOCALLOC);
ins->inst_left = *sp;
ins->cil_code = ip;
+ ins->type = STACK_MP;
cfg->flags |= MONO_CFG_HAS_ALLOCA;
if (header->init_locals)
ip += 2;
break;
case CEE_TAIL_:
- ins_flag |= MONO_INST_TAILCALL;
+ ins_flag |= MONO_INST_TAILCALL;
+ cfg->flags |= MONO_CFG_HAS_TAIL;
/* Can't inline tail calls at this time */
inline_costs += 100000;
ip += 2;
#endif
mono_install_stack_walk (mono_jit_walk_stack);
- domain = mono_init (filename);
+ domain = mono_init_from_assembly (filename, filename);
mono_init_icall ();
mono_add_internal_call ("System.Diagnostics.StackFrame::get_frame_info",