public static void AddIoLibrary(LuaContext Context) { dynamic io = LuaObject.NewTable(); FileMetatable.__index = LuaObject.NewTable(); FileMetatable.__index.write = (LuaFunction) write; FileMetatable.__index.close = (LuaFunction) close; FileMetatable.__index.flush = (LuaFunction) flush; FileMetatable.__index.seek = (LuaFunction) seek; FileMetatable.__index.read = (LuaFunction) read; io.open = (LuaFunction) io_open; io.type = (LuaFunction) io_type; io.input = (LuaFunction) io_input; io.output = (LuaFunction) io_output; io.temp = (LuaFunction) io_temp; io.flush = (LuaFunction) io_flush; io.write = (LuaFunction) io_write; io.read = (LuaFunction) io_read; currentInput = CreateFileObject(Console.OpenStandardInput()); currentOutput = CreateFileObject(Console.OpenStandardOutput(), true); io.stdin = currentInput; io.stdout = currentOutput; io.stderr = CreateFileObject(Console.OpenStandardError(), true); Context.Set("io", io); }
public InterpreterExecutor(LuaContext ctx) { this.scopes = new Stack<LuaContext> (); this.scopes.Push (ctx); this.stack = new Stack<LuaObject> (); }
public static Expr UnaryMinus(LuaContext context, DynamicMetaObject target) { return Expr.Invoke( Expr.Constant((Func<LuaContext, object, object>)LuaOps.UnaryMinusMetamethod), Expr.Constant(context, typeof(LuaContext)), Expr.Convert(target.Expression, typeof(object))); }
public static object BinaryOpMetamethod(LuaContext context, ExprType op, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); switch (op) { case ExprType.Add: case ExprType.Subtract: case ExprType.Multiply: case ExprType.Divide: case ExprType.Modulo: case ExprType.Power: return NumericMetamethod(context, op, left, right); case ExprType.GreaterThan: case ExprType.GreaterThanOrEqual: case ExprType.LessThan: case ExprType.LessThanOrEqual: return RelationalMetamethod(context, op, left, right); case ExprType.Equal: return EquateMetamethod(context, op, left, right); case ExprType.NotEqual: return Not(EquateMetamethod(context, ExprType.Equal, left, right)); default: throw new ArgumentOutOfRangeException("op"); } }
public DefaultExecutor(LuaContext ctx) { var defaultExecutor = new InterpreterExecutor (ctx); this.executors = new Stack<IExecutor> (); this.executors.Push (defaultExecutor); }
public static Expr Index(LuaContext context, DynamicMetaObject target, DynamicMetaObject[] indexes) { return Expr.Invoke( Expr.Constant((Func<LuaContext, object, object, object>)LuaOps.IndexMetamethod), Expr.Constant(context, typeof(LuaContext)), Expr.Convert(target.Expression, typeof(object)), Expr.Convert(indexes[0].Expression, typeof(object))); }
public LuaErrorException(LuaContext context, object errorObject, int stackLevel = 1, Exception innerException = null) : base(context, BaseLibrary.ToStringEx(errorObject), innerException) { Result = errorObject; StackLevel = stackLevel; UnwindStack(StackLevel); }
public static Expr BinaryOp(LuaContext context, ExprType operation, DynamicMetaObject left, DynamicMetaObject right) { return Expr.Invoke( Expr.Constant((Func<LuaContext, ExprType, object, object, object>)LuaOps.BinaryOpMetamethod), Expr.Constant(context, typeof(LuaContext)), Expr.Constant(operation), Expr.Convert(left.Expression, typeof(object)), Expr.Convert(right.Expression, typeof(object))); }
public UnitOfWork(LuaContext context) { _context = context; Authors = new AuthorRepository(_context); Books = new BookRepository(_context); Customers = new CustomerRepository(_context); Rentals = new RentalRepository(_context); Stocks = new StockRepository(_context); }
public static object Concat(LuaContext context, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); if ((left is string || left is double) && (right is double || right is string)) return String.Concat(left, right); return ConcatMetamethod(context, left, right); }
public void DoFileTest() { LuaParser parser; var context = new LuaContext(); context.AddBasicLibrary(); context.AddIoLibrary(); parser = new LuaParser(context, "dofile.lua"); parser.Parse(); }
public void FunctionScopesTest() { LuaParser parser; var context = new LuaContext(); context.AddBasicLibrary(); context.AddIoLibrary(); parser = new LuaParser(context, "functionscopes.lua"); parser.Parse(); }
public void HelloWorldTest() { LuaParser parser; var context = new LuaContext(); context.AddBasicLibrary(); context.AddIoLibrary(); parser = new LuaParser(context, "helloworld.lua"); parser.Parse(); }
public static object ConcatMetamethod(LuaContext context, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); var metamethod = GetMetamethod(context, left, Constant.CONCAT_METAMETHOD) ?? GetMetamethod(context, right, Constant.CONCAT_METAMETHOD); if (metamethod != null) return context.DynamicCache.GetDynamicCall2()(metamethod, left, right); var typeName = left is string ? BaseLibrary.Type(left) : BaseLibrary.Type(right); throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "concatenate", typeName); }
public static Expr Call(LuaContext context, DynamicMetaObject target, DynamicMetaObject[] args) { var expression = Expr.Invoke( Expr.Constant((Func<LuaContext, object, object[], object>)LuaOps.CallMetamethod), Expr.Constant(context, typeof(LuaContext)), Expr.Convert(target.Expression, typeof(object)), Expr.NewArrayInit( typeof(object), args.Select(arg => Expr.Convert(arg.Expression, typeof(object))))); return expression; }
public LuaTable(LuaContext context) { Context = context; const int prime = 3; buckets = new int[prime]; for (var i = 0; i < buckets.Length; i++) buckets[i] = -1; entries = new Entry[prime]; freeList = -1; }
public virtual IEnumerator PlayAnimationRoutine(LuaContext context = null) { if (context == null) { context = GetComponent <LuaContext>(); } isPlayingAnimation = true; LuaScript script = anim.ToScript(context); context.SetGlobal("target", target); yield return(script.RunRoutine()); isPlayingAnimation = false; }
public void PlayAnimation(LuaAnimation anim, MapEvent kill = null, LuaContext context = null) { if (anim == null) { return; } chara.doll.GetComponent <CharaAnimationTarget>().ConfigureToBattler(this); chara.PerformWhenDoneAnimating( CoUtils.RunWithCallback(chara.doll.GetComponent <AnimationPlayer>().PlayAnimationRoutine(anim, context), () => { if (kill != null) { battle.map.RemoveEvent(kill); } })); }
public static object GetValueFromSaveFile(LuaContext luaContext, string[] strArgs, int[] intArgs) { luaContext.RegisterFunction("edizon", "getStrArgs", getStrArgs(strArgs)); luaContext.RegisterFunction("edizon", "getIntArgs", getIntArgs(intArgs)); var res = luaContext.Execute("getValueFromSaveFile"); if (!res.success) { LogConsole.Instance.Log(res.result.Where(r => r != null).Aggregate("", (a, b) => a + b.ToString() + Environment.NewLine), LogLevel.LUA); return(null); } return(res.result.First()); }
public static object CallMetamethod(LuaContext context, object obj, object[] args) { ContractUtils.RequiresNotNull(context, "context"); var metamethod = GetMetamethod(context, obj, Constant.CALL_METAMETHOD); if (metamethod != null) { var array = new object[args.Length + 1]; array[0] = obj; Array.Copy(args, 0, array, 1, args.Length); return context.DynamicCache.GetDynamicCall1()(metamethod, new Varargs(array)); } throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "call", BaseLibrary.Type(obj)); }
public static object ExecuteCalculation(string calc, double input) { var lua = new LuaContext(); lua.LoadFromString( $"function exec(value)\r\n" + $"return {calc}\r\n" + $"end" ); lua.Execute(); var res = lua.Execute("exec", input); return(Convert.ToUInt32(res.result.First())); }
public static void MessageBox(LuaContext context, String title, String content) { #if WINDOWS_PHONE Deployment.Current. #endif Dispatcher.BeginInvoke(() => { #if WINDOWS_PHONE System.Windows.MessageBox.Show(content, title, MessageBoxButton.OK); #elif NETFX_CORE MessageDialog md = new MessageDialog(content, title); md.Commands.Add(new UICommand("OK", new UICommandInvokedHandler((cmd) => { }))); md.ShowAsync(); #endif }); }
public static Expr ConvertToNumberAndCheck(LuaContext context, Expr expression, string format, params object[] args) { var numberVar = Expr.Variable(typeof(double)); var assignNumber = Expr.Assign(numberVar, ConvertToNumber(context, expression)); return Expr.Block( new[] {numberVar}, assignNumber, Expr.Condition( Expr.Invoke( Expr.Constant((Func<double, bool>)Double.IsNaN), numberVar), Expr.Block( Expr.Throw(Expr.New(MemberInfos.NewRuntimeException, Expr.Constant(context), Expr.Constant(format), Expr.Constant(args))), Expr.Constant(Double.NaN)), numberVar)); }
private static bool _allowExportsClass(int contextId, string className) { LuaContext context = LuaContext.getContext(contextId); if (context != null) { if (_exportsClasses.ContainsKey(contextId) && _exportsClasses [contextId] != null) { return(_exportsClasses [contextId].ContainsKey(className)); } } Debug.LogWarning(string.Format("No permission to import the `{0}` class, please call the setInculdesClasses method to set the class to the includes class list", className)); return(false); }
public Context(LuaContext luaContext) { LuaContext = luaContext; DynamicCache = new DynamicCache(this); SetupLibraries(); Metatables = new Dictionary<Type, LuaTable> { {typeof(bool), new LuaTable()}, {typeof(double), new LuaTable()}, {typeof(string), new LuaTable()}, {typeof(Delegate), new LuaTable()}, }; }
private static string _checkObjectSubclass(int contextId, string className) { LuaContext context = LuaContext.getContext(contextId); if (context != null) { if (_exportsClasses.ContainsKey(contextId) && _exportsClasses [contextId] != null && _exportsClasses [contextId].ContainsKey(className)) { Type t = _exportsClasses [contextId] [className]; if (t.IsSubclassOf(typeof(LuaObjectClass))) { LuaModule.register(context, t); return(LuaModule.moduleName(t)); } } } return(null); }
public void MethodBinding() { LuaParser parser; var context = new LuaContext(); context.AddBasicLibrary(); context.AddIoLibrary(); double res = 0; var func = (Func<double, double>)((a) => { res = a; return a + 1; }); context.SetGlobal("test", LuaObject.FromDelegate(func)); parser = new LuaParser(context, new StringReader("test(123)")); parser.Parse(); Assert.AreEqual(123.0,res); }
/// <summary> /// 设置包含导出的类型列表 /// </summary> /// <param name="context">Lua上下文对象.</param> /// <param name="classes">导出类型列表.</param> public static void setIncludesClasses(LuaContext context, List <Type> classes) { if (_exportsClasses == null) { _exportsClasses = new Dictionary <int, Dictionary <string, Type> > (); } if (context != null) { Dictionary <string, Type> classesDict = new Dictionary <string, Type> (); foreach (Type t in classes) { classesDict [t.FullName] = t; } _exportsClasses [context.objectId] = classesDict; } }
public override void OnInspectorGUI() { base.OnInspectorGUI(); LuaComponent component = (LuaComponent)target; LuaContext context = component.Context; if (Application.IsPlaying(component)) { GUILayout.Space(12); if (!context.IsRunning()) { EditorGUILayout.LabelField("Lua debug prompt!"); } else { EditorGUILayout.LabelField("Running..."); EditorGUI.BeginDisabledGroup(true); } customLua = EditorGUILayout.TextArea(customLua, new GUILayoutOption[] { GUILayout.Height(120) }); GUILayout.Space(12); if (!context.IsRunning()) { if (GUILayout.Button("Run")) { LuaScript script = new LuaScript(context, customLua); component.StartCoroutine(script.RunRoutine()); } } else { EditorGUI.EndDisabledGroup(); if (GUILayout.Button("Force terminate")) { context.ForceTerminate(); } } GUILayout.Space(6); } }
private static IntPtr _allExportInstanceMethods(int contextId, string className) { LuaContext context = LuaContext.getContext(contextId); if (context != null) { HashSet <string> methodNames = new HashSet <string> (); Type t = _exportsClasses [contextId][className]; if (t != null) { Dictionary <string, MethodInfo> methods = new Dictionary <string, MethodInfo> (); MethodInfo[] methodList = t.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (MethodInfo m in methodList) { if (!m.IsStatic) { methodNames.Add(m.Name); methods [m.Name] = m; } } //放入导出类方法中 _exportsInstanceMethods [className] = methods; } LuaObjectEncoder encoder = new LuaObjectEncoder(); encoder.writeInt32(methodNames.Count); foreach (string name in methodNames) { encoder.writeString(name); } byte[] bytes = encoder.bytes; IntPtr namesPtr = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, namesPtr, bytes.Length); return(namesPtr); } return(IntPtr.Zero); }
public void MethodBinding() { LuaParser parser; var context = new LuaContext(); context.AddBasicLibrary(); context.AddIoLibrary(); double res = 0; var func = (Func <double, double>)((a) => { res = a; return(a + 1); }); context.SetGlobal("test", LuaObject.FromDelegate(func)); parser = new LuaParser(context, new StringReader("test(123)")); parser.Parse(); Assert.AreEqual(123.0, res); }
public static object ToNumber(LuaContext context, object obj, object @base = null) { var numBase = ConvertToNumber(context, @base, 2, 10.0); if (numBase == 10.0) { if (obj is double) return obj; } else if (numBase < 2.0 || numBase > 36.0) { throw new LuaRuntimeException(context, ExceptionMessage.INVOKE_BAD_ARGUMENT, 2, "base out of range"); } string stringStr; if ((stringStr = obj as string) == null) return null; var value = InternalToNumber(stringStr, numBase); return Double.IsNaN(value) ? null : (object)value; }
private static IntPtr _allExportInstanceFieldSetters(int contextId, string className) { LuaContext context = LuaContext.getContext(contextId); if (context != null) { HashSet <string> propNames = new HashSet <string> (); Type t = _exportsClasses [contextId][className]; if (t != null) { Dictionary <string, PropertyInfo> propertys = new Dictionary <string, PropertyInfo> (); PropertyInfo[] propertyList = t.GetProperties(BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo p in propertyList) { propNames.Add(p.Name); propertys [p.Name] = p; } _exportsFieldSetters [className] = propertys; } LuaObjectEncoder encoder = new LuaObjectEncoder(); encoder.writeInt32(propNames.Count); foreach (string name in propNames) { encoder.writeString(name); } byte[] bytes = encoder.bytes; IntPtr namesPtr = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, namesPtr, bytes.Length); return(namesPtr); } return(IntPtr.Zero); }
public CompilerExecutor(LuaContext ctx) { #if DEBUG_WRITE_IL if (asm == null) { asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("DebugIL"), AssemblyBuilderAccess.RunAndSave); var mod = asm.DefineDynamicModule("Debug_IL_Output.dll", "Debug_IL_Output.dll", true); typ = mod.DefineType("DummyType"); } var method = typ.DefineMethod("dyn-" + Guid.NewGuid(), MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, typeof(LuaObject), new Type [] { typeof(LuaContext), typeof(LuaObject[]) }); #else this.method = new DynamicMethod("dyn-" + Guid.NewGuid(), typeof(LuaObject), new Type [] { typeof(LuaContext), typeof(LuaObject[]) }); #endif this.scopes = new Stack <LuaContext> (); this.scopes.Push(ctx); this.stack = new Stack <Expression> (); this.IL = method.GetILGenerator(); this.ctx = Expression.Parameter(typeof(LuaContext), "ctx"); this.args = Expression.Parameter(typeof(LuaObject[]), "args"); this.expression_compiler = new ExpressionCompiler(IL, this.ctx, this.args); }
private bool OpenScript(out string message) { message = ""; if (!CheckConfig(out message)) { return(false); } if (!SetScriptPath()) { message = "Script path not found"; return(false); } if (_luaInstance == null) { _luaInstance = new Dictionary <string, LuaContext>(); } var context = new LuaContext(); if (!Lua.InitializeScript(ref context, _luaScriptPath[_currentVersion], _saveFilePath[_currentVersion], _config?.configs[_currentVersion].encoding, out var error))
public static bool InitializeScript(ref LuaContext luaContext, string luaFile, string saveFile, string encoding, out string message) { message = String.Empty; try { luaContext = new LuaContext(); luaContext.RegisterFunction("edizon", "getSaveFileBuffer", getSaveFileBuffer(saveFile)); luaContext.RegisterFunction("edizon", "getSaveFileString", getSaveFileString(saveFile, encoding)); luaContext.RegisterFunction("", "print", Print()); luaContext.LoadFromFile(luaFile); luaContext.Execute(); } catch (Exception e) { message = e.Message; return(false); } return(true); }
private static IntPtr _instanceMethodInvoke(int contextId, string className, Int64 instance, string methodName, IntPtr argumentsBuffer, int bufferSize) { LuaContext context = LuaContext.getContext(contextId); if (context != null) { Type t = _exportsClasses [contextId] [className]; if (t != null && instance != 0 && _exportsInstanceMethods.ContainsKey(className) && _exportsInstanceMethods [className].ContainsKey(methodName)) { LuaObjectReference objRef = LuaObjectReference.findObject(instance); MethodInfo m = _exportsInstanceMethods [className] [methodName]; if (objRef.target != null && m != null) { ArrayList argsArr = parseMethodParameters(m, argumentsBuffer, bufferSize); object ret = m.Invoke(objRef.target, argsArr != null ? argsArr.ToArray() : null); LuaValue retValue = new LuaValue(ret); LuaObjectEncoder encoder = new LuaObjectEncoder(); encoder.writeObject(retValue); byte[] bytes = encoder.bytes; IntPtr retPtr; retPtr = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, retPtr, bytes.Length); return(retPtr); } } } return(IntPtr.Zero); }
/// <summary> /// Reads a Dialog Scene from an XML document /// </summary> /// <param name="node">The node that represents this scene</param> /// <param name="context">The Lua context to use for this scene</param> /// <returns>A dialog Scene as read from the document</returns> public static DialogueScene ReadFromXML(XmlNode node, LuaContext context) { DialogueScene scene = new DialogueScene(context); if (node.Attributes["name"] != null) { scene.m_name = node.Attributes["name"].Value; } if (node["selector"] != null) { scene.m_initDialogSelector = node["selector"].InnerText; } XmlNode dialogs = node["dialogues"]; foreach (XmlNode dialogNode in dialogs) { if (dialogNode.Name == "dialog") { scene.m_dialogs.Add(DialogueOutput.ReadFromXML(dialogNode)); } } XmlNode choices = node["choices"]; foreach (XmlNode choiceNode in choices) { if (choiceNode.Name == "choice") { scene.m_choices.Add(DialogueChoice.ReadFromXML(choiceNode)); } } return(scene); }
public static object LengthMetamethod(LuaContext context, object obj) { ContractUtils.RequiresNotNull(context, "context"); var metamethod = GetMetamethod(context, obj, Constant.LENGTH_METAMETHOD); if (metamethod != null) return context.DynamicCache.GetDynamicCall1()(metamethod, obj); throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "get length of", BaseLibrary.Type(obj)); }
static object GetRelationalMetamethod(LuaContext context, ExprType op, object left, object right) { var methodName = GetMethodName(op); var metamethodLeft = GetMetamethod(context, left, methodName); var metamethodRight = GetMetamethod(context, right, methodName); return metamethodLeft != metamethodRight ? null : metamethodLeft; }
public static object NumericMetamethod(LuaContext context, ExprType op, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); var methodName = GetMethodName(op); var metamethod = GetMetamethod(context, left, methodName) ?? GetMetamethod(context, right, methodName); if (metamethod != null) return context.DynamicCache.GetDynamicCall2()(metamethod, left, right); var typeName = BaseLibrary.Type(BaseLibrary.ToNumber(context, left) == null ? left : right); throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "perform arithmetic on", typeName); }
public static object NewIndexMetamethod(LuaContext context, object obj, object key, object value) { ContractUtils.RequiresNotNull(context, "context"); var metamethod = GetMetamethod(context, obj, Constant.NEWINDEX_METAMETHOD); if (metamethod != null) { if (metamethod is Delegate) return context.DynamicCache.GetDynamicCall3()(metamethod, obj, key, value); if (metamethod is LuaTable) return context.DynamicCache.GetDynamicNewIndex()(obj, key, value); } if (obj is LuaTable) { return (obj as LuaTable).SetValue(key, value); //var targetParam = Expr.Parameter(typeof(object)); //var keyParam = Expr.Parameter(typeof(object)); //var valParam = Expr.Parameter(typeof(object)); //var expression = Expr.Call( // Expr.Convert(targetParam, typeof(LuaTable)), // MemberInfos.LuaTableSetValue, // keyParam, // valParam); //return Expr.Lambda<Func<object, object, object, object>>( // Expr.Block(typeof(object), // new[] { targetParam, keyParam, valParam }, // expression) // , targetParam, keyParam, valParam).Compile()(obj, key, value); } throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "index", BaseLibrary.Type(obj)); }
public static object RelationalMetamethod(LuaContext context, ExprType op, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); var leftTypeName = BaseLibrary.Type(left); var rightTypeName = BaseLibrary.Type(right); //if (left.GetType() != right.GetType()) // throw new LuaRuntimeException(ExceptionMessage.OP_TYPE_WITH_ERROR, "compare", leftTypeName, rightTypeName); // There are no metamethods for 'a > b' and 'a >= b' so they are translated to 'b < a' and 'b <= a' respectively var invert = op == ExprType.GreaterThan || op == ExprType.GreaterThanOrEqual; var metamethod = GetRelationalMetamethod(context, op, left, right); if (metamethod != null) { if (invert) return context.DynamicCache.GetDynamicCall2()(metamethod, right, left); else return context.DynamicCache.GetDynamicCall2()(metamethod, left, right); } // In the absence of a '<=' metamethod, try '<', 'a <= b' is translated to 'not (b < a)' if (op != ExprType.LessThanOrEqual && op != ExprType.GreaterThanOrEqual) throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_WITH_ERROR, "compare", leftTypeName, rightTypeName); metamethod = GetRelationalMetamethod(context, ExprType.LessThan, left, right); if (metamethod != null) { if (invert) return Not(context.DynamicCache.GetDynamicCall2()(metamethod, right, left)); else return Not(context.DynamicCache.GetDynamicCall2()(metamethod, left, right)); } if (leftTypeName == rightTypeName) throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_TWO_ERROR, "compare", leftTypeName); throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_WITH_ERROR, "compare", leftTypeName, rightTypeName); }
internal LuaTable(LuaContext context, int refId) { this.context = context; this.refId = refId; }
/// <summary> /// 注册模块 /// </summary> /// <param name="context">Lua上下文对象.</param> /// <param name="moduleName">模块名称.</param> /// <param name="t">类型.</param> protected static new void _register(LuaContext context, string moduleName, Type t) { Type baseType = t.BaseType; string superClassName = null; if (baseType != typeof(LuaModule)) { superClassName = LuaModule.moduleName(baseType); if (!context.isModuleRegisted(superClassName)) { //尚未注册父类,进行父类注册 LuaModule.register(context, baseType); } } //获取导出的类/实例方法 Dictionary <string, MethodInfo> exportClassMethods = new Dictionary <string, MethodInfo> (); List <string> exportClassMethodNames = new List <string> (); Dictionary <string, MethodInfo> exportInstanceMethods = new Dictionary <string, MethodInfo> (); List <string> exportInstanceMethodNames = new List <string> (); MethodInfo[] methods = t.GetMethods(); foreach (MethodInfo m in methods) { if (m.IsStatic && m.IsPublic) { //静态和公开的方法会导出到Lua exportClassMethodNames.Add(m.Name); exportClassMethods.Add(m.Name, m); } else if (m.IsPublic) { //实例方法 exportInstanceMethodNames.Add(m.Name); exportInstanceMethods.Add(m.Name, m); } } //获取导出的字段 Dictionary <string, PropertyInfo> exportFields = new Dictionary <string, PropertyInfo> (); List <string> exportSetterNames = new List <string> (); List <string> exportGetterNames = new List <string> (); PropertyInfo[] propertys = t.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo p in propertys) { if (p.CanRead) { exportGetterNames.Add(p.Name); } if (p.CanWrite) { exportSetterNames.Add(p.Name); } exportFields.Add(p.Name, p); } //创建导出的字段数据 IntPtr exportSetterNamesPtr = IntPtr.Zero; if (exportSetterNames.Count > 0) { LuaObjectEncoder fieldEncoder = new LuaObjectEncoder(); fieldEncoder.writeInt32(exportSetterNames.Count); foreach (string name in exportSetterNames) { fieldEncoder.writeString(name); } byte[] fieldNameBytes = fieldEncoder.bytes; exportSetterNamesPtr = Marshal.AllocHGlobal(fieldNameBytes.Length); Marshal.Copy(fieldNameBytes, 0, exportSetterNamesPtr, fieldNameBytes.Length); } IntPtr exportGetterNamesPtr = IntPtr.Zero; if (exportGetterNames.Count > 0) { LuaObjectEncoder fieldEncoder = new LuaObjectEncoder(); fieldEncoder.writeInt32(exportGetterNames.Count); foreach (string name in exportGetterNames) { fieldEncoder.writeString(name); } byte[] fieldNameBytes = fieldEncoder.bytes; exportGetterNamesPtr = Marshal.AllocHGlobal(fieldNameBytes.Length); Marshal.Copy(fieldNameBytes, 0, exportGetterNamesPtr, fieldNameBytes.Length); } //创建导出的实例方法数据 IntPtr exportInstanceMethodNamesPtr = IntPtr.Zero; if (exportInstanceMethodNames.Count > 0) { LuaObjectEncoder instanceMethodEncoder = new LuaObjectEncoder(); instanceMethodEncoder.writeInt32(exportInstanceMethodNames.Count); foreach (string name in exportInstanceMethodNames) { instanceMethodEncoder.writeString(name); } byte[] instMethodNameBytes = instanceMethodEncoder.bytes; exportInstanceMethodNamesPtr = Marshal.AllocHGlobal(instMethodNameBytes.Length); Marshal.Copy(instMethodNameBytes, 0, exportInstanceMethodNamesPtr, instMethodNameBytes.Length); } //创建导出类方法数据 IntPtr exportClassMethodNamesPtr = IntPtr.Zero; if (exportClassMethodNames.Count > 0) { LuaObjectEncoder classMethodEncoder = new LuaObjectEncoder(); classMethodEncoder.writeInt32(exportClassMethodNames.Count); foreach (string name in exportClassMethodNames) { classMethodEncoder.writeString(name); } byte[] classMethodNameBytes = classMethodEncoder.bytes; exportClassMethodNamesPtr = Marshal.AllocHGlobal(classMethodNameBytes.Length); Marshal.Copy(classMethodNameBytes, 0, exportClassMethodNamesPtr, classMethodNameBytes.Length); } //创建实例方法 if (_createInstanceDelegate == null) { _createInstanceDelegate = new LuaInstanceCreateHandleDelegate(_createInstance); } //销毁实例方法 if (_destroyInstanceDelegate == null) { _destroyInstanceDelegate = new LuaInstanceDestroyHandleDelegate(_destroyInstance); } //类描述 if (_instanceDescriptionDelegate == null) { _instanceDescriptionDelegate = new LuaInstanceDescriptionHandleDelegate(_instanceDescription); } //字段获取器 if (_fieldGetterDelegate == null) { _fieldGetterDelegate = new LuaInstanceFieldGetterHandleDelegate(_fieldGetter); } //字段设置器 if (_fieldSetterDelegate == null) { _fieldSetterDelegate = new LuaInstanceFieldSetterHandleDelegate(_fieldSetter); } //实例方法处理器 if (_instanceMethodHandlerDelegate == null) { _instanceMethodHandlerDelegate = new LuaInstanceMethodHandleDelegate(_instanceMethodHandler); } //类方法处理器 if (_classMethodHandleDelegate == null) { _classMethodHandleDelegate = new LuaModuleMethodHandleDelegate(_classMethodHandler); } int nativeId = NativeUtils.registerClass( context.objectId, moduleName, superClassName, exportSetterNamesPtr, exportGetterNamesPtr, exportInstanceMethodNamesPtr, exportClassMethodNamesPtr, Marshal.GetFunctionPointerForDelegate(_createInstanceDelegate), Marshal.GetFunctionPointerForDelegate(_destroyInstanceDelegate), Marshal.GetFunctionPointerForDelegate(_instanceDescriptionDelegate), Marshal.GetFunctionPointerForDelegate(_fieldGetterDelegate), Marshal.GetFunctionPointerForDelegate(_fieldSetterDelegate), Marshal.GetFunctionPointerForDelegate(_instanceMethodHandlerDelegate), Marshal.GetFunctionPointerForDelegate(_classMethodHandleDelegate)); //关联注册模块的注册方法 _exportsClass[nativeId] = t; _exportsClassMethods[nativeId] = exportClassMethods; _exportsInstanceMethods[nativeId] = exportInstanceMethods; _exportsFields[nativeId] = exportFields; if (exportSetterNamesPtr != IntPtr.Zero) { Marshal.FreeHGlobal(exportSetterNamesPtr); } if (exportGetterNamesPtr != IntPtr.Zero) { Marshal.FreeHGlobal(exportGetterNamesPtr); } if (exportInstanceMethodNamesPtr != IntPtr.Zero) { Marshal.FreeHGlobal(exportInstanceMethodNamesPtr); } if (exportClassMethodNamesPtr != IntPtr.Zero) { Marshal.FreeHGlobal(exportClassMethodNamesPtr); } }
public static Object CreateForTab(LuaContext lc, String luaId) { return(LuaForm.activeForm); }
void Start() { LuaContext context = LuaContext.currentContext; context.addSearchPath("LuaScriptCore_Modules/Foundation"); context.addSearchPath("LuaScriptCore_Modules/Network"); context.onException((msg) => { Debug.LogFormat("lua exception = {0}", msg); }); listVC.itemRendererHandler = (cell, data) => { ModuleItemCell itemCell = cell.GetComponent <ModuleItemCell>(); string itemData = Convert.ToString(data); itemCell.titleLabel.text = itemData; itemCell.itemClickHandler = () => { switch (itemData) { case "Foundation": _selectedItem = itemData; listVC.dataSource = new List <string> () { "Encoding", "Path" }; listVC.reloadData(); break; case "Network": _selectedItem = itemData; listVC.dataSource = new List <string> () { "HTTP" }; listVC.reloadData(); break; case "Encoding": _selectedItem = itemData; listVC.dataSource = new List <string> () { "URL Encode", "URL Decode", "Base64 Encode", "Base64 Decode", "JSON Encode", "JSON Decode" }; listVC.reloadData(); break; case "Path": _selectedItem = itemData; listVC.dataSource = new List <string> () { "App Path", "Home Path", "Documents Path", "Caches Path", "Tmp Path", "Exists Path" }; listVC.reloadData(); break; case "HTTP": _selectedItem = itemData; listVC.dataSource = new List <string> () { "GET Request", "POST Request", "Upload File", "Download File" }; listVC.reloadData(); break; case "URL Encode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_urlEncode()"); break; case "URL Decode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_urlDecode()"); break; case "Base64 Encode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_base64Encode()"); break; case "Base64 Decode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_base64Decode()"); break; case "JSON Encode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_jsonEndode()"); break; case "JSON Decode": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Encoding-Sample.lua"); LuaContext.currentContext.evalScript("Encoding_Sample_jsonDecode()"); break; case "App Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_appPath()"); break; case "Home Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_homePath()"); break; case "Documents Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_docsPath()"); break; case "Caches Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_cachesPath()"); break; case "Tmp Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_tmpPath()"); break; case "Exists Path": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Foundation/Sample/Path-Sample.lua"); LuaContext.currentContext.evalScript("Path_Sample_exists()"); break; case "GET Request": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Network/Sample/HTTP-Sample.lua"); LuaContext.currentContext.evalScript("HTTP_Sample_get()"); break; case "POST Request": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Network/Sample/HTTP-Sample.lua"); LuaContext.currentContext.evalScript("HTTP_Sample_post()"); break; case "Upload File": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Network/Sample/HTTP-Sample.lua"); LuaContext.currentContext.evalScript("HTTP_Sample_upload()"); break; case "Download File": LuaContext.currentContext.evalScriptFromFile("LuaScriptCore_Modules/Network/Sample/HTTP-Sample.lua"); LuaContext.currentContext.evalScript("HTTP_Sample_download()"); break; } }; }; listVC.dataSource = new List <string> () { "Foundation", "Network" }; listVC.reloadData(); }
public LuaMapEvent(MapEvent mapEvent) { this.mapEvent = mapEvent; this.context = mapEvent.GetComponent <LuaContext>(); }
/// <summary> /// Creates a new dialog scene with the default name /// </summary> /// <param name="context">The Lua context to use for running sripts</param> public DialogueScene(LuaContext context) : this(context, DEFAULT_NAME) { }
public static object UnaryMinusMetamethod(LuaContext context, object obj) { ContractUtils.RequiresNotNull(context, "context"); var metamethod = GetMetamethod(context, obj, Constant.UNARYMINUS_METAMETHOD); if (metamethod != null) return context.DynamicCache.GetDynamicCall1()(metamethod, obj); throw new LuaRuntimeException(context, ExceptionMessage.OP_TYPE_ERROR, "perform arithmetic on", BaseLibrary.Type(obj)); }
public LuaScript(LuaContext context, DynValue function) { this.context = context; scriptRoutine = context.lua.CreateCoroutine(function).Coroutine; }
public string GetMessage(LuaContext context) { return(ScriptingTools.GetTextEmbedded(m_message, context)); }
public static object EquateMetamethod(LuaContext context, ExprType op, object left, object right) { ContractUtils.RequiresNotNull(context, "context"); var leftTypeName = BaseLibrary.Type(left); var rightTypeName = BaseLibrary.Type(right); if (left == null && right == null) return true; var metamethod = GetRelationalMetamethod(context, op, left, right); if (metamethod != null) return context.DynamicCache.GetDynamicCall2()(metamethod, left, right); else return left == null ? right.Equals(left) : left.Equals(right); }
public LuaUnaryOperationBinder(LuaContext context, ExprType operation) : base(operation) { ContractUtils.RequiresNotNull(context, "context"); this.context = context; }
public LuaCondition(LuaContext context, DynValue scriptFunction) { this.function = scriptFunction; this.context = context; }
public LuaInvokeMemberBinder(LuaContext context, string name, CallInfo callInfo) : base(name, false, callInfo) { ContractUtils.RequiresNotNull(context, "context"); this.context = context; }
public Task OnHttpExtensionProcess(DirectiveDelegate next, HtcHttpContext httpContext, string fileName, string extension) { var luaContext = new LuaContext(httpContext, fileName); return(luaContext.LoadFile() ? luaContext.ProcessRequest() : next(httpContext)); }