Пример #1
0
        /// <summary>
        /// Returns the value of the member of the specified name.
        /// </summary>
        /// <param name="context">The runtime context.</param>
        /// <param name="name">The name of the member.</param>
        /// <returns>The value of the member <paramref name="name"/>.</returns>
        IScriptObject IMemberObject.GetMember(RuntimeContexts.RuntimeContext context, string name)
        {
            IScriptObject value;
            string        rename;
            var           cls = context.Class as ClassObject;

            if (cls != null)
            {
                rename = ClassHelper.RenamePrivate(name, cls.Name);
                if (Fields.TryGetValue(rename, out value))
                {
                    return(value);
                }
            }
            {
                rename = name;
                if (Fields.TryGetValue(rename, out value))
                {
                    return(value);
                }
            }
            if (cls == this.Class || ClassHelper.IsExtendedFrom(this.Class, cls) || ClassHelper.IsExtendedFrom(cls, this.Class))
            {
                rename = ClassHelper.RenameProtected(name);
                if (Fields.TryGetValue(rename, out value))
                {
                    return(value);
                }
            }
            {
                var member = Class.GetMember(context, name, false);
                var mtd    = member as ClassMethod;
                if (mtd != null)
                {
                    return(new BoundMethod(this, mtd));
                }
                var proget = member as PropertyGetter;
                if (proget != null)
                {
                    return(proget.GetProperty(this));
                }
            }
            throw new InvalidOperationException(
                      string.Format(ExceptionResource.MemberNotFound, name));
        }
Пример #2
0
        /// <summary>
        /// Sets the value of the member of the specified name to the specified value.
        /// </summary>
        /// <param name="context">The runtime context.</param>
        /// <param name="name">The name of the member.</param>
        /// <param name="value">The value to set.</param>
        void IMemberObject.SetMember(RuntimeContexts.RuntimeContext context, string name, IScriptObject value)
        {
            string rename;
            var    cls = context.Class as ClassObject;

            if (cls != null)
            {
                rename = ClassHelper.RenamePrivate(name, cls.Name);
                if (Fields.ContainsKey(rename))
                {
                    Fields[rename] = value;
                    return;
                }
            }
            {
                rename = name;
                if (Fields.ContainsKey(rename))
                {
                    Fields[rename] = value;
                    return;
                }
            }
            if (cls == this.Class || ClassHelper.IsExtendedFrom(this.Class, cls) || ClassHelper.IsExtendedFrom(cls, this.Class))
            {
                rename = ClassHelper.RenameProtected(name);
                if (Fields.ContainsKey(rename))
                {
                    Fields[rename] = value;
                    return;
                }
            }
            {
                var member = Class.SetMember(context, name, false);
                var proset = member as PropertySetter;
                if (proset != null)
                {
                    proset.SetProperty(this, value);
                    return;
                }
            }
            throw new InvalidOperationException(
                      string.Format(ExceptionResource.MemberNotFound, name));
        }
Пример #3
0
        /// <summary>
        /// Invokes the <c>get</c> accessor of the indexer referring to <c>super</c> with the specified parameters and returns the value.
        /// </summary>
        /// <param name="context">The runtime context.</param>
        /// <param name="indices">The parameters passed to the indexer.</param>
        /// <returns>The return value of the indexer.</returns>
        IScriptObject ISuperIndexableObject.GetSuperItem(RuntimeContexts.RuntimeContext context, List <IScriptObject> indices)
        {
            var cls = context.Class as ClassObject;

            if (cls != null)
            {
                var super = cls.Super;
                if (ClassHelper.IsExtendedFrom(this.Class, super))
                {
                    var member = super.GetItem(context, false);
                    var idxget = member as IndexerGetter;
                    if (idxget != null)
                    {
                        return(idxget.GetItem(this, indices));
                    }
                    throw new InvalidOperationException(
                              ExceptionResource.IndexerNotSupported);
                }
            }
            throw new InvalidOperationException(
                      ExceptionResource.SuperMustBeInExtendedClass);
        }
Пример #4
0
        /// <summary>
        /// Sets the value of the member of the specified name referring to <c>super</c> to the specified value.
        /// </summary>
        /// <param name="context">The runtime context.</param>
        /// <param name="name">The name of the member.</param>
        /// <param name="value">The value to set.</param>
        void ISuperMemberObject.SetSuperMember(RuntimeContexts.RuntimeContext context, string name, IScriptObject value)
        {
            var cls = context.Class as ClassObject;

            if (cls != null)
            {
                var super = cls.Super;
                if (ClassHelper.IsExtendedFrom(this.Class, super))
                {
                    var member = super.SetMember(context, name, false);
                    var proset = member as PropertySetter;
                    if (proset != null)
                    {
                        proset.SetProperty(this, value);
                        return;
                    }
                    throw new InvalidOperationException(
                              string.Format(ExceptionResource.MemberNotFound, name));
                }
            }
            throw new InvalidOperationException(
                      ExceptionResource.SuperMustBeInExtendedClass);
        }
Пример #5
0
        private void DeclareMember(Property member)
        {
            var name = member.Name;

            CheckName(name, member);
            var modifier = member.Modifier;
            var g        = member.Getter;
            var s        = member.Setter;

            CheckModifier(modifier, g, s);
            ClassMethod gmtd = null, smtd = null;
            Modifier    gmod = 0, smod = 0;

            if (g == null && s == null)
            {
                throw new RuntimeException(member.LinePragma,
                                           ExceptionResource.AccessorStatementsExpected);
            }
            else if (g != null && s != null)
            {
                gmod = g.Modifier ?? member.Modifier;
                smod = s.Modifier ?? member.Modifier;
                if (g.Statements == null && s.Statements == null)
                {
                    var id = "#autoproperty_" + member.Name;
                    // CheckName(id, member);
                    if (member.IsStatic)
                    {
                        Class.StaticFields.Add(id, ScriptNull.Instance);
                    }
                    else
                    {
                        Class.FieldInitializers.Add(id, null);
                    }
                    gmtd = new ScriptMethod(Class,
                                            new ParameterCollection(),
                                            new StatementCollection(
                                                new ReturnStatement(g.LinePragma,
                                                                    new MemberReferenceExpression(g.LinePragma,
                                                                                                  member.IsStatic ?
                                                                                                  new VariableReferenceExpression(g.LinePragma, Class.Name) as Expression :
                                                                                                  new ThisReferenceExpression(g.LinePragma),
                                                                                                  id))),
                                            Context);
                    smtd = new ScriptMethod(Class,
                                            new ParameterCollection(new Parameter(s.LinePragma, "value")),
                                            new StatementCollection(
                                                new ExpressionStatement(s.LinePragma,
                                                                        new AssignExpression(s.LinePragma,
                                                                                             new MemberReferenceExpression(s.LinePragma,
                                                                                                                           member.IsStatic ?
                                                                                                                           new VariableReferenceExpression(s.LinePragma, Class.Name) as Expression :
                                                                                                                           new ThisReferenceExpression(s.LinePragma),
                                                                                                                           id),
                                                                                             new VariableReferenceExpression(s.LinePragma, "value")))),
                                            Context);
                }
                else if (g.Statements != null && s.Statements != null)
                {
                    gmtd = new ScriptMethod(Class,
                                            new ParameterCollection(),
                                            g.Statements, Context);
                    smtd = new ScriptMethod(Class,
                                            new ParameterCollection(new Parameter(s.LinePragma, "value")),
                                            s.Statements, Context);
                }
                else
                {
                    throw new RuntimeException((g.Statements == null ? g : s).LinePragma,
                                               ExceptionResource.AccessorStatementsExpected);
                }
            }
            else if (g != null)
            {
                gmod = g.Modifier ?? member.Modifier;
                if (g.Statements == null)
                {
                    throw new RuntimeException(g.LinePragma,
                                               ExceptionResource.AutoPropertyMustHasGetSet);
                }
                else
                {
                    gmtd = new ScriptMethod(Class,
                                            new ParameterCollection(), g.Statements,
                                            Context);
                }
            }
            else
            {
                smod = s.Modifier ?? member.Modifier;
                if (s.Statements == null)
                {
                    throw new RuntimeException(s.LinePragma,
                                               ExceptionResource.AutoPropertyMustHasGetSet);
                }
                else
                {
                    smtd = new ScriptMethod(Class,
                                            new ParameterCollection(new Parameter(s.LinePragma, "value")), s.Statements,
                                            Context);
                }
            }
            if (gmtd != null)
            {
                var propget = ClassHelper.RenamePropertyGetter(name);
                propget = RenameModifier(gmod, propget);
                if (member.IsStatic)
                {
                    Class.StaticMembers.Add(propget, new PropertyGetter(gmtd));
                }
                else
                {
                    Class.InstanceMembers.Add(propget, new PropertyGetter(gmtd));
                }
            }
            if (smtd != null)
            {
                var propset = ClassHelper.RenamePropertySetter(name);
                propset = RenameModifier(smod, propset);
                if (member.IsStatic)
                {
                    Class.StaticMembers.Add(propset, new PropertySetter(smtd));
                }
                else
                {
                    Class.InstanceMembers.Add(propset, new PropertySetter(smtd));
                }
            }
        }
Пример #6
0
        internal ClassMember SetMember(RuntimeContexts.RuntimeContext context, string name, bool isStatic)
        {
            var         members = isStatic ? StaticMembers : InstanceMembers;
            ClassMember value;
            string      rename;
            string      propget = ClassHelper.RenamePropertyGetter(name);
            string      propset = ClassHelper.RenamePropertySetter(name);
            var         cls     = context.Class as ClassObject;

            if (cls != null)
            {
                rename = ClassHelper.RenamePrivate(name, cls.Name);
                if (members.TryGetValue(rename, out value) && value is ClassMethod)
                {
                    return(ClassHelper.ThrowCannotAssignMethod(name));
                }
                rename = ClassHelper.RenamePrivate(propset, cls.Name);
                if (members.TryGetValue(rename, out value) && value is PropertySetter)
                {
                    return(value);
                }
                rename = ClassHelper.RenamePrivate(propget, cls.Name);
                if (members.TryGetValue(rename, out value) && value is PropertyGetter)
                {
                    return(ClassHelper.ThrowPropertyIsReadonly(name));
                }
            }
            {
                rename = name;
                if (members.TryGetValue(rename, out value) && value is ClassMethod)
                {
                    return(ClassHelper.ThrowCannotAssignMethod(name));
                }
                rename = propset;
                if (members.TryGetValue(rename, out value) && value is PropertySetter)
                {
                    return(value);
                }
                rename = propget;
                if (members.TryGetValue(rename, out value) && value is PropertyGetter)
                {
                    return(ClassHelper.ThrowPropertyIsReadonly(name));
                }
            }
            if (cls == this || ClassHelper.IsExtendedFrom(this, cls) || ClassHelper.IsExtendedFrom(cls, this))
            {
                rename = ClassHelper.RenameProtected(name);
                if (members.TryGetValue(rename, out value) && value is ClassMethod)
                {
                    return(value);
                }
                rename = ClassHelper.RenameProtected(propset);
                if (members.TryGetValue(rename, out value) && value is PropertySetter)
                {
                    return(value);
                }
                rename = ClassHelper.RenameProtected(propget);
                if (members.TryGetValue(rename, out value) && value is PropertyGetter)
                {
                    return(ClassHelper.ThrowPropertyIsReadonly(name));
                }
            }
            if (Super != null)
            {
                return(Super.SetMember(context, name, isStatic));
            }
            return(ClassHelper.ThrowMemberNotFound(name));
        }