lua_isnumber() public static method

public static lua_isnumber ( IntPtr luaState, int index ) : bool
luaState System.IntPtr
index int
return bool
示例#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 length = (int)LuaDLL.lua_tonumber(luaState, 2);
                objectTranslator.push(luaState, Array.CreateInstance(reflect.UnderlyingSystemType, length));
                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, BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.FlattenHierarchy));
        }
示例#2
0
        /*
         * __index metafunction of type references, works on static members.
         */
        private int getClassMethod(KopiLua.Lua.lua_State luaState)
        {
            IReflect klass;
            object   obj = translator.getRawNetObject(luaState, 1);

            if (obj == null || !(obj is IReflect))
            {
                translator.throwError(luaState, "trying to index an invalid type reference");
                LuaDLL.lua_pushnil(luaState);
                return(1);
            }
            else
            {
                klass = (IReflect)obj;
            }
            if (LuaDLL.lua_isnumber(luaState, 2))
            {
                int size = (int)LuaDLL.lua_tonumber(luaState, 2);
                translator.push(luaState, Array.CreateInstance(klass.UnderlyingSystemType, size));
                return(1);
            }
            else
            {
                string methodName = LuaDLL.lua_tostring(luaState, 2);
                if (methodName == null)
                {
                    LuaDLL.lua_pushnil(luaState);
                    return(1);
                }
                else
                {
                    return(getMember(luaState, klass, null, methodName, BindingFlags.FlattenHierarchy | BindingFlags.Static));
                }
            }
        }
示例#3
0
        public static int setFieldOrProperty(IntPtr luaState)
        {
            ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState);
            object           rawNetObject     = objectTranslator.getRawNetObject(luaState, 1);

            if (rawNetObject == null)
            {
                objectTranslator.throwError(luaState, "trying to index and invalid object reference");
                return(0);
            }
            Type   type = rawNetObject.GetType();
            string message;
            bool   flag = objectTranslator.metaFunctions.trySetMember(luaState, type, rawNetObject, BindingFlags.IgnoreCase | BindingFlags.Instance, out message);

            if (flag)
            {
                return(0);
            }
            try
            {
                if (type.IsArray && LuaDLL.lua_isnumber(luaState, 2))
                {
                    int    index  = (int)LuaDLL.lua_tonumber(luaState, 2);
                    Array  array  = (Array)rawNetObject;
                    object asType = objectTranslator.getAsType(luaState, 3, array.GetType().GetElementType());
                    array.SetValue(asType, index);
                }
                else
                {
                    MethodInfo method = type.GetMethod("set_Item");
                    if (method != null)
                    {
                        ParameterInfo[] parameters     = method.GetParameters();
                        Type            parameterType  = parameters[1].ParameterType;
                        object          asType2        = objectTranslator.getAsType(luaState, 3, parameterType);
                        Type            parameterType2 = parameters[0].ParameterType;
                        object          asType3        = objectTranslator.getAsType(luaState, 2, parameterType2);
                        method.Invoke(rawNetObject, new object[]
                        {
                            asType3,
                            asType2
                        });
                    }
                    else
                    {
                        objectTranslator.throwError(luaState, message);
                    }
                }
            }
            catch (SEHException)
            {
                throw;
            }
            catch (Exception e)
            {
                objectTranslator.metaFunctions.ThrowError(luaState, e);
            }
            return(0);
        }
示例#4
0
        private object getAsUlong(IntPtr luaState, int stackPos)
        {
            ulong retVal = (ulong)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#5
0
        private object getAsLong(KopiLua.Lua.lua_State luaState, int stackPos)
        {
            long retVal = (long)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#6
0
        private object getAsUint(KopiLua.Lua.lua_State luaState, int stackPos)
        {
            uint retVal = (uint)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#7
0
        private object getAsFloat(IntPtr luaState, int stackPos)
        {
            float retVal = (float)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#8
0
        private object getAsChar(IntPtr luaState, int stackPos)
        {
            char c = (char)LuaDLL.lua_tonumber(luaState, stackPos);

            if (c == '\0' && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(c);
        }
示例#9
0
        private object getAsLong(IntPtr luaState, int stackPos)
        {
            long num = (long)LuaDLL.lua_tonumber(luaState, stackPos);

            if (num == 0L && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(num);
        }
示例#10
0
        private object getAsUint(IntPtr luaState, int stackPos)
        {
            uint num = (uint)LuaDLL.lua_tonumber(luaState, stackPos);

            if (num == 0u && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(num);
        }
示例#11
0
        private object getAsShort(IntPtr luaState, int stackPos)
        {
            short num = (short)LuaDLL.lua_tonumber(luaState, stackPos);

            if (num == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(num);
        }
示例#12
0
        private object getAsSbyte(IntPtr luaState, int stackPos)
        {
            sbyte b = (sbyte)LuaDLL.lua_tonumber(luaState, stackPos);

            if ((int)b == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(b);
        }
示例#13
0
        /*
         * The following functions return the value in the Lua stack
         * index stackPos as the desired type if it can, or null
         * otherwise.
         */
        private object getAsSbyte(KopiLua.Lua.lua_State luaState, int stackPos)
        {
            sbyte retVal = (sbyte)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#14
0
        private object getAsDecimal(IntPtr luaState, int stackPos)
        {
            decimal retVal = (decimal)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#15
0
        private object getAsByte(IntPtr luaState, int stackPos)
        {
            byte retVal = (byte)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#16
0
        private object getAsDouble(IntPtr luaState, int stackPos)
        {
            double retVal = LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#17
0
        private object getAsChar(IntPtr luaState, int stackPos)
        {
            char retVal = (char)LuaDLL.lua_tonumber(luaState, stackPos);

            if (retVal == 0 && !LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(null);
            }
            return(retVal);
        }
示例#18
0
        public static int luaL_checkinteger(IntPtr L, int stackPos)
        {
            int num = LuaDLL.lua_tointeger(L, stackPos);

            if (num == 0 && LuaDLL.lua_isnumber(L, stackPos) == 0)
            {
                LuaDLL.luaL_typerror(L, stackPos, "number", null);
                return(0);
            }
            return(num);
        }
示例#19
0
        public static double luaL_checknumber(IntPtr L, int stackPos)
        {
            double num = LuaDLL.lua_tonumber(L, stackPos);

            if (num == 0.0 && LuaDLL.lua_isnumber(L, stackPos) == 0)
            {
                LuaDLL.luaL_typerror(L, stackPos, "number", null);
                return(0.0);
            }
            return(num);
        }
示例#20
0
        public static double luaL_checknumber(IntPtr L, int stackPos)
        {
            double d = lua_tonumber(L, stackPos);

            if (d == 0 && LuaDLL.lua_isnumber(L, stackPos) == 0)
            {
                luaL_typerror(L, stackPos, "number");
                return(0);
            }

            return(d);
        }
示例#21
0
        public static T[] CheckParamsNumber <T>(IntPtr L, int stackPos, int count)
        {
            double[] array = new double[count];
            int      i     = 0;

            while (i < count)
            {
                if (LuaDLL.lua_isnumber(L, stackPos) == 0)
                {
                    LuaDLL.luaL_typerror(L, stackPos, LuaMisc.GetTypeName(typeof(T)), null);
                    return(null);
                }
                array[i] = LuaDLL.lua_tonumber(L, stackPos);
                i++;
                stackPos++;
            }
            return((T[])Convert.ChangeType(array, typeof(T[])));
        }
示例#22
0
        public static char[] CheckParamsChar(IntPtr L, int stackPos, int count)
        {
            char[] array = new char[count];
            int    i     = 0;

            while (i < count)
            {
                if (LuaDLL.lua_isnumber(L, stackPos) == 0)
                {
                    LuaDLL.luaL_typerror(L, stackPos, "char", null);
                    return(null);
                }
                array[i] = (char)LuaDLL.lua_tointeger(L, stackPos);
                i++;
                stackPos++;
            }
            return(array);
        }
示例#23
0
        private object getAsColor(IntPtr luaState, int stackPos)
        {
            try
            {
                if (LuaDLL.lua_isnumber(luaState, stackPos))
                {
                    Color retVal = Color.FromArgb((int)(long)LuaDLL.lua_tonumber(luaState, stackPos));
                    return(retVal);
                }
                else if (LuaDLL.lua_isstring(luaState, stackPos))
                {
                    Color retVal = Color.FromName(LuaDLL.lua_tostring(luaState, stackPos));
                    return(retVal);
                }

                return(null);
            }
            catch (Exception)
            {
                return(null);
            }
        }
示例#24
0
        public static T[] CheckParamsNumber <T>(IntPtr L, int stackPos, int count)
        {
            double[] buffer = new double[count];
            int      pos    = 0;

            while (pos < count)
            {
                if (LuaDLL.lua_isnumber(L, stackPos) != 0)
                {
                    buffer[pos] = LuaDLL.lua_tonumber(L, stackPos);
                }
                else
                {
                    LuaDLL.luaL_typerror(L, stackPos, LuaMisc.GetTypeName(typeof(T)));
                    return(null);
                }

                ++pos;
                ++stackPos;
            }

            return((T[])Convert.ChangeType(buffer, typeof(T[])));
        }
示例#25
0
        public static char[] CheckParamsChar(IntPtr L, int stackPos, int count)
        {
            char[] buffer = new char[count];
            int    pos    = 0;

            while (pos < count)
            {
                if (LuaDLL.lua_isnumber(L, stackPos) != 0)
                {
                    buffer[pos] = (char)LuaDLL.lua_tointeger(L, stackPos);
                }
                else
                {
                    LuaDLL.luaL_typerror(L, stackPos, "char");
                    return(null);
                }

                ++pos;
                ++stackPos;
            }

            return(buffer);
        }
示例#26
0
        public static int getClassMethod(IntPtr luaState)
        {
            ObjectTranslator translator = ObjectTranslator.FromState(luaState);
            IReflect         klass;
            object           obj = translator.getRawNetObject(luaState, 1);

            if (obj == null || !(obj is IReflect))
            {
                translator.throwError(luaState, "trying to index an invalid type reference");
                LuaDLL.lua_pushnil(luaState);
                return(1);
            }
            else
            {
                klass = (IReflect)obj;
            }
            if (LuaDLL.lua_isnumber(luaState, 2))
            {
                int size = (int)LuaDLL.lua_tonumber(luaState, 2);
                translator.push(luaState, Array.CreateInstance(klass.UnderlyingSystemType, size));
                return(1);
            }
            else
            {
                string methodName = LuaDLL.lua_tostring(luaState, 2);
                if (methodName == null)
                {
                    LuaDLL.lua_pushnil(luaState);
                    return(1);
                }                 //CP: Ignore case
                else
                {
                    return(translator.metaFunctions.getMember(luaState, klass, null, methodName, BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.IgnoreCase));
                }
            }
        }
示例#27
0
        internal ExtractValue checkType(IntPtr luaState, int stackPos, Type paramType)
        {
            LuaTypes luatype = LuaDLL.lua_type(luaState, stackPos);

            if (paramType.IsByRef)
            {
                paramType = paramType.GetElementType();
            }

            Type underlyingType = Nullable.GetUnderlyingType(paramType);

            if (underlyingType != null)
            {
                paramType = underlyingType;     // Silently convert nullable types to their non null requics
            }

            long runtimeHandleValue = paramType.TypeHandle.Value.ToInt64();

            if (paramType.Equals(typeof(object)))
            {
                return(extractValues[runtimeHandleValue]);
            }

            //CP: Added support for generic parameters
            if (paramType.IsGenericParameter)
            {
                if (luatype == LuaTypes.LUA_TBOOLEAN)
                {
                    return(extractValues[typeof(bool).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TSTRING)
                {
                    return(extractValues[typeof(string).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TTABLE)
                {
                    return(extractValues[typeof(LuaTable).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TUSERDATA)
                {
                    return(extractValues[typeof(object).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TFUNCTION)
                {
                    return(extractValues[typeof(LuaFunction).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TNUMBER)
                {
                    return(extractValues[typeof(double).TypeHandle.Value.ToInt64()]);
                }
                //else // suppress CS0642
                ;    //an unsupported type was encountered
            }

            if (LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(extractValues[runtimeHandleValue]);
            }

            if (paramType == typeof(bool))
            {
                if (LuaDLL.lua_isboolean(luaState, stackPos))
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (paramType == typeof(string))
            {
                if (LuaDLL.lua_isstring(luaState, stackPos))
                {
                    return(extractValues[runtimeHandleValue]);
                }
                else if (luatype == LuaTypes.LUA_TNIL)
                {
                    return(extractNetObject); // kevinh - silently convert nil to a null string pointer
                }
            }
            else if (paramType == typeof(LuaTable))
            {
                if (luatype == LuaTypes.LUA_TTABLE)
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (paramType == typeof(LuaUserData))
            {
                if (luatype == LuaTypes.LUA_TUSERDATA)
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (paramType == typeof(LuaFunction))
            {
                if (luatype == LuaTypes.LUA_TFUNCTION)
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaTypes.LUA_TFUNCTION)
            {
                return(new ExtractValue(new DelegateGenerator(translator, paramType).extractGenerated));
            }
            else if (paramType.IsInterface && luatype == LuaTypes.LUA_TTABLE)
            {
                return(new ExtractValue(new ClassGenerator(translator, paramType).extractGenerated));
            }
            else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaTypes.LUA_TNIL)
            {
                // kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found
                return(extractNetObject);
            }
            else if (LuaDLL.lua_type(luaState, stackPos) == LuaTypes.LUA_TTABLE)
            {
                if (LuaDLL.luaL_getmetafield(luaState, stackPos, "__index"))
                {
                    object obj = translator.getNetObject(luaState, -1);
                    LuaDLL.lua_settop(luaState, -2);
                    if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
                    {
                        return(extractNetObject);
                    }
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                object obj = translator.getNetObject(luaState, stackPos);
                if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
                {
                    return(extractNetObject);
                }
            }

            return(null);
        }
示例#28
0
文件: CheckType.cs 项目: qipa/tolua-2
        internal ExtractValue checkType(IntPtr luaState, int stackPos, Type paramType)
        {
            LuaTypes luatype = LuaDLL.lua_type(luaState, stackPos);

            if (paramType.IsByRef)
            {
                paramType = paramType.GetElementType();
            }

            Type underlyingType = Nullable.GetUnderlyingType(paramType);

            if (underlyingType != null)
            {
                paramType = underlyingType;     // Silently convert nullable types to their non null requics
            }

            long runtimeHandleValue = paramType.TypeHandle.Value.ToInt64();

            if (paramType.Equals(typeof(object)))
            {
                return(extractValues[runtimeHandleValue]);
            }

            //CP: Added support for generic parameters
            if (paramType.IsGenericParameter)
            {
                if (luatype == LuaTypes.LUA_TBOOLEAN)
                {
                    return(extractValues[typeof(bool).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TSTRING)
                {
                    return(extractValues[typeof(string).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TTABLE)
                {
                    return(extractValues[typeof(LuaTable).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TUSERDATA)
                {
                    return(extractValues[typeof(object).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TFUNCTION)
                {
                    return(extractValues[typeof(LuaFunction).TypeHandle.Value.ToInt64()]);
                }
                else if (luatype == LuaTypes.LUA_TNUMBER)
                {
                    return(extractValues[typeof(double).TypeHandle.Value.ToInt64()]);
                }
                //else // suppress CS0642
                ;    //an unsupported type was encountered
            }

            if (paramType.IsValueType && luatype == LuaTypes.LUA_TTABLE)
            {
                int          oldTop = LuaDLL.lua_gettop(luaState);
                ExtractValue ret    = null;
                LuaDLL.lua_pushvalue(luaState, stackPos);
                LuaDLL.lua_pushstring(luaState, "class");
                LuaDLL.lua_gettable(luaState, -2);

                if (!LuaDLL.lua_isnil(luaState, -1))
                {
                    string cls = LuaDLL.lua_tostring(luaState, -1);

                    if (cls == "Vector3" && paramType == typeof(Vector3))
                    {
                        ret = extractValues[typeof(Vector3).TypeHandle.Value.ToInt64()];
                    }
                    else if (cls == "Vector2" && paramType == typeof(Vector2))
                    {
                        ret = extractValues[typeof(Vector2).TypeHandle.Value.ToInt64()];
                    }
                    else if (cls == "Quaternion" && paramType == typeof(Quaternion))
                    {
                        ret = extractValues[typeof(Quaternion).TypeHandle.Value.ToInt64()];
                    }
                    else if (cls == "Color" && paramType == typeof(Color))
                    {
                        ret = extractValues[typeof(Color).TypeHandle.Value.ToInt64()];
                    }
                    else if (cls == "Vector4" && paramType == typeof(Vector4))
                    {
                        ret = extractValues[typeof(Vector4).TypeHandle.Value.ToInt64()];
                    }
                    else if (cls == "Ray" && paramType == typeof(Ray))
                    {
                        ret = extractValues[typeof(Ray).TypeHandle.Value.ToInt64()];
                    }
                    else
                    {
                        ret = null;
                    }
                }

                LuaDLL.lua_settop(luaState, oldTop);

                if (ret != null)
                {
                    return(ret);
                }
            }

            if (LuaDLL.lua_isnumber(luaState, stackPos))
            {
                return(extractValues[runtimeHandleValue]);
            }

            if (paramType == typeof(bool))
            {
                if (LuaDLL.lua_isboolean(luaState, stackPos))
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (paramType == typeof(string))
            {
                if (LuaDLL.lua_isstring(luaState, stackPos))
                {
                    return(extractValues[runtimeHandleValue]);
                }
                else if (luatype == LuaTypes.LUA_TNIL)
                {
                    return(extractNetObject); // kevinh - silently convert nil to a null string pointer
                }
            }
            else if (paramType == typeof(LuaTable))
            {
                if (luatype == LuaTypes.LUA_TTABLE)
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (paramType == typeof(LuaFunction))
            {
                if (luatype == LuaTypes.LUA_TFUNCTION)
                {
                    return(extractValues[runtimeHandleValue]);
                }
            }
            else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaTypes.LUA_TFUNCTION)
            {
#if __NOGEN__
                translator.throwError(luaState, "Delegates not implemnented");
#else
                return(new ExtractValue(new DelegateGenerator(translator, paramType).extractGenerated));
#endif
            }
            else if (paramType.IsInterface && luatype == LuaTypes.LUA_TTABLE)
            {
#if __NOGEN__
                translator.throwError(luaState, "Interfaces not implemnented");
#else
                return(new ExtractValue(new ClassGenerator(translator, paramType).extractGenerated));
#endif
            }
            else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaTypes.LUA_TNIL)
            {
                // kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found
                return(extractNetObject);
            }
            else if (LuaDLL.lua_type(luaState, stackPos) == LuaTypes.LUA_TTABLE)
            {
                if (LuaTypes.LUA_TNIL != LuaDLL.luaL_getmetafield(luaState, stackPos, "__index"))
                {
                    object obj = translator.getNetObject(luaState, -1);
                    LuaDLL.lua_settop(luaState, -2);
                    if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
                    {
                        return(extractNetObject);
                    }
                }
            }
            else
            {
                //object obj = translator.getNetObject(luaState, stackPos);  //topameng 修改这里使支持注册到c#的lua类
                object obj = translator.getRawNetObject(luaState, stackPos);
                if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
                {
                    return(extractNetObject);
                }
            }

            return(null);
        }
示例#29
0
 public bool LuaIsNumber(int idx)
 {
     return(LuaDLL.lua_isnumber(L, idx) != 0);
 }
示例#30
0
        /*
         * __newindex metafunction of CLR objects. Receives the object,
         * the member name and the value to be stored as arguments. Throws
         * and error if the assignment is invalid.
         */
        private int setFieldOrProperty(KopiLua.Lua.lua_State luaState)
        {
            object target = translator.getRawNetObject(luaState, 1);

            if (target == null)
            {
                translator.throwError(luaState, "trying to index and invalid object reference");
                return(0);
            }
            Type type = target.GetType();

            // First try to look up the parameter as a property name
            string detailMessage;
            bool   didMember = trySetMember(luaState, type, target, BindingFlags.Instance, out detailMessage);

            if (didMember)
            {
                return(0);       // Must have found the property name
            }
            // We didn't find a property name, now see if we can use a [] style this accessor to set array contents
            try
            {
                if (type.IsArray && LuaDLL.lua_isnumber(luaState, 2))
                {
                    int index = (int)LuaDLL.lua_tonumber(luaState, 2);

                    Array  arr = (Array)target;
                    object val = translator.getAsType(luaState, 3, arr.GetType().GetElementType());
                    arr.SetValue(val, index);
                }
                else
                {
                    // Try to see if we have a this[] accessor
                    MethodInfo setter = type.GetMethod("set_Item");
                    if (setter != null)
                    {
                        ParameterInfo[] args      = setter.GetParameters();
                        Type            valueType = args[1].ParameterType;

                        // The new val ue the user specified
                        object val = translator.getAsType(luaState, 3, valueType);

                        Type   indexType = args[0].ParameterType;
                        object index     = translator.getAsType(luaState, 2, indexType);

                        object[] methodArgs = new object[2];

                        // Just call the indexer - if out of bounds an exception will happen
                        methodArgs[0] = index;
                        methodArgs[1] = val;

                        setter.Invoke(target, methodArgs);
                    }
                    else
                    {
                        translator.throwError(luaState, detailMessage); // Pass the original message from trySetMember because it is probably best
                    }
                }
            }
#if false
            catch (SEHException)
            {
                // If we are seeing a C++ exception - this must actually be for Lua's private use.  Let it handle it
                throw;
            }
#endif
            catch (Exception e)
            {
                ThrowError(luaState, e);
            }
            return(0);
        }