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; }
private object getAsBoolean(ILuaState luaState,int stackPos) { return LuaDLL.lua_toboolean(luaState,stackPos); }
private object getAsString(ILuaState luaState,int stackPos) { string retVal=LuaDLL.lua_tostring(luaState,stackPos); if(retVal=="" && !LuaDLL.lua_isstring(luaState,stackPos)) return null; return retVal; }
private object getAsFloat(ILuaState luaState,int stackPos) { float retVal=(float)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsDecimal(ILuaState luaState,int stackPos) { decimal retVal=(decimal)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsChar(ILuaState luaState,int stackPos) { char retVal=(char)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsDouble(ILuaState luaState,int stackPos) { double retVal=LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsUlong(ILuaState luaState,int stackPos) { ulong retVal=(ulong)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsUshort(ILuaState luaState,int stackPos) { ushort retVal=(ushort)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }
private object getAsByte(ILuaState luaState,int stackPos) { byte retVal=(byte)LuaDLL.lua_tonumber(luaState,stackPos); if(retVal==0 && !LuaDLL.lua_isnumber(luaState,stackPos)) return null; return retVal; }