protected HardwiredMemberDescriptor(Type memberType, string name, bool isStatic, MemberDescriptorAccess access) { IsStatic = isStatic; Name = name; MemberAccess = access; MemberType = memberType; }
/// <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); } }
/// <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; }
/// <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); }
/// <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; }
/// <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); }
/// <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) }); }