private static int indexInt(IntPtr l, object self, int index)
        {
            Type type = LuaVarObject.getType(self);

            if (self is IList)
            {
                LuaObject.pushValue(l, true);
                LuaObject.pushVar(l, (self as IList)[index]);
                return(2);
            }
            if (self is IDictionary)
            {
                IDictionary dictionary = (IDictionary)self;
                object      obj        = index;
                if (type.IsGenericType)
                {
                    Type type2 = type.GetGenericArguments()[0];
                    if (type2.IsEnum)
                    {
                        LuaObject.pushValue(l, true);
                        LuaObject.pushVar(l, dictionary[Enum.Parse(type2, obj.ToString())]);
                        return(2);
                    }
                    obj = LuaObject.changeType(obj, type2);
                }
                LuaObject.pushValue(l, true);
                LuaObject.pushVar(l, dictionary[obj]);
                return(2);
            }
            return(0);
        }
        public static int luaNewIndex(IntPtr l)
        {
            int result;

            try
            {
                ObjectCache objectCache = ObjectCache.get(l);
                object      self        = objectCache.get(l, 1);
                LuaTypes    luaTypes    = LuaDLL.pua_type(l, 2);
                LuaTypes    luaTypes2   = luaTypes;
                if (luaTypes2 != LuaTypes.LUA_TNUMBER)
                {
                    if (luaTypes2 != LuaTypes.LUA_TSTRING)
                    {
                        result = LuaVarObject.newindexObject(l, self, LuaObject.checkVar(l, 2), LuaObject.checkVar(l, 3));
                    }
                    else
                    {
                        result = LuaVarObject.newindexString(l, self, LuaDLL.pua_tostring(l, 2));
                    }
                }
                else
                {
                    result = LuaVarObject.newindexInt(l, self, LuaDLL.pua_tointeger(l, 2));
                }
            }
            catch (Exception e)
            {
                result = LuaObject.error(l, e);
            }
            return(result);
        }
        private static int newindexInt(IntPtr l, object self, int index)
        {
            Type type = LuaVarObject.getType(self);

            if (self is IList)
            {
                if (type.IsGenericType)
                {
                    Type t = type.GetGenericArguments()[0];
                    (self as IList)[index] = LuaObject.changeType(LuaObject.checkVar(l, 3), t);
                }
                else
                {
                    (self as IList)[index] = LuaObject.checkVar(l, 3);
                }
            }
            else if (self is IDictionary)
            {
                Type   t2  = type.GetGenericArguments()[0];
                object obj = index;
                obj = LuaObject.changeType(obj, t2);
                if (type.IsGenericType)
                {
                    Type t3 = type.GetGenericArguments()[1];
                    (self as IDictionary)[obj] = LuaObject.changeType(LuaObject.checkVar(l, 3), t3);
                }
                else
                {
                    (self as IDictionary)[obj] = LuaObject.checkVar(l, 3);
                }
            }
            LuaObject.pushValue(l, true);
            return(1);
        }
        private static int indexString(IntPtr l, object self, string key)
        {
            Type type = LuaVarObject.getType(self);

            if (self is IDictionary)
            {
                if (!type.IsGenericType || type.GetGenericArguments()[0] == typeof(string))
                {
                    object obj = (self as IDictionary)[key];
                    if (obj != null)
                    {
                        LuaObject.pushValue(l, true);
                        LuaObject.pushVar(l, obj);
                        return(2);
                    }
                }
            }
            IList <MemberInfo> cacheMembers = LuaVarObject.GetCacheMembers(type, key);

            if (cacheMembers == null || cacheMembers.Count == 0)
            {
                return(LuaObject.error(l, "Can't find " + key));
            }
            LuaObject.pushValue(l, true);
            MemberInfo  memberInfo = cacheMembers[0];
            MemberTypes memberType = memberInfo.MemberType;

            switch (memberType)
            {
            case MemberTypes.Event:
                return(2);

            case MemberTypes.Constructor | MemberTypes.Event:
            {
IL_B3:
                if (memberType == MemberTypes.Method)
                {
                    LuaCSFunction o = new LuaCSFunction(new LuaVarObject.MethodWrapper(self, cacheMembers).invoke);
                    LuaObject.pushObject(l, o);
                    return(2);
                }
                if (memberType != MemberTypes.Property)
                {
                    return(1);
                }
                PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
                MethodInfo   getMethod    = propertyInfo.GetGetMethod(true);
                LuaObject.pushVar(l, getMethod.Invoke(self, null));
                return(2);
            }

            case MemberTypes.Field:
            {
                FieldInfo fieldInfo = (FieldInfo)memberInfo;
                LuaObject.pushVar(l, fieldInfo.GetValue(self));
                return(2);
            }
            }
            goto IL_B3;
        }
        private static int newindexString(IntPtr l, object self, string key)
        {
            if (self is IDictionary)
            {
                Type type = LuaVarObject.getType(self);
                Type t    = type.GetGenericArguments()[1];
                (self as IDictionary)[key] = LuaObject.checkVar(l, 3, t);
                return(LuaObject.ok(l));
            }
            Type type2 = LuaVarObject.getType(self);
            IList <MemberInfo> cacheMembers = LuaVarObject.GetCacheMembers(type2, key);

            if (cacheMembers == null || cacheMembers.Count == 0)
            {
                return(LuaObject.error(l, "Can't find " + key));
            }
            MemberInfo  memberInfo = cacheMembers[0];
            MemberTypes memberType = memberInfo.MemberType;

            switch (memberType)
            {
            case MemberTypes.Event:
                return(LuaObject.error(l, "Event can't set"));

            case MemberTypes.Constructor | MemberTypes.Event:
            {
IL_8F:
                if (memberType == MemberTypes.Method)
                {
                    return(LuaObject.error(l, "Method can't set"));
                }
                if (memberType != MemberTypes.Property)
                {
                    goto IL_121;
                }
                PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
                MethodInfo   setMethod    = propertyInfo.GetSetMethod(true);
                object       obj          = LuaObject.checkVar(l, 3, propertyInfo.PropertyType);
                setMethod.Invoke(self, new object[]
                    {
                        obj
                    });
                goto IL_121;
            }

            case MemberTypes.Field:
            {
                FieldInfo fieldInfo = (FieldInfo)memberInfo;
                object    value     = LuaObject.checkVar(l, 3, fieldInfo.FieldType);
                fieldInfo.SetValue(self, value);
                goto IL_121;
            }
            }
            goto IL_8F;
IL_121:
            return(LuaObject.ok(l));
        }
        private static IList <MemberInfo> GetCacheMembers(Type type, string key)
        {
            Dictionary <string, List <MemberInfo> > dictionary;

            if (!LuaVarObject.cachedMemberInfos.TryGetValue(type, out dictionary))
            {
                dictionary = (LuaVarObject.cachedMemberInfos[type] = new Dictionary <string, List <MemberInfo> >());
                LuaVarObject.CollectTypeMembers(type, ref dictionary);
            }
            return(dictionary[key]);
        }
 private static int newindexObject(IntPtr l, object self, object k, object v)
 {
     if (self is IDictionary)
     {
         IDictionary dictionary = self as IDictionary;
         Type        type       = LuaVarObject.getType(self);
         Type        t          = type.GetGenericArguments()[1];
         object      value      = LuaObject.changeType(v, t);
         dictionary[k] = value;
     }
     return(LuaObject.ok(l));
 }
 private static void CollectTypeMembers(Type type, ref Dictionary <string, List <MemberInfo> > membersMap)
 {
     MemberInfo[] members = type.GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
     for (int i = 0; i < members.Length; i++)
     {
         MemberInfo        memberInfo = members[i];
         List <MemberInfo> list;
         if (!membersMap.TryGetValue(memberInfo.Name, out list))
         {
             List <MemberInfo> list2 = new List <MemberInfo>();
             membersMap[memberInfo.Name] = list2;
             list = list2;
         }
         list.Add(memberInfo);
     }
     if (type.BaseType != null)
     {
         LuaVarObject.CollectTypeMembers(type.BaseType, ref membersMap);
     }
 }
Beispiel #9
0
        public static void init(IntPtr l)
        {
            string newindexfun = @"

local getmetatable=getmetatable
local rawget=rawget
local error=error
local type=type
local function newindex(ud,k,v)
    local t=getmetatable(ud)
    repeat
        local h=rawget(t,k)
        if h then
			if h[2] then
				h[2](ud,v)
	            return
			else
				error('property '..k..' is read only')
			end
        end
        t=rawget(t,'__parent')
    until t==nil
    error('can not find '..k)
end

return newindex
";

            string   indexfun = @"
local type=type
local error=error
local rawget=rawget
local getmetatable=getmetatable
local function index(ud,k)
    local t=getmetatable(ud)
    repeat
        local fun=rawget(t,k)
        local tp=type(fun)	
        if tp=='function' then 
            return fun 
        elseif tp=='table' then
			local f=fun[1]
			if f then
				return f(ud)
			else
				error('property '..k..' is write only')
			end
        end
        t = rawget(t,'__parent')
    until t==nil
    error('Can not find '..k)
end

return index
";
            LuaState L        = LuaState.get(l);

            newindex_func = (LuaFunction)L.doString(newindexfun);
            index_func    = (LuaFunction)L.doString(indexfun);

            // object method
            LuaDLL.pua_createtable(l, 0, 4);
            addMember(l, ToString);
            addMember(l, GetHashCode);
            addMember(l, Equals);
            addMember(l, GetType);
            LuaDLL.pua_setfield(l, LuaIndexes.LUA_REGISTRYINDEX, "__luabaseobject");

            LuaArray.init(l);
            LuaVarObject.init(l);

            LuaDLL.pua_newtable(l);
            LuaDLL.pua_setglobal(l, DelgateTable);


            setupPushVar();
        }