public void Visit(Indexer expression) { Builder.Append("["); expression.Index.Accept(this); Builder.Append("]"); }
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); } }
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); }
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; } } } } }