public Kernel() { SilverNativeFunction nfunc; GetType().GetMethods(BindingFlags.Static | BindingFlags.NonPublic).ToList() .ForEach(method => { nfunc = new SilverNativeFunction(GetType(), method); Silver.Globals.SetVariable(nfunc.Name, nfunc); }); // Register wrapper for functions which need it, like eval Stream stream = typeof (Kernel).Assembly.GetManifestResourceStream("IronSilver.Scripts.core.sv"); var buffer = new byte[stream.Length]; stream.Read(buffer, 0, (int) stream.Length); string source = Encoding.UTF8.GetString(buffer); Silver.Execute(source); }
private bool CheckForMatch(SilverNativeFunction function, List<FunctionArgument> args) { if (function.Arguments.Count == args.Count) { var _args = new List<object>(); args.ForEach(arg => { dynamic val = CompilerServices.CreateLambdaForExpression(arg.Value)(); if (val is SilverString) { val = (string) val; } if (val is SilverNumber) { val = SilverNumber.Convert((SilverNumber)val); } _args.Add(val); }); bool match = true; int i = 0; foreach (ParameterInfo param in function.Method.GetParameters()) { if (_args[i++].GetType() != param.ParameterType) { match = false; break; } } return match; } if (args.Count > function.Arguments.Count) { if (function.Arguments.Any() && function.Arguments.Last().IsVarArg) { return true; } return false; } int myCount = args.Count; int theirCount = function.Arguments.Count; function.Arguments.ForEach(arg => { if (arg.HasDefault) { theirCount--; } }); int vo = 0; if (function.Arguments.Any() && function.Arguments.Last().IsVarArg) { vo = 1; } if (myCount == theirCount) { return true; } if (myCount + vo == theirCount) { return true; } return false; }