Ejemplo n.º 1
0
        public static int getClassMethod(IntPtr luaState)
        {
            ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState);
            object           rawNetObject     = objectTranslator.getRawNetObject(luaState, 1);

            if (rawNetObject == null || !(rawNetObject is IReflect))
            {
                objectTranslator.throwError(luaState, "trying to index an invalid type reference");
                LuaDLL.lua_pushnil(luaState);
                return(1);
            }
            IReflect reflect = (IReflect)rawNetObject;

            if (LuaDLL.lua_isnumber(luaState, 2))
            {
                int num = (int)LuaDLL.lua_tonumber(luaState, 2);
                objectTranslator.push(luaState, Array.CreateInstance(reflect.get_UnderlyingSystemType(), num));
                return(1);
            }
            string text = LuaDLL.lua_tostring(luaState, 2);

            if (text == null)
            {
                LuaDLL.lua_pushnil(luaState);
                return(1);
            }
            return(objectTranslator.metaFunctions.getMember(luaState, reflect, null, text, 73));
        }
Ejemplo n.º 2
0
        public static int getConstructorSignature(IntPtr luaState)
        {
            ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState);
            IReflect         reflect          = null;
            int num = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class");

            if (num != -1)
            {
                reflect = (IReflect)objectTranslator.objects.get_Item(num);
            }
            if (reflect == null)
            {
                objectTranslator.throwError(luaState, "get_constructor_bysig: first arg is invalid type reference");
            }
            Type[] array = new Type[LuaDLL.lua_gettop(luaState) - 1];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = objectTranslator.FindType(LuaDLL.lua_tostring(luaState, i + 2));
            }
            try
            {
                ConstructorInfo constructor = reflect.get_UnderlyingSystemType().GetConstructor(array);
                objectTranslator.pushFunction(luaState, new LuaCSFunction(new LuaMethodWrapper(objectTranslator, null, reflect, constructor).call));
            }
            catch (Exception ex)
            {
                objectTranslator.throwError(luaState, ex.get_Message());
                LuaDLL.lua_pushnil(luaState);
            }
            return(1);
        }
Ejemplo n.º 3
0
 public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType)
 {
     this._Translator = translator;
     this._MethodName = methodName;
     this._TargetType = targetType;
     if (targetType != null)
     {
         this._ExtractTarget = translator.typeChecker.getExtractor(targetType);
     }
     this._BindingType = bindingType;
     this._Members     = targetType.get_UnderlyingSystemType().GetMember(methodName, 8, bindingType | 16 | 1);
 }
Ejemplo n.º 4
0
        public static int callConstructor(IntPtr luaState)
        {
            ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState);
            MethodCache      methodCache      = default(MethodCache);
            object           rawNetObject     = objectTranslator.getRawNetObject(luaState, 1);

            if (rawNetObject == null || !(rawNetObject is IReflect))
            {
                LuaDLL.luaL_error(luaState, "trying to call constructor on an invalid type reference");
                LuaDLL.lua_pushnil(luaState);
                return(1);
            }
            IReflect reflect = (IReflect)rawNetObject;

            LuaDLL.lua_remove(luaState, 1);
            ConstructorInfo[] constructors = reflect.get_UnderlyingSystemType().GetConstructors();
            ConstructorInfo[] array        = constructors;
            for (int i = 0; i < array.Length; i++)
            {
                ConstructorInfo constructorInfo = array[i];
                bool            flag            = objectTranslator.metaFunctions.matchParameters(luaState, constructorInfo, ref methodCache);
                if (flag)
                {
                    try
                    {
                        objectTranslator.push(luaState, constructorInfo.Invoke(methodCache.args));
                    }
                    catch (TargetInvocationException e)
                    {
                        objectTranslator.metaFunctions.ThrowError(luaState, e);
                        LuaDLL.lua_pushnil(luaState);
                    }
                    catch
                    {
                        LuaDLL.lua_pushnil(luaState);
                    }
                    return(1);
                }
            }
            string text = (constructors.Length != 0) ? constructors[0].get_Name() : "unknown";

            LuaDLL.luaL_error(luaState, string.Format("{0} does not contain constructor({1}) argument match", reflect.get_UnderlyingSystemType(), text));
            LuaDLL.lua_pushnil(luaState);
            return(1);
        }
Ejemplo n.º 5
0
 internal ExtractValue getExtractor(IReflect paramType)
 {
     return(this.getExtractor(paramType.get_UnderlyingSystemType()));
 }