objectextvalue.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,740 行 · 第 1/3 页

JAVA
1,740
字号
   * @param serializeMap holds reference indexes   */  @Override  public void serialize(StringBuilder sb,                        SerializeMap serializeMap)  {    sb.append("O:");    sb.append(_className.length());    sb.append(":\"");    sb.append(_className);    sb.append("\":");    sb.append(getSize());    sb.append(":{");        serializeMap.put(this);    serializeMap.incrementIndex();    for (Map.Entry<Value,Value> entry : entrySet()) {      Value key = entry.getKey();      sb.append("s:");      sb.append(key.length());      sb.append(":\"");      sb.append(key);      sb.append("\";");      Value value = ((Entry) entry).getRawValue();            value.serialize(sb, serializeMap);    }    sb.append("}");  }  /**   * Converts to a string.   * @param env   */  @Override  public StringValue toString(Env env)  {    String oldClassName = env.setCallingClassName(_className);        try {      AbstractFunction fun = _quercusClass.findFunction("__toString");      if (fun != null)        return fun.callMethod(env, this, new Expr[0]).toStringValue();      else        return env.createString(_className + "[]");    } finally {      env.setCallingClassName(oldClassName);    }      }  /**   * Converts to a string.   * @param env   */  @Override  public void print(Env env)  {    env.print(toString(env));  }  /**   * Converts to an array.   */  @Override  public Value toArray()  {    ArrayValue array = new ArrayValueImpl();    for (Map.Entry<Value,Value> entry : entrySet()) {      array.put(entry.getKey(), entry.getValue());    }    return array;  }  /**   * Converts to an object.   */  @Override  public Value toObject(Env env)  {    return this;  }  /**   * Converts to an object.   */  @Override  public Object toJavaObject()  {    return this;  }  @Override  public Set<? extends Map.Entry<Value,Value>> entrySet()  {    return new EntrySet();  }  /**   * Returns a Set of entries, sorted by key.   */  public Set<? extends Map.Entry<Value,Value>> sortedEntrySet()  {    return new TreeSet<Map.Entry<Value, Value>>(entrySet());  }  //  // debugging  //  public void varDumpImpl(Env env,                          WriteStream out,                          int depth,                          IdentityHashMap<Value, String> valueSet)    throws IOException  {    // XXX: push up to super, and use varDumpObject    out.println("object(" + getName() + ") (" + getSize() + ") {");    for (Map.Entry<Value,Value> mapEntry : sortedEntrySet()) {      ObjectExtValue.Entry entry = (ObjectExtValue.Entry) mapEntry;      entry.varDumpImpl(env, out, depth + 1, valueSet);    }    printDepth(out, 2 * depth);    out.print("}");  }  @Override  protected void printRImpl(Env env,                            WriteStream out,                            int depth,                            IdentityHashMap<Value, String> valueSet)    throws IOException  {    out.print(getName());    out.print(' ');    out.println("Object");    printDepth(out, 4 * depth);    out.println("(");    for (Map.Entry<Value,Value> mapEntry : sortedEntrySet()) {      ObjectExtValue.Entry entry = (ObjectExtValue.Entry) mapEntry;      entry.printRImpl(env, out, depth + 1, valueSet);    }    printDepth(out, 4 * depth);    out.println(")");  }  //  // Java Serialization  //    private void writeObject(ObjectOutputStream out)    throws IOException  {    out.writeObject(_className);    out.writeInt(_size);        for (Map.Entry<Value,Value> entry : entrySet()) {            out.writeObject(entry.getKey());      out.writeObject(entry.getValue());    }  }    private void readObject(ObjectInputStream in)    throws ClassNotFoundException, IOException  {     Env env = Env.getInstance();    String name = (String) in.readObject();    QuercusClass cl = env.findClass(name);    init();    if (cl != null) {      setQuercusClass(cl);    }    else {      cl = env.getQuercus().getStdClass();      setQuercusClass(cl);      putThisField(env,		   env.createString("__Quercus_Class_Definition_Not_Found"),		   env.createString(name));    }    int size = in.readInt();        for (int i = 0; i < size; i++) {      putThisField(env,		   (StringValue) in.readObject(),		   (Value) in.readObject());    }  }  private static String toMethod(char []key, int keyLength)  {    return new String(key, 0, keyLength);  }  @Override  public String toString()  {    return getClass().getSimpleName() + "@" + System.identityHashCode(this) +  "[" + _className + "]";  }    public class EntrySet extends AbstractSet<Map.Entry<Value,Value>> {    EntrySet()    {    }    @Override    public int size()    {      return ObjectExtValue.this.getSize();    }    @Override    public Iterator<Map.Entry<Value,Value>> iterator()    {      return new EntryIterator(ObjectExtValue.this._entries);    }  }  public static class EntryIterator    implements Iterator<Map.Entry<Value,Value>>  {    private final Entry []_list;    private int _index;    private Entry _entry;    EntryIterator(Entry []list)    {      _list = list;    }    public boolean hasNext()    {      if (_entry != null)	return true;            for (; _index < _list.length && _list[_index] == null; _index++) {      }      return _index < _list.length;    }    public Map.Entry<Value,Value> next()    {      if (_entry != null) {	Entry entry = _entry;	_entry = entry._next;	return entry;      }      for (; _index < _list.length && _list[_index] == null; _index++) {      }      if (_list.length <= _index)        return null;      Entry entry = _list[_index++];      _entry = entry._next;      return entry;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public static class ValueIterator    implements Iterator<Value>  {    private final Entry []_list;    private int _index;    private Entry _entry;    ValueIterator(Entry []list)    {      _list = list;    }    public boolean hasNext()    {      if (_entry != null)	return true;            for (; _index < _list.length && _list[_index] == null; _index++) {      }      return _index < _list.length;    }    public Value next()    {      if (_entry != null) {	Entry entry = _entry;	_entry = entry._next;	return entry._value;      }      for (; _index < _list.length && _list[_index] == null; _index++) {      }      if (_list.length <= _index)        return null;      Entry entry = _list[_index++];      _entry = entry._next;      return entry._value;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public static class KeyIterator    implements Iterator<Value>  {    private final Entry []_list;    private int _index;    private Entry _entry;    KeyIterator(Entry []list)    {      _list = list;    }    public boolean hasNext()    {      if (_entry != null)	return true;            for (; _index < _list.length && _list[_index] == null; _index++) {      }      return _index < _list.length;    }    public Value next()    {      if (_entry != null) {	Entry entry = _entry;	_entry = entry._next;	return entry._key;      }      for (; _index < _list.length && _list[_index] == null; _index++) {      }      if (_list.length <= _index)        return null;      Entry entry = _list[_index++];      _entry = entry._next;      return entry._key;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public final static class Entry    implements Map.Entry<Value,Value>,               Comparable<Map.Entry<Value, Value>>  {    private final StringValue _key;    private Value _value;    Entry _prev;    Entry _next;    public Entry(StringValue key)    {      _key = key;      _value = NullValue.NULL;    }    public Entry(StringValue key, Value value)    {      _key = key;      _value = value;    }    public Value getValue()    {      return _value.toValue();    }        public Value getRawValue()    {      return _value;    }    public Value getKey()    {      return _key;    }    public Value toValue()    {      // The value may be a var      // XXX: need test      return _value.toValue();    }    /**     * Argument used/declared as a ref.     */    public Var toRefVar()    {      Var var = _value.toRefVar();      _value = var;            return var;    }    /**     * Converts to an argument value.     */    public Value toArgValue()    {      return _value.toValue();    }    public Value setValue(Value value)    {      Value oldValue = toValue();      _value = value;      return oldValue;    }    /**     * Converts to a variable reference (for function arguments)     */    public Value toRef()    {      Value value = _value;      if (value instanceof Var)        return new RefVar((Var) value);      else {	Var var = new Var(_value);		_value = var;	        return new RefVar(var);      }    }    /**     * Converts to a variable reference (for function  arguments)     */    public Value toArgRef()    {      Value value = _value;      if (value instanceof Var)        return new RefVar((Var) value);      else {	Var var = new Var(_value);		_value = var;	        return new RefVar(var);      }    }    public Value toArg()    {      Value value = _value;      if (value instanceof Var)        return value;      else {	Var var = new Var(_value);		_value = var;	        return var;      }    }    Entry copyTree(Env env, CopyRoot root)    {      return new Entry(_key, _value.copyTree(env, root));    }    public int compareTo(Map.Entry<Value, Value> other)    {      if (other == null)        return 1;      Value thisKey = getKey();      Value otherKey = other.getKey();      if (thisKey == null)        return otherKey == null ? 0 : -1;      if (otherKey == null)        return 1;      return thisKey.cmp(otherKey);    }    public void varDumpImpl(Env env,                            WriteStream out,                            int depth,                            IdentityHashMap<Value, String> valueSet)      throws IOException    {      printDepth(out, 2 * depth);      out.println("[\"" + getKey() + "\"]=>");      printDepth(out, 2 * depth);            _value.varDump(env, out, depth, valueSet);            out.println();    }    protected void printRImpl(Env env,                              WriteStream out,                              int depth,                              IdentityHashMap<Value, String> valueSet)      throws IOException    {      printDepth(out, 4 * depth);      out.print("[" + getKey() + "] => ");            _value.printR(env, out, depth + 1, valueSet);      out.println();    }    private void printDepth(WriteStream out, int depth)      throws java.io.IOException    {      for (int i = 0; i < depth; i++)	out.print(' ');    }    @Override    public String toString()    {      return "ObjectExtValue.Entry[" + getKey() + "]";    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?