Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }