protected HardwiredMemberDescriptor(Type memberType, string name, bool isStatic, MemberDescriptorAccess access)
 {
     IsStatic     = isStatic;
     Name         = name;
     MemberAccess = access;
     MemberType   = memberType;
 }
		protected HardwiredMemberDescriptor(Type memberType, string name, bool isStatic, MemberDescriptorAccess access)
		{
			IsStatic = isStatic;
			Name = name;
			MemberAccess = access;
			MemberType = memberType;
		}
Example #3
0
        /// <summary>
        /// Raises an appropriate ScriptRuntimeException if the specified access is not supported.
        /// Checks are made for the MemberDescriptorAccess permissions AND for the access of instance
        /// members through static userdatas.
        /// </summary>
        /// <param name="desc">The desc.</param>
        /// <param name="access">The access.</param>
        /// <param name="obj">The object to be checked for access.</param>
        public static void CheckAccess(this IMemberDescriptor desc, MemberDescriptorAccess access, object obj)
        {
            if (!desc.IsStatic && obj == null)
            {
                throw ScriptRuntimeException.AccessInstanceMemberOnStatics(desc);
            }

            if (access.HasAllFlags(MemberDescriptorAccess.CanExecute) && !desc.CanExecute())
            {
                throw new ScriptRuntimeException("userdata member {0} cannot be called.", desc.Name);
            }

            if (access.HasAllFlags(MemberDescriptorAccess.CanWrite) && !desc.CanWrite())
            {
                throw new ScriptRuntimeException("userdata member {0} cannot be assigned to.", desc.Name);
            }

            if (access.HasAllFlags(MemberDescriptorAccess.CanRead) && !desc.CanRead())
            {
                throw new ScriptRuntimeException("userdata member {0} cannot be read from.", desc.Name);
            }
        }
Example #4
0
		/// <summary>
		/// Determines whether the specified MemberDescriptorAccess has ALL the specified flags.
		/// </summary>
		/// <param name="access">The access.</param>
		/// <param name="flag">The flag.</param>
		/// <returns></returns>
		public static bool HasAllFlags(this MemberDescriptorAccess access, MemberDescriptorAccess flag)
		{
			return (access & flag) == flag;
		}
Example #5
0
		/// <summary>
		/// Raises an appropriate ScriptRuntimeException if the specified access is not supported.
		/// Checks are made for the MemberDescriptorAccess permissions AND for the access of instance
		/// members through static userdatas.
		/// </summary>
		/// <param name="desc">The desc.</param>
		/// <param name="access">The access.</param>
		/// <param name="obj">The object to be checked for access.</param>
		public static void CheckAccess(this IMemberDescriptor desc, MemberDescriptorAccess access, object obj)
		{
			if (!desc.IsStatic && obj == null)
				throw ScriptRuntimeException.AccessInstanceMemberOnStatics(desc);

			if (access.HasAllFlags(MemberDescriptorAccess.CanExecute) && !desc.CanExecute())
				throw new ScriptRuntimeException("userdata member {0} cannot be called.", desc.Name);

			if (access.HasAllFlags(MemberDescriptorAccess.CanWrite) && !desc.CanWrite())
				throw new ScriptRuntimeException("userdata member {0} cannot be assigned to.", desc.Name);

			if (access.HasAllFlags(MemberDescriptorAccess.CanRead) && !desc.CanRead())
				throw new ScriptRuntimeException("userdata member {0} cannot be read from.", desc.Name);
		}
Example #6
0
		/// <summary>
		/// Returns the specified descriptor if it supports all the specified access modes, otherwise returns null.
		/// </summary>
		/// <param name="desc">The descriptor instance.</param>
		/// <param name="access">The access mode(s).</param>
		/// <returns></returns>
		public static IMemberDescriptor WithAccessOrNull(this IMemberDescriptor desc, MemberDescriptorAccess access)
		{
			if (desc == null)
				return null;

			if (desc.MemberAccess.HasAllFlags(access))
				return desc;

			return null;
		}
Example #7
0
 /// <summary>
 /// Determines whether the specified MemberDescriptorAccess has ALL the specified flags.
 /// </summary>
 /// <param name="access">The access.</param>
 /// <param name="flag">The flag.</param>
 /// <returns></returns>
 public static bool HasAllFlags(this MemberDescriptorAccess access, MemberDescriptorAccess flag)
 {
     return((access & flag) == flag);
 }
Example #8
0
        /// <summary>
        /// Returns the specified descriptor if it supports all the specified access modes, otherwise returns null.
        /// </summary>
        /// <param name="desc">The descriptor instance.</param>
        /// <param name="access">The access mode(s).</param>
        /// <returns></returns>
        public static IMemberDescriptor WithAccessOrNull(this IMemberDescriptor desc, MemberDescriptorAccess access)
        {
            if (desc == null)
            {
                return(null);
            }

            if (desc.MemberAccess.HasAllFlags(access))
            {
                return(desc);
            }

            return(null);
        }
        public CodeExpression[] Generate(Table table, HardwireCodeGenerationContext generator, CodeTypeMemberCollection members)
        {
            bool   isStatic   = table.Get("static").Boolean;
            string memberType = table.Get("type").String;
            string name       = table.Get("name").String;
            string decltype   = table.Get("decltype").String;
            bool   declvtype  = table.Get("declvtype").Boolean;
            bool   canWrite   = table.Get("write").Boolean;
            bool   canRead    = table.Get("read").Boolean;

            if (declvtype && canWrite)
            {
                generator.Warning("Member '{0}.{1}::Set' will be a no-op, as it's a member of a value type.", decltype, name);
            }

            MemberDescriptorAccess access = 0;

            if (canWrite)
            {
                access = access | MemberDescriptorAccess.CanWrite;
            }

            if (canRead)
            {
                access = access | MemberDescriptorAccess.CanRead;
            }


            string className = GetPrefix() + "_" + Guid.NewGuid().ToString("N");

            CodeTypeDeclaration classCode = new CodeTypeDeclaration(className);

            classCode.TypeAttributes = System.Reflection.TypeAttributes.NestedPrivate | System.Reflection.TypeAttributes.Sealed;

            classCode.BaseTypes.Add(typeof(HardwiredMemberDescriptor));

            // protected HardwiredMemberDescriptor(Type memberType, string name, bool isStatic, MemberDescriptorAccess access)

            CodeConstructor ctor = new CodeConstructor();

            ctor.Attributes = MemberAttributes.Assembly;
            ctor.BaseConstructorArgs.Add(new CodeTypeOfExpression(memberType));
            ctor.BaseConstructorArgs.Add(new CodePrimitiveExpression(name));
            ctor.BaseConstructorArgs.Add(new CodePrimitiveExpression(isStatic));
            ctor.BaseConstructorArgs.Add(new CodeCastExpression(typeof(MemberDescriptorAccess), new CodePrimitiveExpression((int)access)));
            classCode.Members.Add(ctor);

            var thisExp = isStatic
                                ? (CodeExpression)(new CodeTypeReferenceExpression(decltype))
                                : (CodeExpression)(new CodeCastExpression(decltype, new CodeVariableReferenceExpression("obj")));

            if (canRead)
            {
                var memberExp = GetMemberAccessExpression(thisExp, name);
                //	protected virtual object GetValueImpl(Script script, object obj)
                CodeMemberMethod m = new CodeMemberMethod();
                classCode.Members.Add(m);
                m.Name       = "GetValueImpl";
                m.Attributes = MemberAttributes.Override | MemberAttributes.Family;
                m.ReturnType = new CodeTypeReference(typeof(object));
                m.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Script), "script"));
                m.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "obj"));
                m.Statements.Add(new CodeMethodReturnStatement(memberExp));
            }

            if (canWrite)
            {
                //	protected virtual object GetValueImpl(Script script, object obj)
                CodeMemberMethod m = new CodeMemberMethod();
                classCode.Members.Add(m);
                m.Name       = "SetValueImpl";
                m.Attributes = MemberAttributes.Override | MemberAttributes.Family;
                m.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Script), "script"));
                m.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "obj"));
                m.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "value"));

                var valExp = new CodeCastExpression(memberType, new CodeVariableReferenceExpression("value"));

                if (isStatic)
                {
                    var e = GetMemberAccessExpression(thisExp, name);
                    m.Statements.Add(new CodeAssignStatement(e, valExp));
                }
                else
                {
                    m.Statements.Add(new CodeVariableDeclarationStatement(decltype, "tmp", thisExp));

                    var memberExp = GetMemberAccessExpression(new CodeVariableReferenceExpression("tmp"), name);

                    m.Statements.Add(new CodeAssignStatement(memberExp, valExp));
                }
            }

            members.Add(classCode);
            return(new CodeExpression[] { new CodeObjectCreateExpression(className) });
        }