public static int getConstructorSignature(IntPtr luaState) { ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState); IReflect reflect = null; int num = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class"); if (num != -1) { reflect = (IReflect)objectTranslator.objects[num]; } if (reflect == null) { objectTranslator.throwError(luaState, "get_constructor_bysig: first arg is invalid type reference"); } Type[] array = new Type[LuaDLL.lua_gettop(luaState) - 1]; for (int i = 0; i < array.Length; i++) { array[i] = objectTranslator.FindType(LuaDLL.lua_tostring(luaState, i + 2)); } try { ConstructorInfo constructor = reflect.UnderlyingSystemType.GetConstructor(array); objectTranslator.pushFunction(luaState, new LuaCSFunction(new LuaMethodWrapper(objectTranslator, null, reflect, constructor).call)); } catch (Exception ex) { objectTranslator.throwError(luaState, ex.Message); LuaDLL.lua_pushnil(luaState); } return(1); }
public static int getConstructorSignature(IntPtr luaState) { ObjectTranslator translator = ObjectTranslator.FromState(luaState); IReflect klass = null; int udata = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class"); if (udata != -1) { klass = (IReflect)translator.objects[udata]; } if (klass == null) { translator.throwError(luaState, "get_constructor_bysig: first arg is invalid type reference"); } Type[] signature = new Type[LuaDLL.lua_gettop(luaState) - 1]; for (int i = 0; i < signature.Length; i++) signature[i] = translator.FindType(LuaDLL.lua_tostring(luaState, i + 2)); try { ConstructorInfo constructor = klass.UnderlyingSystemType.GetConstructor(signature); translator.pushFunction(luaState, new LuaCSFunction((new LuaMethodWrapper(translator, null, klass, constructor)).call)); } catch (Exception e) { translator.throwError(luaState, e.Message); LuaDLL.lua_pushnil(luaState); } return 1; }
public static int getMethodSignature(IntPtr luaState) { ObjectTranslator translator = ObjectTranslator.FromState(luaState); IReflect klass; object target; int udata = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class"); if (udata != -1) { klass = (IReflect)translator.objects[udata]; target = null; } else { target = translator.getRawNetObject(luaState, 1); if (target == null) { translator.throwError(luaState, "get_method_bysig: first arg is not type or object reference"); LuaDLL.lua_pushnil(luaState); return(1); } klass = target.GetType(); } string methodName = LuaDLL.lua_tostring(luaState, 2); Type[] signature = new Type[LuaDLL.lua_gettop(luaState) - 2]; for (int i = 0; i < signature.Length; i++) { signature[i] = translator.FindType(LuaDLL.lua_tostring(luaState, i + 3)); } try { //CP: Added ignore case MethodInfo method = klass.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase, null, signature, null); translator.pushFunction(luaState, new LuaCSFunction((new LuaMethodWrapper(translator, target, klass, method)).call)); } catch (Exception e) { translator.throwError(luaState, e.Message); LuaDLL.lua_pushnil(luaState); } return(1); }
public static int getMethodSignature(IntPtr luaState) { ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState); int num = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class"); IReflect reflect; object obj; if (num != -1) { reflect = (IReflect)objectTranslator.objects[num]; obj = null; } else { obj = objectTranslator.getRawNetObject(luaState, 1); if (obj == null) { objectTranslator.throwError(luaState, "get_method_bysig: first arg is not type or object reference"); LuaDLL.lua_pushnil(luaState); return(1); } reflect = obj.GetType(); } string name = LuaDLL.lua_tostring(luaState, 2); Type[] array = new Type[LuaDLL.lua_gettop(luaState) - 2]; for (int i = 0; i < array.Length; i++) { array[i] = objectTranslator.FindType(LuaDLL.lua_tostring(luaState, i + 3)); } try { MethodInfo method = reflect.GetMethod(name, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy, null, array, null); objectTranslator.pushFunction(luaState, new LuaCSFunction(new LuaMethodWrapper(objectTranslator, obj, reflect, method).call)); } catch (Exception ex) { objectTranslator.throwError(luaState, ex.Message); LuaDLL.lua_pushnil(luaState); } return(1); }
/* * Pushes the value of a member or a delegate to call it, depending on the type of * the member. Works with static or instance members. * Uses reflection to find members, and stores the reflected MemberInfo object in * a cache (indexed by the type of the object and the name of the member). */ private int getMember(KopiLua.Lua.lua_State luaState, IReflect objType, object obj, string methodName, BindingFlags bindingType) { bool implicitStatic = false; MemberInfo member = null; object cachedMember = checkMemberCache(memberCache, objType, methodName); //object cachedMember=null; if (cachedMember is KopiLua.Lua.lua_CFunction) { translator.pushFunction(luaState, (KopiLua.Lua.lua_CFunction)cachedMember); translator.push(luaState, true); return(2); } else if (cachedMember != null) { member = (MemberInfo)cachedMember; } else { MemberInfo[] members = objType.GetMember(methodName, bindingType | BindingFlags.Public | BindingFlags.NonPublic); if (members.Length > 0) { member = members[0]; } else { // If we can't find any suitable instance members, try to find them as statics - but we only want to allow implicit static // lookups for fields/properties/events -kevinh members = objType.GetMember(methodName, bindingType | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (members.Length > 0) { member = members[0]; implicitStatic = true; } } } if (member != null) { if (member.MemberType == MemberTypes.Field) { FieldInfo field = (FieldInfo)member; if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } try { translator.push(luaState, field.GetValue(obj)); } catch { LuaDLL.lua_pushnil(luaState); } } else if (member.MemberType == MemberTypes.Property) { PropertyInfo property = (PropertyInfo)member; if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } try { object val = property.GetValue(obj, null); translator.push(luaState, val); } catch (ArgumentException) { // If we can't find the getter in our class, recurse up to the base class and see // if they can help. if (objType is Type && !(((Type)objType) == typeof(object))) { return(getMember(luaState, ((Type)objType).BaseType, obj, methodName, bindingType)); } else { LuaDLL.lua_pushnil(luaState); } } catch (TargetInvocationException e) // Convert this exception into a Lua error { ThrowError(luaState, e); LuaDLL.lua_pushnil(luaState); } } else if (member.MemberType == MemberTypes.Event) { EventInfo eventInfo = (EventInfo)member; if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } translator.push(luaState, new RegisterEventHandler(translator.pendingEvents, obj, eventInfo)); } else if (!implicitStatic) { if (member.MemberType == MemberTypes.NestedType) { // kevinh - added support for finding nested types // cache us if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } // Find the name of our class string name = member.Name; Type dectype = member.DeclaringType; // Build a new long name and try to find the type by name string longname = dectype.FullName + "+" + name; Type nestedType = translator.FindType(longname); translator.pushType(luaState, nestedType); } else { // Member type must be 'method' KopiLua.Lua.lua_CFunction wrapper = new KopiLua.Lua.lua_CFunction((new LuaMethodWrapper(translator, objType, methodName, bindingType)).call); if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, wrapper); } translator.pushFunction(luaState, wrapper); translator.push(luaState, true); return(2); } } else { // If we reach this point we found a static method, but can't use it in this context because the user passed in an instance translator.throwError(luaState, "can't pass instance to static method " + methodName); LuaDLL.lua_pushnil(luaState); } } else { // kevinh - we want to throw an exception because meerly returning 'nil' in this case // is not sufficient. valid data members may return nil and therefore there must be some // way to know the member just doesn't exist. translator.throwError(luaState, "unknown member name " + methodName); LuaDLL.lua_pushnil(luaState); } // push false because we are NOT returning a function (see luaIndexFunction) translator.push(luaState, false); return(2); }
internal void pushCSFunction(LuaCSFunction function) { translator.pushFunction(L, function); }
internal void pushCSFunction(LuaCore.lua_CFunction function) { translator.pushFunction(luaState, function); }
internal void pushCSFunction(KopiLua.Lua.lua_CFunction function) { translator.pushFunction(luaState, function); }
/* * Pushes the value of a member or a delegate to call it, depending on the type of * the member. Works with static or instance members. * Uses reflection to find members, and stores the reflected MemberInfo object in * a cache (indexed by the type of the object and the name of the member). */ private int getMember(IntPtr luaState, IReflect objType, object obj, string methodName, BindingFlags bindingType) { bool implicitStatic = false; MemberInfo member = null; object cachedMember = checkMemberCache(memberCache, objType, methodName); if (cachedMember is LuaCSFunction) { translator.pushFunction(luaState, (LuaCSFunction)cachedMember); translator.push(luaState, true); return(2); } else if (cachedMember != null) { member = (MemberInfo)cachedMember; } else { //CP: Removed NonPublic binding search MemberInfo[] members = objType.GetMember(methodName, bindingType | BindingFlags.Public | BindingFlags.IgnoreCase /*| BindingFlags.NonPublic*/); if (members.Length > 0) { member = members[0]; } else { members = objType.GetMember(methodName, bindingType | BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase /*| BindingFlags.NonPublic*/); if (members.Length > 0) { member = members[0]; implicitStatic = true; } } } if (member != null) { if (member.MemberType == MemberTypes.Field) { FieldInfo field = (FieldInfo)member; if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } try { translator.push(luaState, field.GetValue(obj)); } catch { LuaAPI.lua_pushnil(luaState); } } else if (member.MemberType == MemberTypes.Property) { PropertyInfo property = (PropertyInfo)member; if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } try { object val = property.GetGetMethod().Invoke(obj, null); translator.push(luaState, val); } catch (ArgumentException) { if (objType is Type && !(((Type)objType) == typeof(object))) { return(getMember(luaState, ((Type)objType).BaseType, obj, methodName, bindingType)); } else { LuaAPI.lua_pushnil(luaState); } } catch (TargetInvocationException e) // Convert this exception into a Lua error { ThrowError(luaState, e); LuaAPI.lua_pushnil(luaState); } } else if (!implicitStatic) { if (member.MemberType == MemberTypes.NestedType) { // cache us if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, member); } // Find the name of our class string name = member.Name; Type dectype = member.DeclaringType; // Build a new long name and try to find the type by name string longname = dectype.FullName + "+" + name; Type nestedType = translator.FindType(longname); translator.pushType(luaState, nestedType); } else { // Member type must be 'method' LuaCSFunction wrapper = new LuaCSFunction((new LuaMethodWrapper(translator, objType, methodName, bindingType)).call); if (cachedMember == null) { setMemberCache(memberCache, objType, methodName, wrapper); } translator.pushFunction(luaState, wrapper); translator.push(luaState, true); return(2); } } else { // If we reach this point we found a static method, but can't use it in this context because the user passed in an instance translator.throwError(luaState, "can't pass instance to static method " + methodName); LuaAPI.lua_pushnil(luaState); } } else { // kevinh - we want to throw an exception because meerly returning 'nil' in this case // is not sufficient. valid data members may return nil and therefore there must be some // way to know the member just doesn't exist. translator.throwError(luaState, "unknown member name " + methodName); LuaAPI.lua_pushnil(luaState); } // push false because we are NOT returning a function (see luaIndexFunction) translator.push(luaState, false); return(2); }