public void t_varargs_single()
        {
// ReSharper disable once CSharpWarnings::CS0618
            Delegate d = new DelegateParameterVarArgs(my_concat_atom);

            PlEngine.RegisterForeign("my_concat_atom", 4, d);
            for (int i = 1; i < 10; i++)
            {
                PlTerm t = PlQuery.PlCallQuery("my_concat_atom(a,b,c, X)");
                Assert.AreEqual("abc", t.ToString(), "my_concat_atom failed!");
            }
        }
        public void t_varargs()
        {
            Delegate d = new DelegateParameterVarArgs(my_concat_atom);

            PlEngine.RegisterForeign("my_concat_atom", 4, d);
            PlEngine.RegisterForeign("my_concat_atom", 7, d);
            for (int i = 1; i < 10; i++)
            {
                PlTerm t = PlQuery.PlCallQuery("my_concat_atom(a,b,c, X)");
                Assert.AreEqual("abc", t.ToString(), "my_concat_atom failed!");
                t = PlQuery.PlCallQuery("my_concat_atom(a,b,c,d,e,f, X)");
                Assert.AreEqual("abcdef", t.ToString(), "my_concat_atom failed!");
            }
        }
Exemple #3
0
        public static void InternMethod(string module, string pn, MethodInfo minfo, object defaultInstanceWhenMissing)
        {
            if (minfo == null)
            {
                return;
            }
            if (!minfo.IsStatic && defaultInstanceWhenMissing == null)
            {
                throw new NotSupportedException(string.Format(
                                                    "Interning a staic method without a target {0}:{1} -> {2}", module,
                                                    pn, minfo));
            }
            ExportedMethodInfos.Add(minfo);
            Type type = minfo.DeclaringType;

            pn = pn ?? (type.Name + "." + minfo.Name);
            if (ForceJanCase)
            {
                var pn2 = ToPrologCase(pn);
                if (pn2 != pn)
                {
                    pn = pn2;
                }
            }
            ParameterInfo[] ps             = minfo.GetParameters();
            Type            rt             = minfo.ReturnType;
            int             paramlen       = ps.Length;
            bool            nonvoid        = rt != typeof(void);
            bool            isbool         = rt == typeof(bool);
            bool            hasReturnValue = nonvoid && !isbool;
            bool            isStatic       = minfo.IsStatic;
            bool            isVanilla      = true;
            int             maxOptionals   = 0;

            foreach (ParameterInfo info in ps)
            {
                if (info.ParameterType != typeof(PlTerm))
                {
                    isVanilla = false;
                }
                if (IsOptionalParam(info))
                {
                    isVanilla = false;
                    maxOptionals++;
                }
            }
            if (isbool && isStatic)
            {
                if (isVanilla)
                {
                    RegisterInfo(pn, paramlen, minfo);
                    Delegate d = null;
                    switch (paramlen)
                    {
                    case 0:
                    {
                        d = new DelegateParameter0(() => (bool)InvokeCaught(minfo, null, ZERO_OBJECTS));
                        PlEngine.RegisterForeign(module, pn, paramlen, d, PlForeignSwitches.None);
                        return;
                    }

                    case 1:
                        PlEngine.RegisterForeign(module, pn, paramlen,
                                                 new DelegateParameter1(
                                                     (p1) => (bool)InvokeCaught(minfo, null, new object[] { p1 })),
                                                 PlForeignSwitches.None);
                        return;

                    case 2:
                        PlEngine.RegisterForeign(module, pn, paramlen,
                                                 new DelegateParameter2(
                                                     (p1, p2) =>
                                                     (bool)InvokeCaught(minfo, null, new object[] { p1, p2 })),
                                                 PlForeignSwitches.None);
                        return;

                    case 3:
                        PlEngine.RegisterForeign(module, pn, paramlen,
                                                 new DelegateParameter3(
                                                     (p1, p2, p3) =>
                                                     (bool)InvokeCaught(minfo, null, new object[] { p1, p2, p3 })),
                                                 PlForeignSwitches.None);
                        return;

                    case 4:
                        PlEngine.RegisterForeign(module, pn, paramlen,
                                                 new DelegateParameter4(
                                                     (p1, p2, p3, p4) =>
                                                     (bool)InvokeCaught(minfo, null, new object[] { p1, p2, p3, p4 })),
                                                 PlForeignSwitches.None);
                        return;

                    case -5:     // use the default please
                        PlEngine.RegisterForeign(module, pn, paramlen,
                                                 new DelegateParameter5(
                                                     (p1, p2, p3, p4, p5) =>
                                                     (bool)InvokeCaught(minfo, null, new object[] { p1, p2, p3, p4, p5 })),
                                                 PlForeignSwitches.None);
                        return;

                    default:
                        break;
                    }
                }
            }
            int plarity = paramlen + (hasReturnValue ? 1 : 0) + (isStatic ? 0 : 1);

            RegisterInfo(pn, plarity, minfo);
            DelegateParameterVarArgs del = GetDelV(minfo, type, nonvoid, isbool, isStatic, plarity, defaultInstanceWhenMissing);

            PlEngine.RegisterForeign(module, pn, plarity, del, PlForeignSwitches.VarArgs);
            while (maxOptionals > 0)
            {
                RegisterInfo(pn, plarity - maxOptionals, minfo);
                del = GetDelV(minfo, type, nonvoid, isbool, isStatic, plarity - maxOptionals, defaultInstanceWhenMissing);
                PlEngine.RegisterForeign(module, pn, plarity - maxOptionals, del, PlForeignSwitches.VarArgs);
                maxOptionals--;
            }
        }