internal Array TableToArray(object luaParamValue, Type paramArrayType) { Array paramArray; if (luaParamValue is LuaTable) { LuaTable table = (LuaTable)luaParamValue; IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); tableEnumerator.Reset(); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); int paramArrayIndex = 0; while (tableEnumerator.MoveNext()) { object o = tableEnumerator.Value; if (paramArrayType == typeof(object)) { if (o != null && o.GetType() == typeof(double) && IsInteger((double)o)) { o = Convert.ToInt32((double)o); } } paramArray.SetValue(Convert.ChangeType(o, paramArrayType), paramArrayIndex); paramArrayIndex++; } } else { paramArray = Array.CreateInstance(paramArrayType, 1); paramArray.SetValue(luaParamValue, 0); } return(paramArray); }
internal Array TableToArray(object luaParamValue, Type paramArrayType) { Array array; if (luaParamValue is LuaTable) { LuaTable luaTable = (LuaTable)luaParamValue; IDictionaryEnumerator enumerator = luaTable.GetEnumerator(); enumerator.Reset(); array = Array.CreateInstance(paramArrayType, luaTable.Values.Count); int num = 0; while (enumerator.MoveNext()) { object obj = enumerator.Value; if (paramArrayType == typeof(object) && obj != null && obj.GetType() == typeof(double) && MetaFunctions.IsInteger((double)obj)) { obj = Convert.ToInt32((double)obj); } array.SetValue(Convert.ChangeType(obj, paramArrayType), num); num++; } } else { array = Array.CreateInstance(paramArrayType, 1); array.SetValue(luaParamValue, 0); } return(array); }
internal Array TableToArray(Func <int, object> luaParamValueExtractor, Type paramArrayType, int startIndex, int count) { Array paramArray; if (count == 0) { return(Array.CreateInstance(paramArrayType, 0)); } var luaParamValue = luaParamValueExtractor(startIndex); #if false // LuaTable unpacking is disabled. // In Lua, print({1, 2, 3}) should pass an array, not multiple arguments. // You can write print(unpack({1, 2, 3})) if necessary. if (luaParamValue is LuaTable) { LuaTable table = (LuaTable)luaParamValue; IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); tableEnumerator.Reset(); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); int paramArrayIndex = 0; while (tableEnumerator.MoveNext()) { object value = tableEnumerator.Value; if (paramArrayType == typeof(object)) { if (value != null && value.GetType() == typeof(double) && IsInteger((double)value)) { value = Convert.ToInt32((double)value); } } paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex); paramArrayIndex++; } } else #endif { paramArray = Array.CreateInstance(paramArrayType, count); paramArray.SetValue(luaParamValue, 0); for (int i = 1; i < count; i++) { startIndex++; var value = luaParamValueExtractor(startIndex); paramArray.SetValue(value, i); } } return(paramArray); }
/* * Matches a method against its arguments in the Lua stack. Returns * if the match was succesful. It it was also returns the information * necessary to invoke the method. */ internal bool matchParameters(IntPtr luaState, MethodBase method, ref MethodCache methodCache) { ExtractValue extractValue; bool isMethod = true; ParameterInfo[] paramInfo = method.GetParameters(); int currentLuaParam = 1; int nLuaParams = LuaDLL.lua_gettop(luaState); ArrayList paramList = new ArrayList(); List <int> outList = new List <int>(); List <MethodArgs> argTypes = new List <MethodArgs>(); foreach (ParameterInfo currentNetParam in paramInfo) { if (!currentNetParam.IsIn && currentNetParam.IsOut) // Skips out params { outList.Add(paramList.Add(null)); } else if (currentLuaParam > nLuaParams) // Adds optional parameters { if (currentNetParam.IsOptional) { paramList.Add(currentNetParam.DefaultValue); } else { isMethod = false; break; } } else if (_IsTypeCorrect(luaState, currentLuaParam, currentNetParam, out extractValue)) // Type checking { int index = paramList.Add(extractValue(luaState, currentLuaParam)); MethodArgs methodArg = new MethodArgs(); methodArg.index = index; methodArg.extractValue = extractValue; argTypes.Add(methodArg); if (currentNetParam.ParameterType.IsByRef) { outList.Add(index); } currentLuaParam++; } // Type does not match, ignore if the parameter is optional else if (_IsParamsArray(luaState, currentLuaParam, currentNetParam, out extractValue)) { object luaParamValue = extractValue(luaState, currentLuaParam); Type paramArrayType = currentNetParam.ParameterType.GetElementType(); Array paramArray; if (luaParamValue is LuaTable) { LuaTable table = (LuaTable)luaParamValue; IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); tableEnumerator.Reset(); int paramArrayIndex = 0; while (tableEnumerator.MoveNext()) { paramArray.SetValue(Convert.ChangeType(tableEnumerator.Value, currentNetParam.ParameterType.GetElementType()), paramArrayIndex); paramArrayIndex++; } } else { paramArray = Array.CreateInstance(paramArrayType, 1); paramArray.SetValue(luaParamValue, 0); } int index = paramList.Add(paramArray); MethodArgs methodArg = new MethodArgs(); methodArg.index = index; methodArg.extractValue = extractValue; methodArg.isParamsArray = true; methodArg.paramsArrayType = paramArrayType; argTypes.Add(methodArg); currentLuaParam++; } else if (currentNetParam.IsOptional) { paramList.Add(currentNetParam.DefaultValue); } else // No match { isMethod = false; break; } } if (currentLuaParam != nLuaParams + 1) // Number of parameters does not match { isMethod = false; } if (isMethod) { methodCache.args = paramList.ToArray(); methodCache.cachedMethod = method; methodCache.outList = outList.ToArray(); methodCache.argTypes = argTypes.ToArray(); } return(isMethod); }