Exemple #1
0
        /* }====================================================== */


        private static void AuxOpen(LuaState L, CharPtr name,
                                    LuaNativeFunction f, LuaNativeFunction u)
        {
            LuaPushCFunction(L, u);
            LuaPushCClosure(L, f, 1);
            LuaSetField(L, -2, name);
        }
Exemple #2
0
        public static void lua_pushcfunction(lua_State L, LuaNativeFunction function)
        {
#if SAVE_FUNC
            savedFn.TryAdd(function);
#endif
            lua_pushcclosure(L, function.ToFunctionPointer(), 0);
        }
Exemple #3
0
        private SharpClass CreateClass(Type classType, Type superType, SharpClass module)
        {
            string name = GetTableName(classType);

            LuaNativeFunction dctor = null;

            if (classType.IsValueType)
            {
                if (!classType.IsUnManaged()) //未注册Wrap,用反射版api, UnmanagedType同Object
                {
                    dctor = gcFn;
                }
            }
            else
            {
                dctor = gcFn;
            }

            LuaRef meta      = CreateClass(module.Meta, name, classType, superType, dctor);
            var    bindClass = new SharpClass(module, meta);

            bindClass.Name = name;
            bindClass.SetClassType(classType);
            registeredClass.Add(classType, bindClass);
            return(bindClass);
        }
Exemple #4
0
        private static int RunFunctionDelegate(LuaState luaState, ObjectTranslator translator)
        {
            LuaNativeFunction func = (LuaNativeFunction)translator.GetRawNetObject(luaState, 1);

            LuaLib.LuaRemove(luaState, 1);
            return(func(luaState));
        }
Exemple #5
0
        public static LuaRef CreateFunction(lua_State L, LuaNativeFunction proc, object obj)
        {
            GCHandle gC = GCHandle.Alloc(obj);

            lua_pushlightuserdata(L, GCHandle.ToIntPtr(gC));
            lua_pushcclosure(L, proc, 1);
            return(PopFromStack(L));
        }
Exemple #6
0
        public static LuaNativeFunction lua_atpanic(lua_State L, LuaNativeFunction panicFunction)
        {
#if SAVE_FUNC
            savedFn.TryAdd(panicFunction);
#endif
            IntPtr newPanicPtr = panicFunction.ToFunctionPointer();
            return(lua_atpanic(L, newPanicPtr).ToLuaFunction());
        }
Exemple #7
0
 public static LuaNativeFunction LuaAtPanic(LuaState L, LuaNativeFunction panicf)
 {
     LuaNativeFunction old;
     LuaLock(L);
     old = G(L).panic;
     G(L).panic = panicf;
     LuaUnlock(L);
     return old;
 }
Exemple #8
0
 public Lua()
 {
     luaState = LuaLib.LuaLNewState();                   // steffenj: Lua 5.1.1 API change (lua_open is gone)
     LuaLib.LuaLOpenLibs(luaState);                      // steffenj: Lua 5.1.1 API change (luaopen_base is gone, just open all libs right here)
     Init();
     // We need to keep this in a managed reference so the delegate doesn't get garbage collected
     panicCallback = new LuaNativeFunction(PanicCallback);
     LuaLib.LuaAtPanic(luaState, panicCallback);
 }
Exemple #9
0
 public Lua()
 {
     luaState = LuaLib.LuaLNewState();
     LuaLib.LuaLOpenLibs(luaState);
     Init();
     // We need to keep this in a managed reference so the delegate doesn't get garbage collected
     panicCallback = new LuaNativeFunction(PanicCallback);
     LuaLib.LuaAtPanic(luaState, panicCallback);
 }
Exemple #10
0
        public void RegFunction(string name, LuaNativeFunction func)
        {
            if (!TryGetValue(name, out var methodWraper))
            {
                methodWraper = new MethodWraper();
                Add(name, methodWraper);
            }

            methodWraper.func = func;
        }
Exemple #11
0
        public static LuaNativeFunction LuaAtPanic(LuaState L, LuaNativeFunction panicf)
        {
            LuaNativeFunction old;

            LuaLock(L);
            old        = G(L).panic;
            G(L).panic = panicf;
            LuaUnlock(L);
            return(old);
        }
Exemple #12
0
        public static void lua_register(lua_State L, string n, LuaNativeFunction f)
        {
#if SAVE_FUNC
            savedFn.TryAdd(f);
#endif
            lua_pushcfunction(L, (f));
            var p = Marshal.StringToHGlobalAnsi(n);
            lua_setglobal(L, (byte *)(p));
            Marshal.FreeHGlobal(p);
        }
Exemple #13
0
        /*
         * Registers an object's method as a Lua function (global or table field)
         * The method may have any signature
         */
        public LuaFunction RegisterFunction(string path, LuaNativeFunction function)
        {
            int oldTop = LuaLib.LuaGetTop(luaState);

            translator.Push(luaState, function);
            this[path] = translator.GetObject(luaState, -1);
            var f = GetFunction(path);

            LuaLib.LuaSetTop(luaState, oldTop);
            return(f);
        }
Exemple #14
0
        public void RegProperty(string name, LuaNativeFunction getter, LuaNativeFunction setter = null)
        {
            if (!TryGetValue(name, out var methodWraper))
            {
                methodWraper = new MethodWraper();
                Add(name, methodWraper);
            }

            methodWraper.getter = getter;
            methodWraper.setter = setter;
        }
Exemple #15
0
        public static LuaNativeFunction LuaToCFunction(IntPtr luaState, int index)
        {
            IntPtr ptr = NativeMethods.LuaToCFunction(luaState, index);

            if (ptr == IntPtr.Zero)
            {
                return(null);
            }
            LuaNativeFunction function = Marshal.GetDelegateForFunctionPointer(ptr, typeof(LuaNativeFunction)) as LuaNativeFunction;

            return(function);
        }
Exemple #16
0
        /// <summary>
        /// Registers the given function to the current table on the stack top.
        /// </summary>
        /// <param name="state"></param>
        /// <param name="name"></param>
        /// <param name="func"></param>
        public static void RegisterTableFunction(this NLua.Lua state, string name, LuaNativeFunction func)
        {
            // Do not continue if we are not a table..
            var isTable = NLua.LuaLib.LuaType(state.GetState(), -1) == LuaTypes.Table;
            if (!isTable)
                return;

            // Push the name, function, and set the table..
            NLua.LuaLib.LuaPushString(state.GetState(), name);
            NLua.LuaLib.LuaPushStdCallCFunction(state.GetState(), func);
            NLua.LuaLib.LuaRawSet(state.GetState(), -3);
        }
Exemple #17
0
        public static int LuaCPCall(LuaState L, LuaNativeFunction func, object ud)
        {
            CCallS c = new CCallS();
            int    status;

            LuaLock(L);
            c.func = func;
            c.ud   = ud;
            status = LuaDPCall(L, FunctionCCall, c, SaveStack(L, L.top), 0);
            LuaUnlock(L);
            return(status);
        }
Exemple #18
0
        public static void lua_pushcclosure(lua_State L, LuaNativeFunction function, int n)
        {
            //Delegate
            if (!function.Method.IsDefined(typeof(AOT.MonoPInvokeCallbackAttribute), false))
            {
                assert(false);
            }
#if SAVE_FUNC
            savedFn.TryAdd(function);
#endif
            lua_pushcclosure(L, function.ToFunctionPointer(), n);
        }
Exemple #19
0
 public MetaFunctions(ObjectTranslator translator)
 {
     this.translator         = translator;
     gcFunction              = new LuaNativeFunction(MetaFunctions.CollectObject);
     toStringFunction        = new LuaNativeFunction(MetaFunctions.ToStringLua);
     indexFunction           = new LuaNativeFunction(MetaFunctions.GetMethod);
     newindexFunction        = new LuaNativeFunction(MetaFunctions.SetFieldOrProperty);
     baseIndexFunction       = new LuaNativeFunction(MetaFunctions.GetBaseMethod);
     callConstructorFunction = new LuaNativeFunction(MetaFunctions.CallConstructor);
     classIndexFunction      = new LuaNativeFunction(MetaFunctions.GetClassMethod);
     classNewindexFunction   = new LuaNativeFunction(MetaFunctions.SetClassFieldOrProperty);
     execDelegateFunction    = new LuaNativeFunction(MetaFunctions.RunFunctionDelegate);
 }
Exemple #20
0
        public static IntPtr ToFunctionPointer(this LuaNativeFunction d)
        {
            if (d == null)
            {
                return(IntPtr.Zero);
            }

#if NETFRAMEWORK
            return(Marshal.GetFunctionPointerForDelegate(d));
#else
            return(Marshal.GetFunctionPointerForDelegate <LuaNativeFunction>(d));
#endif
        }
Exemple #21
0
        /// <summary>
        /// Creates and saves reference to function, so it's not garbage
        /// collected.
        /// </summary>
        /// <param name="function"></param>
        public static LuaNativeFunction CreateFunctionReference(IntPtr L, LuaNativeFunction function)
        {
            if (!_functions.TryGetValue(L, out List <LuaNativeFunction> list) || list == null)
            {
                list = _functions[L] = new List <LuaNativeFunction>();
            }

            var func = new LuaNativeFunction(function);

            list.Add(func);

            return(func);
        }
Exemple #22
0
		public MetaFunctions (ObjectTranslator translator)
		{
			this.translator = translator;
			gcFunction = new LuaNativeFunction (MetaFunctions.CollectObject);
			toStringFunction = new LuaNativeFunction (MetaFunctions.ToStringLua);
			indexFunction = new LuaNativeFunction (MetaFunctions.GetMethod);
			newindexFunction = new LuaNativeFunction (MetaFunctions.SetFieldOrProperty);
			baseIndexFunction = new LuaNativeFunction (MetaFunctions.GetBaseMethod);
			callConstructorFunction = new LuaNativeFunction (MetaFunctions.CallConstructor);
			classIndexFunction = new LuaNativeFunction (MetaFunctions.GetClassMethod);
			classNewindexFunction = new LuaNativeFunction (MetaFunctions.SetClassFieldOrProperty);
			execDelegateFunction = new LuaNativeFunction (MetaFunctions.RunFunctionDelegate);
		}
Exemple #23
0
		/*
		 * Constructs the wrapper for a known MethodBase instance
		 */
		public LuaMethodWrapper (ObjectTranslator translator, object target, ProxyType targetType, MethodBase method)
		{
			invokeFunction = new LuaNativeFunction (this.Call);
			_Translator = translator;
			_Target = target;

			if (targetType != null)
				_ExtractTarget = translator.typeChecker.GetExtractor (targetType);

			_Method = method;
			_MethodName = method.Name;
			_IsStatic = method.IsStatic;
		}
        /// <summary>
        /// Constructs the wrapper for a known method name
        /// </summary>
        /// <param name="translator"></param>
        /// <param name="targetType"></param>
        /// <param name="methodName"></param>
        /// <param name="bindingType"></param>
        public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType)
        {
            invokeFunction = new LuaNativeFunction(this.Call);

            _Translator = translator;
            _MethodName = methodName;

            if (targetType != null)
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);

            _BindingType = bindingType;
            //CP: Removed NonPublic binding search and added IgnoreCase
            _Members = targetType.UnderlyingSystemType.GetMember(methodName, MemberTypes.Method, bindingType | BindingFlags.Public | BindingFlags.IgnoreCase/*|BindingFlags.NonPublic*/);
        }
Exemple #25
0
        /// <summary>
        /// Creates a function reference to a function and stores it in <see cref="Functions"/>.
        /// </summary>
        public static LuaNativeFunction GetFunctionRef(IntPtr L, LuaNativeFunction function)
        {
            List <LuaNativeFunction> list;

            if (!Functions.TryGetValue(L, out list) || list == null)
            {
                list = Functions[L] = new List <LuaNativeFunction>();
            }

            var func = new LuaNativeFunction(function);

            list.Add(func);

            return(func);
        }
        /*
         * Constructs the wrapper for a known method name
         */
        public LuaMethodWrapper(ObjectTranslator translator, ProxyType targetType, string methodName, BindingFlags bindingType)
        {
            invokeFunction = new LuaNativeFunction(this.Call);

            _Translator = translator;
            _MethodName = methodName;

            if (targetType != null)
            {
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);
            }

            _BindingType = bindingType;
            _Members     = targetType.UnderlyingSystemType.GetMember(methodName, MemberTypes.Method, bindingType | BindingFlags.Public);
        }
Exemple #27
0
        public static LuaNativeFunction LuaToCFunction(IntPtr luaState, int index)
        {
            IntPtr ptr = NativeMethods.LuaToCFunction(luaState, index);

            if (ptr == IntPtr.Zero)
            {
                return(null);
            }
#if NETFX_CORE
            LuaNativeFunction function = Marshal.GetDelegateForFunctionPointer <LuaNativeFunction> (ptr);
#else
            LuaNativeFunction function = Marshal.GetDelegateForFunctionPointer(ptr, typeof(LuaNativeFunction)) as LuaNativeFunction;
#endif
            return(function);
        }
Exemple #28
0
        /*
         * Constructs the wrapper for a known method name
         */
        public LuaMethodWrapper(ObjectTranslator translator, ProxyType targetType, string methodName, BindingFlags bindingType)
        {
            invokeFunction = new LuaNativeFunction(this.Call);

            _Translator = translator;
            _MethodName = methodName;

            if (targetType != null)
            {
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);
            }

            _IsStatic = (bindingType & BindingFlags.Static) == BindingFlags.Static;
            _Members  = GetMethodsRecursively(targetType.UnderlyingSystemType, methodName, bindingType | BindingFlags.Public);
        }
Exemple #29
0
        /*
         * Constructs the wrapper for a known MethodBase instance
         */
        public LuaMethodWrapper(ObjectTranslator translator, object target, ProxyType targetType, MethodBase method)
        {
            invokeFunction = new LuaNativeFunction(this.Call);
            _Translator    = translator;
            _Target        = target;

            if (targetType != null)
            {
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);
            }

            _Method     = method;
            _MethodName = method.Name;
            _IsStatic   = method.IsStatic;
        }
Exemple #30
0
        /*
         * Constructs the wrapper for a known method name
         */
        public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType)
        {
            invokeFunction = new LuaNativeFunction(this.Call);

            _Translator = translator;
            _MethodName = methodName;

            if (targetType != null)
            {
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);
            }

            _BindingType = bindingType;
            //CP: Removed NonPublic binding search and added IgnoreCase
            _Members = targetType.UnderlyingSystemType.GetMember(methodName, MemberTypes.Method, bindingType | BindingFlags.Public | BindingFlags.IgnoreCase /*|BindingFlags.NonPublic*/);
        }
Exemple #31
0
        public void AddSearcher(LuaNativeFunction searcher)
        {
            var state = State;

            lua_getglobal(L, "package");
            lua_getfield(L, -1, "searchers");
            lua_pushcfunction(L, searcher);

            for (long i = luaL_len(L, -2) + 1; i > 2; i--)
            {
                lua_rawgeti(L, -2, i - 1);
                lua_rawseti(L, -3, i);
            }

            lua_rawseti(L, -2, 2);
            lua_pop(L, 2);
        }
		/*
		 * Constructs the wrapper for a known MethodBase instance
		 */
		public LuaMethodWrapper (ObjectTranslator translator, object target, IReflect targetType, MethodBase method)
		{
			invokeFunction = new LuaNativeFunction (this.Call);
			_Translator = translator;
			_Target = target;

			if (targetType != null)
				_ExtractTarget = translator.typeChecker.GetExtractor (targetType);

			_Method = method;
			_MethodName = method.Name;

			if (method.IsStatic)
				_BindingType = BindingFlags.Static;
			else
				_BindingType = BindingFlags.Instance;
		}
Exemple #33
0
        public static void LuaPushCClosure(LuaState L, LuaNativeFunction fn, int n)
        {
            Closure cl;

            LuaLock(L);
            LuaCCheckGC(L);
            CheckNElements(L, n);
            cl     = LuaFNewCclosure(L, n, GetCurrentEnv(L));
            cl.c.f = fn;
            L.top -= n;
            while (n-- != 0)
            {
                SetObj2N(L, cl.c.upvalue[n], L.top + n);
            }
            SetCLValue(L, L.top, cl);
            LuaAssert(IsWhite(obj2gco(cl)));
            IncrementTop(L);
            LuaUnlock(L);
        }
Exemple #34
0
        public ObjectTranslator(Lua interpreter, LuaState luaState)
        {
            this.interpreter = interpreter;
            typeChecker      = new CheckType(this);
            metaFunctions    = new MetaFunctions(this);
            assemblies       = new List <Assembly> ();

            importTypeFunction        = new LuaNativeFunction(ObjectTranslator.ImportType);
            loadAssemblyFunction      = new LuaNativeFunction(ObjectTranslator.LoadAssembly);
            registerTableFunction     = new LuaNativeFunction(ObjectTranslator.RegisterTable);
            unregisterTableFunction   = new LuaNativeFunction(ObjectTranslator.UnregisterTable);
            getMethodSigFunction      = new LuaNativeFunction(ObjectTranslator.GetMethodSignature);
            getConstructorSigFunction = new LuaNativeFunction(ObjectTranslator.GetConstructorSignature);

            CreateLuaObjectList(luaState);
            CreateIndexingMetaFunction(luaState);
            CreateBaseClassMetatable(luaState);
            CreateClassMetatable(luaState);
            CreateFunctionMetatable(luaState);
            SetGlobalFunctions(luaState);
        }
Exemple #35
0
        /*
         * Constructs the wrapper for a known MethodBase instance
         */
        public LuaMethodWrapper(ObjectTranslator translator, object target, IReflect targetType, MethodBase method)
        {
            invokeFunction = new LuaNativeFunction(this.Call);
            _Translator    = translator;
            _Target        = target;

            if (targetType != null)
            {
                _ExtractTarget = translator.typeChecker.GetExtractor(targetType);
            }

            _Method     = method;
            _MethodName = method.Name;

            if (method.IsStatic)
            {
                _BindingType = BindingFlags.Static;
            }
            else
            {
                _BindingType = BindingFlags.Instance;
            }
        }
        public ObjectTranslator(Lua interpreter, LuaState luaState)
        {
            this.interpreter = interpreter;
            typeChecker = new CheckType(this);
            metaFunctions = new MetaFunctions(this);
            assemblies = new List<Assembly>();

            importTypeFunction = new LuaNativeFunction(ObjectTranslator.ImportType);
            loadAssemblyFunction = new LuaNativeFunction(ObjectTranslator.LoadAssembly);
            registerTableFunction = new LuaNativeFunction(ObjectTranslator.RegisterTable);
            unregisterTableFunction = new LuaNativeFunction(ObjectTranslator.UnregisterTable);
            getMethodSigFunction = new LuaNativeFunction(ObjectTranslator.GetMethodSignature);
            getConstructorSigFunction = new LuaNativeFunction(ObjectTranslator.GetConstructorSignature);
            ctypeFunction = new LuaNativeFunction(ObjectTranslator.CType);
            enumFromIntFunction = new LuaNativeFunction(ObjectTranslator.EnumFromInt);

            CreateLuaObjectList(luaState);
            CreateIndexingMetaFunction(luaState);
            CreateBaseClassMetatable(luaState);
            CreateClassMetatable(luaState);
            CreateFunctionMetatable(luaState);
            SetGlobalFunctions(luaState);
        }
Exemple #37
0
 public static void LuaPushCFunction(LuaState L, LuaNativeFunction f)
 {
     LuaPushCClosure(L, f, 0);
 }
Exemple #38
0
 public static void LuaRegister(LuaState L, CharPtr n, LuaNativeFunction f)
 {
     LuaPushCFunction(L, f);
     LuaSetGlobal(L, n);
 }
Exemple #39
0
 public static void LuaPushCClosure(LuaState L, LuaNativeFunction fn, int n)
 {
     Closure cl;
     LuaLock(L);
     LuaCCheckGC(L);
     CheckNElements(L, n);
     cl = LuaFNewCclosure(L, n, GetCurrentEnv(L));
     cl.c.f = fn;
     L.top -= n;
     while (n-- != 0)
         SetObj2N(L, cl.c.upvalue[n], L.top + n);
     SetCLValue(L, L.top, cl);
     LuaAssert(IsWhite(obj2gco(cl)));
     IncrementTop(L);
     LuaUnlock(L);
 }
Exemple #40
0
		public LuaFunction (int reference, Lua interpreter)
		{
			_Reference = reference;
			this.function = null;
			_Interpreter = interpreter;
		}
Exemple #41
0
		public Lua ()
		{
			luaState = LuaLib.LuaLNewState ();	// steffenj: Lua 5.1.1 API change (lua_open is gone)
			LuaLib.LuaLOpenLibs (luaState);		// steffenj: Lua 5.1.1 API change (luaopen_base is gone, just open all libs right here)
			Init ();
			// We need to keep this in a managed reference so the delegate doesn't get garbage collected
			panicCallback = new LuaNativeFunction (PanicCallback);
			LuaLib.LuaAtPanic (luaState, panicCallback);
		}
Exemple #42
0
		public static void LuaAtPanic (IntPtr luaState, LuaNativeFunction panicf)
		{
			IntPtr fnpanic = Marshal.GetFunctionPointerForDelegate (panicf);
			NativeMethods.LuaAtPanic (luaState, fnpanic);
		}
		/*
		 * Constructs the wrapper for a known method name
		 */
		public LuaMethodWrapper (ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType)
		{
			invokeFunction = new LuaNativeFunction (this.Call);

			_Translator = translator;
			_MethodName = methodName;

			if (targetType != null)
				_ExtractTarget = translator.typeChecker.GetExtractor (targetType);

			_BindingType = bindingType;
			_Members = targetType.UnderlyingSystemType.GetMember (methodName, MemberTypes.Method, bindingType | BindingFlags.Public);
		}
Exemple #44
0
 public static void LuaPushStdCallCFunction(LuaState luaState, LuaNativeFunction function)
 {
     LuaPushCFunction (luaState, function);
 }
Exemple #45
0
		  public LuaLReg(CharPtr name, LuaNativeFunction func) {
			  this.name = name;
			  this.func = func;
		  }
Exemple #46
0
 /* }====================================================== */
 private static void AuxOpen(LuaState L, CharPtr name,
     LuaNativeFunction f, LuaNativeFunction u)
 {
     LuaPushCFunction(L, u);
       LuaPushCClosure(L, f, 1);
       LuaSetField(L, -2, name);
 }
Exemple #47
0
		public static void LuaAtPanic (LuaState luaState, LuaNativeFunction panicf)
		{
			LuaCore.LuaAtPanic (luaState, (LuaNativeFunction)panicf);
		}
Exemple #48
0
		/*
		 * Constructs the wrapper for a known method name
		 */
		public LuaMethodWrapper (ObjectTranslator translator, ProxyType targetType, string methodName, BindingFlags bindingType)
		{
			invokeFunction = new LuaNativeFunction (this.Call);

			_Translator = translator;
			_MethodName = methodName;

			if (targetType != null)
				_ExtractTarget = translator.typeChecker.GetExtractor (targetType);

			_IsStatic = (bindingType & BindingFlags.Static) == BindingFlags.Static;
			_Members  = GetMethodsRecursively (targetType.UnderlyingSystemType, methodName, bindingType | BindingFlags.Public);
		}
Exemple #49
0
 public static int LuaCPCall(LuaState L, LuaNativeFunction func, object ud)
 {
     CCallS c = new CCallS();
     int status;
     LuaLock(L);
     c.func = func;
     c.ud = ud;
     status = LuaDPCall(L, FunctionCCall, c, SaveStack(L, L.top), 0);
     LuaUnlock(L);
     return status;
 }
 /*
  * Pushes a delegate into the stack
  */
 internal void PushFunction(LuaState luaState, LuaNativeFunction func)
 {
     PushObject(luaState, func, "luaNet_function");
 }
Exemple #51
0
		public LuaFunction (LuaNativeFunction function, Lua interpreter)
		{
			_Reference = 0;
			this.function = function;
			_Interpreter = interpreter;
		}
Exemple #52
0
 private static void NewFEnv(LuaState L, LuaNativeFunction cls)
 {
     LuaCreateTable(L, 0, 1);
     LuaPushCFunction(L, cls);
     LuaSetField(L, -2, "__close");
 }
Exemple #53
0
		int GetExtensionMethod (LuaState luaState, Type type, object obj, string name)
		{
			object cachedMember = CheckMemberCache (memberCache, type, name);

			if (cachedMember != null && cachedMember is LuaNativeFunction) {
					translator.PushFunction (luaState, (LuaNativeFunction)cachedMember);
					translator.Push (luaState, true);
					return 2;
			}

			MethodInfo methodInfo = translator.GetExtensionMethod (type, name);
			var wrapper = new LuaNativeFunction ((new LuaMethodWrapper (translator, obj, type, methodInfo)).invokeFunction);

			SetMemberCache (memberCache, type, name, wrapper);

			translator.PushFunction (luaState, wrapper);
			translator.Push (luaState, true);
			return 2;			
		}
Exemple #54
0
		internal void PushCSFunction (LuaNativeFunction function)
		{
			translator.PushFunction (luaState, function);
		}
Exemple #55
0
		/*
		 * Pushes the value of a member or a delegate to call it, depending on the type of
		 * the member. Works with static or instance members.
		 * Uses reflection to find members, and stores the reflected MemberInfo object in
		 * a cache (indexed by the type of the object and the name of the member).
		 */
		int GetMember (LuaState luaState, IReflect objType, object obj, string methodName, BindingFlags bindingType)
		{
			bool implicitStatic = false;
			MemberInfo member = null;
			object cachedMember = CheckMemberCache (memberCache, objType, methodName);

			if (cachedMember is LuaNativeFunction) {
				translator.PushFunction (luaState, (LuaNativeFunction)cachedMember);
				translator.Push (luaState, true);
				return 2;
			} else if (cachedMember != null)
				member = (MemberInfo)cachedMember;
			else {
				var members = objType.GetMember (methodName, bindingType | BindingFlags.Public);

				if (members.Length > 0)
					member = members [0];
				else {
					// If we can't find any suitable instance members, try to find them as statics - but we only want to allow implicit static
					members = objType.GetMember (methodName, bindingType | BindingFlags.Static | BindingFlags.Public);

					if (members.Length > 0) {
						member = members [0];
						implicitStatic = true;
					}
				}
			}

			if (member != null) {
				if (member.MemberType == MemberTypes.Field) {
					var field = (FieldInfo)member;

					if (cachedMember == null)
						SetMemberCache (memberCache, objType, methodName, member);

					try {
						translator.Push (luaState, field.GetValue (obj));
					} catch {
						LuaLib.LuaPushNil (luaState);
					}
				} else if (member.MemberType == MemberTypes.Property) {
					var property = (PropertyInfo)member;
					if (cachedMember == null)
						SetMemberCache (memberCache, objType, methodName, member);

					try {
						object val = property.GetValue (obj, null);
						translator.Push (luaState, val);
					} catch (ArgumentException) {
						// If we can't find the getter in our class, recurse up to the base class and see
						// if they can help.
						if (objType is Type && !(((Type)objType) == typeof(object)))
							return GetMember (luaState, ((Type)objType).BaseType, obj, methodName, bindingType);
						else
							LuaLib.LuaPushNil (luaState);
					} catch (TargetInvocationException e) {  // Convert this exception into a Lua error
						ThrowError (luaState, e);
						LuaLib.LuaPushNil (luaState);
					}
				} else if (member.MemberType == MemberTypes.Event) {
					var eventInfo = (EventInfo)member;
					if (cachedMember == null)
						SetMemberCache (memberCache, objType, methodName, member);

					translator.Push (luaState, new RegisterEventHandler (translator.pendingEvents, obj, eventInfo));
				} else if (!implicitStatic) {
					if (member.MemberType == MemberTypes.NestedType) {
						// kevinh - added support for finding nested types
						// cache us
						if (cachedMember == null)
							SetMemberCache (memberCache, objType, methodName, member);

						// Find the name of our class
						string name = member.Name;
						var dectype = member.DeclaringType;

						// Build a new long name and try to find the type by name
						string longname = dectype.FullName + "+" + name;
						var nestedType = translator.FindType (longname);
						translator.PushType (luaState, nestedType);
					} else {
						// Member type must be 'method'
						var wrapper = new LuaNativeFunction ((new LuaMethodWrapper (translator, objType, methodName, bindingType)).invokeFunction);

						if (cachedMember == null)
							SetMemberCache (memberCache, objType, methodName, wrapper);

						translator.PushFunction (luaState, wrapper);
						translator.Push (luaState, true);
						return 2;
					}
				} else {
					// If we reach this point we found a static method, but can't use it in this context because the user passed in an instance
					translator.ThrowError (luaState, "can't pass instance to static method " + methodName);
					LuaLib.LuaPushNil (luaState);
				}
			} else {
				// kevinh - we want to throw an exception because meerly returning 'nil' in this case
				// is not sufficient.  valid data members may return nil and therefore there must be some
				// way to know the member just doesn't exist.
				translator.ThrowError (luaState, "unknown member name " + methodName);
				LuaLib.LuaPushNil (luaState);
			}

			// push false because we are NOT returning a function (see luaIndexFunction)
			translator.Push (luaState, false);
			return 2;
		}
Exemple #56
0
		/*
		 * Pushes a delegate into the stack
		 */
		internal void PushFunction (LuaState luaState, LuaNativeFunction func)
		{
			PushObject (luaState, func, "luaNet_function");
		}
Exemple #57
0
		public MetaFunctions (ObjectTranslator translator)
		{
			this.translator = translator;
			GcFunction = new LuaNativeFunction (MetaFunctions.CollectObject);
			ToStringFunction = new LuaNativeFunction (MetaFunctions.ToStringLua);
			IndexFunction = new LuaNativeFunction (MetaFunctions.GetMethod);
			NewIndexFunction = new LuaNativeFunction (MetaFunctions.SetFieldOrProperty);
			BaseIndexFunction = new LuaNativeFunction (MetaFunctions.GetBaseMethod);
			CallConstructorFunction = new LuaNativeFunction (MetaFunctions.CallConstructor);
			ClassIndexFunction = new LuaNativeFunction (MetaFunctions.GetClassMethod);
			ClassNewindexFunction = new LuaNativeFunction (MetaFunctions.SetClassFieldOrProperty);
			ExecuteDelegateFunction = new LuaNativeFunction (MetaFunctions.RunFunctionDelegate);
			AddFunction = new LuaNativeFunction (MetaFunctions.AddLua);
			SubtractFunction = new LuaNativeFunction (MetaFunctions.SubtractLua);
			MultiplyFunction = new LuaNativeFunction (MetaFunctions.MultiplyLua);
			DivisionFunction = new LuaNativeFunction (MetaFunctions.DivideLua);
			ModulosFunction = new LuaNativeFunction (MetaFunctions.ModLua);
			UnaryNegationFunction = new LuaNativeFunction (MetaFunctions.UnaryNegationLua);
			EqualFunction = new LuaNativeFunction (MetaFunctions.EqualLua);
			LessThanFunction = new LuaNativeFunction (MetaFunctions.LessThanLua);
			LessThanOrEqualFunction = new LuaNativeFunction (MetaFunctions.LessThanOrEqualLua);
		}
Exemple #58
0
		public static void LuaPushStdCallCFunction (IntPtr luaState, LuaNativeFunction fn)
		{
			IntPtr pfunc = Marshal.GetFunctionPointerForDelegate (fn);
			NativeMethods.LuaPushStdCallCFunction (luaState, pfunc);
		}
Exemple #59
0
		public Lua ()
		{
			luaState = LuaLib.LuaLNewState ();
			LuaLib.LuaLOpenLibs (luaState);
			Init ();
			// We need to keep this in a managed reference so the delegate doesn't get garbage collected
			panicCallback = new LuaNativeFunction (PanicCallback);
			LuaLib.LuaAtPanic (luaState, panicCallback);
		}