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 + -
显示快捷键?