Commit 68bdf7fa authored by Megax's avatar Megax Committed by Megax
Browse files

* Autotols alapú Makefile generátor hozzáadva a kódhoz.

parent 856d0cb7
/* /*
* This file is part of LuaInterface. * This file is part of LuaInterface.
* *
* Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz. * Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz.
* Copyright (C) 2012 Megax <http://megax.yeahunter.hu/> * Copyright (C) 2012 Megax <http://megax.yeahunter.hu/>
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights * in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is * copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: * furnished to do so, subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
using System; using System;
using System.Reflection; using System.Reflection;
using System.Collections.Generic; using System.Collections.Generic;
using LuaInterface.Exceptions; using LuaInterface.Exceptions;
using LuaInterface.Extensions; using LuaInterface.Extensions;
namespace LuaInterface.Method namespace LuaInterface.Method
{ {
using LuaCore = KopiLua.Lua; using LuaCore = KopiLua.Lua;
/* /*
* Argument extraction with type-conversion function * Argument extraction with type-conversion function
*/ */
delegate object ExtractValue(LuaCore.lua_State luaState, int stackPos); delegate object ExtractValue(LuaCore.lua_State luaState, int stackPos);
/* /*
* Wrapper class for methods/constructors accessed from Lua. * Wrapper class for methods/constructors accessed from Lua.
* *
* Author: Fabio Mascarenhas * Author: Fabio Mascarenhas
* Version: 1.0 * Version: 1.0
*/ */
class LuaMethodWrapper class LuaMethodWrapper
{ {
private ObjectTranslator _Translator; private ObjectTranslator _Translator;
private MethodBase _Method; private MethodBase _Method;
private MethodCache _LastCalledMethod = new MethodCache(); private MethodCache _LastCalledMethod = new MethodCache();
private string _MethodName; private string _MethodName;
private MemberInfo[] _Members; private MemberInfo[] _Members;
private IReflect _TargetType; private IReflect _TargetType;
private ExtractValue _ExtractTarget; private ExtractValue _ExtractTarget;
private object _Target; private object _Target;
private BindingFlags _BindingType; private BindingFlags _BindingType;
/* /*
* Constructs the wrapper for a known MethodBase instance * Constructs the wrapper for a known MethodBase instance
*/ */
public LuaMethodWrapper(ObjectTranslator translator, object target, IReflect targetType, MethodBase method) public LuaMethodWrapper(ObjectTranslator translator, object target, IReflect targetType, MethodBase method)
{ {
_Translator = translator; _Translator = translator;
_Target = target; _Target = target;
_TargetType = targetType; _TargetType = targetType;
if(!targetType.IsNull()) if(!targetType.IsNull())
_ExtractTarget = translator.typeChecker.getExtractor(targetType); _ExtractTarget = translator.typeChecker.getExtractor(targetType);
_Method = method; _Method = method;
_MethodName = method.Name; _MethodName = method.Name;
if(method.IsStatic) if(method.IsStatic)
_BindingType = BindingFlags.Static; _BindingType = BindingFlags.Static;
else else
_BindingType = BindingFlags.Instance; _BindingType = BindingFlags.Instance;
} }
/* /*
* Constructs the wrapper for a known method name * Constructs the wrapper for a known method name
*/ */
public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType) public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType)
{ {
_Translator = translator; _Translator = translator;
_MethodName = methodName; _MethodName = methodName;
_TargetType = targetType; _TargetType = targetType;
if(!targetType.IsNull()) if(!targetType.IsNull())
_ExtractTarget = translator.typeChecker.getExtractor(targetType); _ExtractTarget = translator.typeChecker.getExtractor(targetType);
_BindingType = bindingType; _BindingType = bindingType;
//CP: Removed NonPublic binding search and added IgnoreCase //CP: Removed NonPublic binding search and added IgnoreCase
_Members = targetType.UnderlyingSystemType.GetMember(methodName, MemberTypes.Method, bindingType | BindingFlags.Public | BindingFlags.IgnoreCase/*|BindingFlags.NonPublic*/); _Members = targetType.UnderlyingSystemType.GetMember(methodName, MemberTypes.Method, bindingType | BindingFlags.Public | BindingFlags.IgnoreCase/*|BindingFlags.NonPublic*/);
} }
/// <summary> /// <summary>
/// Convert C# exceptions into Lua errors /// Convert C# exceptions into Lua errors
/// </summary> /// </summary>
/// <returns>num of things on stack</returns> /// <returns>num of things on stack</returns>
/// <param name="e">null for no pending exception</param> /// <param name="e">null for no pending exception</param>
int SetPendingException(Exception e) int SetPendingException(Exception e)
{ {
return _Translator.interpreter.SetPendingException(e); return _Translator.interpreter.SetPendingException(e);
} }
/* /*
* Calls the method. Receives the arguments from the Lua stack * Calls the method. Receives the arguments from the Lua stack
* and returns values in it. * and returns values in it.
*/ */
public int call(LuaCore.lua_State luaState) public int call(LuaCore.lua_State luaState)
{ {
var methodToCall = _Method; var methodToCall = _Method;
object targetObject = _Target; object targetObject = _Target;
bool failedCall = true; bool failedCall = true;
int nReturnValues = 0; int nReturnValues = 0;
if(!LuaLib.lua_checkstack(luaState, 5)) if(!LuaLib.lua_checkstack(luaState, 5))
throw new LuaException("Lua stack overflow"); throw new LuaException("Lua stack overflow");
bool isStatic = (_BindingType & BindingFlags.Static) == BindingFlags.Static; bool isStatic = (_BindingType & BindingFlags.Static) == BindingFlags.Static;
SetPendingException(null); SetPendingException(null);
if(methodToCall.IsNull()) // Method from name if(methodToCall.IsNull()) // Method from name
{ {
if(isStatic) if(isStatic)
targetObject = null; targetObject = null;
else else
targetObject = _ExtractTarget(luaState, 1); targetObject = _ExtractTarget(luaState, 1);
//LuaLib.lua_remove(luaState,1); // Pops the receiver //LuaLib.lua_remove(luaState,1); // Pops the receiver
if(!_LastCalledMethod.cachedMethod.IsNull()) // Cached? if(!_LastCalledMethod.cachedMethod.IsNull()) // Cached?
{ {
int numStackToSkip = isStatic ? 0 : 1; // If this is an instance invoe we will have an extra arg on the stack for the targetObject int numStackToSkip = isStatic ? 0 : 1; // If this is an instance invoe we will have an extra arg on the stack for the targetObject
int numArgsPassed = LuaLib.lua_gettop(luaState) - numStackToSkip; int numArgsPassed = LuaLib.lua_gettop(luaState) - numStackToSkip;
if(numArgsPassed == _LastCalledMethod.argTypes.Length) // No. of args match? if(numArgsPassed == _LastCalledMethod.argTypes.Length) // No. of args match?
{ {
if(!LuaLib.lua_checkstack(luaState, _LastCalledMethod.outList.Length + 6)) if(!LuaLib.lua_checkstack(luaState, _LastCalledMethod.outList.Length + 6))
throw new LuaException("Lua stack overflow"); throw new LuaException("Lua stack overflow");
try try
{ {
for(int i = 0; i < _LastCalledMethod.argTypes.Length; i++) for(int i = 0; i < _LastCalledMethod.argTypes.Length; i++)
{ {
if(_LastCalledMethod.argTypes[i].isParamsArray) if(_LastCalledMethod.argTypes[i].isParamsArray)
{ {
object luaParamValue = _LastCalledMethod.argTypes[i].extractValue(luaState, i + 1 + numStackToSkip); object luaParamValue = _LastCalledMethod.argTypes[i].extractValue(luaState, i + 1 + numStackToSkip);
var paramArrayType = _LastCalledMethod.argTypes[i].paramsArrayType; var paramArrayType = _LastCalledMethod.argTypes[i].paramsArrayType;
Array paramArray; Array paramArray;
if(luaParamValue is LuaTable) if(luaParamValue is LuaTable)
{ {
var table = (LuaTable)luaParamValue; var table = (LuaTable)luaParamValue;
paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count);
for(int x = 1; x <= table.Values.Count; x++) for(int x = 1; x <= table.Values.Count; x++)
paramArray.SetValue(Convert.ChangeType(table[x], paramArrayType), x - 1); paramArray.SetValue(Convert.ChangeType(table[x], paramArrayType), x - 1);
} }
else else
{ {
paramArray = Array.CreateInstance(paramArrayType, 1); paramArray = Array.CreateInstance(paramArrayType, 1);
paramArray.SetValue(luaParamValue, 0); paramArray.SetValue(luaParamValue, 0);
} }
_LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] = paramArray; _LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] = paramArray;
} }
else else
{ {
_LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] = _LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] =
_LastCalledMethod.argTypes[i].extractValue(luaState, i + 1 + numStackToSkip); _LastCalledMethod.argTypes[i].extractValue(luaState, i + 1 + numStackToSkip);
} }
if(_LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] == null && if(_LastCalledMethod.args[_LastCalledMethod.argTypes[i].index] == null &&
!LuaLib.lua_isnil(luaState, i + 1 + numStackToSkip)) !LuaLib.lua_isnil(luaState, i + 1 + numStackToSkip))
throw new LuaException("argument number " + (i + 1) + " is invalid"); throw new LuaException("argument number " + (i + 1) + " is invalid");
} }
if((_BindingType & BindingFlags.Static) == BindingFlags.Static) if((_BindingType & BindingFlags.Static) == BindingFlags.Static)
_Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(null, _LastCalledMethod.args)); _Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(null, _LastCalledMethod.args));
else else
{ {
if(_LastCalledMethod.cachedMethod.IsConstructor) if(_LastCalledMethod.cachedMethod.IsConstructor)
_Translator.push(luaState, ((ConstructorInfo)_LastCalledMethod.cachedMethod).Invoke(_LastCalledMethod.args)); _Translator.push(luaState, ((ConstructorInfo)_LastCalledMethod.cachedMethod).Invoke(_LastCalledMethod.args));
else else
_Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(targetObject, _LastCalledMethod.args)); _Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(targetObject, _LastCalledMethod.args));
} }
failedCall = false; failedCall = false;
} }
catch(TargetInvocationException e) catch(TargetInvocationException e)
{ {
// Failure of method invocation // Failure of method invocation
return SetPendingException(e.GetBaseException()); return SetPendingException(e.GetBaseException());
} }
catch(Exception e) catch(Exception e)
{ {
if(_Members.Length == 1) // Is the method overloaded? if(_Members.Length == 1) // Is the method overloaded?
// No, throw error // No, throw error
return SetPendingException(e); return SetPendingException(e);
} }
} }
} }
// Cache miss // Cache miss
if(failedCall) if(failedCall)
{ {
// System.Diagnostics.Debug.WriteLine("cache miss on " + methodName); // System.Diagnostics.Debug.WriteLine("cache miss on " + methodName);
// If we are running an instance variable, we can now pop the targetObject from the stack // If we are running an instance variable, we can now pop the targetObject from the stack
if(!isStatic) if(!isStatic)
{ {
if(targetObject.IsNull()) if(targetObject.IsNull())
{ {
_Translator.throwError(luaState, String.Format("instance method '{0}' requires a non null target object", _MethodName)); _Translator.throwError(luaState, String.Format("instance method '{0}' requires a non null target object", _MethodName));
LuaLib.lua_pushnil(luaState); LuaLib.lua_pushnil(luaState);
return 1; return 1;
} }
LuaLib.lua_remove(luaState, 1); // Pops the receiver LuaLib.lua_remove(luaState, 1); // Pops the receiver
} }
bool hasMatch = false; bool hasMatch = false;
string candidateName = null; string candidateName = null;
foreach(var member in _Members) foreach(var member in _Members)
{ {
candidateName = member.ReflectedType.Name + "." + member.Name; candidateName = member.ReflectedType.Name + "." + member.Name;
var m = (MethodInfo)member; var m = (MethodInfo)member;
bool isMethod = _Translator.matchParameters(luaState, m, ref _LastCalledMethod); bool isMethod = _Translator.matchParameters(luaState, m, ref _LastCalledMethod);
if(isMethod) if(isMethod)
{ {
hasMatch = true; hasMatch = true;
break; break;
} }
} }
if(!hasMatch) if(!hasMatch)
{ {
string msg = (candidateName == null) ? "invalid arguments to method call" : ("invalid arguments to method: " + candidateName); string msg = (candidateName == null) ? "invalid arguments to method call" : ("invalid arguments to method: " + candidateName);
_Translator.throwError(luaState, msg); _Translator.throwError(luaState, msg);
LuaLib.lua_pushnil(luaState); LuaLib.lua_pushnil(luaState);
return 1; return 1;
} }
} }
} }
else // Method from MethodBase instance else // Method from MethodBase instance
{ {
if(methodToCall.ContainsGenericParameters) if(methodToCall.ContainsGenericParameters)
{ {
/*bool isMethod = */_Translator.matchParameters(luaState, methodToCall, ref _LastCalledMethod); /*bool isMethod = */_Translator.matchParameters(luaState, methodToCall, ref _LastCalledMethod);
if(methodToCall.IsGenericMethodDefinition) if(methodToCall.IsGenericMethodDefinition)
{ {
//need to make a concrete type of the generic method definition //need to make a concrete type of the generic method definition
var typeArgs = new List<Type>(); var typeArgs = new List<Type>();
foreach(object arg in _LastCalledMethod.args) foreach(object arg in _LastCalledMethod.args)
typeArgs.Add(arg.GetType()); typeArgs.Add(arg.GetType());
var concreteMethod = (methodToCall as MethodInfo).MakeGenericMethod(typeArgs.ToArray()); var concreteMethod = (methodToCall as MethodInfo).MakeGenericMethod(typeArgs.ToArray());
_Translator.push(luaState, concreteMethod.Invoke(targetObject, _LastCalledMethod.args)); _Translator.push(luaState, concreteMethod.Invoke(targetObject, _LastCalledMethod.args));
failedCall = false; failedCall = false;
} }
else if(methodToCall.ContainsGenericParameters) else if(methodToCall.ContainsGenericParameters)
{ {
_Translator.throwError(luaState, "unable to invoke method on generic class as the current method is an open generic method"); _Translator.throwError(luaState, "unable to invoke method on generic class as the current method is an open generic method");
LuaLib.lua_pushnil(luaState); LuaLib.lua_pushnil(luaState);
return 1; return 1;
} }
} }
else else
{ {
if(!methodToCall.IsStatic && !methodToCall.IsConstructor && targetObject == null) if(!methodToCall.IsStatic && !methodToCall.IsConstructor && targetObject == null)
{ {
targetObject = _ExtractTarget(luaState, 1); targetObject = _ExtractTarget(luaState, 1);
LuaLib.lua_remove(luaState, 1); // Pops the receiver LuaLib.lua_remove(luaState, 1); // Pops the receiver
} }
if(!_Translator.matchParameters(luaState, methodToCall, ref _LastCalledMethod)) if(!_Translator.matchParameters(luaState, methodToCall, ref _LastCalledMethod))
{ {
_Translator.throwError(luaState, "invalid arguments to method call"); _Translator.throwError(luaState, "invalid arguments to method call");
LuaLib.lua_pushnil(luaState); LuaLib.lua_pushnil(luaState);
return 1; return 1;
} }
} }
} }
if(failedCall) if(failedCall)
{ {
if(!LuaLib.lua_checkstack(luaState, _LastCalledMethod.outList.Length + 6)) if(!LuaLib.lua_checkstack(luaState, _LastCalledMethod.outList.Length + 6))
throw new LuaException("Lua stack overflow"); throw new LuaException("Lua stack overflow");
try try
{ {
if(isStatic) if(isStatic)
_Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(null, _LastCalledMethod.args)); _Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(null, _LastCalledMethod.args));
else else
{ {
if(_LastCalledMethod.cachedMethod.IsConstructor) if(_LastCalledMethod.cachedMethod.IsConstructor)
_Translator.push(luaState, ((ConstructorInfo)_LastCalledMethod.cachedMethod).Invoke(_LastCalledMethod.args)); _Translator.push(luaState, ((ConstructorInfo)_LastCalledMethod.cachedMethod).Invoke(_LastCalledMethod.args));
else else
_Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(targetObject, _LastCalledMethod.args)); _Translator.push(luaState, _LastCalledMethod.cachedMethod.Invoke(targetObject, _LastCalledMethod.args));
} }
} }
catch(TargetInvocationException e) catch(TargetInvocationException e)
{ {
return SetPendingException(e.GetBaseException()); return SetPendingException(e.GetBaseException());
} }
catch(Exception e) catch(Exception e)
{ {
return SetPendingException(e); return SetPendingException(e);
} }
} }
// Pushes out and ref return values // Pushes out and ref return values
for(int index = 0; index < _LastCalledMethod.outList.Length; index++) for(int index = 0; index < _LastCalledMethod.outList.Length; index++)
{ {
nReturnValues++; nReturnValues++;
//for(int i=0;i<lastCalledMethod.outList.Length;i++) //for(int i=0;i<lastCalledMethod.outList.Length;i++)
_Translator.push(luaState, _LastCalledMethod.args[_LastCalledMethod.outList[index]]); _Translator.push(luaState, _LastCalledMethod.args[_LastCalledMethod.outList[index]]);
} }
//by isSingle 2010-09-10 11:26:31 //by isSingle 2010-09-10 11:26:31
//Desc: //Desc:
// if not return void,we need add 1, // if not return void,we need add 1,
// or we will lost the function's return value // or we will lost the function's return value
// when call dotnet function like "int foo(arg1,out arg2,out arg3)" in lua code // when call dotnet function like "int foo(arg1,out arg2,out arg3)" in lua code
if(!_LastCalledMethod.IsReturnVoid && nReturnValues > 0) if(!_LastCalledMethod.IsReturnVoid && nReturnValues > 0)
nReturnValues++; nReturnValues++;
return nReturnValues < 1 ? 1 : nReturnValues; return nReturnValues < 1 ? 1 : nReturnValues;
} }
} }
} }
\ No newline at end of file
/* /*
* This file is part of LuaInterface. * This file is part of LuaInterface.
* *
* Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz. * Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz.
* Copyright (C) 2012 Megax <http://megax.yeahunter.hu/> * Copyright (C) 2012 Megax <http://megax.yeahunter.hu/>
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights * in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is * copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: * furnished to do so, subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
using System; using System;
namespace LuaInterface.Method namespace LuaInterface.Method
{ {
/* /*
* Parameter information * Parameter information
*/ */
struct MethodArgs struct MethodArgs
{ {
// Position of parameter // Position of parameter
public int index; public int index;
// Type-conversion function // Type-conversion function
public ExtractValue extractValue; public ExtractValue extractValue;
public bool isParamsArray; public bool isParamsArray;
public Type paramsArrayType; public Type paramsArrayType;
} }
} }
\ No newline at end of file
/* /*
* This file is part of LuaInterface. * This file is part of LuaInterface.
* *
* Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz. * Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz.
* Copyright (C) 2012 Megax <http://megax.yeahunter.hu/> * Copyright (C) 2012 Megax <http://megax.yeahunter.hu/>
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights * in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is * copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: * furnished to do so, subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
using System; using System;
using System.Reflection; using System.Reflection;
using LuaInterface.Extensions; using LuaInterface.Extensions;
namespace LuaInterface.Method namespace LuaInterface.Method
{ {
/* /*
* Cached method * Cached method
*/ */
struct MethodCache struct MethodCache
{ {
private MethodBase _cachedMethod; private MethodBase _cachedMethod;
public MethodBase cachedMethod public MethodBase cachedMethod
{ {
get get
{ {
return _cachedMethod; return _cachedMethod;
} }
set set
{ {
_cachedMethod = value; _cachedMethod = value;
var mi = value as MethodInfo; var mi = value as MethodInfo;
if(!mi.IsNull()) if(!mi.IsNull())
IsReturnVoid = string.Compare(mi.ReturnType.Name, "System.Void", true) == 0; IsReturnVoid = string.Compare(mi.ReturnType.Name, "System.Void", true) == 0;
} }
} }
public bool IsReturnVoid; public bool IsReturnVoid;
// List or arguments // List or arguments
public object[] args; public object[] args;
// Positions of out parameters // Positions of out parameters
public int[] outList; public int[] outList;
// Types of parameters // Types of parameters
public MethodArgs[] argTypes; public MethodArgs[] argTypes;
} }
} }
\ No newline at end of file
/* /*
* This file is part of LuaInterface. * This file is part of LuaInterface.
* *
* Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz. * Copyright (C) 2003-2005 Fabio Mascarenhas de Queiroz.
* Copyright (C) 2012 Megax <http://megax.yeahunter.hu/> * Copyright (C) 2012 Megax <http://megax.yeahunter.hu/>
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights * in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is * copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: * furnished to do so, subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
using System; using System;
using System.Reflection; using System.Reflection;
namespace LuaInterface.Method namespace LuaInterface.Method
{ {
/* /*
* Wrapper class for events that does registration/deregistration * Wrapper class for events that does registration/deregistration
* of event handlers. * of event handlers.
* *
* Author: Fabio Mascarenhas * Author: Fabio Mascarenhas
* Version: 1.0 * Version: 1.0
*/ */
class RegisterEventHandler class RegisterEventHandler
{ {
private EventHandlerContainer pendingEvents; private EventHandlerContainer pendingEvents;
private EventInfo eventInfo; private EventInfo eventInfo;
private object target; private object target;
public RegisterEventHandler(EventHandlerContainer pendingEvents, object target, EventInfo eventInfo) public RegisterEventHandler(EventHandlerContainer pendingEvents, object target, EventInfo eventInfo)
{ {
this.target = target; this.target = target;
this.eventInfo = eventInfo; this.eventInfo = eventInfo;
this.pendingEvents = pendingEvents; this.pendingEvents = pendingEvents;
} }
/* /*
* Adds a new event handler * Adds a new event handler
*/ */
public Delegate Add(LuaFunction function) public Delegate Add(LuaFunction function)
{ {
//CP: Fix by Ben Bryant for event handling with one parameter //CP: Fix by Ben Bryant for event handling with one parameter
//link: http://luaforge.net/forum/message.php?msg_id=9266 //link: http://luaforge.net/forum/message.php?msg_id=9266
Delegate handlerDelegate = CodeGeneration.Instance.GetDelegate(eventInfo.EventHandlerType, function); Delegate handlerDelegate = CodeGeneration.Instance.GetDelegate(eventInfo.EventHandlerType, function);
eventInfo.AddEventHandler(target, handlerDelegate); eventInfo.AddEventHandler(target, handlerDelegate);
pendingEvents.Add(handlerDelegate, this); pendingEvents.Add(handlerDelegate, this);
return handlerDelegate; return handlerDelegate;
//MethodInfo mi = eventInfo.EventHandlerType.GetMethod("Invoke"); //MethodInfo mi = eventInfo.EventHandlerType.GetMethod("Invoke");
//ParameterInfo[] pi = mi.GetParameters(); //ParameterInfo[] pi = mi.GetParameters();
//LuaEventHandler handler=CodeGeneration.Instance.GetEvent(pi[1].ParameterType,function); //LuaEventHandler handler=CodeGeneration.Instance.GetEvent(pi[1].ParameterType,function);
//Delegate handlerDelegate=Delegate.CreateDelegate(eventInfo.EventHandlerType,handler,"HandleEvent"); //Delegate handlerDelegate=Delegate.CreateDelegate(eventInfo.EventHandlerType,handler,"HandleEvent");
//eventInfo.AddEventHandler(target,handlerDelegate); //eventInfo.AddEventHandler(target,handlerDelegate);
//pendingEvents.Add(handlerDelegate, this); //pendingEvents.Add(handlerDelegate, this);
//return handlerDelegate; //return handlerDelegate;
} }
/* /*
* Removes an existing event handler * Removes an existing event handler
*/ */
public void Remove(Delegate handlerDelegate) public void Remove(Delegate handlerDelegate)
{ {
RemovePending(handlerDelegate); RemovePending(handlerDelegate);
pendingEvents.Remove(handlerDelegate); pendingEvents.Remove(handlerDelegate);
} }
/* /*
* Removes an existing event handler (without updating the pending handlers list) * Removes an existing event handler (without updating the pending handlers list)
*/ */
internal void RemovePending(Delegate handlerDelegate) internal void RemovePending(Delegate handlerDelegate)
{ {
eventInfo.RemoveEventHandler(target, handlerDelegate); eventInfo.RemoveEventHandler(target, handlerDelegate);
} }
} }
} }
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment