Browse Source

Delegates interops

Xanathar 11 years ago
parent
commit
da0b2a554f

+ 12 - 12
src/MoonSharp.Interpreter.Tests/EndToEnd/UserDataMethodsTests.cs

@@ -54,7 +54,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 		}
 		}
 
 
 
 
-		public void Test_ConcatMethodStatic(UserDataAccessMode opt)
+		public void Test_ConcatMethodStatic(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
@@ -75,7 +75,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(DataType.String, res.Type);
 			Assert.AreEqual(DataType.String, res.Type);
 			Assert.AreEqual("eheh1ciao!SOMECLASS!True|asdqwezxc|asdqwezxc|123xy|asdqweXYzxc|!SOMECLASS!1994", res.String);
 			Assert.AreEqual("eheh1ciao!SOMECLASS!True|asdqwezxc|asdqwezxc|123xy|asdqweXYzxc|!SOMECLASS!1994", res.String);
 		}
 		}
-		public void Test_ConcatMethod(UserDataAccessMode opt)
+		public void Test_ConcatMethod(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
@@ -96,7 +96,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual("eheh1ciao!SOMECLASS!True|asdqwezxc|asdqwezxc|123xy|asdqweXYzxc|!SOMECLASS!1912", res.String);
 			Assert.AreEqual("eheh1ciao!SOMECLASS!True|asdqwezxc|asdqwezxc|123xy|asdqweXYzxc|!SOMECLASS!1912", res.String);
 		}
 		}
 
 
-		public void Test_ConcatMethodStaticSimplifiedSyntax(UserDataAccessMode opt)
+		public void Test_ConcatMethodStaticSimplifiedSyntax(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
 				t = { 'asd', 'qwe', 'zxc', ['x'] = 'X', ['y'] = 'Y' };
@@ -122,56 +122,56 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethod_None()
 		public void Interpo_ConcatMethod_None()
 		{
 		{
-			Test_ConcatMethod(UserDataAccessMode.Reflection);
+			Test_ConcatMethod(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethod_Lazy()
 		public void Interpo_ConcatMethod_Lazy()
 		{
 		{
-			Test_ConcatMethod(UserDataAccessMode.LazyOptimized);
+			Test_ConcatMethod(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethod_Precomputed()
 		public void Interpo_ConcatMethod_Precomputed()
 		{
 		{
-			Test_ConcatMethod(UserDataAccessMode.Preoptimized);
+			Test_ConcatMethod(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStatic_None()
 		public void Interpo_ConcatMethodStatic_None()
 		{
 		{
-			Test_ConcatMethodStatic(UserDataAccessMode.Reflection);
+			Test_ConcatMethodStatic(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStatic_Lazy()
 		public void Interpo_ConcatMethodStatic_Lazy()
 		{
 		{
-			Test_ConcatMethodStatic(UserDataAccessMode.LazyOptimized);
+			Test_ConcatMethodStatic(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStatic_Precomputed()
 		public void Interpo_ConcatMethodStatic_Precomputed()
 		{
 		{
-			Test_ConcatMethodStatic(UserDataAccessMode.Preoptimized);
+			Test_ConcatMethodStatic(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_None()
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_None()
 		{
 		{
-			Test_ConcatMethodStaticSimplifiedSyntax(UserDataAccessMode.Reflection);
+			Test_ConcatMethodStaticSimplifiedSyntax(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_Lazy()
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_Lazy()
 		{
 		{
-			Test_ConcatMethodStaticSimplifiedSyntax(UserDataAccessMode.LazyOptimized);
+			Test_ConcatMethodStaticSimplifiedSyntax(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_Precomputed()
 		public void Interpo_ConcatMethodStaticSimplifiedSyntax_Precomputed()
 		{
 		{
-			Test_ConcatMethodStaticSimplifiedSyntax(UserDataAccessMode.Preoptimized);
+			Test_ConcatMethodStaticSimplifiedSyntax(InteropAccessMode.Preoptimized);
 		}
 		}
 	}
 	}
 }
 }

+ 36 - 36
src/MoonSharp.Interpreter.Tests/EndToEnd/UserDataPropertiesTests.cs

@@ -26,7 +26,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			}
 			}
 		}
 		}
 
 
-		public void Test_IntPropertyGetter(UserDataAccessMode opt)
+		public void Test_IntPropertyGetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				x = myobj.IntProp;
 				x = myobj.IntProp;
@@ -46,7 +46,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(321, res.Number);
 			Assert.AreEqual(321, res.Number);
 		}
 		}
 
 
-		public void Test_NIntPropertyGetter(UserDataAccessMode opt)
+		public void Test_NIntPropertyGetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				x = myobj1.NIntProp;
 				x = myobj1.NIntProp;
@@ -71,7 +71,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(DataType.Nil, res.Tuple[1].Type);
 			Assert.AreEqual(DataType.Nil, res.Tuple[1].Type);
 		}
 		}
 
 
-		public void Test_ObjPropertyGetter(UserDataAccessMode opt)
+		public void Test_ObjPropertyGetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				x = myobj1.ObjProp;
 				x = myobj1.ObjProp;
@@ -100,7 +100,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(obj1, res.Tuple[1].UserData.Object);
 			Assert.AreEqual(obj1, res.Tuple[1].UserData.Object);
 		}
 		}
 
 
-		public void Test_IntPropertySetter(UserDataAccessMode opt)
+		public void Test_IntPropertySetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				myobj.IntProp = 19;";
 				myobj.IntProp = 19;";
@@ -120,7 +120,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(19, obj.IntProp);
 			Assert.AreEqual(19, obj.IntProp);
 		}
 		}
 
 
-		public void Test_NIntPropertySetter(UserDataAccessMode opt)
+		public void Test_NIntPropertySetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				myobj1.NIntProp = nil;
 				myobj1.NIntProp = nil;
@@ -145,7 +145,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(19, obj2.NIntProp);
 			Assert.AreEqual(19, obj2.NIntProp);
 		}
 		}
 
 
-		public void Test_ObjPropertySetter(UserDataAccessMode opt)
+		public void Test_ObjPropertySetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				myobj1.ObjProp = myobj2;
 				myobj1.ObjProp = myobj2;
@@ -170,7 +170,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual("hello", obj2.ObjProp);
 			Assert.AreEqual("hello", obj2.ObjProp);
 		}
 		}
 
 
-		public void Test_InvalidPropertySetter(UserDataAccessMode opt)
+		public void Test_InvalidPropertySetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				myobj.IntProp = '19';";
 				myobj.IntProp = '19';";
@@ -190,7 +190,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual(19, obj.IntProp);
 			Assert.AreEqual(19, obj.IntProp);
 		}
 		}
 
 
-		public void Test_StaticPropertyAccess(UserDataAccessMode opt)
+		public void Test_StaticPropertyAccess(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				static.StaticProp = 'asdasd' .. static.StaticProp;";
 				static.StaticProp = 'asdasd' .. static.StaticProp;";
@@ -210,7 +210,7 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 			Assert.AreEqual("asdasdqweqwe", SomeClass.StaticProp);
 			Assert.AreEqual("asdasdqweqwe", SomeClass.StaticProp);
 		}
 		}
 
 
-		public void Test_IteratorPropertyGetter(UserDataAccessMode opt)
+		public void Test_IteratorPropertyGetter(InteropAccessMode opt)
 		{
 		{
 			string script = @"    
 			string script = @"    
 				x = 0;
 				x = 0;
@@ -237,109 +237,109 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 		[Test]
 		[Test]
 		public void Interop_IntPropertyGetter_None()
 		public void Interop_IntPropertyGetter_None()
 		{
 		{
-			Test_IntPropertyGetter(UserDataAccessMode.Reflection);
+			Test_IntPropertyGetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IntPropertyGetter_Lazy()
 		public void Interop_IntPropertyGetter_Lazy()
 		{
 		{
-			Test_IntPropertyGetter(UserDataAccessMode.LazyOptimized);
+			Test_IntPropertyGetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IntPropertyGetter_Precomputed()
 		public void Interop_IntPropertyGetter_Precomputed()
 		{
 		{
-			Test_IntPropertyGetter(UserDataAccessMode.Preoptimized);
+			Test_IntPropertyGetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertyGetter_None()
 		public void Interop_NIntPropertyGetter_None()
 		{
 		{
-			Test_NIntPropertyGetter(UserDataAccessMode.Reflection);
+			Test_NIntPropertyGetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertyGetter_Lazy()
 		public void Interop_NIntPropertyGetter_Lazy()
 		{
 		{
-			Test_NIntPropertyGetter(UserDataAccessMode.LazyOptimized);
+			Test_NIntPropertyGetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertyGetter_Precomputed()
 		public void Interop_NIntPropertyGetter_Precomputed()
 		{
 		{
-			Test_NIntPropertyGetter(UserDataAccessMode.Preoptimized);
+			Test_NIntPropertyGetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertyGetter_None()
 		public void Interop_ObjPropertyGetter_None()
 		{
 		{
-			Test_ObjPropertyGetter(UserDataAccessMode.Reflection);
+			Test_ObjPropertyGetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertyGetter_Lazy()
 		public void Interop_ObjPropertyGetter_Lazy()
 		{
 		{
-			Test_ObjPropertyGetter(UserDataAccessMode.LazyOptimized);
+			Test_ObjPropertyGetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertyGetter_Precomputed()
 		public void Interop_ObjPropertyGetter_Precomputed()
 		{
 		{
-			Test_ObjPropertyGetter(UserDataAccessMode.Preoptimized);
+			Test_ObjPropertyGetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IntPropertySetter_None()
 		public void Interop_IntPropertySetter_None()
 		{
 		{
-			Test_IntPropertySetter(UserDataAccessMode.Reflection);
+			Test_IntPropertySetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IntPropertySetter_Lazy()
 		public void Interop_IntPropertySetter_Lazy()
 		{
 		{
-			Test_IntPropertySetter(UserDataAccessMode.LazyOptimized);
+			Test_IntPropertySetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IntPropertySetter_Precomputed()
 		public void Interop_IntPropertySetter_Precomputed()
 		{
 		{
-			Test_IntPropertySetter(UserDataAccessMode.Preoptimized);
+			Test_IntPropertySetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertySetter_None()
 		public void Interop_NIntPropertySetter_None()
 		{
 		{
-			Test_NIntPropertySetter(UserDataAccessMode.Reflection);
+			Test_NIntPropertySetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertySetter_Lazy()
 		public void Interop_NIntPropertySetter_Lazy()
 		{
 		{
-			Test_NIntPropertySetter(UserDataAccessMode.LazyOptimized);
+			Test_NIntPropertySetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_NIntPropertySetter_Precomputed()
 		public void Interop_NIntPropertySetter_Precomputed()
 		{
 		{
-			Test_NIntPropertySetter(UserDataAccessMode.Preoptimized);
+			Test_NIntPropertySetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertySetter_None()
 		public void Interop_ObjPropertySetter_None()
 		{
 		{
-			Test_ObjPropertySetter(UserDataAccessMode.Reflection);
+			Test_ObjPropertySetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertySetter_Lazy()
 		public void Interop_ObjPropertySetter_Lazy()
 		{
 		{
-			Test_ObjPropertySetter(UserDataAccessMode.LazyOptimized);
+			Test_ObjPropertySetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_ObjPropertySetter_Precomputed()
 		public void Interop_ObjPropertySetter_Precomputed()
 		{
 		{
-			Test_ObjPropertySetter(UserDataAccessMode.Preoptimized);
+			Test_ObjPropertySetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 
 
@@ -347,58 +347,58 @@ namespace MoonSharp.Interpreter.Tests.EndToEnd
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		public void Interop_InvalidPropertySetter_None()
 		public void Interop_InvalidPropertySetter_None()
 		{
 		{
-			Test_InvalidPropertySetter(UserDataAccessMode.Reflection);
+			Test_InvalidPropertySetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		public void Interop_InvalidPropertySetter_Lazy()
 		public void Interop_InvalidPropertySetter_Lazy()
 		{
 		{
-			Test_InvalidPropertySetter(UserDataAccessMode.LazyOptimized);
+			Test_InvalidPropertySetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		[ExpectedException(typeof(ScriptRuntimeException))]
 		public void Interop_InvalidPropertySetter_Precomputed()
 		public void Interop_InvalidPropertySetter_Precomputed()
 		{
 		{
-			Test_InvalidPropertySetter(UserDataAccessMode.Preoptimized);
+			Test_InvalidPropertySetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 
 
 		[Test]
 		[Test]
 		public void Interop_StaticPropertyAccess_None()
 		public void Interop_StaticPropertyAccess_None()
 		{
 		{
-			Test_StaticPropertyAccess(UserDataAccessMode.Reflection);
+			Test_StaticPropertyAccess(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_StaticPropertyAccess_Lazy()
 		public void Interop_StaticPropertyAccess_Lazy()
 		{
 		{
-			Test_StaticPropertyAccess(UserDataAccessMode.LazyOptimized);
+			Test_StaticPropertyAccess(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_StaticPropertyAccess_Precomputed()
 		public void Interop_StaticPropertyAccess_Precomputed()
 		{
 		{
-			Test_StaticPropertyAccess(UserDataAccessMode.Preoptimized);
+			Test_StaticPropertyAccess(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IteratorPropertyGetter_None()
 		public void Interop_IteratorPropertyGetter_None()
 		{
 		{
-			Test_IteratorPropertyGetter(UserDataAccessMode.Reflection);
+			Test_IteratorPropertyGetter(InteropAccessMode.Reflection);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IteratorPropertyGetter_Lazy()
 		public void Interop_IteratorPropertyGetter_Lazy()
 		{
 		{
-			Test_IteratorPropertyGetter(UserDataAccessMode.LazyOptimized);
+			Test_IteratorPropertyGetter(InteropAccessMode.LazyOptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]
 		public void Interop_IteratorPropertyGetter_Precomputed()
 		public void Interop_IteratorPropertyGetter_Precomputed()
 		{
 		{
-			Test_IteratorPropertyGetter(UserDataAccessMode.Preoptimized);
+			Test_IteratorPropertyGetter(InteropAccessMode.Preoptimized);
 		}
 		}
 
 
 		[Test]
 		[Test]

+ 32 - 0
src/MoonSharp.Interpreter/DataTypes/CallbackFunction.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
 using MoonSharp.Interpreter.Execution;
 using MoonSharp.Interpreter.Execution;
+using MoonSharp.Interpreter.Interop;
 
 
 namespace MoonSharp.Interpreter
 namespace MoonSharp.Interpreter
 {
 {
@@ -10,6 +11,7 @@ namespace MoonSharp.Interpreter
 	{
 	{
 		Func<ScriptExecutionContext, CallbackArguments, DynValue> m_CallBack;
 		Func<ScriptExecutionContext, CallbackArguments, DynValue> m_CallBack;
 		public Table Closure { get; set; }
 		public Table Closure { get; set; }
+		private static InteropAccessMode m_DefaultAccessMode = InteropAccessMode.LazyOptimized;
 
 
 		public CallbackFunction(Func<ScriptExecutionContext, CallbackArguments, DynValue> callBack)
 		public CallbackFunction(Func<ScriptExecutionContext, CallbackArguments, DynValue> callBack)
 		{
 		{
@@ -21,5 +23,35 @@ namespace MoonSharp.Interpreter
 			return m_CallBack(executionContext, new  CallbackArguments(args));
 			return m_CallBack(executionContext, new  CallbackArguments(args));
 		}
 		}
 
 
+		public static InteropAccessMode DefaultAccessMode
+		{
+			get { return m_DefaultAccessMode; }
+			set
+			{
+				if (value == InteropAccessMode.Default || value == InteropAccessMode.HideMembers || value == InteropAccessMode.BackgroundOptimized)
+					throw new ArgumentException("DefaultAccessMode");
+
+				m_DefaultAccessMode = value;
+			}
+		}
+
+		public static CallbackFunction FromDelegate(Script script, Delegate del, InteropAccessMode accessMode = InteropAccessMode.Default)
+		{
+			if (accessMode == InteropAccessMode.Default)
+				accessMode = m_DefaultAccessMode;
+
+			UserDataMethodDescriptor descr = new UserDataMethodDescriptor(del.Method, accessMode);
+			return new CallbackFunction(descr.GetCallback(script, del.Target));
+		}
+
+
+		public static CallbackFunction FromMethodInfo(Script script, System.Reflection.MethodInfo mi, InteropAccessMode accessMode = InteropAccessMode.Default)
+		{
+			if (accessMode == InteropAccessMode.Default)
+				accessMode = m_DefaultAccessMode;
+
+			UserDataMethodDescriptor descr = new UserDataMethodDescriptor(mi, accessMode);
+			return new CallbackFunction(descr.GetCallback(script, null));
+		}
 	}
 	}
 }
 }

+ 1 - 0
src/MoonSharp.Interpreter/DataTypes/DynValue.cs

@@ -153,6 +153,7 @@ namespace MoonSharp.Interpreter
 
 
 		/// <summary>
 		/// <summary>
 		/// Creates a new writable value initialized to the specified CLR callback.
 		/// Creates a new writable value initialized to the specified CLR callback.
+		/// See also CallbackFunction.FromDelegate and CallbackFunction.FromMethodInfo factory methods.
 		/// </summary>
 		/// </summary>
 		public static DynValue NewCallback(CallbackFunction function)
 		public static DynValue NewCallback(CallbackFunction function)
 		{
 		{

+ 2 - 3
src/MoonSharp.Interpreter/DataTypes/UserDataAccessMode.cs → src/MoonSharp.Interpreter/DataTypes/InteropAccessMode.cs

@@ -5,8 +5,7 @@ using System.Text;
 
 
 namespace MoonSharp.Interpreter
 namespace MoonSharp.Interpreter
 {
 {
-	[Flags]
-	public enum UserDataAccessMode
+	public enum InteropAccessMode
 	{
 	{
 		/// <summary>
 		/// <summary>
 		/// Optimization is not performed and reflection is used everytime to access members.
 		/// Optimization is not performed and reflection is used everytime to access members.
@@ -31,7 +30,7 @@ namespace MoonSharp.Interpreter
 		/// </summary>
 		/// </summary>
 		HideMembers,
 		HideMembers,
 		/// <summary>
 		/// <summary>
-		/// Use the default access mode set in the registry
+		/// Use the default access mode
 		/// </summary>
 		/// </summary>
 		Default
 		Default
 	}
 	}

+ 11 - 11
src/MoonSharp.Interpreter/DataTypes/UserData.cs

@@ -19,20 +19,20 @@ namespace MoonSharp.Interpreter
 
 
 		private static ReaderWriterLockSlim m_Lock = new ReaderWriterLockSlim();
 		private static ReaderWriterLockSlim m_Lock = new ReaderWriterLockSlim();
 		private static Dictionary<Type, UserDataDescriptor> s_Registry = new Dictionary<Type, UserDataDescriptor>();
 		private static Dictionary<Type, UserDataDescriptor> s_Registry = new Dictionary<Type, UserDataDescriptor>();
-		private static UserDataAccessMode m_DefaultAccessMode;
+		private static InteropAccessMode m_DefaultAccessMode;
 
 
 		static UserData()
 		static UserData()
 		{
 		{
-			RegisterType<EnumerableWrapper>(UserDataAccessMode.HideMembers);
-			m_DefaultAccessMode = UserDataAccessMode.LazyOptimized;
+			RegisterType<EnumerableWrapper>(InteropAccessMode.HideMembers);
+			m_DefaultAccessMode = InteropAccessMode.LazyOptimized;
 		}
 		}
 
 
-		public static void RegisterType<T>(UserDataAccessMode accessMode = UserDataAccessMode.Default)
+		public static void RegisterType<T>(InteropAccessMode accessMode = InteropAccessMode.Default)
 		{
 		{
 			RegisterType_Impl(typeof(T), accessMode);
 			RegisterType_Impl(typeof(T), accessMode);
 		}
 		}
 
 
-		public static void RegisterType(Type type, UserDataAccessMode accessMode = UserDataAccessMode.Default)
+		public static void RegisterType(Type type, InteropAccessMode accessMode = InteropAccessMode.Default)
 		{
 		{
 			RegisterType_Impl(type, accessMode);
 			RegisterType_Impl(type, accessMode);
 		}
 		}
@@ -66,12 +66,12 @@ namespace MoonSharp.Interpreter
 			return CreateStatic(typeof(T));
 			return CreateStatic(typeof(T));
 		}
 		}
 
 
-		public static UserDataAccessMode DefaultAccessMode
+		public static InteropAccessMode DefaultAccessMode
 		{
 		{
 			get { return m_DefaultAccessMode; }
 			get { return m_DefaultAccessMode; }
 			set
 			set
 			{
 			{
-				if (value == UserDataAccessMode.Default)
+				if (value == InteropAccessMode.Default)
 					throw new ArgumentException("DefaultAccessMode");
 					throw new ArgumentException("DefaultAccessMode");
 
 
 				m_DefaultAccessMode = value;
 				m_DefaultAccessMode = value;
@@ -80,9 +80,9 @@ namespace MoonSharp.Interpreter
 
 
 
 
 
 
-		private static void RegisterType_Impl(Type type, UserDataAccessMode accessMode = UserDataAccessMode.Default)
+		private static void RegisterType_Impl(Type type, InteropAccessMode accessMode = InteropAccessMode.Default)
 		{
 		{
-			if (accessMode == UserDataAccessMode.Default)
+			if (accessMode == InteropAccessMode.Default)
 			{
 			{
 				MoonSharpUserDataAttribute attr = type.GetCustomAttributes(true).OfType<MoonSharpUserDataAttribute>()
 				MoonSharpUserDataAttribute attr = type.GetCustomAttributes(true).OfType<MoonSharpUserDataAttribute>()
 					.SingleOrDefault();
 					.SingleOrDefault();
@@ -92,7 +92,7 @@ namespace MoonSharp.Interpreter
 			}
 			}
 
 
 
 
-			if (accessMode == UserDataAccessMode.Default)
+			if (accessMode == InteropAccessMode.Default)
 				accessMode = m_DefaultAccessMode;
 				accessMode = m_DefaultAccessMode;
 
 
 			m_Lock.EnterWriteLock();
 			m_Lock.EnterWriteLock();
@@ -104,7 +104,7 @@ namespace MoonSharp.Interpreter
 					UserDataDescriptor udd = new UserDataDescriptor(type, accessMode);
 					UserDataDescriptor udd = new UserDataDescriptor(type, accessMode);
 					s_Registry.Add(udd.Type, udd);
 					s_Registry.Add(udd.Type, udd);
 
 
-					if (accessMode == UserDataAccessMode.BackgroundOptimized)
+					if (accessMode == InteropAccessMode.BackgroundOptimized)
 					{
 					{
 						ThreadPool.QueueUserWorkItem(o => udd.Optimize());
 						ThreadPool.QueueUserWorkItem(o => udd.Optimize());
 					}
 					}

+ 14 - 0
src/MoonSharp.Interpreter/Interop/ConversionHelper.cs

@@ -85,6 +85,20 @@ namespace MoonSharp.Interpreter.Interop
 
 
 			if (v != null) return v;
 			if (v != null) return v;
 
 
+			if (obj is Delegate)
+				return DynValue.NewCallback(CallbackFunction.FromDelegate(script, (Delegate)obj));
+
+			if (obj is MethodInfo)
+			{
+				MethodInfo mi = (MethodInfo)obj;
+				
+				if (mi.IsStatic)
+				{
+					return DynValue.NewCallback(CallbackFunction.FromMethodInfo(script, mi));
+				}
+			}
+
+
 			if (obj is System.Collections.IList)
 			if (obj is System.Collections.IList)
 			{
 			{
 				Table t = ConvertIListToTable(script, (System.Collections.IList)obj);
 				Table t = ConvertIListToTable(script, (System.Collections.IList)obj);

+ 2 - 2
src/MoonSharp.Interpreter/Interop/MoonSharpUserDataAttribute.cs

@@ -8,11 +8,11 @@ namespace MoonSharp.Interpreter.Interop
 	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
 	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
 	public sealed class MoonSharpUserDataAttribute : Attribute
 	public sealed class MoonSharpUserDataAttribute : Attribute
 	{
 	{
-		public UserDataAccessMode AccessMode { get; private set; }
+		public InteropAccessMode AccessMode { get; private set; }
 
 
 		public MoonSharpUserDataAttribute()
 		public MoonSharpUserDataAttribute()
 		{
 		{
-			AccessMode = UserDataAccessMode.Default;
+			AccessMode = InteropAccessMode.Default;
 		}
 		}
 	}
 	}
 }
 }

+ 18 - 0
src/MoonSharp.Interpreter/Interop/UserDataDelegateDescriptor.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace MoonSharp.Interpreter.Interop
+{
+	class UserDataDelegateDescriptor
+	{
+
+		//void X(Delegate D)
+		//{
+		//	D.
+		//}
+
+
+	}
+}

+ 5 - 5
src/MoonSharp.Interpreter/Interop/UserDataDescriptor.cs

@@ -12,18 +12,18 @@ namespace MoonSharp.Interpreter.Interop
 	{
 	{
 		internal string Name { get; private set; }
 		internal string Name { get; private set; }
 		internal Type Type { get; private set; }
 		internal Type Type { get; private set; }
-		internal UserDataAccessMode AccessMode { get; private set; }
+		internal InteropAccessMode AccessMode { get; private set; }
 
 
 		private Dictionary<string, UserDataMethodDescriptor> m_Methods = new Dictionary<string, UserDataMethodDescriptor>();
 		private Dictionary<string, UserDataMethodDescriptor> m_Methods = new Dictionary<string, UserDataMethodDescriptor>();
 		private Dictionary<string, UserDataPropertyDescriptor> m_Properties = new Dictionary<string, UserDataPropertyDescriptor>();
 		private Dictionary<string, UserDataPropertyDescriptor> m_Properties = new Dictionary<string, UserDataPropertyDescriptor>();
 
 
-		internal UserDataDescriptor(Type type, UserDataAccessMode accessMode)
+		internal UserDataDescriptor(Type type, InteropAccessMode accessMode)
 		{
 		{
 			Type = type;
 			Type = type;
 			Name = type.FullName;
 			Name = type.FullName;
 			AccessMode = accessMode;
 			AccessMode = accessMode;
 
 
-			if (AccessMode != UserDataAccessMode.HideMembers)
+			if (AccessMode != InteropAccessMode.HideMembers)
 			{
 			{
 				foreach (MethodInfo mi in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static))
 				foreach (MethodInfo mi in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static))
 				{
 				{
@@ -32,7 +32,7 @@ namespace MoonSharp.Interpreter.Interop
 						if (mi.IsSpecialName)
 						if (mi.IsSpecialName)
 							continue;
 							continue;
 
 
-						var md = new UserDataMethodDescriptor(mi, this);
+						var md = new UserDataMethodDescriptor(mi, this.AccessMode);
 
 
 						if (m_Methods.ContainsKey(md.Name))
 						if (m_Methods.ContainsKey(md.Name))
 							throw new ArgumentException(string.Format("{0}.{1} has overloads", Name, md.Name));
 							throw new ArgumentException(string.Format("{0}.{1} has overloads", Name, md.Name));
@@ -45,7 +45,7 @@ namespace MoonSharp.Interpreter.Interop
 				{
 				{
 					if (CheckVisibility(pi.GetCustomAttributes(true), pi.GetGetMethod().IsPublic || pi.GetSetMethod().IsPublic))
 					if (CheckVisibility(pi.GetCustomAttributes(true), pi.GetGetMethod().IsPublic || pi.GetSetMethod().IsPublic))
 					{
 					{
-						var pd = new UserDataPropertyDescriptor(pi, this);
+						var pd = new UserDataPropertyDescriptor(pi, this.AccessMode);
 						m_Properties.Add(pd.Name, pd);
 						m_Properties.Add(pd.Name, pd);
 					}
 					}
 				}
 				}

+ 6 - 6
src/MoonSharp.Interpreter/Interop/UserDataMethodDescriptor.cs

@@ -12,7 +12,7 @@ namespace MoonSharp.Interpreter.Interop
 	internal class UserDataMethodDescriptor
 	internal class UserDataMethodDescriptor
 	{
 	{
 		internal MethodInfo MethodInfo { get; private set; }
 		internal MethodInfo MethodInfo { get; private set; }
-		internal UserDataDescriptor UserDataDescriptor { get; private set; }
+		internal InteropAccessMode AccessMode { get; private set; }
 		internal bool IsStatic { get; private set; }
 		internal bool IsStatic { get; private set; }
 		internal string Name { get; private set; }
 		internal string Name { get; private set; }
 
 
@@ -21,17 +21,17 @@ namespace MoonSharp.Interpreter.Interop
 		private Func<object, object[], object> m_OptimizedFunc = null;
 		private Func<object, object[], object> m_OptimizedFunc = null;
 		private Action<object, object[]> m_OptimizedAction = null;
 		private Action<object, object[]> m_OptimizedAction = null;
 
 
-		internal UserDataMethodDescriptor(MethodInfo mi, UserDataDescriptor userDataDescriptor)
+		internal UserDataMethodDescriptor(MethodInfo mi, InteropAccessMode accessMode)
 		{
 		{
 			this.MethodInfo = mi;
 			this.MethodInfo = mi;
-			this.UserDataDescriptor = userDataDescriptor;
+			this.AccessMode = accessMode;
 			this.Name = mi.Name;
 			this.Name = mi.Name;
 			this.IsStatic = mi.IsStatic;
 			this.IsStatic = mi.IsStatic;
 
 
 			m_Arguments = mi.GetParameters().Select(pi => pi.ParameterType).ToArray();
 			m_Arguments = mi.GetParameters().Select(pi => pi.ParameterType).ToArray();
 			m_Defaults = mi.GetParameters().Select(pi => pi.DefaultValue).ToArray();
 			m_Defaults = mi.GetParameters().Select(pi => pi.DefaultValue).ToArray();
 
 
-			if (userDataDescriptor.AccessMode == UserDataAccessMode.Preoptimized)
+			if (AccessMode == InteropAccessMode.Preoptimized)
 				Optimize();
 				Optimize();
 		}
 		}
 
 
@@ -42,7 +42,7 @@ namespace MoonSharp.Interpreter.Interop
 
 
 		DynValue Callback(Script script, object obj, ScriptExecutionContext context, CallbackArguments args)
 		DynValue Callback(Script script, object obj, ScriptExecutionContext context, CallbackArguments args)
 		{
 		{
-			if (UserDataDescriptor.AccessMode == UserDataAccessMode.LazyOptimized &&
+			if (AccessMode == InteropAccessMode.LazyOptimized &&
 				m_OptimizedFunc == null && m_OptimizedAction == null)
 				m_OptimizedFunc == null && m_OptimizedAction == null)
 				Optimize();
 				Optimize();
 
 
@@ -70,7 +70,7 @@ namespace MoonSharp.Interpreter.Interop
 		{
 		{
 			var ep = Expression.Parameter(typeof(object[]), "pars");
 			var ep = Expression.Parameter(typeof(object[]), "pars");
 			var objinst = Expression.Parameter(typeof(object), "instance");
 			var objinst = Expression.Parameter(typeof(object), "instance");
-			var inst = Expression.Convert(objinst, UserDataDescriptor.Type);
+			var inst = Expression.Convert(objinst, MethodInfo.DeclaringType);
 
 
 			Expression[] args = new Expression[m_Arguments.Length];
 			Expression[] args = new Expression[m_Arguments.Length];
 
 

+ 9 - 9
src/MoonSharp.Interpreter/Interop/UserDataPropertyDescriptor.cs

@@ -11,22 +11,22 @@ namespace MoonSharp.Interpreter.Interop
 	internal class UserDataPropertyDescriptor
 	internal class UserDataPropertyDescriptor
 	{
 	{
 		internal PropertyInfo PropertyInfo { get; private set; }
 		internal PropertyInfo PropertyInfo { get; private set; }
-		internal UserDataDescriptor UserDataDescriptor { get; private set; }
+		internal InteropAccessMode AccessMode { get; private set; }
 		internal bool IsStatic { get; private set; }
 		internal bool IsStatic { get; private set; }
 		internal string Name { get; private set; }
 		internal string Name { get; private set; }
 
 
 		Func<object, object> m_OptimizedGetter = null;
 		Func<object, object> m_OptimizedGetter = null;
 		Action<object, object> m_OptimizedSetter = null;
 		Action<object, object> m_OptimizedSetter = null;
-		
 
 
-		internal UserDataPropertyDescriptor(PropertyInfo pi, UserDataDescriptor userDataDescriptor)
+
+		internal UserDataPropertyDescriptor(PropertyInfo pi, InteropAccessMode accessMode)
 		{
 		{
 			this.PropertyInfo = pi;
 			this.PropertyInfo = pi;
-			this.UserDataDescriptor = userDataDescriptor;
+			this.AccessMode = accessMode;
 			this.Name = pi.Name;
 			this.Name = pi.Name;
 			this.IsStatic = (this.PropertyInfo.GetGetMethod() ?? this.PropertyInfo.GetSetMethod()).IsStatic;
 			this.IsStatic = (this.PropertyInfo.GetGetMethod() ?? this.PropertyInfo.GetSetMethod()).IsStatic;
 
 
-			if (userDataDescriptor.AccessMode == UserDataAccessMode.Preoptimized)
+			if (AccessMode == InteropAccessMode.Preoptimized)
 			{
 			{
 				this.OptimizeGetter();
 				this.OptimizeGetter();
 				this.OptimizeSetter();
 				this.OptimizeSetter();
@@ -36,7 +36,7 @@ namespace MoonSharp.Interpreter.Interop
 
 
 		internal object GetValue(object obj)
 		internal object GetValue(object obj)
 		{
 		{
-			if (UserDataDescriptor.AccessMode == UserDataAccessMode.LazyOptimized && m_OptimizedGetter == null)
+			if (AccessMode == InteropAccessMode.LazyOptimized && m_OptimizedGetter == null)
 				OptimizeGetter();
 				OptimizeGetter();
 
 
 			if (m_OptimizedGetter != null)
 			if (m_OptimizedGetter != null)
@@ -60,7 +60,7 @@ namespace MoonSharp.Interpreter.Interop
 				else
 				else
 				{
 				{
 					var paramExp = Expression.Parameter(typeof(object), "obj");
 					var paramExp = Expression.Parameter(typeof(object), "obj");
-					var castParamExp = Expression.Convert(paramExp, this.UserDataDescriptor.Type);
+					var castParamExp = Expression.Convert(paramExp, this.PropertyInfo.DeclaringType);
 					var propAccess = Expression.Property(castParamExp, PropertyInfo);
 					var propAccess = Expression.Property(castParamExp, PropertyInfo);
 					var castPropAccess = Expression.Convert(propAccess, typeof(object));
 					var castPropAccess = Expression.Convert(propAccess, typeof(object));
 					var lambda = Expression.Lambda<Func<object, object>>(castPropAccess, paramExp);
 					var lambda = Expression.Lambda<Func<object, object>>(castPropAccess, paramExp);
@@ -88,7 +88,7 @@ namespace MoonSharp.Interpreter.Interop
 				{
 				{
 					var paramExp = Expression.Parameter(typeof(object), "obj");
 					var paramExp = Expression.Parameter(typeof(object), "obj");
 					var paramValExp = Expression.Parameter(typeof(object), "val");
 					var paramValExp = Expression.Parameter(typeof(object), "val");
-					var castParamExp = Expression.Convert(paramExp, this.UserDataDescriptor.Type);
+					var castParamExp = Expression.Convert(paramExp, this.PropertyInfo.DeclaringType);
 					var castParamValExp = Expression.Convert(paramValExp, this.PropertyInfo.PropertyType);
 					var castParamValExp = Expression.Convert(paramValExp, this.PropertyInfo.PropertyType);
 					var callExpression = Expression.Call(castParamExp, setterMethod, castParamValExp);
 					var callExpression = Expression.Call(castParamExp, setterMethod, castParamValExp);
 					var lambda = Expression.Lambda<Action<object, object>>(callExpression, paramExp, paramValExp);
 					var lambda = Expression.Lambda<Action<object, object>>(callExpression, paramExp, paramValExp);
@@ -104,7 +104,7 @@ namespace MoonSharp.Interpreter.Interop
 				if (value is double)
 				if (value is double)
 					value = ConversionHelper.DoubleToType(PropertyInfo.PropertyType, (double)value);
 					value = ConversionHelper.DoubleToType(PropertyInfo.PropertyType, (double)value);
 
 
-				if (UserDataDescriptor.AccessMode == UserDataAccessMode.LazyOptimized && m_OptimizedSetter == null)
+				if (AccessMode == InteropAccessMode.LazyOptimized && m_OptimizedSetter == null)
 					OptimizeSetter();
 					OptimizeSetter();
 
 
 				if (m_OptimizedSetter != null)
 				if (m_OptimizedSetter != null)

+ 2 - 1
src/MoonSharp.Interpreter/MoonSharp.Interpreter.csproj

@@ -138,8 +138,9 @@
     <Compile Include="Interop\EnumerableWrapper.cs" />
     <Compile Include="Interop\EnumerableWrapper.cs" />
     <Compile Include="Interop\MoonSharpUserDataAttribute.cs" />
     <Compile Include="Interop\MoonSharpUserDataAttribute.cs" />
     <Compile Include="Interop\MoonSharpVisibleAttribute.cs" />
     <Compile Include="Interop\MoonSharpVisibleAttribute.cs" />
+    <Compile Include="Interop\UserDataDelegateDescriptor.cs" />
     <Compile Include="Interop\UserDataDescriptor.cs" />
     <Compile Include="Interop\UserDataDescriptor.cs" />
-    <Compile Include="DataTypes\UserDataAccessMode.cs" />
+    <Compile Include="DataTypes\InteropAccessMode.cs" />
     <Compile Include="Interop\UserDataMethodDescriptor.cs" />
     <Compile Include="Interop\UserDataMethodDescriptor.cs" />
     <Compile Include="Interop\UserDataPropertyDescriptor.cs">
     <Compile Include="Interop\UserDataPropertyDescriptor.cs">
       <SubType>Code</SubType>
       <SubType>Code</SubType>

+ 17 - 14
src/PerformanceComparison/Program.cs

@@ -18,14 +18,14 @@ namespace PerformanceComparison
 #if PROFILER
 #if PROFILER
 		const int ITERATIONS = 10;
 		const int ITERATIONS = 10;
 #else
 #else
-		const int ITERATIONS = 100;
+		const int ITERATIONS = 1;
 #endif
 #endif
 
 
-		static  string scriptText2 = @"
+		static  string scriptText = @"
 			function move(n, src, dst, via)
 			function move(n, src, dst, via)
 				if n > 0 then
 				if n > 0 then
 					move(n - 1, src, via, dst)
 					move(n - 1, src, via, dst)
-					--print(src, 'to', dst)
+					print(src, 'to', dst)
 					move(n - 1, via, dst, src)
 					move(n - 1, via, dst, src)
 				end
 				end
 			end
 			end
@@ -34,7 +34,7 @@ namespace PerformanceComparison
 				move(4, 1, 2, 3)
 				move(4, 1, 2, 3)
 			end
 			end
 			";
 			";
-		static  string scriptText = @"
+		static  string scriptText22 = @"
 N = 8
 N = 8
  
  
 board = {}
 board = {}
@@ -97,15 +97,6 @@ end
 			return DynValue.Nil;
 			return DynValue.Nil;
 		}
 		}
 
 
-		private static void Example()
-		{
-			Script script = new Script();
-			Table t = script.Globals;
-			t.Set("print", DynValue.NewCallback(Print));
-
-
-			DynValue retVal = script.DoFile("test.lua");
-		}
 
 
 		public static void NPrint(params object[] values)
 		public static void NPrint(params object[] values)
 		{
 		{
@@ -116,6 +107,14 @@ end
 			g_NLuaStr.AppendLine();
 			g_NLuaStr.AppendLine();
 		}
 		}
 
 
+		public static void PrintX(int from, string mid, int to)
+		{
+			g_MoonSharpStr.Append(from);
+			g_MoonSharpStr.Append(mid);
+			g_MoonSharpStr.Append(to);
+			g_MoonSharpStr.AppendLine();
+		}
+
 		static Lua lua = new Lua();
 		static Lua lua = new Lua();
 		static string testString = "world";
 		static string testString = "world";
 
 
@@ -136,6 +135,10 @@ end
 
 
 			var script = new Script();
 			var script = new Script();
 			script.Globals.Set("print", DynValue.NewCallback(new CallbackFunction(Print)));
 			script.Globals.Set("print", DynValue.NewCallback(new CallbackFunction(Print)));
+			CallbackFunction.DefaultAccessMode = InteropAccessMode.Preoptimized;
+
+			//script.Globals["print"] = (Action<int, string, int>)PrintX;
+
 
 
 			DynValue func = script.LoadString(scriptText);
 			DynValue func = script.LoadString(scriptText);
 
 
@@ -165,7 +168,7 @@ end
 			sw = Stopwatch.StartNew();
 			sw = Stopwatch.StartNew();
 			for (int i = 0; i < ITERATIONS; i++)
 			for (int i = 0; i < ITERATIONS; i++)
 			{
 			{
-				fn.Call();
+				//fn.Call();
 			}
 			}
 			sw.Stop();
 			sw.Stop();
 
 

+ 1 - 0
src/moonsharp.sln

@@ -56,6 +56,7 @@ Global
 		{4AD350E6-E296-43EF-9FEA-CB70358467E4}.Release|x86.ActiveCfg = Release|x86
 		{4AD350E6-E296-43EF-9FEA-CB70358467E4}.Release|x86.ActiveCfg = Release|x86
 		{4AD350E6-E296-43EF-9FEA-CB70358467E4}.Release|x86.Build.0 = Release|x86
 		{4AD350E6-E296-43EF-9FEA-CB70358467E4}.Release|x86.Build.0 = Release|x86
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|x86.ActiveCfg = Debug|x86
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|x86.ActiveCfg = Debug|x86
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|x86.Build.0 = Debug|x86
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Debug|x86.Build.0 = Debug|x86
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{01C3C379-C816-4779-942D-0263763F8EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU