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)); }
/* * __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)); } } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
/* * 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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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[]))); }
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); }
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); } }
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[]))); }
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); }
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)); } } }
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); }
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); }
public bool LuaIsNumber(int idx) { return(LuaDLL.lua_isnumber(L, idx) != 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); }