public object getAsObject(ILuaState luaState,int stackPos) { if(LuaDLL.lua_type(luaState,stackPos)==LuaType.LUA_TTABLE) { if(LuaDLL.luaL_getmetafield(luaState,stackPos,"__index")) { if(LuaDLL.luaL_checkmetatable(luaState,-1)) { LuaDLL.lua_insert(luaState,stackPos); LuaDLL.lua_remove(luaState,stackPos+1); } else { LuaDLL.lua_settop(luaState,-2); } } } object obj=translator.getObject(luaState,stackPos); return obj; }
internal ExtractValue checkType(ILuaState luaState,int stackPos,Type paramType) { LuaType 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 == LuaType.LUA_TBOOLEAN) return extractValues[typeof(bool).TypeHandle.Value.ToInt64()]; else if (luatype == LuaType.LUA_TSTRING) return extractValues[typeof(string).TypeHandle.Value.ToInt64()]; else if (luatype == LuaType.LUA_TTABLE) return extractValues[typeof(LuaTable).TypeHandle.Value.ToInt64()]; else if (luatype == LuaType.LUA_TUSERDATA || luatype == LuaType.LUA_TLIGHTUSERDATA) return extractValues[typeof(object).TypeHandle.Value.ToInt64()]; else if (luatype == LuaType.LUA_TFUNCTION) return extractValues[typeof(LuaFunction).TypeHandle.Value.ToInt64()]; else if (luatype == LuaType.LUA_TNUMBER) return extractValues[typeof(double).TypeHandle.Value.ToInt64()]; else ;//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 == LuaType.LUA_TNIL) return extractNetObject; // kevinh - silently convert nil to a null string pointer } else if (paramType == typeof(LuaTable)) { if (luatype == LuaType.LUA_TTABLE) return extractValues[runtimeHandleValue]; } else if (paramType == typeof(LuaUserData)) { if (luatype == LuaType.LUA_TUSERDATA || luatype == LuaType.LUA_TLIGHTUSERDATA) return extractValues[runtimeHandleValue]; } else if (paramType == typeof(LuaFunction)) { if (luatype == LuaType.LUA_TFUNCTION) return extractValues[runtimeHandleValue]; } else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaType.LUA_TFUNCTION) { return new ExtractValue(new DelegateGenerator(translator, paramType).extractGenerated); } else if (paramType.IsInterface && luatype == LuaType.LUA_TTABLE) { return new ExtractValue(new ClassGenerator(translator, paramType).extractGenerated); } else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaType.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) == LuaType.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; }