コード例 #1
0
		/// <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;
		}
コード例 #2
0
		/// <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();
			}
		}
コード例 #3
0
        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);
        }
コード例 #4
0
		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();
		}
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        /// <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();
            }
        }
コード例 #11
0
		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);
		}
コード例 #12
0
        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();
        }
コード例 #13
0
ファイル: UserData.cs プロジェクト: walklook/moonsharp
 static UserData()
 {
     RegisterType <StandardUserDataEventDescriptor.EventFacade>(InteropAccessMode.Reflection);
     RegisterType <AnonWrapper>(InteropAccessMode.HideMembers);
     RegisterType <EnumerableWrapper>(InteropAccessMode.HideMembers);
     s_DefaultAccessMode = InteropAccessMode.LazyOptimized;
 }
コード例 #14
0
		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);
		}
コード例 #15
0
        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();
        }
コード例 #16
0
		/// <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;
			}
		}
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
        /// <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();
            }
        }
コード例 #20
0
        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();
            }
        }
コード例 #21
0
        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();
        }
コード例 #22
0
		/// <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;
		}
コード例 #23
0
        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);
        }
コード例 #24
0
 /// <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;
 }
コード例 #25
0
ファイル: CallbackFunction.cs プロジェクト: eddy5641/LuaSharp
		/// <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);
		}
コード例 #26
0
 /// <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;
 }
コード例 #27
0
 /// <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;
 }
コード例 #28
0
		/// <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;
		}
コード例 #29
0
        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]);
                }
            }
        }
コード例 #30
0
		/// <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();
		}
コード例 #31
0
        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));
        }
コード例 #32
0
		/// <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;
		}
コード例 #33
0
 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));
     }
 }
コード例 #34
0
        /// <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));
        }
コード例 #35
0
        /// <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);
                }
            }
        }
コード例 #36
0
        /// <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;
        }
コード例 #37
0
        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();
            }
        }
コード例 #38
0
        /// <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();
            }
        }
コード例 #39
0
		/// <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;
		}
コード例 #40
0
        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();
            }
        }
コード例 #41
0
        /// <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));
        }
コード例 #42
0
        /// <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);
        }
コード例 #43
0
		/// <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();
		}
コード例 #44
0
		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);
		}
コード例 #45
0
        /// <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();
        }
コード例 #46
0
		/// <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);
			}
		}
コード例 #47
0
        /// <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();
            }
        }
コード例 #48
0
		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);
		}
コード例 #49
0
		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);
		}
コード例 #50
0
		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);
		}
コード例 #51
0
		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();
		}
コード例 #52
0
		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);
		}
コード例 #53
0
		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();
		}
コード例 #54
0
		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);
		}
コード例 #55
0
		/// <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;
		}
コード例 #56
0
		/// <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;
				}
			}
		}
コード例 #57
0
		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);
		}
コード例 #58
0
		/// <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));
		}
コード例 #59
0
		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);
		}
コード例 #60
0
		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);
		}