Inheritance: Expression, IAssignable
Example #1
0
		public void Visit(Indexer expression)
		{
			Builder.Append("[");
			expression.Index.Accept(this);
			Builder.Append("]");
		}
Example #2
0
        public void Visit(Indexer indexer)
        {
            EnsureIdentifierIsDefined(Result);

            JsObject target = (JsObject)Result;

            indexer.Index.Accept(this);

            if (target.IsClr)
                EnsureClrAllowed();

            if (target.Class == JsInstance.CLASS_STRING) {
                SetResult(Global.StringClass.New(target.ToString()[Convert.ToInt32(Result.ToNumber())].ToString()), target);
            }
            else {
                if (target.Indexer != null)
                    SetResult(target.Indexer.get(target, Result), target);
                else
                    SetResult(target[Result], target);
            }
        }
Example #3
0
        public void Visit(Indexer indexer)
        {
            JsDictionaryObject temp = (JsDictionaryObject)Result;

            JsDictionaryObject currentScope = CurrentScope;

            if (currentScope.IsClr)
                ExitScope();
            try
            {
                indexer.Index.Accept(this);
            }
            finally
            {
                if (currentScope.IsClr)
                    EnterScope(currentScope);
            }

            if (temp.IsClr) // && ((JsValue)Result).Type == JsValueType.CLRObject)
            {
                EnsureClrAllowed();

                PermissionSet.PermitOnly();

                try
                {
                    if (temp.Value.GetType().IsArray)
                    {
                        Result = Global.ObjectClass.New(((Array)temp.Value).GetValue((int)Result.ToNumber()));
                        return;
                    }
                    else
                    {
                        var parameters = JsClr.ConvertParameters(Result);

                        PropertyInfo pi = propertyGetter.GetValue(temp.Value, "Item", parameters);

                        if (pi != null)
                        {
                            Result = Global.WrapClr(pi.GetValue(temp.Value, parameters));
                            return;
                        }
                        else
                        {
                            pi = propertyGetter.GetValue(temp.Value, Result.ToString());

                            if (pi != null)
                            {
                                Result = Global.WrapClr(pi.GetValue(temp.Value, null));
                                return;
                            }

                            FieldInfo fi = fieldGetter.GetValue(temp.Value, Result.ToString());

                            if (fi != null)
                            {
                                Result = Global.WrapClr(fi.GetValue(temp.Value));
                                return;
                            }
                            else
                            {
                                throw new JintException("Index not found: " + Result.ToString());
                            }
                        }
                    }
                }
                finally
                {
                    CodeAccessPermission.RevertPermitOnly();
                }
            }

            if (temp.Class == JsString.TYPEOF)
            {
                Result = Global.StringClass.New(temp.ToString()[Convert.ToInt32(Result.ToNumber())].ToString());
            }
            else
            {
                if (temp.Class == JsFunction.TYPEOF)
                    Result = ((JsFunction)temp).Scope[Result.ToString()];
                else
                    Result = temp[Result.ToString()];
            }
        }
        public void Visit(Indexer indexer) {
            EnsureIdentifierIsDefined(Result);

            JsObject target = (JsObject)Result;

            indexer.Index.Accept(this);

            if (target.IsClr)
                EnsureClrAllowed();

            if (target.Class == JsInstance.CLASS_STRING)
            {
                try
                {
                    SetResult(Global.StringClass.New(target.ToString()[Convert.ToInt32(Result.ToNumber())].ToString()), target);
                    return;
                }
                catch
                {
                    // if an error occured, try to access the index as a member
                }
            }

            if (target.Indexer != null)
                SetResult(target.Indexer.get(target, Result), target);
            else
                SetResult(target[Result], target);
        }
Example #5
0
 void Analyze(Indexer Stmt)
 {
     SetCurrentLineAndCharNos(Stmt);
     if (Stmt.Index != null)
     {
         int StatusIndex = AddToJintStack(Stmt.Source, JintState.Indexer);
         Analyze(Stmt.Index);
         if (JintStack[StatusIndex].State == JintState.Indexer)
         {
             List<JintItem> SubItems = RemoveJintStackFrom(StatusIndex + 1);
             if (SubItems.Count > 1)
             {
                 JintStack[StatusIndex].SubItems = new List<JintItem>(SubItems);
             }
             else if (SubItems.Count == 1)
             {
                 if (SubItems[0].State == JintState.Identifier)
                 {
                     JintStack[StatusIndex].State = JintState.IdentifierIndex;
                     JintStack[StatusIndex].Value = SubItems[0].Value;
                 }
                 else if (SubItems[0].State == JintState.StringValue)
                 {
                     JintStack[StatusIndex].State = JintState.StringIndex;
                     JintStack[StatusIndex].Value = SubItems[0].Value;
                 }
                 else if (SubItems[0].State == JintState.IntValue)
                 {
                     JintStack[StatusIndex].State = JintState.IntIndex;
                     JintStack[StatusIndex].Value = SubItems[0].Value;
                 }
             }
         }
     }
 }