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!"); } }
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--; } }