Unverified Commit 5e9a190a authored by Vinicius Jarina's avatar Vinicius Jarina Committed by GitHub
Browse files

WIP cleanup (#275)

* WIP cleanup

* Trying fixing iPhoneSimTests.

* More cleanups

* Minified initLua loadCLRpackage
parent 66947423
...@@ -9,33 +9,33 @@ namespace NLua ...@@ -9,33 +9,33 @@ namespace NLua
using LuaState = KeraLua.Lua; using LuaState = KeraLua.Lua;
sealed class CheckType sealed class CheckType
{ {
Dictionary<Type, ExtractValue> extractValues = new Dictionary<Type, ExtractValue>(); readonly Dictionary<Type, ExtractValue> _extractValues = new Dictionary<Type, ExtractValue>();
ExtractValue extractNetObject; readonly ExtractValue _extractNetObject;
ObjectTranslator translator; readonly ObjectTranslator _translator;
public CheckType(ObjectTranslator translator) public CheckType(ObjectTranslator translator)
{ {
this.translator = translator; _translator = translator;
extractValues.Add(GetExtractDictionaryKey(typeof(object)), new ExtractValue(GetAsObject)); _extractValues.Add(GetExtractDictionaryKey(typeof(object)), GetAsObject);
extractValues.Add(GetExtractDictionaryKey(typeof(sbyte)), new ExtractValue(GetAsSbyte)); _extractValues.Add(GetExtractDictionaryKey(typeof(sbyte)), GetAsSbyte);
extractValues.Add(GetExtractDictionaryKey(typeof(byte)), new ExtractValue(GetAsByte)); _extractValues.Add(GetExtractDictionaryKey(typeof(byte)), GetAsByte);
extractValues.Add(GetExtractDictionaryKey(typeof(short)), new ExtractValue(GetAsShort)); _extractValues.Add(GetExtractDictionaryKey(typeof(short)), GetAsShort);
extractValues.Add(GetExtractDictionaryKey(typeof(ushort)), new ExtractValue(GetAsUshort)); _extractValues.Add(GetExtractDictionaryKey(typeof(ushort)), GetAsUshort);
extractValues.Add(GetExtractDictionaryKey(typeof(int)), new ExtractValue(GetAsInt)); _extractValues.Add(GetExtractDictionaryKey(typeof(int)), GetAsInt);
extractValues.Add(GetExtractDictionaryKey(typeof(uint)), new ExtractValue(GetAsUint)); _extractValues.Add(GetExtractDictionaryKey(typeof(uint)), GetAsUint);
extractValues.Add(GetExtractDictionaryKey(typeof(long)), new ExtractValue(GetAsLong)); _extractValues.Add(GetExtractDictionaryKey(typeof(long)), GetAsLong);
extractValues.Add(GetExtractDictionaryKey(typeof(ulong)), new ExtractValue(GetAsUlong)); _extractValues.Add(GetExtractDictionaryKey(typeof(ulong)), GetAsUlong);
extractValues.Add(GetExtractDictionaryKey(typeof(double)), new ExtractValue(GetAsDouble)); _extractValues.Add(GetExtractDictionaryKey(typeof(double)), GetAsDouble);
extractValues.Add(GetExtractDictionaryKey(typeof(char)), new ExtractValue(GetAsChar)); _extractValues.Add(GetExtractDictionaryKey(typeof(char)), GetAsChar);
extractValues.Add(GetExtractDictionaryKey(typeof(float)), new ExtractValue(GetAsFloat)); _extractValues.Add(GetExtractDictionaryKey(typeof(float)), GetAsFloat);
extractValues.Add(GetExtractDictionaryKey(typeof(decimal)), new ExtractValue(GetAsDecimal)); _extractValues.Add(GetExtractDictionaryKey(typeof(decimal)), GetAsDecimal);
extractValues.Add(GetExtractDictionaryKey(typeof(bool)), new ExtractValue(GetAsBoolean)); _extractValues.Add(GetExtractDictionaryKey(typeof(bool)), GetAsBoolean);
extractValues.Add(GetExtractDictionaryKey(typeof(string)), new ExtractValue(GetAsString)); _extractValues.Add(GetExtractDictionaryKey(typeof(string)), GetAsString);
extractValues.Add(GetExtractDictionaryKey(typeof(char[])), new ExtractValue(GetAsCharArray)); _extractValues.Add(GetExtractDictionaryKey(typeof(char[])), GetAsCharArray);
extractValues.Add(GetExtractDictionaryKey(typeof(LuaFunction)), new ExtractValue(GetAsFunction)); _extractValues.Add(GetExtractDictionaryKey(typeof(LuaFunction)), GetAsFunction);
extractValues.Add(GetExtractDictionaryKey(typeof(LuaTable)), new ExtractValue(GetAsTable)); _extractValues.Add(GetExtractDictionaryKey(typeof(LuaTable)), GetAsTable);
extractValues.Add(GetExtractDictionaryKey(typeof(LuaUserData)), new ExtractValue(GetAsUserdata)); _extractValues.Add(GetExtractDictionaryKey(typeof(LuaUserData)), GetAsUserdata);
extractNetObject = new ExtractValue(GetAsNetObject); _extractNetObject = GetAsNetObject;
} }
/* /*
...@@ -53,7 +53,7 @@ namespace NLua ...@@ -53,7 +53,7 @@ namespace NLua
paramType = paramType.GetElementType(); paramType = paramType.GetElementType();
var extractKey = GetExtractDictionaryKey(paramType); var extractKey = GetExtractDictionaryKey(paramType);
return extractValues.ContainsKey(extractKey) ? extractValues[extractKey] : extractNetObject; return _extractValues.ContainsKey(extractKey) ? _extractValues[extractKey] : _extractNetObject;
} }
internal ExtractValue CheckLuaType(LuaState luaState, int stackPos, Type paramType) internal ExtractValue CheckLuaType(LuaState luaState, int stackPos, Type paramType)
...@@ -91,90 +91,90 @@ namespace NLua ...@@ -91,90 +91,90 @@ namespace NLua
{ {
// Return the correct extractor anyways // Return the correct extractor anyways
if (netParamIsNumeric || paramType == typeof(bool)) if (netParamIsNumeric || paramType == typeof(bool))
return extractValues[extractKey]; return _extractValues[extractKey];
return extractNetObject; return _extractNetObject;
} }
} }
if (paramType.Equals(typeof(object))) if (paramType.Equals(typeof(object)))
return extractValues[extractKey]; return _extractValues[extractKey];
//CP: Added support for generic parameters //CP: Added support for generic parameters
if (paramType.IsGenericParameter) if (paramType.IsGenericParameter)
{ {
if (luatype == LuaType.Boolean) if (luatype == LuaType.Boolean)
return extractValues[GetExtractDictionaryKey(typeof(bool))]; return _extractValues[GetExtractDictionaryKey(typeof(bool))];
else if (luatype == LuaType.String) if (luatype == LuaType.String)
return extractValues[GetExtractDictionaryKey(typeof(string))]; return _extractValues[GetExtractDictionaryKey(typeof(string))];
else if (luatype == LuaType.Table) if (luatype == LuaType.Table)
return extractValues[GetExtractDictionaryKey(typeof(LuaTable))]; return _extractValues[GetExtractDictionaryKey(typeof(LuaTable))];
else if (luatype == LuaType.UserData) if (luatype == LuaType.UserData)
return extractValues[GetExtractDictionaryKey(typeof(object))]; return _extractValues[GetExtractDictionaryKey(typeof(object))];
else if (luatype == LuaType.Function) if (luatype == LuaType.Function)
return extractValues[GetExtractDictionaryKey(typeof(LuaFunction))]; return _extractValues[GetExtractDictionaryKey(typeof(LuaFunction))];
else if (luatype == LuaType.Number) if (luatype == LuaType.Number)
return extractValues[GetExtractDictionaryKey(typeof(double))]; return _extractValues[GetExtractDictionaryKey(typeof(double))];
} }
bool netParamIsString = paramType == typeof(string) || paramType == typeof(char[]); bool netParamIsString = paramType == typeof(string) || paramType == typeof(char[]);
if (netParamIsNumeric) if (netParamIsNumeric)
{ {
if (luaState.IsNumber(stackPos) && !netParamIsString) if (luaState.IsNumber(stackPos) && !netParamIsString)
return extractValues[extractKey]; return _extractValues[extractKey];
} }
else if (paramType == typeof(bool)) else if (paramType == typeof(bool))
{ {
if (luaState.IsBoolean(stackPos)) if (luaState.IsBoolean(stackPos))
return extractValues[extractKey]; return _extractValues[extractKey];
} }
else if (netParamIsString) else if (netParamIsString)
{ {
if (luaState.IsString(stackPos)) if (luaState.IsString(stackPos))
return extractValues[extractKey]; return _extractValues[extractKey];
else if (luatype == LuaType.Nil) if (luatype == LuaType.Nil)
return extractNetObject; // kevinh - silently convert nil to a null string pointer return _extractNetObject; // kevinh - silently convert nil to a null string pointer
} }
else if (paramType == typeof(LuaTable)) else if (paramType == typeof(LuaTable))
{ {
if (luatype == LuaType.Table || luatype == LuaType.Nil) if (luatype == LuaType.Table || luatype == LuaType.Nil)
return extractValues[extractKey]; return _extractValues[extractKey];
} }
else if (paramType == typeof(LuaUserData)) else if (paramType == typeof(LuaUserData))
{ {
if (luatype == LuaType.UserData || luatype == LuaType.Nil) if (luatype == LuaType.UserData || luatype == LuaType.Nil)
return extractValues[extractKey]; return _extractValues[extractKey];
} }
else if (paramType == typeof(LuaFunction)) else if (paramType == typeof(LuaFunction))
{ {
if (luatype == LuaType.Function || luatype == LuaType.Nil) if (luatype == LuaType.Function || luatype == LuaType.Nil)
return extractValues[extractKey]; return _extractValues[extractKey];
} }
else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaType.Function) else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaType.Function)
return new ExtractValue(new DelegateGenerator(translator, paramType).ExtractGenerated); return new DelegateGenerator(_translator, paramType).ExtractGenerated;
else if (paramType.IsInterface && luatype == LuaType.Table) else if (paramType.IsInterface && luatype == LuaType.Table)
return new ExtractValue(new ClassGenerator(translator, paramType).ExtractGenerated); return new ClassGenerator(_translator, paramType).ExtractGenerated;
else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaType.Nil) else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaType.Nil)
{ {
// kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found // kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found
return extractNetObject; return _extractNetObject;
} }
else if (luaState.Type(stackPos) == LuaType.Table) else if (luaState.Type(stackPos) == LuaType.Table)
{ {
if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil) if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil)
{ {
object obj = translator.GetNetObject(luaState, -1); object obj = _translator.GetNetObject(luaState, -1);
luaState.SetTop(-2); luaState.SetTop(-2);
if (obj != null && paramType.IsAssignableFrom(obj.GetType())) if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
return extractNetObject; return _extractNetObject;
} }
else else
return null; return null;
} }
else else
{ {
object obj = translator.GetNetObject(luaState, stackPos); object obj = _translator.GetNetObject(luaState, stackPos);
if (obj != null && paramType.IsAssignableFrom(obj.GetType())) if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
return extractNetObject; return _extractNetObject;
} }
return null; return null;
...@@ -323,17 +323,17 @@ namespace NLua ...@@ -323,17 +323,17 @@ namespace NLua
private object GetAsTable(LuaState luaState, int stackPos) private object GetAsTable(LuaState luaState, int stackPos)
{ {
return translator.GetTable(luaState, stackPos); return _translator.GetTable(luaState, stackPos);
} }
private object GetAsFunction(LuaState luaState, int stackPos) private object GetAsFunction(LuaState luaState, int stackPos)
{ {
return translator.GetFunction(luaState, stackPos); return _translator.GetFunction(luaState, stackPos);
} }
private object GetAsUserdata(LuaState luaState, int stackPos) private object GetAsUserdata(LuaState luaState, int stackPos)
{ {
return translator.GetUserData(luaState, stackPos); return _translator.GetUserData(luaState, stackPos);
} }
public object GetAsObject(LuaState luaState, int stackPos) public object GetAsObject(LuaState luaState, int stackPos)
...@@ -342,7 +342,7 @@ namespace NLua ...@@ -342,7 +342,7 @@ namespace NLua
{ {
if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil) if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil)
{ {
if (luaState.CheckMetaTable(-1, translator.Tag)) if (luaState.CheckMetaTable(-1, _translator.Tag))
{ {
luaState.Insert(stackPos); luaState.Insert(stackPos);
luaState.Remove(stackPos + 1); luaState.Remove(stackPos + 1);
...@@ -352,23 +352,23 @@ namespace NLua ...@@ -352,23 +352,23 @@ namespace NLua
} }
} }
object obj = translator.GetObject(luaState, stackPos); object obj = _translator.GetObject(luaState, stackPos);
return obj; return obj;
} }
public object GetAsNetObject(LuaState luaState, int stackPos) public object GetAsNetObject(LuaState luaState, int stackPos)
{ {
object obj = translator.GetNetObject(luaState, stackPos); object obj = _translator.GetNetObject(luaState, stackPos);
if (obj == null && luaState.Type(stackPos) == LuaType.Table) if (obj == null && luaState.Type(stackPos) == LuaType.Table)
{ {
if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil) if (luaState.GetMetaField(stackPos, "__index") != LuaType.Nil)
{ {
if (luaState.CheckMetaTable(-1, translator.Tag)) if (luaState.CheckMetaTable(-1, _translator.Tag))
{ {
luaState.Insert(stackPos); luaState.Insert(stackPos);
luaState.Remove(stackPos + 1); luaState.Remove(stackPos + 1);
obj = translator.GetNetObject(luaState, stackPos); obj = _translator.GetNetObject(luaState, stackPos);
} }
else else
luaState.SetTop(-2); luaState.SetTop(-2);
......
...@@ -6,18 +6,16 @@ namespace NLua.Event ...@@ -6,18 +6,16 @@ namespace NLua.Event
/// <summary> /// <summary>
/// Event args for hook callback event /// Event args for hook callback event
/// </summary> /// </summary>
/// <author>Reinhard Ostermeier</author>
public class DebugHookEventArgs : EventArgs public class DebugHookEventArgs : EventArgs
{ {
readonly LuaDebug luaDebug;
public DebugHookEventArgs(LuaDebug luaDebug) public DebugHookEventArgs(LuaDebug luaDebug)
{ {
this.luaDebug = luaDebug; LuaDebug = luaDebug;
} }
public LuaDebug LuaDebug { /// <summary>
get { return luaDebug; } /// Lua Debug Information
} /// </summary>
public LuaDebug LuaDebug { get; }
} }
} }
\ No newline at end of file
...@@ -4,15 +4,11 @@ namespace NLua.Event ...@@ -4,15 +4,11 @@ namespace NLua.Event
{ {
public class HookExceptionEventArgs : EventArgs public class HookExceptionEventArgs : EventArgs
{ {
private readonly Exception m_Exception; public Exception Exception { get; }
public Exception Exception {
get { return m_Exception; }
}
public HookExceptionEventArgs(Exception ex) public HookExceptionEventArgs(Exception ex)
{ {
m_Exception = ex; Exception = ex;
} }
} }
} }
\ No newline at end of file
...@@ -8,10 +8,6 @@ namespace NLua.Exceptions ...@@ -8,10 +8,6 @@ namespace NLua.Exceptions
[Serializable] [Serializable]
public class LuaException : Exception public class LuaException : Exception
{ {
public LuaException ()
{
}
public LuaException (string message) : base(message) public LuaException (string message) : base(message)
{ {
} }
......
...@@ -12,18 +12,14 @@ namespace NLua.Exceptions ...@@ -12,18 +12,14 @@ namespace NLua.Exceptions
/// <summary> /// <summary>
/// Returns true if the exception has occured as the result of a .NET exception in user code /// Returns true if the exception has occured as the result of a .NET exception in user code
/// </summary> /// </summary>
public bool IsNetException { get; private set; } public bool IsNetException { get; }
private readonly string source; private readonly string _source;
/// <summary> /// <summary>
/// The position in the script where the exception was triggered. /// The position in the script where the exception was triggered.
/// </summary> /// </summary>
#if SILVERLIGHT && !WINDOWS_PHONE public override string Source => _source;
public string Source { get { return source; } }
#else
public override string Source { get { return source; } }
#endif
/// <summary> /// <summary>
/// Creates a new Lua-only exception. /// Creates a new Lua-only exception.
...@@ -32,7 +28,7 @@ namespace NLua.Exceptions ...@@ -32,7 +28,7 @@ namespace NLua.Exceptions
/// <param name="source">The position in the script where the exception was triggered.</param> /// <param name="source">The position in the script where the exception was triggered.</param>
public LuaScriptException(string message, string source) : base(message) public LuaScriptException(string message, string source) : base(message)
{ {
this.source = source; _source = source;
} }
/// <summary> /// <summary>
...@@ -43,14 +39,14 @@ namespace NLua.Exceptions ...@@ -43,14 +39,14 @@ namespace NLua.Exceptions
public LuaScriptException(Exception innerException, string source) public LuaScriptException(Exception innerException, string source)
: base("A .NET exception occured in user-code", innerException) : base("A .NET exception occured in user-code", innerException)
{ {
this.source = source; _source = source;
this.IsNetException = true; IsNetException = true;
} }
public override string ToString() public override string ToString()
{ {
// Prepend the error source // Prepend the error source
return GetType().FullName + ": " + source + Message; return GetType().FullName + ": " + _source + Message;
} }
} }
} }
\ No newline at end of file
using System.Collections.Generic;
namespace NLua.Extensions
{
static class StringExtensions
{
public static IEnumerable<string> SplitWithEscape(this string input, char separator, char escapeCharacter)
{
int start = 0;
int index = 0;
while (index < input.Length)
{
index = input.IndexOf(separator, index);
if (index == -1)
break;
if (input[index - 1] == escapeCharacter)
{
input = input.Remove(index - 1, 1);
continue;
}
yield return input.Substring(start, index - start);
index++;
start = index;
}
yield return input.Substring(start);
}
}
}
\ No newline at end of file
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
...@@ -92,7 +92,7 @@ namespace NLua.Extensions ...@@ -92,7 +92,7 @@ namespace NLua.Extensions
public static MethodInfo[] GetExtensionMethods(this Type type, IEnumerable<Assembly> assemblies = null) public static MethodInfo[] GetExtensionMethods(this Type type, IEnumerable<Assembly> assemblies = null)
{ {
List<Type> types = new List<Type>(); var types = new List<Type>();
types.AddRange(type.Assembly.GetTypes().Where(t => t.IsPublic)); types.AddRange(type.Assembly.GetTypes().Where(t => t.IsPublic));
...@@ -106,58 +106,34 @@ namespace NLua.Extensions ...@@ -106,58 +106,34 @@ namespace NLua.Extensions
} }
} }
var query = from extensionType in types var query = types
where extensionType.IsSealed && !extensionType.IsGenericType && !extensionType.IsNested .Where(extensionType =>
from method in extensionType.GetMethods(BindingFlags.Static | BindingFlags.Public) extensionType.IsSealed && !extensionType.IsGenericType && !extensionType.IsNested)
where method.IsDefined(typeof(ExtensionAttribute), false) .SelectMany(extensionType => extensionType.GetMethods(BindingFlags.Static | BindingFlags.Public),
where (method.GetParameters()[0].ParameterType == type (extensionType, method) => new {extensionType, method})
|| type.IsSubclassOf(method.GetParameters()[0].ParameterType) .Where(t => t.method.IsDefined(typeof(ExtensionAttribute), false))
|| type.GetInterfaces().Contains(method.GetParameters()[0].ParameterType)) .Where(t =>
select method; t.method.GetParameters()[0].ParameterType == type ||
return query.ToArray<MethodInfo>(); type.IsSubclassOf(t.method.GetParameters()[0].ParameterType) ||
type.GetInterfaces().Contains(t.method.GetParameters()[0].ParameterType))
.Select(t => t.method);
return query.ToArray();
} }
/// <summary> /// <summary>
/// Extends the System.Type-type to search for a given extended MethodeName. /// Extends the System.Type-type to search for a given extended MethodeName.
/// </summary> /// </summary>
/// <param name="MethodeName">Name of the Methode</param> /// <param name="t"></param>
/// <returns>the found Method or null</returns> /// <param name="name"></param>
/// <param name="assemblies"></param>
/// <returns></returns>
public static MethodInfo GetExtensionMethod(this Type t, string name, IEnumerable<Assembly> assemblies = null) public static MethodInfo GetExtensionMethod(this Type t, string name, IEnumerable<Assembly> assemblies = null)
{ {
var mi = from methode in t.GetExtensionMethods(assemblies) var mi = t.GetExtensionMethods(assemblies).Where(method => method.Name == name).ToArray();
where methode.Name == name if (mi.Length == 0)
select methode;
if (!mi.Any<MethodInfo>())
return null; return null;
else return mi[0];
return mi.First<MethodInfo>();
}
}
static class StringExtensions
{
public static IEnumerable<string> SplitWithEscape(this string input, char separator, char escapeCharacter)
{
int start = 0;
int index = 0;
while (index < input.Length)
{
index = input.IndexOf(separator, index);
if (index == -1)
break;
if (input[index - 1] == escapeCharacter)
{
input = input.Remove(index - 1, 1);
continue;
}
yield return input.Substring(start, index - start);
index++;
start = index;
}
yield return input.Substring(start);
} }
} }
} }
\ No newline at end of file
...@@ -5,18 +5,18 @@ namespace NLua ...@@ -5,18 +5,18 @@ namespace NLua
{ {
class ClassGenerator class ClassGenerator
{ {
private ObjectTranslator translator; private readonly ObjectTranslator _translator;
private Type klass; private readonly Type _klass;
public ClassGenerator(ObjectTranslator objTranslator, Type typeClass) public ClassGenerator(ObjectTranslator objTranslator, Type typeClass)
{ {
translator = objTranslator; _translator = objTranslator;
klass = typeClass; _klass = typeClass;
} }
public object ExtractGenerated(LuaState luaState, int stackPos) public object ExtractGenerated(LuaState luaState, int stackPos)
{ {
return CodeGeneration.Instance.GetClassInstance(klass, translator.GetTable(luaState, stackPos)); return CodeGeneration.Instance.GetClassInstance(_klass, _translator.GetTable(luaState, stackPos));
} }
} }
} }
\ No newline at end of file
...@@ -2,9 +2,7 @@ using System; ...@@ -2,9 +2,7 @@ using System;
using System.Threading; using System.Threading;
using System.Reflection; using System.Reflection;
using NLua.Extensions;
using System.Reflection.Emit; using System.Reflection.Emit;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using NLua.Method; using NLua.Method;
...@@ -12,12 +10,10 @@ namespace NLua ...@@ -12,12 +10,10 @@ namespace NLua
{ {
class CodeGeneration class CodeGeneration
{ {
private Dictionary<Type, LuaClassType> classCollection = new Dictionary<Type, LuaClassType>(); private readonly Dictionary<Type, LuaClassType> _classCollection = new Dictionary<Type, LuaClassType>();
private Dictionary<Type, Type> delegateCollection = new Dictionary<Type, Type>(); private readonly Dictionary<Type, Type> _delegateCollection = new Dictionary<Type, Type>();
private static readonly CodeGeneration instance = new CodeGeneration();
private AssemblyName assemblyName;
#if !(__IOS__ || __TVOS__ || __WATCHOS__) && !SILVERLIGHT && !NETSTANDARD #if !(__IOS__ || __TVOS__ || __WATCHOS__) && !NETSTANDARD
private Dictionary<Type, Type> eventHandlerCollection = new Dictionary<Type, Type>(); private Dictionary<Type, Type> eventHandlerCollection = new Dictionary<Type, Type>();
private Type eventHandlerParent = typeof(LuaEventHandler); private Type eventHandlerParent = typeof(LuaEventHandler);
private Type delegateParent = typeof(LuaDelegate); private Type delegateParent = typeof(LuaDelegate);
...@@ -34,7 +30,7 @@ namespace NLua ...@@ -34,7 +30,7 @@ namespace NLua
private CodeGeneration() private CodeGeneration()
{ {
// Create an assembly name // Create an assembly name
assemblyName = new AssemblyName(); var assemblyName = new AssemblyName();
assemblyName.Name = "NLua_generatedcode"; assemblyName.Name = "NLua_generatedcode";
// Create a new assembly with one module. // Create a new assembly with one module.
#if NETCOREAPP #if NETCOREAPP
...@@ -49,9 +45,7 @@ namespace NLua ...@@ -49,9 +45,7 @@ namespace NLua
/* /*
* Singleton instance of the class * Singleton instance of the class
*/ */
public static CodeGeneration Instance { public static CodeGeneration Instance { get; } = new CodeGeneration();
get { return instance; }
}
/* /*
* Generates an event handler that calls a Lua function * Generates an event handler that calls a Lua function
...@@ -60,15 +54,13 @@ namespace NLua ...@@ -60,15 +54,13 @@ namespace NLua
{ {
#if __IOS__ || __TVOS__ || __WATCHOS__ #if __IOS__ || __TVOS__ || __WATCHOS__
throw new NotImplementedException (" Emit not available on Xamarin.iOS "); throw new NotImplementedException (" Emit not available on Xamarin.iOS ");
#elif SILVERLIGHT
throw new NotImplementedException(" Emit not available on Silverlight ");
#elif NETSTANDARD #elif NETSTANDARD
throw new NotImplementedException(" Emit not available on .NET Standard "); throw new NotImplementedException(" Emit not available on .NET Standard ");
#else #else
string typeName; string typeName;
lock (this) lock (this)
{ {
typeName = "LuaGeneratedClass" + luaClassNumber.ToString(); typeName = "LuaGeneratedClass" + luaClassNumber;
luaClassNumber++; luaClassNumber++;
} }
...@@ -105,15 +97,13 @@ namespace NLua ...@@ -105,15 +97,13 @@ namespace NLua
{ {
#if __IOS__ || __TVOS__ || __WATCHOS__ #if __IOS__ || __TVOS__ || __WATCHOS__
throw new NotImplementedException ("GenerateDelegate is not available on iOS, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) "); throw new NotImplementedException ("GenerateDelegate is not available on iOS, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) ");
#elif SILVERLIGHT
throw new NotImplementedException("GenerateDelegate is not available on Silverlight, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) ");
#elif NETSTANDARD #elif NETSTANDARD
throw new NotImplementedException("GenerateDelegate is not available on Windows Store, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) "); throw new NotImplementedException("GenerateDelegate is not available on Windows Store, please register your LuaDelegate type with Lua.RegisterLuaDelegateType( yourDelegate, theLuaDelegateHandler) ");
#else #else
string typeName; string typeName;
lock (this) lock (this)
{ {
typeName = "LuaGeneratedClass" + luaClassNumber.ToString(); typeName = "LuaGeneratedClass" + luaClassNumber;
luaClassNumber++; luaClassNumber++;
} }
...@@ -297,13 +287,10 @@ namespace NLua ...@@ -297,13 +287,10 @@ namespace NLua
GetReturnTypesFromMethod(method, out returnTypes[i]); GetReturnTypesFromMethod(method, out returnTypes[i]);
i++; i++;
} }
else else if (!method.IsPrivate && !method.IsFinal && method.IsVirtual)
{ {
if (!method.IsPrivate && !method.IsFinal && method.IsVirtual) GetReturnTypesFromMethod(method, out returnTypes[i]);
{ i++;
GetReturnTypesFromMethod(method, out returnTypes[i]);
i++;
}
} }
} }
} }
...@@ -316,15 +303,13 @@ namespace NLua ...@@ -316,15 +303,13 @@ namespace NLua
{ {
#if __IOS__ || __TVOS__ || __WATCHOS__ #if __IOS__ || __TVOS__ || __WATCHOS__
throw new NotImplementedException (" Emit not available on Xamarin.iOS "); throw new NotImplementedException (" Emit not available on Xamarin.iOS ");
#elif SILVERLIGHT
throw new NotImplementedException (" Emit not available on Silverlight ");
#elif NETSTANDARD #elif NETSTANDARD
throw new NotImplementedException (" Emit not available on .NET Standard "); throw new NotImplementedException (" Emit not available on .NET Standard ");
#else #else
string typeName; string typeName;
lock (this) lock (this)
{ {
typeName = "LuaGeneratedClass" + luaClassNumber.ToString(); typeName = "LuaGeneratedClass" + luaClassNumber;
luaClassNumber++; luaClassNumber++;
} }
...@@ -414,12 +399,9 @@ namespace NLua ...@@ -414,12 +399,9 @@ namespace NLua
for (int i = 0; i < paramTypes.Length; i++) for (int i = 0; i < paramTypes.Length; i++)
{ {
paramTypes[i] = paramInfo[i].ParameterType; paramTypes[i] = paramInfo[i].ParameterType;
#if SILVERLIGHT
if (paramInfo[i].IsOut) { if (!paramInfo[i].IsIn && paramInfo[i].IsOut)
#else
if ((!paramInfo[i].IsIn) && paramInfo[i].IsOut)
{ {
#endif
nOutParams++; nOutParams++;
} }
...@@ -433,7 +415,7 @@ namespace NLua ...@@ -433,7 +415,7 @@ namespace NLua
returnTypes = returnTypesList.ToArray(); returnTypes = returnTypesList.ToArray();
} }
#if !(__IOS__ || __TVOS__ || __WATCHOS__) && !SILVERLIGHT && !NETSTANDARD #if !(__IOS__ || __TVOS__ || __WATCHOS__) && !NETSTANDARD
/* /*
* Generates an overriden implementation of method inside myType that delegates * Generates an overriden implementation of method inside myType that delegates
...@@ -458,7 +440,7 @@ namespace NLua ...@@ -458,7 +440,7 @@ namespace NLua
for (int i = 0; i < paramTypes.Length; i++) for (int i = 0; i < paramTypes.Length; i++)
{ {
paramTypes[i] = paramInfo[i].ParameterType; paramTypes[i] = paramInfo[i].ParameterType;
if ((!paramInfo[i].IsIn) && paramInfo[i].IsOut) if (!paramInfo[i].IsIn && paramInfo[i].IsOut)
nOutParams++; nOutParams++;
if (paramTypes[i].IsByRef) if (paramTypes[i].IsByRef)
...@@ -684,8 +666,6 @@ namespace NLua ...@@ -684,8 +666,6 @@ namespace NLua
{ {
#if __IOS__ || __TVOS__ || __WATCHOS__ #if __IOS__ || __TVOS__ || __WATCHOS__
throw new NotImplementedException (" Emit not available on Xamarin.iOS "); throw new NotImplementedException (" Emit not available on Xamarin.iOS ");
#elif SILVERLIGHT
throw new NotImplementedException (" Emit not available on Silverlight ");
#elif NETSTANDARD #elif NETSTANDARD
throw new NotImplementedException (" Emit not available on .NET Standard "); throw new NotImplementedException (" Emit not available on .NET Standard ");
#else #else
...@@ -700,22 +680,22 @@ namespace NLua ...@@ -700,22 +680,22 @@ namespace NLua
} }
var luaEventHandler = (LuaEventHandler)Activator.CreateInstance(eventConsumerType); var luaEventHandler = (LuaEventHandler)Activator.CreateInstance(eventConsumerType);
luaEventHandler.handler = eventHandler; luaEventHandler.Handler = eventHandler;
return luaEventHandler; return luaEventHandler;
#endif #endif
} }
public void RegisterLuaDelegateType(Type delegateType, Type luaDelegateType) public void RegisterLuaDelegateType(Type delegateType, Type luaDelegateType)
{ {
delegateCollection[delegateType] = luaDelegateType; _delegateCollection[delegateType] = luaDelegateType;
} }
public void RegisterLuaClassType(Type klass, Type luaClass) public void RegisterLuaClassType(Type klass, Type luaClass)
{ {
LuaClassType luaClassType = new LuaClassType(); var luaClassType = new LuaClassType();
luaClassType.klass = luaClass; luaClassType.klass = luaClass;
GetReturnTypesFromClass(klass, out luaClassType.returnTypes); GetReturnTypesFromClass(klass, out luaClassType.returnTypes);
classCollection[klass] = luaClassType; _classCollection[klass] = luaClassType;
} }
/* /*
* Gets a delegate with delegateType that calls the luaFunc Lua function * Gets a delegate with delegateType that calls the luaFunc Lua function
...@@ -726,12 +706,14 @@ namespace NLua ...@@ -726,12 +706,14 @@ namespace NLua
var returnTypes = new List<Type>(); var returnTypes = new List<Type>();
Type luaDelegateType; Type luaDelegateType;
if (delegateCollection.ContainsKey(delegateType)) if (_delegateCollection.ContainsKey(delegateType))
luaDelegateType = delegateCollection[delegateType]; {
luaDelegateType = _delegateCollection[delegateType];
}
else else
{ {
luaDelegateType = GenerateDelegate(delegateType); luaDelegateType = GenerateDelegate(delegateType);
delegateCollection[delegateType] = luaDelegateType; _delegateCollection[delegateType] = luaDelegateType;
} }
var methodInfo = delegateType.GetMethod("Invoke"); var methodInfo = delegateType.GetMethod("Invoke");
...@@ -746,12 +728,7 @@ namespace NLua ...@@ -746,12 +728,7 @@ namespace NLua
var luaDelegate = (LuaDelegate)Activator.CreateInstance(luaDelegateType); var luaDelegate = (LuaDelegate)Activator.CreateInstance(luaDelegateType);
luaDelegate.function = luaFunc; luaDelegate.function = luaFunc;
luaDelegate.returnTypes = returnTypes.ToArray(); luaDelegate.returnTypes = returnTypes.ToArray();
#if NETFX_CORE
var mi = luaDelegate.GetType ().GetTypeInfo ().GetDeclaredMethod ("CallFunction");
return mi.CreateDelegate (delegateType, luaDelegate);
#else
return Delegate.CreateDelegate(delegateType, luaDelegate, "CallFunction"); return Delegate.CreateDelegate(delegateType, luaDelegate, "CallFunction");
#endif
} }
/* /*
...@@ -764,13 +741,13 @@ namespace NLua ...@@ -764,13 +741,13 @@ namespace NLua
{ {
LuaClassType luaClassType; LuaClassType luaClassType;
if (classCollection.ContainsKey(klass)) if (_classCollection.ContainsKey(klass))
luaClassType = classCollection[klass]; luaClassType = _classCollection[klass];
else else
{ {
luaClassType = new LuaClassType(); luaClassType = new LuaClassType();
GenerateClass(klass, out luaClassType.klass, out luaClassType.returnTypes); GenerateClass(klass, out luaClassType.klass, out luaClassType.returnTypes);
classCollection[klass] = luaClassType; _classCollection[klass] = luaClassType;
} }
return Activator.CreateInstance(luaClassType.klass, new object[] { return Activator.CreateInstance(luaClassType.klass, new object[] {
......
...@@ -5,19 +5,18 @@ namespace NLua ...@@ -5,19 +5,18 @@ namespace NLua
{ {
class DelegateGenerator class DelegateGenerator
{ {
private ObjectTranslator translator; private readonly ObjectTranslator _translator;
private Type delegateType; private readonly Type _delegateType;
public DelegateGenerator(ObjectTranslator objectTranslator, Type type) public DelegateGenerator(ObjectTranslator objectTranslator, Type type)
{ {
translator = objectTranslator; _translator = objectTranslator;
delegateType = type; _delegateType = type;
} }
public object ExtractGenerated(LuaState luaState, int stackPos) public object ExtractGenerated(LuaState luaState, int stackPos)
{ {
return CodeGeneration.Instance.GetDelegate(delegateType, translator.GetFunction(luaState, stackPos)); return CodeGeneration.Instance.GetDelegate(_delegateType, _translator.GetFunction(luaState, stackPos));
} }
} }
} }
\ No newline at end of file
...@@ -37,22 +37,21 @@ namespace NLua ...@@ -37,22 +37,21 @@ namespace NLua
/// <summary> /// <summary>
/// lua hook calback delegate /// lua hook calback delegate
/// </summary> /// </summary>
private LuaHookFunction hookCallback = null; private LuaHookFunction _hookCallback;
#endregion #endregion
#region Globals auto-complete #region Globals auto-complete
private readonly List<string> globals = new List<string>(); private readonly List<string> _globals = new List<string>();
private bool globalsSorted; private bool _globalsSorted;
#endregion #endregion
private LuaState luaState; private LuaState _luaState;
/// <summary> /// <summary>
/// True while a script is being executed /// True while a script is being executed
/// </summary> /// </summary>
public bool IsExecuting { get { return executing; } } public bool IsExecuting => executing;
public LuaState State => luaState; public LuaState State => _luaState;
private LuaNativeFunction panicCallback; private ObjectTranslator _translator;
private ObjectTranslator translator;
/// <summary> /// <summary>
/// Used to protect the (global) object translator pool during add/remove /// Used to protect the (global) object translator pool during add/remove
/// </summary> /// </summary>
...@@ -64,155 +63,158 @@ namespace NLua ...@@ -64,155 +63,158 @@ namespace NLua
//private object luaLock = new object(); //private object luaLock = new object();
private bool _StatePassed; private bool _StatePassed;
private bool executing; private bool executing;
static string initLuanet =
@"local metatable = {}
local rawget = rawget
local import_type = luanet.import_type
local load_assembly = luanet.load_assembly
luanet.error, luanet.type = error, type
-- Lookup a .NET identifier component.
function metatable:__index(key) -- key is e.g. 'Form'
-- Get the fully-qualified name, e.g. 'System.Windows.Forms.Form'
local fqn = rawget(self,'.fqn')
fqn = ((fqn and fqn .. '.') or '') .. key
-- Try to find either a luanet function or a CLR type
local obj = rawget(luanet,key) or import_type(fqn)
-- If key is neither a luanet function or a CLR type, then it is simply
-- an identifier component.
if obj == nil then
-- It might be an assembly, so we load it too.
pcall(load_assembly,fqn)
obj = { ['.fqn'] = fqn }
setmetatable(obj, metatable)
end
-- Cache this lookup
rawset(self, key, obj)
return obj
end
-- A non-type has been called; e.g. foo = System.Foo()
function metatable:__call(...)
error('No such type: ' .. rawget(self,'.fqn'), 2)
end
-- This is the root of the .NET namespace
luanet['.fqn'] = false
setmetatable(luanet, metatable)
-- Preload the mscorlib assembly
luanet.load_assembly('mscorlib')";
static string clr_package = @"---
--- This lua module provides auto importing of .net classes into a named package.
--- Makes for super easy use of LuaInterface glue
---
--- example:
--- Threading = CLRPackage(""System"", ""System.Threading"")
--- Threading.Thread.Sleep(100)
---
--- Extensions:
--- import() is a version of CLRPackage() which puts the package into a list which is used by a global __index lookup,
--- and thus works rather like C#'s using statement. It also recognizes the case where one is importing a local
--- assembly, which must end with an explicit .dll extension.
--- Alternatively, luanet.namespace can be used for convenience without polluting the global namespace:
--- local sys,sysi = luanet.namespace {'System','System.IO'}
-- sys.Console.WriteLine(""we are at {0}"",sysi.Directory.GetCurrentDirectory())
-- LuaInterface hosted with stock Lua interpreter will need to explicitly require this...
if not luanet then require 'luanet' end
local import_type, load_assembly = luanet.import_type, luanet.load_assembly
local mt = {
--- Lookup a previously unfound class and add it to our table
__index = function(package, classname)
local class = rawget(package, classname)
if class == nil then
class = import_type(package.packageName .. ""."" .. classname)
if class == nil then class = import_type(classname) end
package[classname] = class -- keep what we found around, so it will be shared
end
return class
end
}
function luanet.namespace(ns) // The commented code bellow is the initLua, the code assigned here is minified for size/performance reasons.
if type(ns) == 'table' then private static string initLuanet = @"local a={}local rawget=rawget;local b=luanet.import_type;local c=luanet.load_assembly;luanet.error,luanet.type=error,type;function a:__index(d)local e=rawget(self,'.fqn')e=(e and e..'.'or'')..d;local f=rawget(luanet,d)or b(e)if f==nil then pcall(c,e)f={['.fqn']=e}setmetatable(f,a)end;rawset(self,d,f)return f end;function a:__call(...)error('No such type: '..rawget(self,'.fqn'),2)end;luanet['.fqn']=false;setmetatable(luanet,a)luanet.load_assembly('mscorlib')";
local res = {} //@"local metatable = {}
for i = 1,#ns do // local rawget = rawget
res[i] = luanet.namespace(ns[i]) // local import_type = luanet.import_type
end // local load_assembly = luanet.load_assembly
return unpack(res) // luanet.error, luanet.type = error, type
end // -- Lookup a .NET identifier component.
-- FIXME - table.packageName could instead be a private index (see Lua 13.4.4) // function metatable:__index(key) -- key is e.g. 'Form'
local t = { packageName = ns } // -- Get the fully-qualified name, e.g. 'System.Windows.Forms.Form'
setmetatable(t,mt) // local fqn = rawget(self,'.fqn')
return t // fqn = ((fqn and fqn .. '.') or '') .. key
end
// -- Try to find either a luanet function or a CLR type
local globalMT, packages // local obj = rawget(luanet,key) or import_type(fqn)
local function set_global_mt() // -- If key is neither a luanet function or a CLR type, then it is simply
packages = {} // -- an identifier component.
globalMT = { // if obj == nil then
__index = function(T,classname) // -- It might be an assembly, so we load it too.
for i,package in ipairs(packages) do // pcall(load_assembly,fqn)
local class = package[classname] // obj = { ['.fqn'] = fqn }
if class then // setmetatable(obj, metatable)
_G[classname] = class // end
return class
end // -- Cache this lookup
end // rawset(self, key, obj)
end // return obj
} // end
setmetatable(_G, globalMT)
end // -- A non-type has been called; e.g. foo = System.Foo()
// function metatable:__call(...)
--- Create a new Package class // error('No such type: ' .. rawget(self,'.fqn'), 2)
function CLRPackage(assemblyName, packageName) // end
-- a sensible default...
packageName = packageName or assemblyName // -- This is the root of the .NET namespace
local ok = pcall(load_assembly,assemblyName) -- Make sure our assembly is loaded // luanet['.fqn'] = false
return luanet.namespace(packageName) // setmetatable(luanet, metatable)
end
// -- Preload the mscorlib assembly
function import (assemblyName, packageName) // luanet.load_assembly('mscorlib')";
if not globalMT then
set_global_mt() private static string clr_package = @"if not luanet then require'luanet'end;local a,b=luanet.import_type,luanet.load_assembly;local c={__index=function(d,e)local f=rawget(d,e)if f==nil then f=a(d.packageName.."".""..e)if f==nil then f=a(e)end;d[e]=f end;return f end}function luanet.namespace(g)if type(g)=='table'then local h={}for i=1,#g do h[i]=luanet.namespace(g[i])end;return unpack(h)end;local j={packageName=g}setmetatable(j,c)return j end;local k,l;local function m()l={}k={__index=function(n,e)for i,d in ipairs(l)do local f=d[e]if f then _G[e]=f;return f end end end}setmetatable(_G,k)end;function CLRPackage(o,p)p=p or o;local q=pcall(b,o)return luanet.namespace(p)end;function import(o,p)if not k then m()end;if not p then local i=o:find('%.dll$')if i then p=o:sub(1,i-1)else p=o end end;local j=CLRPackage(o,p)table.insert(l,j)return j end;function luanet.make_array(r,s)local t=r[#s]for i,u in ipairs(s)do t:SetValue(u,i-1)end;return t end;function luanet.each(v)local w=v:GetEnumerator()return function()if w:MoveNext()then return w.Current end end end";
end //@"---
if not packageName then //--- This lua module provides auto importing of .net classes into a named package.
local i = assemblyName:find('%.dll$') //--- Makes for super easy use of LuaInterface glue
if i then packageName = assemblyName:sub(1,i-1) //---
else packageName = assemblyName end //--- example:
end //--- Threading = CLRPackage(""System"", ""System.Threading"")
local t = CLRPackage(assemblyName,packageName) //--- Threading.Thread.Sleep(100)
table.insert(packages,t) //---
return t //--- Extensions:
end //--- import() is a version of CLRPackage() which puts the package into a list which is used by a global __index lookup,
//--- and thus works rather like C#'s using statement. It also recognizes the case where one is importing a local
//--- assembly, which must end with an explicit .dll extension.
function luanet.make_array (tp,tbl)
local arr = tp[#tbl] //--- Alternatively, luanet.namespace can be used for convenience without polluting the global namespace:
for i,v in ipairs(tbl) do //--- local sys,sysi = luanet.namespace {'System','System.IO'}
arr:SetValue(v,i-1) //-- sys.Console.WriteLine(""we are at {0}"",sysi.Directory.GetCurrentDirectory())
end
return arr
end //-- LuaInterface hosted with stock Lua interpreter will need to explicitly require this...
//if not luanet then require 'luanet' end
function luanet.each(o)
local e = o:GetEnumerator() //local import_type, load_assembly = luanet.import_type, luanet.load_assembly
return function()
if e:MoveNext() then //local mt = {
return e.Current // --- Lookup a previously unfound class and add it to our table
end // __index = function(package, classname)
end // local class = rawget(package, classname)
end // if class == nil then
"; // class = import_type(package.packageName .. ""."" .. classname)
// if class == nil then class = import_type(classname) end
// package[classname] = class -- keep what we found around, so it will be shared
// end
// return class
// end
//}
//function luanet.namespace(ns)
// if type(ns) == 'table' then
// local res = {}
// for i = 1,#ns do
// res[i] = luanet.namespace(ns[i])
// end
// return unpack(res)
// end
// -- FIXME - table.packageName could instead be a private index (see Lua 13.4.4)
// local t = { packageName = ns }
// setmetatable(t,mt)
// return t
//end
//local globalMT, packages
//local function set_global_mt()
// packages = {}
// globalMT = {
// __index = function(T,classname)
// for i,package in ipairs(packages) do
// local class = package[classname]
// if class then
// _G[classname] = class
// return class
// end
// end
// end
// }
// setmetatable(_G, globalMT)
//end
//--- Create a new Package class
//function CLRPackage(assemblyName, packageName)
// -- a sensible default...
// packageName = packageName or assemblyName
// local ok = pcall(load_assembly,assemblyName) -- Make sure our assembly is loaded
// return luanet.namespace(packageName)
//end
//function import (assemblyName, packageName)
// if not globalMT then
// set_global_mt()
// end
// if not packageName then
// local i = assemblyName:find('%.dll$')
// if i then packageName = assemblyName:sub(1,i-1)
// else packageName = assemblyName end
// end
// local t = CLRPackage(assemblyName,packageName)
// table.insert(packages,t)
// return t
//end
//function luanet.make_array (tp,tbl)
// local arr = tp[#tbl]
// for i,v in ipairs(tbl) do
// arr:SetValue(v,i-1)
// end
// return arr
//end
//function luanet.each(o)
// local e = o:GetEnumerator()
// return function()
// if e:MoveNext() then
// return e.Current
// end
// end
//end
//";
public bool UseTraceback { get; set; } = false; public bool UseTraceback { get; set; } = false;
#region Globals auto-complete #region Globals auto-complete
...@@ -224,24 +226,23 @@ end ...@@ -224,24 +226,23 @@ end
get get
{ {
// Only sort list when necessary // Only sort list when necessary
if (!globalsSorted) if (!_globalsSorted)
{ {
globals.Sort(); _globals.Sort();
globalsSorted = true; _globalsSorted = true;
} }
return globals; return _globals;
} }
} }
#endregion #endregion
public Lua() public Lua()
{ {
luaState = new LuaState(); _luaState = new LuaState();
Init(); Init();
// We need to keep this in a managed reference so the delegate doesn't get garbage collected // We need to keep this in a managed reference so the delegate doesn't get garbage collected
panicCallback = PanicCallback; _luaState.AtPanic(PanicCallback);
luaState.AtPanic(panicCallback);
} }
/* /*
...@@ -257,53 +258,48 @@ end ...@@ -257,53 +258,48 @@ end
luaState.SetTop(-2); luaState.SetTop(-2);
throw new LuaException("There is already a NLua.Lua instance associated with this Lua state"); throw new LuaException("There is already a NLua.Lua instance associated with this Lua state");
} }
else
{ _luaState = luaState;
this.luaState = luaState; _StatePassed = true;
_StatePassed = true; luaState.SetTop(-2);
luaState.SetTop(-2); Init();
Init();
}
} }
void Init() void Init()
{ {
luaState.PushString("NLua_Loaded"); _luaState.PushString("NLua_Loaded");
luaState.PushBoolean(true); _luaState.PushBoolean(true);
luaState.SetTable((int)LuaRegistry.Index); _luaState.SetTable((int)LuaRegistry.Index);
if (_StatePassed == false) if (_StatePassed == false)
{ {
luaState.NewTable(); _luaState.NewTable();
luaState.SetGlobal("luanet"); _luaState.SetGlobal("luanet");
} }
luaState.PushGlobalTable(); _luaState.PushGlobalTable();
luaState.GetGlobal("luanet"); _luaState.GetGlobal("luanet");
luaState.PushString("getmetatable"); _luaState.PushString("getmetatable");
luaState.GetGlobal("getmetatable"); _luaState.GetGlobal("getmetatable");
luaState.SetTable(-3); _luaState.SetTable(-3);
luaState.PopGlobalTable(); _luaState.PopGlobalTable();
translator = new ObjectTranslator(this, luaState); _translator = new ObjectTranslator(this, _luaState);
lock (translatorPoolLock) lock (translatorPoolLock)
{ {
ObjectTranslatorPool.Instance.Add(luaState, translator); ObjectTranslatorPool.Instance.Add(_luaState, _translator);
} }
luaState.PopGlobalTable(); _luaState.PopGlobalTable();
luaState.DoString(initLuanet); _luaState.DoString(initLuanet);
} }
public void Close() public void Close()
{ {
if (_StatePassed) if (_StatePassed || _luaState == null)
return; return;
if (luaState != null) lock (translatorPoolLock)
{ {
lock (translatorPoolLock) _luaState.Close();
{ ObjectTranslatorPool.Instance.Remove(_luaState);
luaState.Close(); _luaState = null;
ObjectTranslatorPool.Instance.Remove(luaState);
luaState = null;
}
} }
} }
...@@ -323,8 +319,8 @@ end ...@@ -323,8 +319,8 @@ end
/// <exception cref = "LuaScriptException">Thrown if the script caused an exception</exception> /// <exception cref = "LuaScriptException">Thrown if the script caused an exception</exception>
private void ThrowExceptionFromError(int oldTop) private void ThrowExceptionFromError(int oldTop)
{ {
object err = translator.GetObject(luaState, -1); object err = _translator.GetObject(_luaState, -1);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
// A pre-wrapped exception - just rethrow it (stack trace of InnerException will be preserved) // A pre-wrapped exception - just rethrow it (stack trace of InnerException will be preserved)
var luaEx = err as LuaScriptException; var luaEx = err as LuaScriptException;
...@@ -347,9 +343,9 @@ end ...@@ -347,9 +343,9 @@ end
luaState.GetGlobal("debug"); luaState.GetGlobal("debug");
luaState.GetField(-1, "traceback"); luaState.GetField(-1, "traceback");
luaState.Remove(-2); luaState.Remove(-2);
int errindex = -argCount - 2; int errIndex = -argCount - 2;
luaState.Insert(errindex); luaState.Insert(errIndex);
return errindex; return errIndex;
} }
/// <summary> /// <summary>
...@@ -358,12 +354,12 @@ end ...@@ -358,12 +354,12 @@ end
/// </summary> /// </summary>
public string GetDebugTraceback() public string GetDebugTraceback()
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetGlobal("debug"); // stack: debug _luaState.GetGlobal("debug"); // stack: debug
luaState.GetField(-1, "traceback"); // stack: debug,traceback _luaState.GetField(-1, "traceback"); // stack: debug,traceback
luaState.Remove(-2); // stack: traceback _luaState.Remove(-2); // stack: traceback
luaState.PCall(0, -1, 0); _luaState.PCall(0, -1, 0);
return translator.PopValues(luaState, oldTop)[0] as string; return _translator.PopValues(_luaState, oldTop)[0] as string;
} }
/// <summary> /// <summary>
...@@ -375,14 +371,12 @@ end ...@@ -375,14 +371,12 @@ end
{ {
var caughtExcept = e; var caughtExcept = e;
if (caughtExcept != null) if (caughtExcept == null)
{
translator.ThrowError(luaState, caughtExcept);
luaState.PushNil();
return 1;
}
else
return 0; return 0;
_translator.ThrowError(_luaState, caughtExcept);
_luaState.PushNil();
return 1;
} }
/// <summary> /// <summary>
...@@ -393,12 +387,12 @@ end ...@@ -393,12 +387,12 @@ end
/// <returns></returns> /// <returns></returns>
public LuaFunction LoadString(string chunk, string name) public LuaFunction LoadString(string chunk, string name)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
executing = true; executing = true;
try try
{ {
if (luaState.LoadString(chunk, name) != LuaStatus.OK) if (_luaState.LoadString(chunk, name) != LuaStatus.OK)
ThrowExceptionFromError(oldTop); ThrowExceptionFromError(oldTop);
} }
finally finally
...@@ -406,8 +400,8 @@ end ...@@ -406,8 +400,8 @@ end
executing = false; executing = false;
} }
var result = translator.GetFunction(luaState, -1); var result = _translator.GetFunction(_luaState, -1);
translator.PopValues(luaState, oldTop); _translator.PopValues(_luaState, oldTop);
return result; return result;
} }
...@@ -419,12 +413,12 @@ end ...@@ -419,12 +413,12 @@ end
/// <returns></returns> /// <returns></returns>
public LuaFunction LoadString(byte[] chunk, string name) public LuaFunction LoadString(byte[] chunk, string name)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
executing = true; executing = true;
try try
{ {
if (luaState.LoadBuffer(chunk, name) != LuaStatus.OK) if (_luaState.LoadBuffer(chunk, name) != LuaStatus.OK)
ThrowExceptionFromError(oldTop); ThrowExceptionFromError(oldTop);
} }
finally finally
...@@ -432,8 +426,8 @@ end ...@@ -432,8 +426,8 @@ end
executing = false; executing = false;
} }
var result = translator.GetFunction(luaState, -1); var result = _translator.GetFunction(_luaState, -1);
translator.PopValues(luaState, oldTop); _translator.PopValues(_luaState, oldTop);
return result; return result;
} }
...@@ -444,13 +438,13 @@ end ...@@ -444,13 +438,13 @@ end
/// <returns></returns> /// <returns></returns>
public LuaFunction LoadFile(string fileName) public LuaFunction LoadFile(string fileName)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
if (luaState.LoadFile(fileName) != LuaStatus.OK) if (_luaState.LoadFile(fileName) != LuaStatus.OK)
ThrowExceptionFromError(oldTop); ThrowExceptionFromError(oldTop);
var result = translator.GetFunction(luaState, -1); var result = _translator.GetFunction(_luaState, -1);
translator.PopValues(luaState, oldTop); _translator.PopValues(_luaState, oldTop);
return result; return result;
} }
...@@ -462,34 +456,31 @@ end ...@@ -462,34 +456,31 @@ end
/// <returns></returns> /// <returns></returns>
public object[] DoString(byte[] chunk, string chunkName = "chunk") public object[] DoString(byte[] chunk, string chunkName = "chunk")
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
executing = true; executing = true;
if (luaState.LoadBuffer(chunk, chunkName) == LuaStatus.OK) if (_luaState.LoadBuffer(chunk, chunkName) != LuaStatus.OK)
{ ThrowExceptionFromError(oldTop);
int errfunction = 0;
if (UseTraceback)
{
errfunction = PushDebugTraceback(luaState, 0);
oldTop++;
}
try int errorFunctionIndex = 0;
{
if (luaState.PCall(0, -1, errfunction) == LuaStatus.OK) if (UseTraceback)
return translator.PopValues(luaState, oldTop); {
else errorFunctionIndex = PushDebugTraceback(_luaState, 0);
ThrowExceptionFromError(oldTop); oldTop++;
}
finally
{
executing = false;
}
} }
else
ThrowExceptionFromError(oldTop);
return null; try
{
if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK)
ThrowExceptionFromError(oldTop);
return _translator.PopValues(_luaState, oldTop);
}
finally
{
executing = false;
}
} }
/// <summary> /// <summary>
...@@ -500,71 +491,64 @@ end ...@@ -500,71 +491,64 @@ end
/// <returns></returns> /// <returns></returns>
public object[] DoString(string chunk, string chunkName = "chunk") public object[] DoString(string chunk, string chunkName = "chunk")
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
executing = true; executing = true;
if (luaState.LoadString(chunk, chunkName) == LuaStatus.OK) if (_luaState.LoadString(chunk, chunkName) != LuaStatus.OK)
{ ThrowExceptionFromError(oldTop);
int errfunction = 0;
if (UseTraceback)
{
errfunction = PushDebugTraceback(luaState, 0);
oldTop++;
}
try int errorFunctionIndex = 0;
{
if (luaState.PCall(0, -1, errfunction) == LuaStatus.OK) if (UseTraceback)
return translator.PopValues(luaState, oldTop); {
else errorFunctionIndex = PushDebugTraceback(_luaState, 0);
ThrowExceptionFromError(oldTop); oldTop++;
}
finally
{
executing = false;
}
} }
else
ThrowExceptionFromError(oldTop);
return null; try
{
if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK)
ThrowExceptionFromError(oldTop);
return _translator.PopValues(_luaState, oldTop);
}
finally
{
executing = false;
}
} }
/* /*
* Excutes a Lua file and returns all the chunk's return * Executes a Lua file and returns all the chunk's return
* values in an array * values in an array
*/ */
public object[] DoFile(string fileName) public object[] DoFile(string fileName)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
if (luaState.LoadFile(fileName) == LuaStatus.OK) if (_luaState.LoadFile(fileName) != LuaStatus.OK)
{ ThrowExceptionFromError(oldTop);
executing = true;
int errfunction = 0; executing = true;
if (UseTraceback)
{
errfunction = PushDebugTraceback(luaState, 0);
oldTop++;
}
try int errorFunctionIndex = 0;
{ if (UseTraceback)
if (luaState.PCall(0, -1, errfunction) == LuaStatus.OK) {
return translator.PopValues(luaState, oldTop); errorFunctionIndex = PushDebugTraceback(_luaState, 0);
else oldTop++;
ThrowExceptionFromError(oldTop);
}
finally
{
executing = false;
}
} }
else
ThrowExceptionFromError(oldTop);
return null; try
{
if (_luaState.PCall(0, -1, errorFunctionIndex) != LuaStatus.OK)
ThrowExceptionFromError(oldTop);
return _translator.PopValues(_luaState, oldTop);
}
finally
{
executing = false;
}
} }
...@@ -575,11 +559,10 @@ end ...@@ -575,11 +559,10 @@ end
public object this[string fullPath] { public object this[string fullPath] {
get get
{ {
object returnValue = null; int oldTop = _luaState.GetTop();
int oldTop = luaState.GetTop();
string[] path = FullPathToArray(fullPath); string[] path = FullPathToArray(fullPath);
luaState.GetGlobal(path[0]); _luaState.GetGlobal(path[0]);
returnValue = translator.GetObject(luaState, -1); object returnValue = _translator.GetObject(_luaState, -1);
if (path.Length > 1) if (path.Length > 1)
{ {
...@@ -591,38 +574,38 @@ end ...@@ -591,38 +574,38 @@ end
dispose.Dispose(); dispose.Dispose();
} }
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return returnValue; return returnValue;
} }
set set
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
string[] path = FullPathToArray(fullPath); string[] path = FullPathToArray(fullPath);
if (path.Length == 1) if (path.Length == 1)
{ {
translator.Push(luaState, value); _translator.Push(_luaState, value);
luaState.SetGlobal(fullPath); _luaState.SetGlobal(fullPath);
} }
else else
{ {
luaState.GetGlobal(path[0]); _luaState.GetGlobal(path[0]);
string[] remainingPath = new string[path.Length - 1]; string[] remainingPath = new string[path.Length - 1];
Array.Copy(path, 1, remainingPath, 0, path.Length - 1); Array.Copy(path, 1, remainingPath, 0, path.Length - 1);
SetObject(remainingPath, value); SetObject(remainingPath, value);
} }
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
// Globals auto-complete // Globals auto-complete
if (value == null) if (value == null)
{ {
// Remove now obsolete entries // Remove now obsolete entries
globals.Remove(fullPath); _globals.Remove(fullPath);
} }
else else
{ {
// Add new entries // Add new entries
if (!globals.Contains(fullPath)) if (!_globals.Contains(fullPath))
RegisterGlobal(fullPath, value.GetType(), 0); RegisterGlobal(fullPath, value.GetType(), 0);
} }
} }
...@@ -630,7 +613,7 @@ end ...@@ -630,7 +613,7 @@ end
#region Globals auto-complete #region Globals auto-complete
/// <summary> /// <summary>
/// Adds an entry to <see cref = "globals"/> (recursivley handles 2 levels of members) /// Adds an entry to <see cref = "_globals"/> (recursivley handles 2 levels of members)
/// </summary> /// </summary>
/// <param name = "path">The index accessor path ot the entry</param> /// <param name = "path">The index accessor path ot the entry</param>
/// <param name = "type">The type of the entry</param> /// <param name = "type">The type of the entry</param>
...@@ -641,7 +624,7 @@ end ...@@ -641,7 +624,7 @@ end
if (type == typeof(LuaFunction)) if (type == typeof(LuaFunction))
{ {
// Format for easy method invocation // Format for easy method invocation
globals.Add(path + "("); _globals.Add(path + "(");
} }
// If the type is a class or an interface and recursion hasn't been running too long, list the members // If the type is a class or an interface and recursion hasn't been running too long, list the members
else if ((type.IsClass || type.IsInterface) && type != typeof(string) && recursionCounter < 2) else if ((type.IsClass || type.IsInterface) && type != typeof(string) && recursionCounter < 2)
...@@ -668,7 +651,7 @@ end ...@@ -668,7 +651,7 @@ end
if (method.GetParameters().Length == 0) if (method.GetParameters().Length == 0)
command += ")"; command += ")";
globals.Add(command); _globals.Add(command);
} }
} }
#endregion #endregion
...@@ -704,10 +687,10 @@ end ...@@ -704,10 +687,10 @@ end
#endregion #endregion
} }
else else
globals.Add(path); // Otherwise simply add the element to the list _globals.Add(path); // Otherwise simply add the element to the list
// List will need to be sorted on next access // List will need to be sorted on next access
globalsSorted = false; _globalsSorted = false;
} }
#endregion #endregion
...@@ -721,9 +704,9 @@ end ...@@ -721,9 +704,9 @@ end
for (int i = 0; i < remainingPath.Length; i++) for (int i = 0; i < remainingPath.Length; i++)
{ {
luaState.PushString(remainingPath[i]); _luaState.PushString(remainingPath[i]);
luaState.GetTable(-2); _luaState.GetTable(-2);
returnValue = translator.GetObject(luaState, -1); returnValue = _translator.GetObject(_luaState, -1);
if (returnValue == null) if (returnValue == null)
break; break;
...@@ -795,7 +778,7 @@ end ...@@ -795,7 +778,7 @@ end
public void LoadCLRPackage() public void LoadCLRPackage()
{ {
luaState.DoString(Lua.clr_package); _luaState.DoString(Lua.clr_package);
} }
/* /*
* Gets a function global variable as a delegate of * Gets a function global variable as a delegate of
...@@ -823,19 +806,19 @@ end ...@@ -823,19 +806,19 @@ end
internal object[] CallFunction(object function, object[] args, Type[] returnTypes) internal object[] CallFunction(object function, object[] args, Type[] returnTypes)
{ {
int nArgs = 0; int nArgs = 0;
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
if (!luaState.CheckStack(args.Length + 6)) if (!_luaState.CheckStack(args.Length + 6))
throw new LuaException("Lua stack overflow"); throw new LuaException("Lua stack overflow");
translator.Push(luaState, function); _translator.Push(_luaState, function);
if (args.Length > 0) if (args.Length > 0)
{ {
nArgs = args.Length; nArgs = args.Length;
for (int i = 0; i < args.Length; i++) for (int i = 0; i < args.Length; i++)
translator.Push(luaState, args[i]); _translator.Push(_luaState, args[i]);
} }
executing = true; executing = true;
...@@ -845,11 +828,11 @@ end ...@@ -845,11 +828,11 @@ end
int errfunction = 0; int errfunction = 0;
if (UseTraceback) if (UseTraceback)
{ {
errfunction = PushDebugTraceback(luaState, nArgs); errfunction = PushDebugTraceback(_luaState, nArgs);
oldTop++; oldTop++;
} }
LuaStatus error = luaState.PCall(nArgs, -1, errfunction); LuaStatus error = _luaState.PCall(nArgs, -1, errfunction);
if (error != LuaStatus.OK) if (error != LuaStatus.OK)
ThrowExceptionFromError(oldTop); ThrowExceptionFromError(oldTop);
} }
...@@ -859,9 +842,9 @@ end ...@@ -859,9 +842,9 @@ end
} }
if (returnTypes != null) if (returnTypes != null)
return translator.PopValues(luaState, oldTop, returnTypes); return _translator.PopValues(_luaState, oldTop, returnTypes);
return translator.PopValues(luaState, oldTop); return _translator.PopValues(_luaState, oldTop);
} }
/* /*
...@@ -871,13 +854,13 @@ end ...@@ -871,13 +854,13 @@ end
{ {
for (int i = 0; i < remainingPath.Length - 1; i++) for (int i = 0; i < remainingPath.Length - 1; i++)
{ {
luaState.PushString(remainingPath[i]); _luaState.PushString(remainingPath[i]);
luaState.GetTable(-2); _luaState.GetTable(-2);
} }
luaState.PushString(remainingPath[remainingPath.Length - 1]); _luaState.PushString(remainingPath[remainingPath.Length - 1]);
translator.Push(luaState, val); _translator.Push(_luaState, val);
luaState.SetTable(-3); _luaState.SetTable(-3);
} }
string[] FullPathToArray(string fullPath) string[] FullPathToArray(string fullPath)
...@@ -891,45 +874,45 @@ end ...@@ -891,45 +874,45 @@ end
public void NewTable(string fullPath) public void NewTable(string fullPath)
{ {
string[] path = FullPathToArray(fullPath); string[] path = FullPathToArray(fullPath);
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
if (path.Length == 1) if (path.Length == 1)
{ {
luaState.NewTable(); _luaState.NewTable();
luaState.SetGlobal(fullPath); _luaState.SetGlobal(fullPath);
} }
else else
{ {
luaState.GetGlobal(path[0]); _luaState.GetGlobal(path[0]);
for (int i = 1; i < path.Length - 1; i++) for (int i = 1; i < path.Length - 1; i++)
{ {
luaState.PushString(path[i]); _luaState.PushString(path[i]);
luaState.GetTable(-2); _luaState.GetTable(-2);
} }
luaState.PushString(path[path.Length - 1]); _luaState.PushString(path[path.Length - 1]);
luaState.NewTable(); _luaState.NewTable();
luaState.SetTable(-3); _luaState.SetTable(-3);
} }
luaState.SetTop( oldTop); _luaState.SetTop( oldTop);
} }
public Dictionary<object, object> GetTableDict(LuaTable table) public Dictionary<object, object> GetTableDict(LuaTable table)
{ {
var dict = new Dictionary<object, object>(); var dict = new Dictionary<object, object>();
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
translator.Push(luaState, table); _translator.Push(_luaState, table);
luaState.PushNil(); _luaState.PushNil();
while (luaState.Next(-2)) while (_luaState.Next(-2))
{ {
dict[translator.GetObject(luaState, -2)] = translator.GetObject(luaState, -1); dict[_translator.GetObject(_luaState, -2)] = _translator.GetObject(_luaState, -1);
luaState.SetTop(-2); _luaState.SetTop(-2);
} }
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return dict; return dict;
} }
...@@ -946,10 +929,10 @@ end ...@@ -946,10 +929,10 @@ end
/// <returns>see lua docs. -1 if hook is already set</returns> /// <returns>see lua docs. -1 if hook is already set</returns>
public int SetDebugHook(LuaHookMask mask, int count) public int SetDebugHook(LuaHookMask mask, int count)
{ {
if (hookCallback == null) if (_hookCallback == null)
{ {
hookCallback = new LuaHookFunction(Lua.DebugHookCallback); _hookCallback = new LuaHookFunction(Lua.DebugHookCallback);
luaState.SetHook(hookCallback, mask, count); _luaState.SetHook(_hookCallback, mask, count);
} }
return -1; return -1;
...@@ -961,8 +944,8 @@ end ...@@ -961,8 +944,8 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public void RemoveDebugHook() public void RemoveDebugHook()
{ {
hookCallback = null; _hookCallback = null;
luaState.SetHook(null, LuaHookMask.Disabled, 0); _luaState.SetHook(null, LuaHookMask.Disabled, 0);
} }
/// <summary> /// <summary>
...@@ -971,7 +954,7 @@ end ...@@ -971,7 +954,7 @@ end
/// <returns>hook mask</returns> /// <returns>hook mask</returns>
public LuaHookMask GetHookMask() public LuaHookMask GetHookMask()
{ {
return luaState.HookMask; return _luaState.HookMask;
} }
/// <summary> /// <summary>
...@@ -980,7 +963,7 @@ end ...@@ -980,7 +963,7 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public int GetHookCount() public int GetHookCount()
{ {
return luaState.HookCount; return _luaState.HookCount;
} }
...@@ -992,7 +975,7 @@ end ...@@ -992,7 +975,7 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public string GetLocal(LuaDebug luaDebug, int n) public string GetLocal(LuaDebug luaDebug, int n)
{ {
return luaState.GetLocal(luaDebug, n); return _luaState.GetLocal(luaDebug, n);
} }
/// <summary> /// <summary>
...@@ -1003,17 +986,17 @@ end ...@@ -1003,17 +986,17 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public string SetLocal(LuaDebug luaDebug, int n) public string SetLocal(LuaDebug luaDebug, int n)
{ {
return luaState.SetLocal(luaDebug, n); return _luaState.SetLocal(luaDebug, n);
} }
public int GetStack(int level, ref LuaDebug ar) public int GetStack(int level, ref LuaDebug ar)
{ {
return luaState.GetStack(level, ref ar); return _luaState.GetStack(level, ref ar);
} }
public bool GetInfo(string what, ref LuaDebug ar) public bool GetInfo(string what, ref LuaDebug ar)
{ {
return luaState.GetInfo(what, ref ar); return _luaState.GetInfo(what, ref ar);
} }
/// <summary> /// <summary>
...@@ -1024,7 +1007,7 @@ end ...@@ -1024,7 +1007,7 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public string GetUpValue(int funcindex, int n) public string GetUpValue(int funcindex, int n)
{ {
return luaState.GetUpValue(funcindex, n); return _luaState.GetUpValue(funcindex, n);
} }
/// <summary> /// <summary>
...@@ -1035,7 +1018,7 @@ end ...@@ -1035,7 +1018,7 @@ end
/// <returns>see lua docs</returns> /// <returns>see lua docs</returns>
public string SetUpValue(int funcindex, int n) public string SetUpValue(int funcindex, int n)
{ {
return luaState.SetUpValue(funcindex, n); return _luaState.SetUpValue(funcindex, n);
} }
/// <summary> /// <summary>
...@@ -1060,10 +1043,10 @@ end ...@@ -1060,10 +1043,10 @@ end
ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(state); ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(state);
Lua lua = translator.Interpreter; Lua lua = translator.Interpreter;
lua.DebugHookCallbackInternal(state, debug); lua.DebugHookCallbackInternal(debug);
} }
private void DebugHookCallbackInternal(LuaState luaState, LuaDebug luaDebug) private void DebugHookCallbackInternal(LuaDebug luaDebug)
{ {
try try
{ {
...@@ -1091,8 +1074,8 @@ end ...@@ -1091,8 +1074,8 @@ end
/// <returns>Returns the top value from the lua stack.</returns> /// <returns>Returns the top value from the lua stack.</returns>
public object Pop() public object Pop()
{ {
int top = luaState.GetTop(); int top = _luaState.GetTop();
return translator.PopValues(luaState, top - 1)[0]; return _translator.PopValues(_luaState, top - 1)[0];
} }
/// <summary> /// <summary>
...@@ -1101,14 +1084,14 @@ end ...@@ -1101,14 +1084,14 @@ end
/// <param name = "value">Value to push.</param> /// <param name = "value">Value to push.</param>
public void Push(object value) public void Push(object value)
{ {
translator.Push(luaState, value); _translator.Push(_luaState, value);
} }
#endregion #endregion
internal void DisposeInternal(int reference) internal void DisposeInternal(int reference)
{ {
if (luaState != null) if (_luaState != null)
luaState.Unref(reference); _luaState.Unref(reference);
} }
/* /*
...@@ -1117,12 +1100,12 @@ end ...@@ -1117,12 +1100,12 @@ end
*/ */
internal object RawGetObject(int reference, string field) internal object RawGetObject(int reference, string field)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetRef(reference); _luaState.GetRef(reference);
luaState.PushString(field); _luaState.PushString(field);
luaState.RawGet(-2); _luaState.RawGet(-2);
object obj = translator.GetObject(luaState, -1); object obj = _translator.GetObject(_luaState, -1);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return obj; return obj;
} }
...@@ -1131,10 +1114,10 @@ end ...@@ -1131,10 +1114,10 @@ end
*/ */
internal object GetObject(int reference, string field) internal object GetObject(int reference, string field)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetRef(reference); _luaState.GetRef(reference);
object returnValue = GetObject(FullPathToArray(field)); object returnValue = GetObject(FullPathToArray(field));
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return returnValue; return returnValue;
} }
...@@ -1143,12 +1126,12 @@ end ...@@ -1143,12 +1126,12 @@ end
*/ */
internal object GetObject(int reference, object field) internal object GetObject(int reference, object field)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetRef(reference); _luaState.GetRef(reference);
translator.Push(luaState, field); _translator.Push(_luaState, field);
luaState.GetTable(-2); _luaState.GetTable(-2);
object returnValue = translator.GetObject(luaState, -1); object returnValue = _translator.GetObject(_luaState, -1);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return returnValue; return returnValue;
} }
...@@ -1158,10 +1141,10 @@ end ...@@ -1158,10 +1141,10 @@ end
*/ */
internal void SetObject(int reference, string field, object val) internal void SetObject(int reference, string field, object val)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetRef(reference); _luaState.GetRef(reference);
SetObject(FullPathToArray(field), val); SetObject(FullPathToArray(field), val);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
} }
/* /*
...@@ -1170,12 +1153,12 @@ end ...@@ -1170,12 +1153,12 @@ end
*/ */
internal void SetObject(int reference, object field, object val) internal void SetObject(int reference, object field, object val)
{ {
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
luaState.GetRef(reference); _luaState.GetRef(reference);
translator.Push(luaState, field); _translator.Push(_luaState, field);
translator.Push(luaState, val); _translator.Push(_luaState, val);
luaState.SetTable(-3); _luaState.SetTable(-3);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
} }
public LuaFunction RegisterFunction(string path, MethodBase function /*MethodInfo function*/) public LuaFunction RegisterFunction(string path, MethodBase function /*MethodInfo function*/)
...@@ -1190,12 +1173,12 @@ end ...@@ -1190,12 +1173,12 @@ end
public LuaFunction RegisterFunction(string path, object target, MethodBase function /*MethodInfo function*/) //CP: Fix for struct constructor by Alexander Kappner (link: http://luaforge.net/forum/forum.php?thread_id = 2859&forum_id = 145) public LuaFunction RegisterFunction(string path, object target, MethodBase function /*MethodInfo function*/) //CP: Fix for struct constructor by Alexander Kappner (link: http://luaforge.net/forum/forum.php?thread_id = 2859&forum_id = 145)
{ {
// We leave nothing on the stack when we are done // We leave nothing on the stack when we are done
int oldTop = luaState.GetTop(); int oldTop = _luaState.GetTop();
var wrapper = new LuaMethodWrapper(translator, target, new ProxyType(function.DeclaringType), function); var wrapper = new LuaMethodWrapper(_translator, target, new ProxyType(function.DeclaringType), function);
translator.Push(luaState, new LuaNativeFunction(wrapper.invokeFunction)); _translator.Push(_luaState, new LuaNativeFunction(wrapper.InvokeFunction));
this[path] = translator.GetObject(luaState, -1); this[path] = _translator.GetObject(_luaState, -1);
var f = GetFunction(path); var f = GetFunction(path);
luaState.SetTop(oldTop); _luaState.SetTop(oldTop);
return f; return f;
} }
...@@ -1204,28 +1187,28 @@ end ...@@ -1204,28 +1187,28 @@ end
*/ */
internal bool CompareRef(int ref1, int ref2) internal bool CompareRef(int ref1, int ref2)
{ {
int top = luaState.GetTop(); int top = _luaState.GetTop();
luaState.GetRef(ref1); _luaState.GetRef(ref1);
luaState.GetRef(ref2); _luaState.GetRef(ref2);
bool equal = luaState.AreEqual(-1, -2); bool equal = _luaState.AreEqual(-1, -2);
luaState.SetTop(top); _luaState.SetTop(top);
return equal; return equal;
} }
internal void PushCSFunction(LuaNativeFunction function) internal void PushCSFunction(LuaNativeFunction function)
{ {
translator.PushFunction(luaState, function); _translator.PushFunction(_luaState, function);
} }
#region IDisposable Members #region IDisposable Members
public virtual void Dispose() public virtual void Dispose()
{ {
if (translator != null) if (_translator != null)
{ {
translator.pendingEvents.Dispose(); _translator.PendingEvents.Dispose();
if (translator.Tag != IntPtr.Zero) if (_translator.Tag != IntPtr.Zero)
Marshal.FreeHGlobal(translator.Tag); Marshal.FreeHGlobal(_translator.Tag);
translator = null; _translator = null;
} }
Close(); Close();
......
...@@ -7,11 +7,14 @@ namespace NLua ...@@ -7,11 +7,14 @@ namespace NLua
/// </summary> /// </summary>
public abstract class LuaBase : IDisposable public abstract class LuaBase : IDisposable
{ {
private bool _Disposed; private bool _disposed;
protected int protected readonly int _Reference;
_Reference; protected Lua _Interpreter;
protected Lua
_Interpreter; protected LuaBase(int reference)
{
_Reference = reference;
}
~LuaBase() ~LuaBase()
{ {
...@@ -26,28 +29,23 @@ namespace NLua ...@@ -26,28 +29,23 @@ namespace NLua
public virtual void Dispose(bool disposeManagedResources) public virtual void Dispose(bool disposeManagedResources)
{ {
if (!_Disposed) if (_disposed)
{ return;
if (disposeManagedResources)
{ if (_Reference != 0 && disposeManagedResources)
if (_Reference != 0) _Interpreter.DisposeInternal(_Reference);
_Interpreter.DisposeInternal(_Reference);
} _Interpreter = null;
_disposed = true;
_Interpreter = null;
_Disposed = true;
}
} }
public override bool Equals(object o) public override bool Equals(object o)
{ {
if (o is LuaBase) var reference = o as LuaBase;
{ if (reference == null)
var l = (LuaBase)o;
return _Interpreter.CompareRef(l._Reference, _Reference);
}
else
return false; return false;
return _Interpreter.CompareRef(reference._Reference, _Reference);
} }
public override int GetHashCode() public override int GetHashCode()
......
...@@ -8,18 +8,16 @@ namespace NLua ...@@ -8,18 +8,16 @@ namespace NLua
{ {
public class LuaFunction : LuaBase public class LuaFunction : LuaBase
{ {
internal LuaNativeFunction function; internal readonly LuaNativeFunction function;
public LuaFunction(int reference, Lua interpreter) public LuaFunction(int reference, Lua interpreter):base(reference)
{ {
_Reference = reference;
function = null; function = null;
_Interpreter = interpreter; _Interpreter = interpreter;
} }
public LuaFunction(LuaNativeFunction nativeFunction, Lua interpreter) public LuaFunction(LuaNativeFunction nativeFunction, Lua interpreter):base (0)
{ {
_Reference = 0;
function = nativeFunction; function = nativeFunction;
_Interpreter = interpreter; _Interpreter = interpreter;
} }
...@@ -60,17 +58,15 @@ namespace NLua ...@@ -60,17 +58,15 @@ namespace NLua
public override bool Equals(object o) public override bool Equals(object o)
{ {
if (o is LuaFunction) var l = o as LuaFunction;
{
var l = (LuaFunction)o;
if (this._Reference != 0 && l._Reference != 0) if (l == null)
return _Interpreter.CompareRef(l._Reference, this._Reference);
else
return this.function == l.function;
}
else
return false; return false;
if (_Reference != 0 && l._Reference != 0)
return _Interpreter.CompareRef(l._Reference, _Reference);
return function == l.function;
} }
public override int GetHashCode() public override int GetHashCode()
......
using System; using System;
using System.Reflection; using System.Reflection;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using NLua.Extensions;
namespace NLua namespace NLua
{ {
...@@ -18,10 +16,10 @@ namespace NLua ...@@ -18,10 +16,10 @@ namespace NLua
{ {
#region Sanity checks #region Sanity checks
if (lua == null) if (lua == null)
throw new ArgumentNullException("lua"); throw new ArgumentNullException(nameof(lua));
if (o == null) if (o == null)
throw new ArgumentNullException("o"); throw new ArgumentNullException(nameof(o));
#endregion #endregion
foreach (var method in o.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public)) foreach (var method in o.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public))
...@@ -47,13 +45,13 @@ namespace NLua ...@@ -47,13 +45,13 @@ namespace NLua
{ {
#region Sanity checks #region Sanity checks
if (lua == null) if (lua == null)
throw new ArgumentNullException("lua"); throw new ArgumentNullException(nameof(lua));
if (type == null) if (type == null)
throw new ArgumentNullException("type"); throw new ArgumentNullException(nameof(type));
if (!type.IsClass) if (!type.IsClass)
throw new ArgumentException("The type must be a class!", "type"); throw new ArgumentException("The type must be a class!", nameof(type));
#endregion #endregion
foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public)) foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public))
...@@ -78,7 +76,7 @@ namespace NLua ...@@ -78,7 +76,7 @@ namespace NLua
public static void Enumeration<T>(Lua lua) public static void Enumeration<T>(Lua lua)
{ {
if (lua == null) if (lua == null)
throw new ArgumentNullException("lua"); throw new ArgumentNullException(nameof(lua));
var type = typeof(T); var type = typeof(T);
......
...@@ -9,9 +9,8 @@ namespace NLua ...@@ -9,9 +9,8 @@ namespace NLua
{ {
public class LuaTable : LuaBase public class LuaTable : LuaBase
{ {
public LuaTable(int reference, Lua interpreter) public LuaTable(int reference, Lua interpreter):base(reference)
{ {
_Reference = reference;
_Interpreter = interpreter; _Interpreter = interpreter;
} }
...@@ -48,13 +47,11 @@ namespace NLua ...@@ -48,13 +47,11 @@ namespace NLua
return _Interpreter.GetTableDict(this).GetEnumerator(); return _Interpreter.GetTableDict(this).GetEnumerator();
} }
public ICollection Keys { public ICollection Keys => _Interpreter.GetTableDict(this).Keys;
get { return _Interpreter.GetTableDict(this).Keys; }
}
public ICollection Values => _Interpreter.GetTableDict(this).Values;
public ICollection Values {
get { return _Interpreter.GetTableDict(this).Values; }
}
/* /*
* Gets an string fields of a table ignoring its metatable, * Gets an string fields of a table ignoring its metatable,
......
...@@ -3,9 +3,8 @@ namespace NLua ...@@ -3,9 +3,8 @@ namespace NLua
{ {
public class LuaUserData : LuaBase public class LuaUserData : LuaBase
{ {
public LuaUserData(int reference, Lua interpreter) public LuaUserData(int reference, Lua interpreter):base(reference)
{ {
_Reference = reference;
_Interpreter = interpreter; _Interpreter = interpreter;
} }
......
...@@ -43,13 +43,13 @@ namespace NLua ...@@ -43,13 +43,13 @@ namespace NLua
public LuaNativeFunction LessThanFunction { get; } public LuaNativeFunction LessThanFunction { get; }
public LuaNativeFunction LessThanOrEqualFunction { get; } public LuaNativeFunction LessThanOrEqualFunction { get; }
Dictionary<object, object> memberCache = new Dictionary<object, object>(); readonly Dictionary<object, Dictionary<object, object>> memberCache = new Dictionary<object, Dictionary<object, object>>();
ObjectTranslator translator; readonly ObjectTranslator translator;
/* /*
* __index metafunction for CLR objects. Implemented in Lua. * __index metafunction for CLR objects. Implemented in Lua.
*/ */
static string luaIndexFunction = static readonly string luaIndexFunction =
@"local function index(obj,name) @"local function index(obj,name)
local meta = getmetatable(obj) local meta = getmetatable(obj)
local cached = meta.cache[name] local cached = meta.cache[name]
...@@ -411,43 +411,43 @@ namespace NLua ...@@ -411,43 +411,43 @@ namespace NLua
foreach (var methodInfo in methods) foreach (var methodInfo in methods)
{ {
if (methodInfo.Name == "get_Item") if (methodInfo.Name != "get_Item")
continue;
// Check if the signature matches the input
if (methodInfo.GetParameters().Length != 1)
continue;
var actualParams = methodInfo.GetParameters();
if (actualParams.Length != 1)
{ {
// Check if the signature matches the input translator.ThrowError(luaState, "method not found (or no indexer): " + index);
if (methodInfo.GetParameters().Length == 1) luaState.PushNil();
{ }
var actualParams = methodInfo.GetParameters(); else
{
// Get the index in a form acceptable to the getter
index = translator.GetAsType(luaState, 2, actualParams[0].ParameterType);
object[] args = new object[1];
// Just call the indexer - if out of bounds an exception will happen
args[0] = index;
if (actualParams.Length != 1) try
{ {
translator.ThrowError(luaState, "method not found (or no indexer): " + index); object result = methodInfo.Invoke(obj, args);
luaState.PushNil(); translator.Push(luaState, result);
} }
catch (TargetInvocationException e)
{
// Provide a more readable description for the common case of key not found
if (e.InnerException is KeyNotFoundException)
translator.ThrowError(luaState, "key '" + index + "' not found ");
else else
{ translator.ThrowError(luaState, "exception indexing '" + index + "' " + e.Message);
// Get the index in a form acceptable to the getter
index = translator.GetAsType(luaState, 2, actualParams[0].ParameterType); luaState.PushNil();
object[] args = new object[1];
// Just call the indexer - if out of bounds an exception will happen
args[0] = index;
try
{
object result = methodInfo.Invoke(obj, args);
translator.Push(luaState, result);
}
catch (TargetInvocationException e)
{
// Provide a more readable description for the common case of key not found
if (e.InnerException is KeyNotFoundException)
translator.ThrowError(luaState, "key '" + index + "' not found ");
else
translator.ThrowError(luaState, "exception indexing '" + index + "' " + e.Message);
luaState.PushNil();
}
}
} }
} }
} }
...@@ -545,7 +545,7 @@ namespace NLua ...@@ -545,7 +545,7 @@ namespace NLua
MethodInfo methodInfo = translator.GetExtensionMethod(type, name); MethodInfo methodInfo = translator.GetExtensionMethod(type, name);
var methodWrapper = new LuaMethodWrapper(translator, obj, new ProxyType(type), methodInfo); var methodWrapper = new LuaMethodWrapper(translator, obj, new ProxyType(type), methodInfo);
var invokeDelegate = new LuaNativeFunction(methodWrapper.invokeFunction); var invokeDelegate = new LuaNativeFunction(methodWrapper.InvokeFunction);
SetMemberCache(type, name, invokeDelegate); SetMemberCache(type, name, invokeDelegate);
...@@ -644,7 +644,7 @@ namespace NLua ...@@ -644,7 +644,7 @@ namespace NLua
if (cachedMember == null) if (cachedMember == null)
SetMemberCache(objType, methodName, member); SetMemberCache(objType, methodName, member);
translator.Push(luaState, new RegisterEventHandler(translator.pendingEvents, obj, eventInfo)); translator.Push(luaState, new RegisterEventHandler(translator.PendingEvents, obj, eventInfo));
} }
else if (!implicitStatic) else if (!implicitStatic)
{ {
...@@ -666,7 +666,7 @@ namespace NLua ...@@ -666,7 +666,7 @@ namespace NLua
{ {
// Member type must be 'method' // Member type must be 'method'
var methodWrapper = new LuaMethodWrapper(translator, objType, methodName, bindingType); var methodWrapper = new LuaMethodWrapper(translator, objType, methodName, bindingType);
var wrapper = methodWrapper.invokeFunction; var wrapper = methodWrapper.InvokeFunction;
if (cachedMember == null) if (cachedMember == null)
SetMemberCache(objType, methodName, wrapper); SetMemberCache(objType, methodName, wrapper);
...@@ -710,21 +710,17 @@ namespace NLua ...@@ -710,21 +710,17 @@ namespace NLua
object CheckMemberCache(ProxyType objType, string memberName) object CheckMemberCache(ProxyType objType, string memberName)
{ {
object members = null; Dictionary<object, object> members;
if (memberCache.TryGetValue(objType, out members)) if (!memberCache.TryGetValue(objType, out members))
{ return null;
var membersDict = members as Dictionary<object, object>;
object memberValue = null; object memberValue;
if (members != null && membersDict.TryGetValue(memberName, out memberValue)) if (members == null || !members.TryGetValue(memberName, out memberValue))
{ return null;
return memberValue;
}
}
return null; return memberValue;
} }
/* /*
...@@ -737,12 +733,12 @@ namespace NLua ...@@ -737,12 +733,12 @@ namespace NLua
void SetMemberCache(ProxyType objType, string memberName, object member) void SetMemberCache(ProxyType objType, string memberName, object member)
{ {
Dictionary<object, object> members = null; Dictionary<object, object> members;
object memberCacheValue = null; Dictionary<object, object> memberCacheValue;
if (memberCache.TryGetValue(objType, out memberCacheValue)) if (memberCache.TryGetValue(objType, out memberCacheValue))
{ {
members = (Dictionary<object, object>)memberCacheValue; members = memberCacheValue;
} }
else else
{ {
...@@ -807,7 +803,7 @@ namespace NLua ...@@ -807,7 +803,7 @@ namespace NLua
var args = setter.GetParameters(); var args = setter.GetParameters();
var valueType = args[1].ParameterType; var valueType = args[1].ParameterType;
// The new val ue the user specified // The new value the user specified
object val = translator.GetAsType(luaState, 3, valueType); object val = translator.GetAsType(luaState, 3, valueType);
var indexType = args[0].ParameterType; var indexType = args[0].ParameterType;
object index = translator.GetAsType(luaState, 2, indexType); object index = translator.GetAsType(luaState, 2, indexType);
...@@ -822,13 +818,11 @@ namespace NLua ...@@ -822,13 +818,11 @@ namespace NLua
else else
translator.ThrowError(luaState, detailMessage); // Pass the original message from trySetMember because it is probably best translator.ThrowError(luaState, detailMessage); // Pass the original message from trySetMember because it is probably best
} }
#if !SILVERLIGHT
} }
catch (SEHException) catch (SEHException)
{ {
// If we are seeing a C++ exception - this must actually be for Lua's private use. Let it handle it // If we are seeing a C++ exception - this must actually be for Lua's private use. Let it handle it
throw; throw;
#endif
} }
catch (Exception e) catch (Exception e)
{ {
...@@ -874,16 +868,14 @@ namespace NLua ...@@ -874,16 +868,14 @@ namespace NLua
{ {
var members = targetType.GetMember(fieldName, bindingType | BindingFlags.Public); var members = targetType.GetMember(fieldName, bindingType | BindingFlags.Public);
if (members.Length > 0) if (members.Length <= 0)
{
member = members[0];
SetMemberCache(targetType, fieldName, member);
}
else
{ {
detailMessage = "field or property '" + fieldName + "' does not exist"; detailMessage = "field or property '" + fieldName + "' does not exist";
return false; return false;
} }
member = members[0];
SetMemberCache(targetType, fieldName, member);
} }
if (member.MemberType == MemberTypes.Field) if (member.MemberType == MemberTypes.Field)
...@@ -970,24 +962,22 @@ namespace NLua ...@@ -970,24 +962,22 @@ namespace NLua
private int GetClassMethodInternal(LuaState luaState) private int GetClassMethodInternal(LuaState luaState)
{ {
ProxyType klass; var klass = translator.GetRawNetObject(luaState, 1) as ProxyType;
object obj = translator.GetRawNetObject(luaState, 1);
if (obj == null || !(obj is ProxyType)) if (klass == null)
{ {
translator.ThrowError(luaState, "Trying to index an invalid type reference"); translator.ThrowError(luaState, "Trying to index an invalid type reference");
luaState.PushNil(); luaState.PushNil();
return 1; return 1;
} }
klass = (ProxyType)obj;
if (luaState.IsNumber(2)) if (luaState.IsNumber(2))
{ {
int size = (int)luaState.ToNumber(2); int size = (int)luaState.ToNumber(2);
translator.Push(luaState, Array.CreateInstance(klass.UnderlyingSystemType, size)); translator.Push(luaState, Array.CreateInstance(klass.UnderlyingSystemType, size));
return 1; return 1;
} }
string methodName = luaState.ToString(2); string methodName = luaState.ToString(2);
if (string.IsNullOrEmpty(methodName)) if (string.IsNullOrEmpty(methodName))
...@@ -1014,17 +1004,14 @@ namespace NLua ...@@ -1014,17 +1004,14 @@ namespace NLua
private int SetClassFieldOrPropertyInternal(LuaState luaState) private int SetClassFieldOrPropertyInternal(LuaState luaState)
{ {
ProxyType target; var target = translator.GetRawNetObject(luaState, 1) as ProxyType;
object obj = translator.GetRawNetObject(luaState, 1);
if (obj == null || !(obj is ProxyType)) if (target == null)
{ {
translator.ThrowError(luaState, "trying to index an invalid type reference"); translator.ThrowError(luaState, "trying to index an invalid type reference");
return 0; return 0;
} }
target = (ProxyType)obj;
return SetMember(luaState, target, null, BindingFlags.Static); return SetMember(luaState, target, null, BindingFlags.Static);
} }
...@@ -1044,9 +1031,9 @@ namespace NLua ...@@ -1044,9 +1031,9 @@ namespace NLua
int CallDelegateInternal(LuaState luaState) int CallDelegateInternal(LuaState luaState)
{ {
object objDelegate = translator.GetRawNetObject(luaState, 1); var del = translator.GetRawNetObject(luaState, 1) as Delegate;
if (objDelegate == null || !(objDelegate is Delegate)) if (del == null)
{ {
translator.ThrowError(luaState, "Trying to invoke a not delegate or callable value"); translator.ThrowError(luaState, "Trying to invoke a not delegate or callable value");
luaState.PushNil(); luaState.PushNil();
...@@ -1056,7 +1043,6 @@ namespace NLua ...@@ -1056,7 +1043,6 @@ namespace NLua
luaState.Remove(1); luaState.Remove(1);
var validDelegate = new MethodCache(); var validDelegate = new MethodCache();
var del = (Delegate)objDelegate;
MethodBase methodDelegate = del.Method; MethodBase methodDelegate = del.Method;
bool isOk = MatchParameters(luaState, methodDelegate, ref validDelegate); bool isOk = MatchParameters(luaState, methodDelegate, ref validDelegate);
...@@ -1097,18 +1083,16 @@ namespace NLua ...@@ -1097,18 +1083,16 @@ namespace NLua
private int CallConstructorInternal(LuaState luaState) private int CallConstructorInternal(LuaState luaState)
{ {
var validConstructor = new MethodCache(); var klass = translator.GetRawNetObject(luaState, 1) as ProxyType;
ProxyType klass;
object obj = translator.GetRawNetObject(luaState, 1);
if (obj == null || !(obj is ProxyType)) if (klass == null)
{ {
translator.ThrowError(luaState, "Trying to call constructor on an invalid type reference"); translator.ThrowError(luaState, "Trying to call constructor on an invalid type reference");
luaState.PushNil(); luaState.PushNil();
return 1; return 1;
} }
klass = (ProxyType)obj; var validConstructor = new MethodCache();
luaState.Remove(1); luaState.Remove(1);
ConstructorInfo[] constructors = klass.UnderlyingSystemType.GetConstructors(); ConstructorInfo[] constructors = klass.UnderlyingSystemType.GetConstructors();
...@@ -1117,23 +1101,23 @@ namespace NLua ...@@ -1117,23 +1101,23 @@ namespace NLua
{ {
bool isConstructor = MatchParameters(luaState, constructor, ref validConstructor); bool isConstructor = MatchParameters(luaState, constructor, ref validConstructor);
if (isConstructor) if (!isConstructor)
continue;
try
{ {
try translator.Push(luaState, constructor.Invoke(validConstructor.args));
{ }
translator.Push(luaState, constructor.Invoke(validConstructor.args)); catch (TargetInvocationException e)
} {
catch (TargetInvocationException e) ThrowError(luaState, e);
{ luaState.PushNil();
ThrowError(luaState, e);
luaState.PushNil();
}
catch
{
luaState.PushNil();
}
return 1;
} }
catch
{
luaState.PushNil();
}
return 1;
} }
if (klass.UnderlyingSystemType.IsValueType) if (klass.UnderlyingSystemType.IsValueType)
...@@ -1215,14 +1199,15 @@ namespace NLua ...@@ -1215,14 +1199,15 @@ namespace NLua
return 1; return 1;
} }
internal Array TableToArray(Func<int, object> luaParamValueExtractor, Type paramArrayType, int startIndex, int count) internal Array TableToArray(LuaState luaState, ExtractValue extractValue, Type paramArrayType, ref int startIndex, int count)
{ {
Array paramArray; Array paramArray;
if (count == 0) if (count == 0)
return Array.CreateInstance(paramArrayType, 0); return Array.CreateInstance(paramArrayType, 0);
var luaParamValue = luaParamValueExtractor(startIndex); var luaParamValue = extractValue(luaState, startIndex);
startIndex++;
if (luaParamValue is LuaTable) if (luaParamValue is LuaTable)
{ {
...@@ -1239,30 +1224,27 @@ namespace NLua ...@@ -1239,30 +1224,27 @@ namespace NLua
if (paramArrayType == typeof(object)) if (paramArrayType == typeof(object))
{ {
if (value != null && value.GetType() == typeof(double) && IsInteger((double)value)) if (value != null && value is double && IsInteger((double)value))
value = Convert.ToInt32((double)value); value = Convert.ToInt32((double)value);
} }
#if SILVERLIGHT
paramArray.SetValue (Convert.ChangeType (value, paramArrayType, System.Globalization.CultureInfo.InvariantCulture), paramArrayIndex);
#else
paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex); paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex);
#endif
paramArrayIndex++; paramArrayIndex++;
} }
} }
else else
{ {
paramArray = Array.CreateInstance(paramArrayType, count); paramArray = Array.CreateInstance(paramArrayType, count);
paramArray.SetValue(luaParamValue, 0); paramArray.SetValue(luaParamValue, 0);
for (int i = 1; i < count; i++) for (int i = 1; i < count; i++)
{ {
startIndex++; var value = extractValue(luaState, startIndex);
var value = luaParamValueExtractor(startIndex);
paramArray.SetValue(value, i); paramArray.SetValue(value, i);
startIndex++;
} }
} }
return paramArray; return paramArray;
...@@ -1298,19 +1280,14 @@ namespace NLua ...@@ -1298,19 +1280,14 @@ namespace NLua
int count = (nLuaParams - currentLuaParam) + 1; int count = (nLuaParams - currentLuaParam) + 1;
Type paramArrayType = currentNetParam.ParameterType.GetElementType(); Type paramArrayType = currentNetParam.ParameterType.GetElementType();
Func<int, object> extractDelegate = (currentParam) => { Array paramArray = TableToArray(luaState, extractValue, paramArrayType, ref currentLuaParam, count);
currentLuaParam++;
return extractValue(luaState, currentParam);
};
Array paramArray = TableToArray(extractDelegate, paramArrayType, currentLuaParam, count);
paramList.Add(paramArray); paramList.Add(paramArray);
int index = paramList.LastIndexOf(paramArray); int index = paramList.LastIndexOf(paramArray);
var methodArg = new MethodArgs(); var methodArg = new MethodArgs();
methodArg.index = index; methodArg.Index = index;
methodArg.extractValue = extractValue; methodArg.ExtractValue = extractValue;
methodArg.isParamsArray = true; methodArg.IsParamsArray = true;
methodArg.paramsArrayType = paramArrayType; methodArg.ParamsArrayType = paramArrayType;
argTypes.Add(methodArg); argTypes.Add(methodArg);
} }
...@@ -1330,8 +1307,8 @@ namespace NLua ...@@ -1330,8 +1307,8 @@ namespace NLua
paramList.Add(value); paramList.Add(value);
int index = paramList.LastIndexOf(value); int index = paramList.LastIndexOf(value);
var methodArg = new MethodArgs(); var methodArg = new MethodArgs();
methodArg.index = index; methodArg.Index = index;
methodArg.extractValue = extractValue; methodArg.ExtractValue = extractValue;
argTypes.Add(methodArg); argTypes.Add(methodArg);
if (currentNetParam.ParameterType.IsByRef) if (currentNetParam.ParameterType.IsByRef)
...@@ -1386,59 +1363,28 @@ namespace NLua ...@@ -1386,59 +1363,28 @@ namespace NLua
private bool IsParamsArray(LuaState luaState, int nLuaParams, int currentLuaParam, ParameterInfo currentNetParam, out ExtractValue extractValue) private bool IsParamsArray(LuaState luaState, int nLuaParams, int currentLuaParam, ParameterInfo currentNetParam, out ExtractValue extractValue)
{ {
extractValue = null; extractValue = null;
bool isParamArray = false;
if (currentNetParam.GetCustomAttributes(typeof(ParamArrayAttribute), false).Any()) if (!currentNetParam.GetCustomAttributes(typeof(ParamArrayAttribute), false).Any())
{ return false;
isParamArray = nLuaParams < currentLuaParam;
LuaType luaType;
try bool isParamArray = nLuaParams < currentLuaParam;
{
luaType = luaState.Type(currentLuaParam);
}
catch (Exception ex)
{
Debug.WriteLine("Could not retrieve lua type while attempting to determine params Array Status.");
Debug.WriteLine(ex.Message);
extractValue = null;
return false;
}
if (luaType == LuaType.Table) LuaType luaType = luaState.Type(currentLuaParam);
{
try
{
extractValue = translator.typeChecker.GetExtractor(typeof(LuaTable));
}
catch (Exception)
{
Debug.WriteLine("An error occurred during an attempt to retrieve a LuaTable extractor while checking for params array status.");
}
if (extractValue != null) if (luaType == LuaType.Table)
{ {
return true; extractValue = translator.typeChecker.GetExtractor(typeof(LuaTable));
} if (extractValue != null)
} return true;
else }
{ else
var paramElementType = currentNetParam.ParameterType.GetElementType(); {
Type paramElementType = currentNetParam.ParameterType.GetElementType();
try extractValue = translator.typeChecker.CheckLuaType(luaState, currentLuaParam, paramElementType);
{
extractValue = translator.typeChecker.CheckLuaType(luaState, currentLuaParam, paramElementType);
}
catch (Exception/* ex*/)
{
Debug.WriteLine(string.Format("An error occurred during an attempt to retrieve an extractor ({0}) while checking for params array status.", paramElementType.FullName));
}
if (extractValue != null) if (extractValue != null)
{ return true;
return true;
}
}
} }
return isParamArray; return isParamArray;
} }
......
...@@ -9,16 +9,16 @@ namespace NLua.Method ...@@ -9,16 +9,16 @@ namespace NLua.Method
/// </summary> /// </summary>
class EventHandlerContainer : IDisposable class EventHandlerContainer : IDisposable
{ {
private Dictionary<Delegate, RegisterEventHandler> dict = new Dictionary<Delegate, RegisterEventHandler>(); private readonly Dictionary<Delegate, RegisterEventHandler> _dict = new Dictionary<Delegate, RegisterEventHandler>();
public void Add(Delegate handler, RegisterEventHandler eventInfo) public void Add(Delegate handler, RegisterEventHandler eventInfo)
{ {
dict.Add(handler, eventInfo); _dict.Add(handler, eventInfo);
} }
public void Remove(Delegate handler) public void Remove(Delegate handler)
{ {
bool found = dict.Remove(handler); bool found = _dict.Remove(handler);
Debug.Assert(found); Debug.Assert(found);
} }
...@@ -27,10 +27,10 @@ namespace NLua.Method ...@@ -27,10 +27,10 @@ namespace NLua.Method
/// </summary> /// </summary>
public void Dispose() public void Dispose()
{ {
foreach (KeyValuePair<Delegate, RegisterEventHandler> pair in dict) foreach (KeyValuePair<Delegate, RegisterEventHandler> pair in _dict)
pair.Value.RemovePending(pair.Key); pair.Value.RemovePending(pair.Key);
dict.Clear(); _dict.Clear();
} }
} }
} }
\ No newline at end of file
...@@ -2,12 +2,6 @@ using System; ...@@ -2,12 +2,6 @@ using System;
namespace NLua.Method namespace NLua.Method
{ {
/*
* Static helper methods for Lua tables acting as CLR objects.
*
* Author: Fabio Mascarenhas
* Version: 1.0
*/
public class LuaClassHelper public class LuaClassHelper
{ {
/* /*
...@@ -19,12 +13,11 @@ namespace NLua.Method ...@@ -19,12 +13,11 @@ namespace NLua.Method
if (luaTable == null) if (luaTable == null)
return null; return null;
object funcObj = luaTable.RawGet(name); var funcObj = luaTable.RawGet(name) as LuaFunction;
if (funcObj is LuaFunction) if (funcObj != null)
return (LuaFunction)funcObj; return funcObj;
else return null;
return null;
} }
/* /*
......
...@@ -2,13 +2,13 @@ namespace NLua.Method ...@@ -2,13 +2,13 @@ namespace NLua.Method
{ {
public class LuaEventHandler public class LuaEventHandler
{ {
public LuaFunction handler = null; public LuaFunction Handler = null;
// CP: Fix provided by Ben Bryant for delegates with one param // CP: Fix provided by Ben Bryant for delegates with one param
// link: http://luaforge.net/forum/message.php?msg_id=9318 // link: http://luaforge.net/forum/message.php?msg_id=9318
public void HandleEvent(object[] args) public void HandleEvent(object[] args)
{ {
handler.Call(args); Handler.Call(args);
} }
} }
} }
\ 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