/// <summary> /// Tries to create a new StandardUserDataFieldDescriptor, returning <c>null</c> in case the field is not /// visible to script code. /// </summary> /// <param name="fi">The FieldInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <returns>A new StandardUserDataFieldDescriptor or null.</returns> public static FieldMemberDescriptor TryCreateIfVisible(FieldInfo fi, InteropAccessMode accessMode) { if (fi.GetVisibilityFromAttributes() ?? fi.IsPublic) return new FieldMemberDescriptor(fi, accessMode); return null; }
/// <summary> /// Initializes a new instance of the <see cref="PropertyMemberDescriptor"/> class. /// </summary> /// <param name="fi">The FieldInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /> </param> public FieldMemberDescriptor(FieldInfo fi, InteropAccessMode accessMode) { if (Script.GlobalOptions.Platform.IsRunningOnAOT()) accessMode = InteropAccessMode.Reflection; this.FieldInfo = fi; this.AccessMode = accessMode; this.Name = fi.Name; this.IsStatic = this.FieldInfo.IsStatic; if (this.FieldInfo.IsLiteral) { IsConst = true; m_ConstValue = FieldInfo.GetValue(null); } else { IsReadonly = this.FieldInfo.IsInitOnly; } if (AccessMode == InteropAccessMode.Preoptimized) { this.OptimizeGetter(); } }
public void Test_NIntFieldGetter(InteropAccessMode opt) { string script = @" x = myobj1.NIntProp; y = myobj2.NIntProp; return x,y;" ; Script S = new Script(); SomeClass obj1 = new SomeClass() { NIntProp = 321 }; SomeClass obj2 = new SomeClass() { NIntProp = null }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Tuple, res.Type); Assert.AreEqual(321.0, res.Tuple[0].Number); Assert.AreEqual(DataType.Number, res.Tuple[0].Type); Assert.AreEqual(DataType.Nil, res.Tuple[1].Type); }
public void Test_ConstIntFieldSetter(InteropAccessMode opt) { try { string script = @" myobj.ConstIntProp = 1; return myobj.ConstIntProp;"; Script S = new Script(); SomeClass obj = new SomeClass() { IntProp = 321 }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(115, res.Number); } catch (ScriptRuntimeException) { return; } Assert.Fail(); }
public void Test_ObjFieldGetter(InteropAccessMode opt) { string script = @" x = myobj1.ObjProp; y = myobj2.ObjProp; z = myobj2.ObjProp.ObjProp; return x,y,z;" ; Script S = new Script(); SomeClass obj1 = new SomeClass() { ObjProp = "ciao" }; SomeClass obj2 = new SomeClass() { ObjProp = obj1 }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Tuple, res.Type); Assert.AreEqual(DataType.String, res.Tuple[0].Type); Assert.AreEqual("ciao", res.Tuple[0].String); Assert.AreEqual(DataType.String, res.Tuple[2].Type); Assert.AreEqual("ciao", res.Tuple[2].String); Assert.AreEqual(DataType.UserData, res.Tuple[1].Type); Assert.AreEqual(obj1, res.Tuple[1].UserData.Object); }
public void Test_NIntFieldSetter(InteropAccessMode opt) { string script = @" myobj1.NIntProp = nil; myobj2.NIntProp = 19;" ; Script S = new Script(); SomeClass obj1 = new SomeClass() { NIntProp = 321 }; SomeClass obj2 = new SomeClass() { NIntProp = null }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); Assert.AreEqual(321, obj1.NIntProp); Assert.AreEqual(null, obj2.NIntProp); DynValue res = S.DoString(script); Assert.AreEqual(null, obj1.NIntProp); Assert.AreEqual(19, obj2.NIntProp); }
public void Test_ObjFieldSetter(InteropAccessMode opt) { string script = @" myobj1.ObjProp = myobj2; myobj2.ObjProp = 'hello';" ; Script S = new Script(); SomeClass obj1 = new SomeClass() { ObjProp = "ciao" }; SomeClass obj2 = new SomeClass() { ObjProp = obj1 }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); Assert.AreEqual("ciao", obj1.ObjProp); Assert.AreEqual(obj1, obj2.ObjProp); DynValue res = S.DoString(script); Assert.AreEqual(obj2, obj1.ObjProp); Assert.AreEqual("hello", obj2.ObjProp); }
public void Test_RefOutParams(InteropAccessMode opt) { UserData.UnregisterType <SomeClass>(); string script = @" x, y, z = myobj:manipulateString('CiAo', 'hello'); return x, y, z;" ; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("static", UserData.CreateStatic <SomeClass>()); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Tuple, res.Type); Assert.AreEqual(3, res.Tuple.Length); Assert.AreEqual(DataType.String, res.Tuple[0].Type); Assert.AreEqual(DataType.String, res.Tuple[1].Type); Assert.AreEqual(DataType.String, res.Tuple[2].Type); Assert.AreEqual("CIAO", res.Tuple[0].String); Assert.AreEqual("CiAohello", res.Tuple[1].String); Assert.AreEqual("ciao", res.Tuple[2].String); }
public void Test_ConcatMethodStaticComplex(InteropAccessMode opt) { UserData.UnregisterType <SomeClass>(); string script = @" strlist = { 'ciao', 'hello', 'aloha' }; intlist = { 42, 77, 125, 13 }; dictry = { ciao = 39, hello = 78, aloha = 128 }; x = static.SetComplexTypes(strlist, intlist, dictry, strlist, intlist); return x;" ; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("static", UserData.CreateStatic <SomeClass>()); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.String, res.Type); Assert.AreEqual("ciao,hello,aloha|42,77,125,13|aloha,ciao,hello|39,78,128|ciao,hello,aloha|42,77,125,13", res.String); }
/// <summary> /// Initializes a new instance of the <see cref="PropertyMemberDescriptor" /> class. /// </summary> /// <param name="pi">The PropertyInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <param name="getter">The getter method. Use null to make the property writeonly.</param> /// <param name="setter">The setter method. Use null to make the property readonly.</param> public PropertyMemberDescriptor(PropertyInfo pi, InteropAccessMode accessMode, MethodInfo getter, MethodInfo setter) { if (getter == null && setter == null) { throw new ArgumentNullException("getter and setter cannot both be null"); } if (Script.GlobalOptions.Platform.IsRunningOnAOT()) { accessMode = InteropAccessMode.Reflection; } this.PropertyInfo = pi; this.AccessMode = accessMode; this.Name = pi.Name; m_Getter = getter; m_Setter = setter; this.IsStatic = (m_Getter ?? m_Setter).IsStatic; if (AccessMode == InteropAccessMode.Preoptimized) { this.OptimizeGetter(); this.OptimizeSetter(); } }
private static PropertyMemberDescriptor TryCreate(PropertyInfo pi, InteropAccessMode accessMode, MethodInfo getter, MethodInfo setter) { if (getter == null && setter == null) return null; else return new PropertyMemberDescriptor(pi, accessMode, getter, setter); }
public void Test_PropertyAccessOverrides(InteropAccessMode opt) { SomeClass obj = new SomeClass(); try { string script = @" myobj.AccessOverrProp = 19; return myobj.AccessOverrProp; " ; Script S = new Script(); obj.AccessOverrProp = 13; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); } catch (ScriptRuntimeException) { // Assert.AreEqual(19, obj.AccessOverrProp); // can't do on value type return; } Assert.Fail(); }
static UserData() { RegisterType <StandardUserDataEventDescriptor.EventFacade>(InteropAccessMode.Reflection); RegisterType <AnonWrapper>(InteropAccessMode.HideMembers); RegisterType <EnumerableWrapper>(InteropAccessMode.HideMembers); s_DefaultAccessMode = InteropAccessMode.LazyOptimized; }
public void Test_NIntPropertyGetter(InteropAccessMode opt) { string script = @" x = myobj1.NIntProp; y = myobj2.NIntProp; return x,y;"; Script S = new Script(); SomeClass obj1 = new SomeClass() { NIntProp = 321 }; SomeClass obj2 = new SomeClass() { NIntProp = null }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Tuple, res.Type); Assert.AreEqual(321.0, res.Tuple[0].Number); Assert.AreEqual(DataType.Number, res.Tuple[0].Type); Assert.AreEqual(DataType.Nil, res.Tuple[1].Type); }
public void Test_RoIntProperty2Setter(InteropAccessMode opt) { try { string script = @" myobj.RoIntProp2 = 19; return myobj.RoIntProp2; " ; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); } catch (ScriptRuntimeException) { return; } Assert.Fail(); }
/// <summary> /// Registers an extension Type (that is a type containing extension methods) /// </summary> /// <param name="type">The type.</param> /// <param name="mode">The InteropAccessMode.</param> public static void RegisterExtensionType(Type type, InteropAccessMode mode = InteropAccessMode.Default) { lock (s_Lock) { bool changesDone = false; foreach (MethodInfo mi in type.GetMethods().Where(_mi => _mi.IsStatic)) { if (mi.GetCustomAttributes(typeof(ExtensionAttribute), false).Length == 0) continue; if (mi.ContainsGenericParameters) { s_UnresolvedGenericsRegistry.Add(mi.Name, new UnresolvedGenericMethod(mi, mode)); changesDone = true; continue; } if (!MethodMemberDescriptor.CheckMethodIsCompatible(mi, false)) continue; var desc = new MethodMemberDescriptor(mi, mode); s_Registry.Add(mi.Name, desc); changesDone = true; } if (changesDone) ++s_ExtensionMethodChangeVersion; } }
public void Test_IntFieldSetter(InteropAccessMode opt) { string script = @" myobj.IntProp = 19; return myobj.IntProp; " ; Script S = new Script(); SomeClass obj = new SomeClass() { IntProp = 321 }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); Assert.AreEqual(321, obj.IntProp); DynValue res = S.DoString(script); Assert.AreEqual(19, res.Number); // right! because value types do not change.. Assert.AreEqual(321, obj.IntProp); }
public void Test_ListMethod(InteropAccessMode opt) { UserData.UnregisterType <SomeClass>(); string script = @" x = mklist(1, 4); sum = 0; for _, v in ipairs(x) do sum = sum + v; end return sum;" ; Script S = new Script(); SomeClass obj = new SomeClass(); S.Globals["mklist"] = CallbackFunction.FromDelegate(S, (Func <int, int, List <int> >)obj.MkList, opt); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(10, res.Number); }
/// <summary> /// Initializes a new instance of the <see cref="PropertyMemberDescriptor"/> class. /// </summary> /// <param name="fi">The FieldInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /> </param> public FieldMemberDescriptor(FieldInfo fi, InteropAccessMode accessMode) { if (Script.GlobalOptions.Platform.IsRunningOnAOT()) { accessMode = InteropAccessMode.Reflection; } this.FieldInfo = fi; this.AccessMode = accessMode; this.Name = fi.Name; this.IsStatic = this.FieldInfo.IsStatic; if (this.FieldInfo.IsLiteral) { IsConst = true; m_ConstValue = FieldInfo.GetValue(null); } else { IsReadonly = this.FieldInfo.IsInitOnly; } if (AccessMode == InteropAccessMode.Preoptimized) { this.OptimizeGetter(); } }
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; this.IsStatic = mi.IsStatic; m_IsAction = mi.ReturnType == typeof(void); m_Arguments = mi.GetParameters().Select(pi => pi.ParameterType).ToArray(); m_Defaults = mi.GetParameters().Select(pi => pi.DefaultValue).ToArray(); if (AccessMode == InteropAccessMode.Preoptimized) { Optimize(); } }
public void Test_ConstIntFieldSetter(InteropAccessMode opt) { try { string script = @" myobj.ConstIntProp = 1; return myobj.ConstIntProp;" ; Script S = new Script(); SomeClass obj = new SomeClass() { IntProp = 321 }; UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(115, res.Number); } catch (ScriptRuntimeException) { return; } Assert.Fail(); }
public void Test_ConcatMethodStaticComplexRec(InteropAccessMode opt) { UserData.UnregisterType <SomeClass>(); string script = @" array = { { 1, 2, 3 }, { 11, 35, 77 }, { 16, 42, 64 }, {99, 76, 17 } }; x = static.SetComplexRecursive(array); return x;" ; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); S.Globals.Set("static", UserData.CreateStatic <SomeClass>()); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.String, res.Type); Assert.AreEqual("1,2,3|11,35,77|16,42,64|99,76,17|", res.String); }
/// <summary> /// Initializes a new instance of the <see cref="EventMemberDescriptor" /> class. /// </summary> /// <param name="ei">The ei.</param> /// <param name="accessMode">The access mode.</param> public EventMemberDescriptor(EventInfo ei, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckEventIsCompatible(ei, true); EventInfo = ei; m_Add = ei.GetAddMethod(true); m_Remove = ei.GetRemoveMethod(true); IsStatic = m_Add.IsStatic; }
/// <summary> /// Creates a CallbackFunction from a delegate. /// </summary> /// <param name="script">The script.</param> /// <param name="del">The delegate.</param> /// <param name="accessMode">The access mode.</param> /// <returns></returns> public static CallbackFunction FromDelegate(Script script, Delegate del, InteropAccessMode accessMode = InteropAccessMode.Default) { if (accessMode == InteropAccessMode.Default) accessMode = m_DefaultAccessMode; MethodMemberDescriptor descr = new MethodMemberDescriptor(del.Method, accessMode); return descr.GetCallbackFunction(script, del.Target); }
/// <summary> /// Initializes a new instance of the <see cref="EventMemberDescriptor"/> class. /// </summary> /// <param name="ei">The ei.</param> /// <param name="accessMode">The access mode.</param> public EventMemberDescriptor(EventInfo ei, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckEventIsCompatible(ei, true); this.EventInfo = ei; m_Add = Framework.Do.GetAddMethod(ei); m_Remove = Framework.Do.GetRemoveMethod(ei); this.IsStatic = m_Add.IsStatic; }
/// <summary> /// Initializes a new instance of the <see cref="EventMemberDescriptor"/> class. /// </summary> /// <param name="ei">The ei.</param> /// <param name="accessMode">The access mode.</param> public EventMemberDescriptor(EventInfo ei, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckEventIsCompatible(ei, true); EventInfo = ei; m_Add = ei.GetAddMethod(true); m_Remove = ei.GetRemoveMethod(true); IsStatic = m_Add.IsStatic; }
/// <summary> /// Initializes a new instance of the <see cref="StandardUserDataDescriptor"/> class. /// </summary> /// <param name="type">The type this descriptor refers to.</param> /// <param name="accessMode">The interop access mode this descriptor uses for members access</param> public StandardGenericsUserDataDescriptor(Type type, InteropAccessMode accessMode) { if (accessMode == InteropAccessMode.NoReflectionAllowed) throw new ArgumentException("Can't create a StandardGenericsUserDataDescriptor under a NoReflectionAllowed access mode"); AccessMode = accessMode; this.Type = type; this.Name = "@@" + type.FullName; }
private static IUserDataDescriptor RegisterType_Impl(Type type, InteropAccessMode accessMode, string friendlyName, IUserDataDescriptor descriptor) { if (accessMode == InteropAccessMode.Default) { MoonSharpUserDataAttribute attr = type.GetCustomAttributes(true).OfType <MoonSharpUserDataAttribute>() .SingleOrDefault(); if (attr != null) { accessMode = attr.AccessMode; } } if (accessMode == InteropAccessMode.Default) { accessMode = s_DefaultAccessMode; } lock (s_Lock) { if (!s_Registry.ContainsKey(type)) { if (descriptor == null) { if (type.GetInterfaces().Any(ii => ii == typeof(IUserDataType))) { AutoDescribingUserDataDescriptor audd = new AutoDescribingUserDataDescriptor(type, friendlyName); s_Registry.Add(type, audd); return(audd); } else { StandardUserDataDescriptor udd = new StandardUserDataDescriptor(type, accessMode, friendlyName); s_Registry.Add(type, udd); if (accessMode == InteropAccessMode.BackgroundOptimized) { ThreadPool.QueueUserWorkItem(o => udd.Optimize()); } return(udd); } } else { s_Registry.Add(type, descriptor); return(descriptor); } } else { return(s_Registry[type]); } } }
/// <summary> /// Initializes a new instance of the <see cref="MethodMemberDescriptor"/> class. /// </summary> /// <param name="methodBase">The MethodBase (MethodInfo or ConstructorInfo) got through reflection.</param> /// <param name="accessMode">The interop access mode.</param> /// <exception cref="System.ArgumentException">Invalid accessMode</exception> public MethodMemberDescriptor(MethodBase methodBase, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckMethodIsCompatible(methodBase, true); IsConstructor = (methodBase is ConstructorInfo); this.MethodInfo = methodBase; bool isStatic = methodBase.IsStatic || IsConstructor; if (IsConstructor) m_IsAction = false; else m_IsAction = ((MethodInfo)methodBase).ReturnType == typeof(void); ParameterInfo[] reflectionParams = methodBase.GetParameters(); ParameterDescriptor[] parameters; if (this.MethodInfo.DeclaringType.IsArray) { m_IsArrayCtor = true; int rank = this.MethodInfo.DeclaringType.GetArrayRank(); parameters = new ParameterDescriptor[rank]; for (int i = 0; i < rank; i++) parameters[i] = new ParameterDescriptor("idx" + i.ToString(), typeof(int)); } else { parameters = reflectionParams.Select(pi => new ParameterDescriptor(pi)).ToArray(); } bool isExtensionMethod = (methodBase.IsStatic && parameters.Length > 0 && methodBase.GetCustomAttributes(typeof(ExtensionAttribute), false).Any()); base.Initialize(methodBase.Name, isStatic, parameters, isExtensionMethod); // adjust access mode if (Script.GlobalOptions.Platform.IsRunningOnAOT()) accessMode = InteropAccessMode.Reflection; if (accessMode == InteropAccessMode.Default) accessMode = UserData.DefaultAccessMode; if (accessMode == InteropAccessMode.HideMembers) throw new ArgumentException("Invalid accessMode"); if (parameters.Any(p => p.Type.IsByRef)) accessMode = InteropAccessMode.Reflection; this.AccessMode = accessMode; if (AccessMode == InteropAccessMode.Preoptimized) ((IOptimizableDescriptor)this).Optimize(); }
private static PropertyMemberDescriptor TryCreate(PropertyInfo pi, InteropAccessMode accessMode, MethodInfo getter, MethodInfo setter) { if (getter == null && setter == null) { return(null); } return(new PropertyMemberDescriptor(pi, accessMode, getter, setter)); }
/// <summary> /// Tries to create a new StandardUserDataEventDescriptor, returning <c>null</c> in case the method is not /// visible to script code. /// </summary> /// <param name="ei">The EventInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <returns>A new StandardUserDataEventDescriptor or null.</returns> public static EventMemberDescriptor TryCreateIfVisible(EventInfo ei, InteropAccessMode accessMode) { if (!CheckEventIsCompatible(ei, false)) return null; if (ei.GetVisibilityFromAttributes() ?? (ei.GetAddMethod().IsPublic && ei.GetRemoveMethod().IsPublic)) return new EventMemberDescriptor(ei, accessMode); return null; }
private static StandardUserDataPropertyDescriptor TryCreate(PropertyInfo pi, InteropAccessMode accessMode, MethodInfo getter, MethodInfo setter) { if (getter == null && setter == null) { return(null); } else { return(new StandardUserDataPropertyDescriptor(pi, accessMode, getter, setter)); } }
/// <summary> /// Creates a CallbackFunction from a delegate. /// </summary> /// <param name="script">The script.</param> /// <param name="del">The delegate.</param> /// <param name="accessMode">The access mode.</param> /// <returns></returns> public static CallbackFunction FromDelegate(Script script, Delegate del, InteropAccessMode accessMode = InteropAccessMode.Default) { if (accessMode == InteropAccessMode.Default) { accessMode = m_DefaultAccessMode; } MethodMemberDescriptor descr = new MethodMemberDescriptor(del.Method, accessMode); return(descr.GetCallbackFunction(script, del.Target)); }
/// <summary> /// Registers a type /// </summary> /// <param name="type">The type.</param> /// <param name="accessMode">The access mode (used only if a default type descriptor is created).</param> /// <param name="friendlyName">Friendly name of the descriptor.</param> /// <param name="descriptor">The descriptor, or null to use a default one.</param> /// <returns></returns> internal static IUserDataDescriptor RegisterType_Impl(Type type, InteropAccessMode accessMode, string friendlyName, IUserDataDescriptor descriptor) { accessMode = ResolveDefaultAccessModeForType(accessMode, type); lock (s_Lock) { IUserDataDescriptor oldDescriptor = null; s_TypeRegistry.TryGetValue(type, out oldDescriptor); if (descriptor == null) { if (IsTypeBlacklisted(type)) { return(null); } if (Framework.Do.GetInterfaces(type).Any(ii => ii == typeof(IUserDataType))) { AutoDescribingUserDataDescriptor audd = new AutoDescribingUserDataDescriptor(type, friendlyName); return(PerformRegistration(type, audd, oldDescriptor)); } else if (Framework.Do.IsGenericTypeDefinition(type)) { StandardGenericsUserDataDescriptor typeGen = new StandardGenericsUserDataDescriptor(type, accessMode); return(PerformRegistration(type, typeGen, oldDescriptor)); } else if (Framework.Do.IsEnum(type)) { var enumDescr = new StandardEnumUserDataDescriptor(type, friendlyName); return(PerformRegistration(type, enumDescr, oldDescriptor)); } else { StandardUserDataDescriptor udd = new StandardUserDataDescriptor(type, accessMode, friendlyName); if (accessMode == InteropAccessMode.BackgroundOptimized) { #if NETFX_CORE System.Threading.Tasks.Task.Run(() => ((IOptimizableDescriptor)udd).Optimize()); #else ThreadPool.QueueUserWorkItem(o => ((IOptimizableDescriptor)udd).Optimize()); #endif } return(PerformRegistration(type, udd, oldDescriptor)); } } else { PerformRegistration(type, descriptor, oldDescriptor); return(descriptor); } } }
/// <summary> /// Initializes a new instance of the <see cref="StandardUserDataDescriptor"/> class. /// </summary> /// <param name="type">The type this descriptor refers to.</param> /// <param name="accessMode">The interop access mode this descriptor uses for members access</param> public StandardGenericsUserDataDescriptor(Type type, InteropAccessMode accessMode) { if (accessMode == InteropAccessMode.NoReflectionAllowed) { throw new ArgumentException("Can't create a StandardGenericsUserDataDescriptor under a NoReflectionAllowed access mode"); } AccessMode = accessMode; this.Type = type; this.Name = "@@" + type.FullName; }
public void Test_ConcatMethodStaticComplexCustomConv(InteropAccessMode opt) { try { UserData.UnregisterType <SomeClass>(); string script = @" strlist = { 'ciao', 'hello', 'aloha' }; intlist = { }; dictry = { ciao = 39, hello = 78, aloha = 128 }; x = static.SetComplexTypes(strlist, intlist, dictry, strlist, intlist); return x;" ; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType <SomeClass>(); UserData.RegisterType <SomeClass>(opt); Script.GlobalOptions.CustomConverters.Clear(); Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Table, typeof(List <string>), v => null); Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Table, typeof(IList <int>), v => new List <int>() { 42, 77, 125, 13 }); Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Table, typeof(int[]), v => new int[] { 43, 78, 126, 14 }); Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion <StringBuilder>( (_s, v) => DynValue.NewString(v.ToString().ToUpper())); S.Globals.Set("static", UserData.CreateStatic <SomeClass>()); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.String, res.Type); Assert.AreEqual("CIAO,HELLO,ALOHA|42,77,125,13|ALOHA,CIAO,HELLO|39,78,128|CIAO,HELLO,ALOHA|43,78,126,14", res.String); } finally { Script.GlobalOptions.CustomConverters.Clear(); } }
/// <summary> /// Initializes a new instance of the <see cref="MethodMemberDescriptor"/> class. /// </summary> /// <param name="methodBase">The MethodBase (MethodInfo or ConstructorInfo) got through reflection.</param> /// <param name="accessMode">The interop access mode.</param> /// <exception cref="System.ArgumentException">Invalid accessMode</exception> public MethodMemberDescriptor(MethodBase methodBase, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckMethodIsCompatible(methodBase, true); IsConstructor = (methodBase is ConstructorInfo); this.MethodInfo = methodBase; bool isStatic = methodBase.IsStatic || IsConstructor; if (IsConstructor) { m_IsAction = false; } else { m_IsAction = ((MethodInfo)methodBase).ReturnType == typeof(void); } ParameterInfo[] reflectionParams = methodBase.GetParameters(); ParameterDescriptor[] parameters = reflectionParams.Select(pi => new ParameterDescriptor(pi)).ToArray(); bool isExtensionMethod = (methodBase.IsStatic && parameters.Length > 0 && methodBase.GetCustomAttributes(typeof(ExtensionAttribute), false).Any()); base.Initialize(methodBase.Name, isStatic, parameters, isExtensionMethod); // adjust access mode if (Script.GlobalOptions.Platform.IsRunningOnAOT()) { accessMode = InteropAccessMode.Reflection; } if (accessMode == InteropAccessMode.Default) { accessMode = UserData.DefaultAccessMode; } if (accessMode == InteropAccessMode.HideMembers) { throw new ArgumentException("Invalid accessMode"); } if (parameters.Any(p => p.Type.IsByRef)) { accessMode = InteropAccessMode.Reflection; } this.AccessMode = accessMode; if (AccessMode == InteropAccessMode.Preoptimized) { ((IOptimizableDescriptor)this).Optimize(); } }
/// <summary> /// Tries to create a new StandardUserDataEventDescriptor, returning <c>null</c> in case the method is not /// visible to script code. /// </summary> /// <param name="ei">The EventInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <returns>A new StandardUserDataEventDescriptor or null.</returns> public static EventMemberDescriptor TryCreateIfVisible(EventInfo ei, InteropAccessMode accessMode) { if (!CheckEventIsCompatible(ei, false)) return null; MethodInfo addm = ei.GetAddMethod(); MethodInfo remm = ei.GetRemoveMethod(); if (ei.GetVisibilityFromAttributes() ?? ((remm != null && remm.IsPublic) && (addm != null && addm.IsPublic))) return new EventMemberDescriptor(ei, accessMode); return null; }
internal StandardUserDataPropertyDescriptor(PropertyInfo pi, InteropAccessMode accessMode) { this.PropertyInfo = pi; this.AccessMode = accessMode; this.Name = pi.Name; this.IsStatic = (this.PropertyInfo.GetGetMethod() ?? this.PropertyInfo.GetSetMethod()).IsStatic; if (AccessMode == InteropAccessMode.Preoptimized) { this.OptimizeGetter(); this.OptimizeSetter(); } }
/// <summary> /// Creates a CallbackFunction from a delegate. /// </summary> /// <param name="script">The script.</param> /// <param name="del">The delegate.</param> /// <param name="accessMode">The access mode.</param> /// <returns></returns> public static CallbackFunction FromDelegate(Script script, Delegate del, InteropAccessMode accessMode = InteropAccessMode.Default) { if (accessMode == InteropAccessMode.Default) { accessMode = m_DefaultAccessMode; } #if NETFX_CORE MethodMemberDescriptor descr = new MethodMemberDescriptor(del.GetMethodInfo(), accessMode); #else MethodMemberDescriptor descr = new MethodMemberDescriptor(del.Method, accessMode); #endif return(descr.GetCallbackFunction(script, del.Target)); }
/// <summary> /// Tries to create a new StandardUserDataEventDescriptor, returning <c>null</c> in case the method is not /// visible to script code. /// </summary> /// <param name="ei">The EventInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <returns>A new StandardUserDataEventDescriptor or null.</returns> public static EventMemberDescriptor TryCreateIfVisible(EventInfo ei, InteropAccessMode accessMode) { if (!CheckEventIsCompatible(ei, false)) { return(null); } if (ei.GetVisibilityFromAttributes() ?? (ei.GetAddMethod().IsPublic&& ei.GetRemoveMethod().IsPublic)) { return(new EventMemberDescriptor(ei, accessMode)); } return(null); }
/// <summary> /// Initializes a new instance of the <see cref="StandardUserDataDescriptor"/> class. /// </summary> /// <param name="type">The type this descriptor refers to.</param> /// <param name="accessMode">The interop access mode this descriptor uses for members access</param> /// <param name="friendlyName">A human readable friendly name of the descriptor.</param> public StandardUserDataDescriptor(Type type, InteropAccessMode accessMode, string friendlyName = null) : base(type, friendlyName) { if (accessMode == InteropAccessMode.NoReflectionAllowed) throw new ArgumentException("Can't create a StandardUserDataDescriptor under a NoReflectionAllowed access mode"); if (Script.GlobalOptions.Platform.IsRunningOnAOT()) accessMode = InteropAccessMode.Reflection; if (accessMode == InteropAccessMode.Default) accessMode = UserData.DefaultAccessMode; AccessMode = accessMode; FillMemberList(); }
public void Test_IntPropertyGetter(InteropAccessMode opt) { string script = @" x = myobj.IntProp; return x;"; Script S = new Script(); SomeClass obj = new SomeClass() { IntProp = 321 }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(321, res.Number); }
/// <summary> /// Initializes a new instance of the <see cref="MethodMemberDescriptor" /> class. /// </summary> /// <param name="methodBase">The MethodBase (MethodInfo or ConstructorInfo) got through reflection.</param> /// <param name="accessMode">The interop access mode.</param> /// <exception cref="System.ArgumentException">Invalid accessMode</exception> public MethodMemberDescriptor(MethodBase methodBase, InteropAccessMode accessMode = InteropAccessMode.Default) { CheckMethodIsCompatible(methodBase, true); IsConstructor = (methodBase is ConstructorInfo); MethodInfo = methodBase; var isStatic = methodBase.IsStatic || IsConstructor; if (IsConstructor) m_IsAction = false; else m_IsAction = ((MethodInfo) methodBase).ReturnType == typeof (void); var reflectionParams = methodBase.GetParameters(); var parameters = reflectionParams.Select(pi => new ParameterDescriptor(pi)).ToArray(); var isExtensionMethod = (methodBase.IsStatic && parameters.Length > 0 && methodBase.GetCustomAttributes(typeof (ExtensionAttribute), false).Any()); Initialize(methodBase.Name, isStatic, parameters, isExtensionMethod); // adjust access mode if (Script.GlobalOptions.Platform.IsRunningOnAOT()) accessMode = InteropAccessMode.Reflection; if (accessMode == InteropAccessMode.Default) accessMode = UserData.DefaultAccessMode; if (accessMode == InteropAccessMode.HideMembers) throw new ArgumentException("Invalid accessMode"); if (parameters.Any(p => p.Type.IsByRef)) accessMode = InteropAccessMode.Reflection; AccessMode = accessMode; if (AccessMode == InteropAccessMode.Preoptimized) ((IOptimizableDescriptor) this).Optimize(); }
/// <summary> /// Tries to create a new StandardUserDataPropertyDescriptor, returning <c>null</c> in case the property is not /// visible to script code. /// </summary> /// <param name="pi">The PropertyInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <returns>A new StandardUserDataPropertyDescriptor or null.</returns> public static PropertyMemberDescriptor TryCreateIfVisible(PropertyInfo pi, InteropAccessMode accessMode) { MethodInfo getter = pi.GetGetMethod(true); MethodInfo setter = pi.GetSetMethod(true); bool? pvisible = pi.GetVisibilityFromAttributes(); bool? gvisible = getter.GetVisibilityFromAttributes(); bool? svisible = setter.GetVisibilityFromAttributes(); if (pvisible.HasValue) { return PropertyMemberDescriptor.TryCreate(pi, accessMode, (gvisible ?? pvisible.Value) ? getter : null, (svisible ?? pvisible.Value) ? setter : null); } else { return PropertyMemberDescriptor.TryCreate(pi, accessMode, (gvisible ?? getter.IsPublic) ? getter : null, (svisible ?? setter.IsPublic) ? setter : null); } }
/// <summary> /// Initializes a new instance of the <see cref="PropertyMemberDescriptor" /> class. /// </summary> /// <param name="pi">The PropertyInfo.</param> /// <param name="accessMode">The <see cref="InteropAccessMode" /></param> /// <param name="getter">The getter method. Use null to make the property writeonly.</param> /// <param name="setter">The setter method. Use null to make the property readonly.</param> public PropertyMemberDescriptor(PropertyInfo pi, InteropAccessMode accessMode, MethodInfo getter, MethodInfo setter) { if (getter == null && setter == null) throw new ArgumentNullException("getter and setter cannot both be null"); if (Script.GlobalOptions.Platform.IsRunningOnAOT()) accessMode = InteropAccessMode.Reflection; PropertyInfo = pi; AccessMode = accessMode; Name = pi.Name; m_Getter = getter; m_Setter = setter; IsStatic = (m_Getter ?? m_Setter).IsStatic; if (AccessMode == InteropAccessMode.Preoptimized) { OptimizeGetter(); OptimizeSetter(); } }
public void Test_StaticPropertyAccess(InteropAccessMode opt) { string script = @" static.StaticProp = 'asdasd' .. static.StaticProp;"; Script S = new Script(); SomeClass.StaticProp = "qweqwe"; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("static", UserData.CreateStatic<SomeClass>()); Assert.AreEqual("qweqwe", SomeClass.StaticProp); DynValue res = S.DoString(script); Assert.AreEqual("asdasdqweqwe", SomeClass.StaticProp); }
public void Test_IteratorPropertyGetter(InteropAccessMode opt) { string script = @" x = 0; for i in myobj.Numbers do x = x + i; end return x;"; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(10, res.Number); }
public void Test_NIntPropertySetter(InteropAccessMode opt) { string script = @" myobj1.NIntProp = nil; myobj2.NIntProp = 19;"; Script S = new Script(); SomeClass obj1 = new SomeClass() { NIntProp = 321 }; SomeClass obj2 = new SomeClass() { NIntProp = null }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); Assert.AreEqual(321, obj1.NIntProp); Assert.AreEqual(null, obj2.NIntProp); DynValue res = S.DoString(script); Assert.AreEqual(null, obj1.NIntProp); Assert.AreEqual(19, obj2.NIntProp); }
public void Test_RoIntProperty2Setter(InteropAccessMode opt) { try { string script = @" myobj.RoIntProp2 = 19; return myobj.RoIntProp2; "; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); } catch (ScriptRuntimeException) { return; } Assert.Fail(); }
public void Test_WoIntProperty2Setter(InteropAccessMode opt) { string script = @" myobj.WoIntProp2 = 19; "; Script S = new Script(); SomeClass obj = new SomeClass(); UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); Assert.AreEqual(19, obj.WoIntProp2); }
public void Test_PropertyAccessOverrides(InteropAccessMode opt) { SomeClass obj = new SomeClass(); try { string script = @" myobj.AccessOverrProp = 19; return myobj.AccessOverrProp; "; Script S = new Script(); obj.AccessOverrProp = 13; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); DynValue res = S.DoString(script); } catch (ScriptRuntimeException) { Assert.AreEqual(19, obj.AccessOverrProp); return; } Assert.Fail(); }
public void Test_ObjPropertyGetter(InteropAccessMode opt) { string script = @" x = myobj1.ObjProp; y = myobj2.ObjProp; z = myobj2.ObjProp.ObjProp; return x,y,z;"; Script S = new Script(); SomeClass obj1 = new SomeClass() { ObjProp = "ciao" }; SomeClass obj2 = new SomeClass() { ObjProp = obj1 }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Tuple, res.Type); Assert.AreEqual(DataType.String, res.Tuple[0].Type); Assert.AreEqual("ciao", res.Tuple[0].String); Assert.AreEqual(DataType.String, res.Tuple[2].Type); Assert.AreEqual("ciao", res.Tuple[2].String); Assert.AreEqual(DataType.UserData, res.Tuple[1].Type); Assert.AreEqual(obj1, res.Tuple[1].UserData.Object); }
/// <summary> /// Resolves the default type of the access mode for the given type /// </summary> /// <param name="accessMode">The access mode.</param> /// <param name="type">The type.</param> /// <returns></returns> internal static InteropAccessMode ResolveDefaultAccessModeForType(InteropAccessMode accessMode, Type type) { if (accessMode == InteropAccessMode.Default) { MoonSharpUserDataAttribute attr = Framework.Do.GetCustomAttributes(type, true).OfType<MoonSharpUserDataAttribute>() .SingleOrDefault(); if (attr != null) accessMode = attr.AccessMode; } if (accessMode == InteropAccessMode.Default) accessMode = s_DefaultAccessMode; return accessMode; }
/// <summary> /// Registers a type /// </summary> /// <param name="type">The type.</param> /// <param name="accessMode">The access mode (used only if a default type descriptor is created).</param> /// <param name="friendlyName">Friendly name of the descriptor.</param> /// <param name="descriptor">The descriptor, or null to use a default one.</param> /// <returns></returns> internal static IUserDataDescriptor RegisterType_Impl(Type type, InteropAccessMode accessMode, string friendlyName, IUserDataDescriptor descriptor) { accessMode = ResolveDefaultAccessModeForType(accessMode, type); lock (s_Lock) { IUserDataDescriptor oldDescriptor = null; s_TypeRegistry.TryGetValue(type, out oldDescriptor); if (descriptor == null) { if (IsTypeBlacklisted(type)) return null; if (Framework.Do.GetInterfaces(type).Any(ii => ii == typeof(IUserDataType))) { AutoDescribingUserDataDescriptor audd = new AutoDescribingUserDataDescriptor(type, friendlyName); return PerformRegistration(type, audd, oldDescriptor); } else if (Framework.Do.IsGenericTypeDefinition(type)) { StandardGenericsUserDataDescriptor typeGen = new StandardGenericsUserDataDescriptor(type, accessMode); return PerformRegistration(type, typeGen, oldDescriptor); } else if (Framework.Do.IsEnum(type)) { var enumDescr = new StandardEnumUserDataDescriptor(type, friendlyName); return PerformRegistration(type, enumDescr, oldDescriptor); } else { StandardUserDataDescriptor udd = new StandardUserDataDescriptor(type, accessMode, friendlyName); if (accessMode == InteropAccessMode.BackgroundOptimized) { #if NETFX_CORE System.Threading.Tasks.Task.Run(() => ((IOptimizableDescriptor)udd).Optimize()); #else ThreadPool.QueueUserWorkItem(o => ((IOptimizableDescriptor)udd).Optimize()); #endif } return PerformRegistration(type, udd, oldDescriptor); } } else { PerformRegistration(type, descriptor, oldDescriptor); return descriptor; } } }
public void Test_ListMethod(InteropAccessMode opt) { UserData.UnregisterType<SomeClass>(); string script = @" x = mklist(1, 4); sum = 0; for _, v in ipairs(x) do sum = sum + v; end return sum;"; Script S = new Script(); SomeClass obj = new SomeClass(); S.Globals["mklist"] = CallbackFunction.FromDelegate(S, (Func<int, int, List<int>>)obj.MkList, opt); DynValue res = S.DoString(script); Assert.AreEqual(DataType.Number, res.Type); Assert.AreEqual(10, res.Number); }
/// <summary> /// Registers a proxy type. /// </summary> /// <param name="proxyFactory">The proxy factory.</param> /// <param name="accessMode">The access mode.</param> /// <param name="friendlyName">Name of the friendly.</param> /// <returns></returns> internal static IUserDataDescriptor RegisterProxyType_Impl(IProxyFactory proxyFactory, InteropAccessMode accessMode, string friendlyName) { IUserDataDescriptor proxyDescriptor = RegisterType_Impl(proxyFactory.ProxyType, accessMode, friendlyName, null); return RegisterType_Impl(proxyFactory.TargetType, accessMode, friendlyName, new ProxyUserDataDescriptor(proxyFactory, proxyDescriptor, friendlyName)); }
public void Test_InvalidPropertySetter(InteropAccessMode opt) { string script = @" myobj.IntProp = '19';"; Script S = new Script(); SomeClass obj = new SomeClass() { IntProp = 321 }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj", UserData.Create(obj)); Assert.AreEqual(321, obj.IntProp); DynValue res = S.DoString(script); Assert.AreEqual(19, obj.IntProp); }
public void Test_ObjPropertySetter(InteropAccessMode opt) { string script = @" myobj1.ObjProp = myobj2; myobj2.ObjProp = 'hello';"; Script S = new Script(); SomeClass obj1 = new SomeClass() { ObjProp = "ciao" }; SomeClass obj2 = new SomeClass() { ObjProp = obj1 }; UserData.UnregisterType<SomeClass>(); UserData.RegisterType<SomeClass>(opt); S.Globals.Set("myobj1", UserData.Create(obj1)); S.Globals.Set("myobj2", UserData.Create(obj2)); Assert.AreEqual("ciao", obj1.ObjProp); Assert.AreEqual(obj1, obj2.ObjProp); DynValue res = S.DoString(script); Assert.AreEqual(obj2, obj1.ObjProp); Assert.AreEqual("hello", obj2.ObjProp); }