/// <summary> /// Loads a library into the specified path /// </summary> /// <param name="library"></param> /// <param name="path"></param> public void LoadLibrary(Library library, string path) { //Interface.GetMod().RootLogger.Write(LogType.Debug, "Loading library '{0}' into Lua... (path is '{1}')", library.GetType().Name, path); // Create the library table if it doesn't exist LuaTable libraryTable = LuaEnvironment[path] as LuaTable; if (libraryTable == null) { LuaEnvironment.NewTable(path); libraryTable = LuaEnvironment[path] as LuaTable; //Interface.GetMod().RootLogger.Write(LogType.Debug, "Library table not found, creating one... {0}", libraryTable); } else { //Interface.GetMod().RootLogger.Write(LogType.Debug, "Library table found, using it... {0}", libraryTable); } // Bind all methods foreach (string name in library.GetFunctionNames()) { MethodInfo method = library.GetFunction(name); LuaEnvironment.RegisterFunction(string.Format("{0}.{1}", path, name), library, method); } // Only bind properties if it's not global if (path != "_G") { // Create properties table LuaEnvironment.NewTable("tmp"); LuaTable propertiesTable = LuaEnvironment["tmp"] as LuaTable; //Interface.GetMod().RootLogger.Write(LogType.Debug, "Made properties table {0}", propertiesTable); libraryTable["_properties"] = propertiesTable; libraryTable["_object"] = library; // NOTE: Is this a security risk? LuaEnvironment["tmp"] = null; // Bind all properties foreach (string name in library.GetPropertyNames()) { PropertyInfo property = library.GetProperty(name); propertiesTable[name] = property; } // Bind the metatable //Interface.GetMod().RootLogger.Write(LogType.Debug, "setmetatable {0}", libraryMetaTable); (LuaEnvironment["setmetatable"] as LuaFunction).Call(libraryTable, libraryMetaTable); } }
/// <summary> /// Loads a library into the specified path /// </summary> /// <param name="library"></param> /// <param name="path"></param> public void LoadLibrary(Library library, string path) { ObjectInstance scope = null; if (library.IsGlobal) { scope = JavaScriptEngine.Global; } else if (JavaScriptEngine.Global.GetProperty(path) == PropertyDescriptor.Undefined) { JavaScriptEngine.Global.FastAddProperty(path, new LibraryWrapper(JavaScriptEngine, library) { Extensible = true }, true, false, true); return; //scope = new ObjectInstance(JavaScriptEngine) { Extensible = true }; //JavaScriptEngine.Global.FastAddProperty(path, scope, true, false, true); } else { var jsValue = JavaScriptEngine.Global.GetProperty(path).Value; if (jsValue != null) scope = jsValue.Value.AsObject(); } if (scope == null) { Manager.Logger.Write(LogType.Info, "Library path: " + path + " cannot be set"); return; } foreach (var name in library.GetFunctionNames()) { var method = library.GetFunction(name); var typeArgs = method.GetParameters().Select(p => p.ParameterType).ToList(); Type delegateType; if (method.ReturnType == typeof(void)) { delegateType = Expression.GetActionType(typeArgs.ToArray()); } else { typeArgs.Add(method.ReturnType); delegateType = Expression.GetFuncType(typeArgs.ToArray()); } scope.FastAddProperty(name, new DelegateWrapper(JavaScriptEngine, Delegate.CreateDelegate(delegateType, library, method)), true, false, true); } }
/// <summary> /// Loads a library into the specified path /// </summary> /// <param name="library"></param> /// <param name="path"></param> public void LoadLibrary(Library library, string path) { ScriptScope scope; if (library.IsGlobal) { scope = PythonEngine.GetBuiltinModule(); } else if (!PythonEngine.GetBuiltinModule().TryGetVariable(path, out scope)) { //scope = PythonEngine.CreateScope(); //PythonEngine.GetBuiltinModule().SetVariable(path, scope); PythonEngine.GetBuiltinModule().SetVariable(path, library); return; } foreach (string name in library.GetFunctionNames()) { MethodInfo method = library.GetFunction(name); var typeArgs = method.GetParameters() .Select(p => p.ParameterType) .ToList(); Type delegateType; if (method.ReturnType == typeof(void)) { delegateType = Expression.GetActionType(typeArgs.ToArray()); } else { typeArgs.Add(method.ReturnType); delegateType = Expression.GetFuncType(typeArgs.ToArray()); } scope.SetVariable(name, Delegate.CreateDelegate(delegateType, library, method)); } }