Selaa lähdekoodia

Backround compilation for user data

Xanathar 11 vuotta sitten
vanhempi
sitoutus
336c6034a7

+ 5 - 0
src/MoonSharp.Interpreter/DataTypes/UserData.cs

@@ -103,6 +103,11 @@ namespace MoonSharp.Interpreter
 				{
 					UserDataDescriptor udd = new UserDataDescriptor(type, accessMode);
 					s_Registry.Add(udd.Type, udd);
+
+					if (accessMode == UserDataAccessMode.BackgroundOptimized)
+					{
+						ThreadPool.QueueUserWorkItem(o => udd.Optimize());
+					}
 				}
 			}
 			finally

+ 13 - 0
src/MoonSharp.Interpreter/Interop/UserDataDescriptor.cs

@@ -92,5 +92,18 @@ namespace MoonSharp.Interpreter.Interop
 				throw ScriptRuntimeException.UserDataMissingField(this.Name, idxname);
 			}
 		}
+
+		internal void Optimize()
+		{
+			foreach (var m in this.m_Methods.Values)
+				m.Optimize();
+			
+			foreach (var m in this.m_Properties.Values)
+			{
+				m.OptimizeGetter();
+				m.OptimizeSetter();
+			}
+
+		}
 	}
 }

+ 4 - 3
src/MoonSharp.Interpreter/Interop/UserDataMethodDescriptor.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
 using System.Text;
+using System.Threading;
 using MoonSharp.Interpreter.Execution;
 
 namespace MoonSharp.Interpreter.Interop
@@ -65,7 +66,7 @@ namespace MoonSharp.Interpreter.Interop
 			return ConversionHelper.ClrObjectToComplexMoonSharpValue(script, retv);
 		}
 
-		private void Optimize()
+		internal void Optimize()
 		{
 			var ep = Expression.Parameter(typeof(object[]), "pars");
 			var objinst = Expression.Parameter(typeof(object), "instance");
@@ -94,13 +95,13 @@ namespace MoonSharp.Interpreter.Interop
 			if (MethodInfo.ReturnType == typeof(void))
 			{
 				var lambda = Expression.Lambda<Action<object, object[]>>(fn, objinst, ep);
-				m_OptimizedAction = lambda.Compile();
+				Interlocked.Exchange(ref m_OptimizedAction, lambda.Compile());
 			}
 			else
 			{
 				var fnc = Expression.Convert(fn, typeof(object));
 				var lambda = Expression.Lambda<Func<object, object[], object>>(fnc, objinst, ep);
-				m_OptimizedFunc = lambda.Compile();
+				Interlocked.Exchange(ref m_OptimizedFunc, lambda.Compile());
 			}
 		}
 	}

+ 7 - 6
src/MoonSharp.Interpreter/Interop/UserDataPropertyDescriptor.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
 using System.Text;
+using System.Threading;
 
 namespace MoonSharp.Interpreter.Interop
 {
@@ -44,7 +45,7 @@ namespace MoonSharp.Interpreter.Interop
 			return PropertyInfo.GetValue(IsStatic ? null : obj, null);
 		}
 
-		private void OptimizeGetter()
+		internal void OptimizeGetter()
 		{
 			if (PropertyInfo.CanRead)
 			{
@@ -54,7 +55,7 @@ namespace MoonSharp.Interpreter.Interop
 					var propAccess = Expression.Property(null, PropertyInfo);
 					var castPropAccess = Expression.Convert(propAccess, typeof(object));
 					var lambda = Expression.Lambda<Func<object, object>>(castPropAccess, paramExp);
-					m_OptimizedGetter = lambda.Compile();
+					Interlocked.Exchange(ref m_OptimizedGetter, lambda.Compile());
 				}
 				else
 				{
@@ -63,12 +64,12 @@ namespace MoonSharp.Interpreter.Interop
 					var propAccess = Expression.Property(castParamExp, PropertyInfo);
 					var castPropAccess = Expression.Convert(propAccess, typeof(object));
 					var lambda = Expression.Lambda<Func<object, object>>(castPropAccess, paramExp);
-					m_OptimizedGetter = lambda.Compile();
+					Interlocked.Exchange(ref m_OptimizedGetter, lambda.Compile());
 				}
 			}
 		}
 
-		private void OptimizeSetter()
+		internal void OptimizeSetter()
 		{
 			if (PropertyInfo.CanWrite)
 			{
@@ -81,7 +82,7 @@ namespace MoonSharp.Interpreter.Interop
 					var castParamValExp = Expression.Convert(paramValExp, this.PropertyInfo.PropertyType);
 					var callExpression = Expression.Call(setterMethod, castParamValExp);
 					var lambda = Expression.Lambda<Action<object, object>>(callExpression, paramExp, paramValExp);
-					m_OptimizedSetter = lambda.Compile();
+					Interlocked.Exchange(ref m_OptimizedSetter, lambda.Compile());
 				}
 				else
 				{
@@ -91,7 +92,7 @@ namespace MoonSharp.Interpreter.Interop
 					var castParamValExp = Expression.Convert(paramValExp, this.PropertyInfo.PropertyType);
 					var callExpression = Expression.Call(castParamExp, setterMethod, castParamValExp);
 					var lambda = Expression.Lambda<Action<object, object>>(callExpression, paramExp, paramValExp);
-					m_OptimizedSetter = lambda.Compile();
+					Interlocked.Exchange(ref m_OptimizedSetter, lambda.Compile());
 				}
 			}
 		}