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)));
 }
Exemple #4
0
        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)));
 }
Exemple #9
0
 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);
 }
Exemple #10
0
        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);
        }
Exemple #11
0
        public void DoFileTest()
        {
            LuaParser parser;

            var context = new LuaContext();
            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "dofile.lua");
            parser.Parse();
        }
Exemple #12
0
        public void FunctionScopesTest()
        {
            LuaParser parser;

            var context = new LuaContext();
            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "functionscopes.lua");
            parser.Parse();
        }
Exemple #13
0
        public void HelloWorldTest()
        {
            LuaParser parser;

            var context = new LuaContext();
            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "helloworld.lua");
            parser.Parse();
        }
Exemple #14
0
        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);
        }
Exemple #15
0
        public void HelloWorldTest()
        {
            LuaParser parser;

            var context = new LuaContext();

            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "helloworld.lua");
            parser.Parse();
        }
Exemple #16
0
        public void FunctionScopesTest()
        {
            LuaParser parser;

            var context = new LuaContext();

            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "functionscopes.lua");
            parser.Parse();
        }
Exemple #17
0
        public void DoFileTest()
        {
            LuaParser parser;

            var context = new LuaContext();

            context.AddBasicLibrary();
            context.AddIoLibrary();

            parser = new LuaParser(context, "dofile.lua");
            parser.Parse();
        }
        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;
        }
Exemple #19
0
        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;
    }
Exemple #21
0
 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);
         }
     }));
 }
Exemple #22
0
        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());
        }
Exemple #23
0
        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));
        }
Exemple #24
0
        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()));
        }
Exemple #25
0
        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
            });
        }
Exemple #26
0
        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);
        }
Exemple #28
0
        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);
        }
Exemple #30
0
        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;
            }
        }
Exemple #32
0
    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);
        }
Exemple #34
0
        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);
        }
Exemple #35
0
        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);
        }
Exemple #37
0
        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))
Exemple #39
0
        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);
        }
Exemple #41
0
        /// <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);
        }
Exemple #42
0
        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));
        }
Exemple #43
0
 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;
 }
Exemple #44
0
        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);
        }
Exemple #45
0
        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));
        }
Exemple #46
0
        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);
        }
Exemple #47
0
 internal LuaTable(LuaContext context, int refId)
 {
     this.context = context;
     this.refId   = refId;
 }
Exemple #48
0
        /// <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();
    }
Exemple #51
0
 public LuaMapEvent(MapEvent mapEvent)
 {
     this.mapEvent = mapEvent;
     this.context  = mapEvent.GetComponent <LuaContext>();
 }
Exemple #52
0
 /// <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)
 {
 }
Exemple #53
0
        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));
        }
Exemple #54
0
 public LuaScript(LuaContext context, DynValue function)
 {
     this.context  = context;
     scriptRoutine = context.lua.CreateCoroutine(function).Coroutine;
 }
Exemple #55
0
 public string GetMessage(LuaContext context)
 {
     return(ScriptingTools.GetTextEmbedded(m_message, context));
 }
Exemple #56
0
        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;
 }
Exemple #58
0
 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;
 }
Exemple #60
0
        public Task OnHttpExtensionProcess(DirectiveDelegate next, HtcHttpContext httpContext, string fileName, string extension)
        {
            var luaContext = new LuaContext(httpContext, fileName);

            return(luaContext.LoadFile() ? luaContext.ProcessRequest() : next(httpContext));
        }