internal static MethodBuilder GenerateMethod(EmitContext ec, InlineAsmDeclaration decl, TypeBuilder tb, Universe univ) { // string name = "MessageBox"; List <IKVM.Reflection.Type> param = new List <IKVM.Reflection.Type>(); foreach (AsmParameter pdcl in decl.Parameters) { if (pdcl.IsOutParameter) { param.Add(pdcl.ParameterType.MakePointerType()); } else { param.Add(pdcl.ParameterType); } } // return type IKVM.Reflection.Type retype = univ.System_Void; // declr MethodBuilder mb = tb.DefinePInvokeMethod(decl.MethodName, DllName, IKVM.Reflection.MethodAttributes.PinvokeImpl | IKVM.Reflection.MethodAttributes.Static | IKVM.Reflection.MethodAttributes.Public, IKVM.Reflection.CallingConventions.Standard, retype, param.ToArray(), System.Runtime.InteropServices.CallingConvention.StdCall, System.Runtime.InteropServices.CharSet.Ansi); // param name for (int i = 0; i < param.Count; i++) { ParameterAttributes pa = ParameterAttributes.None; if (decl.Parameters[i].IsOutParameter) { pa = ParameterAttributes.Out; } ParameterBuilder pb = mb.DefineParameter(i + 1, pa, decl.Parameters[i].ParameterName); } // out var // tb.CreateType(); return(mb); }
internal static bool EmitStackCall(EmitContext ec, MethodBuilder mb, InlineAsmDeclaration decl, Dictionary <string, LocalBuilder> lbdef) { int i = -1; foreach (AsmParameter np in decl.Parameters) { i++; //if (pdcl.ptype == ParameterType.Pointer) //{ // ec.Report.Error(3665, "ASM: Pointers are not supported in asm use iasm instead"); // return false ; //} // Emit push eval stack // Local Vars if (lbdef.ContainsKey(np.ParameterName)) { LocalBuilder lb = lbdef[np.ParameterName]; int idx = lb.LocalIndex; EmitStack(ec, idx, false, np.IsOutParameter); continue; } // LocalVariableReference var lvar = np.ParameterExpr as LocalVariableReference; if (lvar != null) { int idx = lvar.local_info.builder.LocalIndex; EmitStack(ec, idx, false, np.IsOutParameter); continue; } // Parameters var par = np.ParameterExpr as ParameterReference; if (par != null) { int idx = par.Parameter.Index; EmitStack(ec, idx, true, np.IsOutParameter); continue; } // Field var field = np.ParameterExpr as FieldExpr; if (field != null) { EmitStack(ec, field, np.ParameterName, np.IsOutParameter); continue; } // Property var prop = np.ParameterExpr as PropertyExpr; if (prop != null) { EmitStack(ec, prop, np.ParameterName, np.IsOutParameter); continue; } // Constant var cnst = np.ParameterExpr as ConstantExpr; if (cnst != null) { EmitStack(ec, cnst, np.ParameterName); continue; } // CONST MANIP var strc = np.ParameterExpr as StringConstant; var bytec = np.ParameterExpr as ByteConstant; var intc = np.ParameterExpr as IntConstant; var uintc = np.ParameterExpr as UIntConstant; var shortc = np.ParameterExpr as ShortConstant; var ushortc = np.ParameterExpr as UShortConstant; var longc = np.ParameterExpr as LongConstant; var ulongc = np.ParameterExpr as ULongConstant; var dblc = np.ParameterExpr as DoubleConstant; var floatc = np.ParameterExpr as FloatConstant; var boolc = np.ParameterExpr as BoolConstant; if (intc != null) { EmitStack(ec, intc.Value); continue; } if (uintc != null) { EmitStack(ec, (int)uintc.Value); continue; } if (shortc != null) { EmitStack(ec, (int)shortc.Value); continue; } if (ushortc != null) { EmitStack(ec, (int)ushortc.Value); continue; } if (bytec != null) { EmitStack(ec, (int)bytec.Value); continue; } if (boolc != null) { EmitStack(ec, boolc.Value ? 1 : 0); continue; } if (longc != null) { EmitStack(ec, longc.Value); continue; } if (ulongc != null) { EmitStack(ec, (long)ulongc.Value); continue; } if (dblc != null) { EmitStack(ec, dblc.Value); continue; } if (floatc != null) { EmitStack(ec, floatc.Value); continue; } if (strc != null) { EmitStack(ec, strc.Value); continue; } // Not supported ec.Report.Error(3665, "ASM: parameter not supported "); return(false); } ec.Emit(OpCodes.Call, mb); //// EmitReturn(ec, decl); return(true); }