public void RegisterFunction(string functionName, MethodInfo method, DekiScriptNativeInvocationTarget.Parameter[] parameters) { var target = new DekiScriptNativeInvocationTarget(null, method, parameters.ToArray()); var function = new DekiScriptInvocationTargetDescriptor(target.Access, false, false, functionName, target.Parameters, target.ReturnType, "", "", target); var functionPointer = new XUri("native:///").At(function.SystemName); Functions[functionPointer] = function; _funcMap[functionName] = functionPointer; }
//--- Class Constructor --- static DekiScriptRuntime() { // register built-in functions _commonFunctions = new Dictionary<XUri, DekiScriptInvocationTargetDescriptor>(); foreach(MethodInfo method in typeof(DekiScriptLibrary).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)) { // check if it has the DekiScriptFunction attribute DekiScriptFunctionAttribute functionAttribute = (DekiScriptFunctionAttribute)Attribute.GetCustomAttribute(method, typeof(DekiScriptFunctionAttribute)); if(functionAttribute != null) { var parameters = from param in method.GetParameters() let attr = (DekiScriptParamAttribute[])param.GetCustomAttributes(typeof(DekiScriptParamAttribute), false) select ((attr != null) && (attr.Length > 0)) ? new DekiScriptNativeInvocationTarget.Parameter(attr[0].Hint, attr[0].Optional) : null; var target = new DekiScriptNativeInvocationTarget(null, method, parameters.ToArray()); var function = new DekiScriptInvocationTargetDescriptor(target.Access, functionAttribute.IsProperty, functionAttribute.IsIdempotent, functionAttribute.Name ?? method.Name, target.Parameters, target.ReturnType, functionAttribute.Description, functionAttribute.Transform, target); _commonFunctions[new XUri("native:///").At(function.SystemName)] = function; } } // build common env DekiScriptMap common = new DekiScriptMap(); // add global constants common.AddNativeValueAt("num.e", Math.E); common.AddNativeValueAt("num.pi", Math.PI); common.AddNativeValueAt("num.epsilon", double.Epsilon); common.AddNativeValueAt("num.positiveinfinity", double.PositiveInfinity); common.AddNativeValueAt("num.negativeinfinity", double.NegativeInfinity); common.AddNativeValueAt("num.nan", double.NaN); // add global functions & properties foreach(var function in _commonFunctions) { common.AddNativeValueAt(function.Value.Name, function.Key); } _commonEnv = new DekiScriptEnv(common); }