Răsfoiți Sursa

Better Method interop. Fixed nasty bug in nested functions.

Xanathar 11 ani în urmă
părinte
comite
1519e20e4e

+ 1 - 1
src/MoonSharp.Debugger/MainForm.cs

@@ -66,7 +66,7 @@ namespace MoonSharp.Debugger
 
 		private void DebugScript(string filename)
 		{
-			m_Script = new Script(CoreModules.Preset_Complete);
+			m_Script = new Script(CoreModules.Basic);
 			m_Script.Options.UseLuaErrorLocations = true;
 			m_Script.Options.DebugPrint = s => { Console_WriteLine("{0}", s); };
 

+ 9 - 10
src/MoonSharp.Interpreter/DataTypes/CallbackFunction.cs

@@ -71,32 +71,31 @@ namespace MoonSharp.Interpreter
 			if (accessMode == InteropAccessMode.Default)
 				accessMode = m_DefaultAccessMode;
 
-			UserDataMethodDescriptor descr = new UserDataMethodDescriptor(del.Method, accessMode);
-			return new CallbackFunction(descr.GetCallback(script, del.Target));
+			StandardUserDataMethodDescriptor descr = new StandardUserDataMethodDescriptor(del.Method, accessMode);
+			return descr.GetCallbackFunction(script, del.Target);
 		}
 
 
 		/// <summary>
-		/// Creates a CallbackFunction from a MethodInfo relative to a static function.
+		/// Creates a CallbackFunction from a MethodInfo relative to a function.
 		/// </summary>
 		/// <param name="script">The script.</param>
 		/// <param name="mi">The MethodInfo object.</param>
+		/// <param name="obj">The object to which the function applies, or null for static methods.</param>
 		/// <param name="accessMode">The access mode.</param>
 		/// <returns></returns>
 		/// <exception cref="System.ArgumentException">The method is not static.</exception>
-		public static CallbackFunction FromMethodInfo(Script script, System.Reflection.MethodInfo mi, InteropAccessMode accessMode = InteropAccessMode.Default)
+		public static CallbackFunction FromMethodInfo(Script script, System.Reflection.MethodInfo mi, object obj = null, InteropAccessMode accessMode = InteropAccessMode.Default)
 		{
-			if (!mi.IsStatic)
-				throw new ArgumentException("MethodInfo");
-
-
 			if (accessMode == InteropAccessMode.Default)
 				accessMode = m_DefaultAccessMode;
 
-			UserDataMethodDescriptor descr = new UserDataMethodDescriptor(mi, accessMode);
-			return new CallbackFunction(descr.GetCallback(script, null), mi.Name);
+			StandardUserDataMethodDescriptor descr = new StandardUserDataMethodDescriptor(mi, accessMode);
+			return descr.GetCallbackFunction(script, obj);
 		}
 
+
+
 		/// <summary>
 		/// Gets or sets an object used as additional data to the callback function (available in the execution context).
 		/// </summary>

+ 10 - 7
src/MoonSharp.Interpreter/Interop/StandardDescriptors/UserDataDescriptor.cs → src/MoonSharp.Interpreter/Interop/StandardDescriptors/StandardUserDataDescriptor.cs

@@ -15,11 +15,14 @@ namespace MoonSharp.Interpreter.Interop
 		public InteropAccessMode AccessMode { get; private set; }
 		public string FriendlyName { get; private set; }
 
-		private Dictionary<string, UserDataMethodDescriptor> m_Methods = new Dictionary<string, UserDataMethodDescriptor>();
-		private Dictionary<string, UserDataPropertyDescriptor> m_Properties = new Dictionary<string, UserDataPropertyDescriptor>();
+		private Dictionary<string, StandardUserDataMethodDescriptor> m_Methods = new Dictionary<string, StandardUserDataMethodDescriptor>();
+		private Dictionary<string, StandardUserDataPropertyDescriptor> m_Properties = new Dictionary<string, StandardUserDataPropertyDescriptor>();
 
 		protected internal StandardUserDataDescriptor(Type type, InteropAccessMode accessMode, string friendlyName)
 		{
+			if (accessMode == InteropAccessMode.Default)
+				accessMode = UserData.DefaultAccessMode;
+
 			Type = type;
 			Name = type.FullName;
 			AccessMode = accessMode;
@@ -34,7 +37,7 @@ namespace MoonSharp.Interpreter.Interop
 						if (mi.IsSpecialName)
 							continue;
 
-						var md = new UserDataMethodDescriptor(mi, this.AccessMode);
+						var md = new StandardUserDataMethodDescriptor(mi, this.AccessMode);
 
 						if (m_Methods.ContainsKey(md.Name))
 							continue;
@@ -48,7 +51,7 @@ namespace MoonSharp.Interpreter.Interop
 				{
 					if (CheckVisibility(pi.GetCustomAttributes(true), IsPropertyInfoPublic(pi)))
 					{
-						var pd = new UserDataPropertyDescriptor(pi, this.AccessMode);
+						var pd = new StandardUserDataPropertyDescriptor(pi, this.AccessMode);
 						m_Properties.Add(pd.Name, pd);
 					}
 				}
@@ -89,12 +92,12 @@ namespace MoonSharp.Interpreter.Interop
 
 		protected virtual DynValue TryIndex(Script script, object obj, string indexName)
 		{
-			UserDataMethodDescriptor mdesc;
+			StandardUserDataMethodDescriptor mdesc;
 
 			if (m_Methods.TryGetValue(indexName, out mdesc))
 				return DynValue.NewCallback(mdesc.GetCallback(script, obj));
 
-			UserDataPropertyDescriptor pdesc;
+			StandardUserDataPropertyDescriptor pdesc;
 
 			if (m_Properties.TryGetValue(indexName, out pdesc))
 			{
@@ -120,7 +123,7 @@ namespace MoonSharp.Interpreter.Interop
 
 		protected virtual bool TrySetIndex(Script script, object obj, string indexName, DynValue value)
 		{
-			UserDataPropertyDescriptor pdesc;
+			StandardUserDataPropertyDescriptor pdesc;
 
 			if (m_Properties.TryGetValue(indexName, out pdesc))
 			{

+ 29 - 7
src/MoonSharp.Interpreter/Interop/StandardDescriptors/UserDataMethodDescriptor.cs → src/MoonSharp.Interpreter/Interop/StandardDescriptors/StandardUserDataMethodDescriptor.cs

@@ -10,12 +10,12 @@ using MoonSharp.Interpreter.Execution;
 
 namespace MoonSharp.Interpreter.Interop
 {
-	internal class UserDataMethodDescriptor
+	public class StandardUserDataMethodDescriptor
 	{
-		internal MethodInfo MethodInfo { get; private set; }
-		internal InteropAccessMode AccessMode { get; private set; }
-		internal bool IsStatic { get; private set; }
-		internal string Name { get; private set; }
+		public MethodInfo MethodInfo { get; private set; }
+		public InteropAccessMode AccessMode { get; private set; }
+		public bool IsStatic { get; private set; }
+		public string Name { get; private set; }
 
 		private Type[] m_Arguments;
 		private object[] m_Defaults;
@@ -23,8 +23,14 @@ namespace MoonSharp.Interpreter.Interop
 		private Action<object, object[]> m_OptimizedAction = null;
 		private bool m_IsAction = false;
 
-		internal UserDataMethodDescriptor(MethodInfo mi, InteropAccessMode accessMode)
+		public StandardUserDataMethodDescriptor(MethodInfo mi, InteropAccessMode accessMode = InteropAccessMode.Default)
 		{
+			if (accessMode == InteropAccessMode.Default)
+				accessMode = UserData.DefaultAccessMode;
+
+			if (accessMode == InteropAccessMode.HideMembers)
+				throw new ArgumentException("Invalid accessMode");
+
 			this.MethodInfo = mi;
 			this.AccessMode = accessMode;
 			this.Name = mi.Name;
@@ -39,11 +45,27 @@ namespace MoonSharp.Interpreter.Interop
 				Optimize();
 		}
 
-		internal Func<ScriptExecutionContext, CallbackArguments, DynValue> GetCallback(Script script, object obj)
+		public Func<ScriptExecutionContext, CallbackArguments, DynValue> GetCallback(Script script, object obj = null)
 		{
 			return (c, a) => Callback(script, obj, c, a);
 		}
 
+		public CallbackFunction GetCallbackFunction(Script script, object obj = null)
+		{
+			return new CallbackFunction(GetCallback(script, obj), this.MethodInfo.Name);
+		}
+
+		public DynValue GetCallbackAsDynValue(Script script, object obj = null)
+		{
+			return DynValue.NewCallback(this.GetCallbackFunction(script, obj));
+		}
+
+		public static DynValue CreateCallbackDynValue(Script script, MethodInfo mi, object obj = null)
+		{
+			var desc = new StandardUserDataMethodDescriptor(mi);
+			return desc.GetCallbackAsDynValue(script, obj);
+		}
+
 		DynValue Callback(Script script, object obj, ScriptExecutionContext context, CallbackArguments args)
 		{
 			if (AccessMode == InteropAccessMode.LazyOptimized &&

+ 2 - 2
src/MoonSharp.Interpreter/Interop/StandardDescriptors/UserDataPropertyDescriptor.cs → src/MoonSharp.Interpreter/Interop/StandardDescriptors/StandardUserDataPropertyDescriptor.cs

@@ -9,7 +9,7 @@ using MoonSharp.Interpreter.Diagnostics;
 
 namespace MoonSharp.Interpreter.Interop
 {
-	internal class UserDataPropertyDescriptor
+	internal class StandardUserDataPropertyDescriptor
 	{
 		internal PropertyInfo PropertyInfo { get; private set; }
 		internal InteropAccessMode AccessMode { get; private set; }
@@ -20,7 +20,7 @@ namespace MoonSharp.Interpreter.Interop
 		Action<object, object> m_OptimizedSetter = null;
 
 
-		internal UserDataPropertyDescriptor(PropertyInfo pi, InteropAccessMode accessMode)
+		internal StandardUserDataPropertyDescriptor(PropertyInfo pi, InteropAccessMode accessMode)
 		{
 			this.PropertyInfo = pi;
 			this.AccessMode = accessMode;

+ 3 - 3
src/MoonSharp.Interpreter/MoonSharp.Interpreter.csproj

@@ -179,10 +179,10 @@
     <Compile Include="Interop\StandardDescriptors\CompositeUserDataDescriptor.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Interop\StandardDescriptors\UserDataDescriptor.cs" />
+    <Compile Include="Interop\StandardDescriptors\StandardUserDataDescriptor.cs" />
     <Compile Include="Interop\InteropAccessMode.cs" />
-    <Compile Include="Interop\StandardDescriptors\UserDataMethodDescriptor.cs" />
-    <Compile Include="Interop\StandardDescriptors\UserDataPropertyDescriptor.cs">
+    <Compile Include="Interop\StandardDescriptors\StandardUserDataMethodDescriptor.cs" />
+    <Compile Include="Interop\StandardDescriptors\StandardUserDataPropertyDescriptor.cs">
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="Loaders\ClassicLuaScriptLoader.cs" />

+ 1 - 2
src/MoonSharp.Interpreter/Tree/Expressions/FunctionDefinitionExpression.cs

@@ -149,8 +149,7 @@ namespace MoonSharp.Interpreter.Tree.Expressions
 			bc.PopSourceRef();
 			bc.PushSourceRef(m_End);
 
-			if (bc.GetLastInstruction().OpCode != OpCode.Ret)
-				bc.Emit_Ret(0);
+			bc.Emit_Ret(0);
 
 			bc.LoopTracker.Loops.Pop();