コード例 #1
0
ファイル: ForeignMethod.cs プロジェクト: segmond/swicli
 private static string ComputeName(PrologVisible pm, MethodInfo m)
 {
     if (pm.Name == null)
     {
         if (char.IsLower(m.Name[0]))
         {
             string mName = m.Name;
             if (ForceJanCase)
             {
                 return(ToPrologCase(mName));
             }
             else
             {
                 return(mName);
             }
         }
         else
         {
             string mName = m.Name;
             return(ToPrologCase(mName));
         }
     }
     else
     {
         if (ForceJanCase)
         {
             return(ToPrologCase(pm.Name));
         }
     }
     return(pm.Name);
 }
コード例 #2
0
ファイル: ForeignMethod.cs プロジェクト: segmond/swicli
 public static void InternMethod(MethodInfo m, PrologVisible pm)
 {
     pm.Name = ComputeName(pm, m);
     if (pm.DelegateType != null)
     {
         ExportedMethodInfos.Add(m);
         PlEngine.RegisterForeign(pm.ModuleName, pm.Name, pm.Arity, pm.Delegate, pm.ForeignSwitches);
         return;
     }
     InternMethod(pm.ModuleName, pm.Name, m);
 }
コード例 #3
0
ファイル: ForeignMethod.cs プロジェクト: segmond/swicli
        private static void CheckRequiredPrefix(MethodInfo m, PrologVisible f1, string requiredPrefix)
        {
            if (f1.Name != null || requiredPrefix == null)
            {
                return;
            }
            string proposal = ComputeName(f1, m);

            if (!proposal.StartsWith(requiredPrefix))
            {
                proposal = requiredPrefix + proposal;
            }
            f1.Name = proposal;
        }
コード例 #4
0
ファイル: ForeignMethod.cs プロジェクト: segmond/swicli
        private static void InternMethod(MethodInfo m, string requiredPrefix)
        {
            if (ExportedMethodInfos.Contains(m))
            {
                return;
            }
            if (m.IsAbstract)
            {
                return;
            }
            object[] f = m.GetCustomAttributes(typeof(PrologVisible), false);
            if (f != null && f.Length > 0)
            {
                PrologVisible f1 = (PrologVisible)f[0];
                f1.Method = m;
                try
                {
                    CheckRequiredPrefix(m, f1, requiredPrefix);
                    InternMethod(m, f1);
                    ExportedMethodInfos.Add(m);
                }
                catch (Exception e)
                {
                    Error("{0} caused {1}", m, e);
                }
                return;
            }
            var ForeignSwitches = PlForeignSwitches.None;
            var pm = m.GetParameters();

            if (pm.Length == 3)
            {
                if (pm[1].ParameterType == typeof(int) && pm[2].ParameterType == typeof(IntPtr) &&
                    m.ReturnType == typeof(int))
                {
                    ForeignSwitches |= PlForeignSwitches.VarArgs | PlForeignSwitches.Nondeterministic;
                    PrologVisible f1 = new NonDet();
                    f1.Method = m;
                    try
                    {
                        CheckRequiredPrefix(m, f1, requiredPrefix);
                        InternMethod(m, f1);
                        ExportedMethodInfos.Add(m);
                    }
                    catch (Exception e)
                    {
                        Error("{0} caused {1}", m, e);
                    }
                    return;
                }
            }
            else
            {
                PrologVisible f1 = (PrologVisible) new PrologVisible();
                f1.ForeignSwitches = ForeignSwitches;
                f1.Method          = m;
                try
                {
                    CheckRequiredPrefix(m, f1, requiredPrefix);
                    InternMethod(m, f1);
                    ExportedMethodInfos.Add(m);
                }
                catch (Exception e)
                {
                    Error("{0} caused {1}", m, e);
                }
            }
        }