/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.quercus.env; import java.io.IOException; import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; import java.net.URL; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.caucho.vfs.WriteStream; /** * Represents a PHP variable value. */ public class Var extends Value implements Serializable { private Value _value; public Var() { _value = NullValue.NULL; } public Var(Value value) { _value = value; } /** * Sets the value. */ @Override public Value set(Value value) { // assert(! value.isVar()); _value = value; // php/151m return this; } public boolean isVar() { return true; } /** * Sets the value, possibly replacing if a var and returning the resulting var * * $a =& (...). */ public Var setRef(Value value) { // php/078d-f if (value.isVar()) return (Var) value; else { // XXX: _value = value; return this; } } /** * Sets the value. */ protected Value setRaw(Value value) { // quercus/0431 _value = value; return this; } /** * Returns the type. */ @Override public String getType() { return _value.getType(); } /* * Returns the type of the resource. */ @Override public String getResourceType() { return _value.getResourceType(); } /** * Returns the ValueType. */ @Override public ValueType getValueType() { return _value.getValueType(); } /** * Returns the class name. */ @Override public String getClassName() { return _value.getClassName(); } /** * Returns true for an object. */ @Override public boolean isObject() { return _value.isObject(); } /* * Returns true for a resource. */ @Override public boolean isResource() { return _value.isResource(); } /** * Returns true for an implementation of a class */ @Override public boolean isA(String name) { return _value.isA(name); } /** * True for a long */ @Override public boolean isLongConvertible() { return _value.isLongConvertible(); } /** * True to a double. */ @Override public boolean isDoubleConvertible() { return _value.isDoubleConvertible(); } /** * True for a number */ @Override public boolean isNumberConvertible() { return _value.isNumberConvertible(); } /** * Returns true for a long-value. */ @Override public boolean isLong() { return _value.isLong(); } /** * Returns true for a long-value. */ @Override public boolean isDouble() { return _value.isDouble(); } /** * Returns true for is_numeric */ @Override public boolean isNumeric() { return _value.isNumeric(); } /** * Returns true for a scalar */ /* public boolean isScalar() { return _value.isScalar(); } */ /** * Returns true for a StringValue. */ @Override public boolean isString() { return _value.isString(); } /** * Returns true for a BinaryValue. */ @Override public boolean isBinary() { return _value.isBinary(); } /** * Returns true for a UnicodeValue. */ @Override public boolean isUnicode() { return _value.isUnicode(); } /** * Returns true for a BooleanValue */ @Override public boolean isBoolean() { return _value.isBoolean(); } /** * Returns true for a DefaultValue */ @Override public boolean isDefault() { return _value.isDefault(); } /** * Returns true if the value is set */ @Override public boolean isset() { return _value.isset(); } /** * Returns true if the value is empty */ @Override public boolean isEmpty() { return _value.isEmpty(); } /** * True if the object is null */ @Override public boolean isNull() { return _value.isNull(); } // // Conversions // @Override public String toString() { return _value.toString(); } /** * Converts to a boolean. */ @Override public boolean toBoolean() { return _value.toBoolean(); } /** * Converts to a long. */ @Override public long toLong() { return _value.toLong(); } /** * Converts to a double. */ @Override public double toDouble() { return _value.toDouble(); } /** * Converts to a long. */ @Override public LongValue toLongValue() { return _value.toLongValue(); } /** * Converts to a double. */ @Override public DoubleValue toDoubleValue() { return _value.toDoubleValue(); } /** * Converts to a string. * @param env */ @Override public StringValue toString(Env env) { return _value.toString(env); } /** * Converts to a java String object. */ @Override public String toJavaString() { if (_value.isObject()) return toString(Env.getInstance()).toString(); else return toString(); } /** * Converts to an object. */ @Override public Object toJavaObject() { return _value.toJavaObject(); } /** * Converts to an object. */ @Override public Object toJavaObject(Env env, Class type) { return _value.toJavaObject(env, type); } /** * Converts to an object. */ @Override public Object toJavaObjectNotNull(Env env, Class type) { return _value.toJavaObjectNotNull(env, type); } /** * Converts to a java Collection object. */ @Override public Collection toJavaCollection(Env env, Class type) { return _value.toJavaCollection(env, type); } /** * Converts to a java List object. */ @Override public List toJavaList(Env env, Class type) { return _value.toJavaList(env, type); } /** * Converts to a java map. */ @Override public Map toJavaMap(Env env, Class type) { return _value.toJavaMap(env, type); } /** * Converts to a Java Calendar. */ @Override public Calendar toJavaCalendar() { return _value.toJavaCalendar(); } /** * Converts to a Java Date. */ @Override public Date toJavaDate() { return _value.toJavaDate(); } /** * Converts to a Java URL. */ @Override public URL toJavaURL(Env env) { return _value.toJavaURL(env); } /** * Converts to a Java BigDecimal. */ @Override public BigDecimal toBigDecimal() { return _value.toBigDecimal(); } /** * Converts to a Java BigInteger. */ @Override public BigInteger toBigInteger() { return _value.toBigInteger(); } /** * Converts to an array */ @Override public Value toArray() { return _value.toArray(); } /** * Converts to an array */ @Override public ArrayValue toArrayValue(Env env) { return _value.toArrayValue(env); } /** * Converts to an array */ @Override public Value toAutoArray() { _value = _value.toAutoArray(); // php/03mg return this; } /** * Converts to an object. */ @Override public Value toObject(Env env) { return _value.toObject(env); } // // marshal costs // /** * Cost to convert to a boolean */ @Override public int toBooleanMarshalCost() { return _value.toBooleanMarshalCost(); } /** * Cost to convert to a byte */ @Override public int toByteMarshalCost() { return _value.toByteMarshalCost(); } /** * Cost to convert to a short */ @Override public int toShortMarshalCost() { return _value.toShortMarshalCost(); } /** * Cost to convert to an integer */ @Override public int toIntegerMarshalCost() { return _value.toIntegerMarshalCost(); } /** * Cost to convert to a long */ @Override public int toLongMarshalCost() { return _value.toLongMarshalCost(); } /** * Cost to convert to a double */ @Override public int toDoubleMarshalCost() { return _value.toDoubleMarshalCost(); } /** * Cost to convert to a float */ @Override public int toFloatMarshalCost() { return _value.toFloatMarshalCost(); } /** * Cost to convert to a character */ @Override public int toCharMarshalCost() { return _value.toCharMarshalCost(); } /** * Cost to convert to a string */ @Override public int toStringMarshalCost() { return _value.toStringMarshalCost(); } /** * Cost to convert to a byte[] */ @Override public int toByteArrayMarshalCost() { return _value.toByteArrayMarshalCost(); } /** * Cost to convert to a char[] */ @Override public int toCharArrayMarshalCost() { return _value.toCharArrayMarshalCost(); } /** * Cost to convert to a Java object */ @Override public int toJavaObjectMarshalCost() { return _value.toJavaObjectMarshalCost(); } /** * Cost to convert to a binary value */ @Override public int toBinaryValueMarshalCost() { return _value.toBinaryValueMarshalCost(); } /** * Cost to convert to a StringValue */ @Override public int toStringValueMarshalCost() { return _value.toStringValueMarshalCost(); } /** * Cost to convert to a UnicdeValue */ @Override public int toUnicodeValueMarshalCost() { return _value.toUnicodeValueMarshalCost(); } /** * Append to a unicode builder. */ @Override public StringValue appendTo(UnicodeBuilderValue sb) { return _value.appendTo(sb); } /** * Append to a binary builder. */ @Override public StringValue appendTo(BinaryBuilderValue sb) { return _value.appendTo(sb); } /** * Append to a string builder. */ @Override public StringValue appendTo(StringBuilderValue sb) { return _value.appendTo(sb); } /** * Append to a string builder. */ @Override public StringValue appendTo(LargeStringBuilderValue sb) { return _value.appendTo(sb); } /** * Returns to the value value. */ public final Value getRawValue() { return _value; } /** * Converts to a raw value. */ @Override public final Value toValue() { return _value; } /** * Converts to a function argument value that is never assigned or modified. */ @Override public Value toLocalValueReadOnly() { return _value; } /** * Converts to a raw value. */ @Override public Value toLocalValue() { return _value.copy(); } /** * Convert to a function argument value, e.g. for * * function foo($a) * * where $a may be assigned. */ @Override public Value toLocalRef() { return _value; } /** * Converts to a function argument ref value, i.e. an argument * declared as a reference, but not assigned */ @Override public Value toRefValue() { // php/344r return _value.toRefValue(); } /** * Converts to a variable */ @Override public Var toVar() { // php/3d04 // return new Var(_value.toArgValue()); return this; } /** * Converts to a local argument variable */ @Override public Var toLocalVar() { return new Var(_value.toLocalValue()); } /** * Converts to a reference variable */ @Override public Var toLocalVarDeclAsRef() { return this; } /** * Converts to a reference variable */ @Override public Value toArgRef() { return new ArgRef(this); } /** * Converts to a key. */ @Override public Value toKey() { return _value.toKey(); } @Override public StringValue toStringValue() { return _value.toStringValue(); } @Override public StringValue toStringValue(Env env) { return _value.toStringValue(env); } @Override public StringValue toBinaryValue(Env env) { return _value.toBinaryValue(env); } @Override public StringValue toUnicode(Env env) { return _value.toUnicode(env); } @Override public StringValue toUnicodeValue(Env env) { return _value.toUnicodeValue(env); } @Override public StringValue toStringBuilder() { return _value.toStringBuilder(); } @Override public StringValue toStringBuilder(Env env) { return _value.toStringBuilder(env); } /** * Converts to a string builder */ @Override public StringValue toStringBuilder(Env env, Value value) { return _value.toStringBuilder(env, value); } /** * Converts to a string builder */ public StringValue toStringBuilder(Env env, StringValue value) { return _value.toStringBuilder(env, value); } @Override public java.io.InputStream toInputStream() { return _value.toInputStream(); } @Override public Callable toCallable(Env env) { return _value.toCallable(env); } // // Operations // /** * Copy the value. */ @Override public Value copy() { // php/041d return _value.copy(); } /** * Copy for serialization */ public Value copyTree(Env env, CopyRoot root) { return _value.copyTree(env, root); } /** * Clone for the clone keyword */ @Override public Value clone(Env env) { return _value.clone(env); } /** * Copy the value as an array item. */ @Override public Value copyArrayItem() { // php/041d return this; } /** * Copy the value as a return value. */ @Override public Value copyReturn() { return _value.copy(); } /** * Converts to a variable reference (for function arguments) */ @Override public Value toRef() { // return new ArgRef(this); return this; } /** * Returns true for an array. */ @Override public boolean isArray() { return _value.isArray(); } /** * Negates the value. */ @Override public Value neg() { return _value.neg(); } /** * Adds to the following value. */ @Override public Value add(Value rValue) { return _value.add(rValue); } /** * Adds to the following value. */ @Override public Value add(long rValue) { return _value.add(rValue); } /** * Pre-increment the following value. */ @Override public Value preincr(int incr) { _value = _value.increment(incr); return _value; } /** * Post-increment the following value. */ @Override public Value postincr(int incr) { Value value = _value; _value = value.increment(incr); return value; } /** * Pre-increment the following value. */ @Override public Value addOne() { return _value.addOne(); } /** * Pre-increment the following value. */ @Override public Value subOne() { return _value.subOne(); } /** * Pre-increment the following value. */ @Override public Value preincr() { _value = _value.preincr(); return _value; } /** * Pre-increment the following value. */ @Override public Value predecr() { _value = _value.predecr(); return _value; } /** * Post-increment the following value. */ @Override public Value postincr() { Value value = _value; _value = value.postincr(); return value; } /** * Post-increment the following value. */ @Override public Value postdecr() { Value value = _value; _value = value.postdecr(); return value; } /** * Increment the following value. */ @Override public Value increment(int incr) { return _value.increment(incr); } /** * Subtracts to the following value. */ @Override public Value sub(Value rValue) { return _value.sub(rValue); } /** * Subtracts to the following value. */ @Override public Value sub(long rValue) { return _value.sub(rValue); } /** * Multiplies to the following value. */ @Override public Value mul(Value rValue) { return _value.mul(rValue); } /** * Multiplies to the following value. */ @Override public Value mul(long lValue) { return _value.mul(lValue); } /** * Divides the following value. */ @Override public Value div(Value rValue) { return _value.div(rValue); } /** * Shifts left by the value. */ @Override public Value lshift(Value rValue) { return _value.lshift(rValue); } /** * Shifts right by the value. */ @Override public Value rshift(Value rValue) { return _value.rshift(rValue); } /** * Binary And. */ public Value bitAnd(Value rValue) { return _value.bitAnd(rValue); } /** * Binary or. */ public Value bitOr(Value rValue) { return _value.bitOr(rValue); } /** * Binary xor. */ @Override public Value bitXor(Value rValue) { return _value.bitXor(rValue); } /** * Absolute value. */ public Value abs() { return _value.abs(); } /** * Returns true for equality */ @Override public boolean eq(Value rValue) { return _value.eq(rValue); } /** * Returns true for equality */ @Override public boolean eql(Value rValue) { return _value.eql(rValue); } /** * Compares the two values */ @Override public int cmp(Value rValue) { return _value.cmp(rValue); } /** * Returns true for less than */ @Override public boolean lt(Value rValue) { // php/335h return _value.lt(rValue); } /** * Returns true for less than or equal to */ @Override public boolean leq(Value rValue) { // php/335h return _value.leq(rValue); } /** * Returns true for greater than */ @Override public boolean gt(Value rValue) { // php/335h return _value.gt(rValue); } /** * Returns true for greater than or equal to */ @Override public boolean geq(Value rValue) { // php/335h return _value.geq(rValue); } /** * Returns the length as a string. */ @Override public int length() { return _value.length(); } /** * Returns the array/object size */ @Override public int getSize() { return _value.getSize(); } /** * Returns the count, as returned by the global php count() function */ public int getCount(Env env) { return _value.getCount(env); } /** * Returns the count, as returned by the global php count() function */ public int getCountRecursive(Env env) { return _value.getCountRecursive(env); } @Override public Iterator<Map.Entry<Value, Value>> getIterator(Env env) { return _value.getIterator(env); } @Override public Iterator<Value> getKeyIterator(Env env) { return _value.getKeyIterator(env); } @Override public Iterator<Value> getValueIterator(Env env) { return _value.getValueIterator(env); } /** * Returns the array ref. */ @Override public Value getArray() { if (! _value.isset()) _value = new ArrayValueImpl(); return _value; } /** * Returns the value, creating an object if unset. */ @Override public Value getObject(Env env) { if (! _value.isset()) _value = env.createObject(); return _value; } /** * Returns the array ref. */ @Override public Value get(Value index) { return _value.get(index); } /** * Returns the array ref. */ @Override public Var getVar(Value index) { // php/3d1a // php/34ab if (! _value.toBoolean()) _value = new ArrayValueImpl(); return _value.getVar(index); } /** * Returns the array ref. */ @Override public Value getArg(Value index, boolean isTop) { // php/0921, php/3921 if (_value.isset()) return _value.getArg(index, isTop); else return new ArgGetValue(this, index); // php/3d2p } /** * Returns the value, creating an object if unset. */ @Override public Value getArray(Value index) { // php/3d11 _value = _value.toAutoArray(); return _value.getArray(index); } /** * Returns the value, doing a copy-on-write if needed. */ @Override public Value getDirty(Value index) { return _value.getDirty(index); } /** * Returns the value, creating an object if unset. */ @Override public Value getObject(Env env, Value index) { // php/3d2p _value = _value.toAutoArray(); return _value.getObject(env, index); } /** * Returns the array ref. */ @Override public Value put(Value index, Value value) { // php/33m{g,h} // _value = _value.toAutoArray().append(index, value); _value = _value.append(index, value); // this is slow, but ok because put() is only used for slow ops if (_value.isArray() || _value.isObject()) { return value; } else { // for strings return _value.get(index); } } /** * Sets the array value, returning the new array, e.g. to handle * string update ($a[0] = 'A'). */ @Override public Value append(Value index, Value value) { // php/323g _value = _value.append(index, value); return _value; } /** * Returns the array ref. */ @Override public Value put(Value value) { _value = _value.toAutoArray(); return _value.put(value); } /** * Returns the array ref. */ @Override public Var putVar() { _value = _value.toAutoArray(); return _value.putVar(); } /** * Return true if the array value is set */ @Override public boolean isset(Value index) { return _value.isset(index); } /** * Return unset the value. */ @Override public Value remove(Value index) { return _value.remove(index); } // // Field references // /** * Returns the field value. */ @Override public Value getField(Env env, StringValue name) { return _value.getField(env, name); } /** * Returns the field ref. */ @Override public Var getFieldVar(Env env, StringValue name) { // php/3a0r _value = _value.toAutoObject(env); return _value.getFieldVar(env, name); } /** * Returns the array ref. */ @Override public Value getFieldArg(Env env, StringValue name, boolean isTop) { if (_value.isset()) return _value.getFieldArg(env, name, isTop); else { // php/3d1q return new ArgGetFieldValue(env, this, name); } } /** * Returns the field value as an array */ @Override public Value getFieldArray(Env env, StringValue name) { // php/3d1q _value = _value.toAutoObject(env); return _value.getFieldArray(env, name); } /** * Returns the field value as an object */ @Override public Value getFieldObject(Env env, StringValue name) { _value = _value.toAutoObject(env); return _value.getFieldObject(env, name); } /** * Sets the field. */ @Override public Value putField(Env env, StringValue name, Value value) { // php/3a0s _value = _value.toAutoObject(env); return _value.putField(env, name, value); } /** * Returns true if the field is set. */ @Override public boolean issetField(StringValue name) { return _value.issetField(name); } /** * Unsets the field. */ @Override public void unsetField(StringValue name) { _value.unsetField(name); } /** * Returns the field value. */ @Override public Value getThisField(Env env, StringValue name) { return _value.getThisField(env, name); } /** * Returns the field ref. */ @Override public Var getThisFieldVar(Env env, StringValue name) { return _value.getThisFieldVar(env, name); } /** * Returns the array ref. */ @Override public Value getThisFieldArg(Env env, StringValue name) { return _value.getThisFieldArg(env, name); } /** * Returns the field value as an array */ @Override public Value getThisFieldArray(Env env, StringValue name) { return _value.getThisFieldArray(env, name); } /** * Returns the field value as an object */ @Override public Value getThisFieldObject(Env env, StringValue name) { return _value.getThisFieldObject(env, name); } /** * Initializes a new field, does not call __set if it is defined. */ public void initField(StringValue key, Value value, FieldVisibility visibility) { _value.initField(key, value, visibility); } /** * Sets the field. */ @Override public Value putThisField(Env env, StringValue name, Value value) { return _value.putThisField(env, name, value); } /** * Returns true if the field is set. */ @Override public boolean issetThisField(StringValue name) { return _value.issetThisField(name); } /** * Unsets the field. */ @Override public void unsetThisField(StringValue name) { _value.unsetThisField(name); } // // array routines // /** * Takes the values of this array, unmarshalls them to objects of type * <i>elementType</i>, and puts them in a java array. */ @Override public Object valuesToArray(Env env, Class elementType) { return _value.valuesToArray(env, elementType); } /** * Returns the character at an index */ @Override public Value charValueAt(long index) { return _value.charValueAt(index); } /** * Sets the character at an index */ @Override public Value setCharValueAt(long index, Value value) { // php/03mg _value = _value.setCharValueAt(index, value); return _value; } /** * Returns true if there are more elements. */ @Override public boolean hasCurrent() { return _value.hasCurrent(); } /** * Returns the current key */ @Override public Value key() { return _value.key(); } /** * Returns the current value */ @Override public Value current() { return _value.current(); } /** * Returns the current value */ @Override public Value next() { return _value.next(); } /** * Returns the previous value */ @Override public Value prev() { return _value.prev(); } /** * Returns the end value. */ @Override public Value end() { return _value.end(); } /** * Returns the array pointer. */ @Override public Value reset() { return _value.reset(); } /** * Shuffles the array. */ @Override public Value shuffle() { return _value.shuffle(); } /** * Pops the top array element. */ @Override public Value pop(Env env) { return _value.pop(env); } // // function calls // /** * Evaluates the function. */ public Value call(Env env, Value []args) { return _value.call(env, args); } /** * Evaluates the function, returning a reference. */ public Value callRef(Env env, Value []args) { return _value.callRef(env, args); } /** * Evaluates the function, returning a copy */ public Value callCopy(Env env, Value []args) { return _value.callCopy(env, args); } /** * Evaluates the function. */ @Override public Value call(Env env) { return _value.call(env); } /** * Evaluates the function. */ @Override public Value callRef(Env env) { return _value.callRef(env); } /** * Evaluates the function with an argument . */ @Override public Value call(Env env, Value a1) { return _value.call(env, a1); } /** * Evaluates the function with an argument . */ @Override public Value callRef(Env env, Value a1) { return _value.callRef(env, a1); } /** * Evaluates the function with arguments */ @Override public Value call(Env env, Value a1, Value a2) { return _value.call(env, a1, a2); } /** * Evaluates the function with arguments */ @Override public Value callRef(Env env, Value a1, Value a2) { return _value.callRef(env, a1, a2); } /** * Evaluates the function with arguments */ @Override public Value call(Env env, Value a1, Value a2, Value a3) { return _value.call(env, a1, a2, a3); } /** * Evaluates the function with arguments */ @Override public Value callRef(Env env, Value a1, Value a2, Value a3) { return _value.callRef(env, a1, a2, a3); } /** * Evaluates the function with arguments */ @Override public Value call(Env env, Value a1, Value a2, Value a3, Value a4) { return _value.call(env, a1, a2, a3, a4); } /** * Evaluates the function with arguments */ @Override public Value callRef(Env env, Value a1, Value a2, Value a3, Value a4) { return _value.callRef(env, a1, a2, a3, a4); } /** * Evaluates the function with arguments */ @Override public Value call(Env env, Value a1, Value a2, Value a3, Value a4, Value a5) { return _value.call(env, a1, a2, a3, a4, a5); } /** * Evaluates the function with arguments */ @Override public Value callRef(Env env, Value a1, Value a2, Value a3, Value a4, Value a5) { return _value.callRef(env, a1, a2, a3, a4, a5); } // // method calls // /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value []args) { return _value.callMethod(env, methodName, hash, args); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value []args) { return _value.callMethodRef(env, methodName, hash, args); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash) { return _value.callMethod(env, methodName, hash); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash) { return _value.callMethodRef(env, methodName, hash); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1) { return _value.callMethod(env, methodName, hash, a1); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1) { return _value.callMethodRef(env, methodName, hash, a1); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1, Value a2) { return _value.callMethod(env, methodName, hash, a1, a2); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2) { return _value.callMethodRef(env, methodName, hash, a1, a2); } /** * Evaluates a method with 3 args. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3) { return _value.callMethod(env, methodName, hash, a1, a2, a3); } /** * Evaluates a method with 3 args. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3) { return _value.callMethodRef(env, methodName, hash, a1, a2, a3); } /** * Evaluates a method with 4 args. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3, Value a4) { return _value.callMethod(env, methodName, hash, a1, a2, a3, a4); } /** * Evaluates a method with 4 args. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3, Value a4) { return _value.callMethodRef(env, methodName, hash, a1, a2, a3, a4); } /** * Evaluates a method with 5 args. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3, Value a4, Value a5) { return _value.callMethod(env, methodName, hash, a1, a2, a3, a4, a5); } /** * Evaluates a method with 5 args. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3, Value a4, Value a5) { return _value.callMethodRef(env, methodName, hash, a1, a2, a3, a4, a5); } /** * Evaluates a method. */ /* @Override public Value callClassMethod(Env env, AbstractFunction fun, Value []args) { return _value.callClassMethod(env, fun, args); } */ /** * Prints the value. * @param env */ @Override public void print(Env env) { _value.print(env); } /** * Prints the value. * @param env */ @Override public void print(Env env, WriteStream out) { _value.print(env, out); } /** * Serializes the value. */ @Override public void serialize(Env env, StringBuilder sb) { _value.serialize(env, sb); } /* * Serializes the value. * * @param sb holds result of serialization * @param serializeMap holds reference indexes */ @Override public void serialize(Env env, StringBuilder sb, SerializeMap serializeMap) { Integer index = serializeMap.get(this); if (index != null) { sb.append("R:"); sb.append(index); sb.append(";"); } else { serializeMap.put(this); _value.serialize(env, sb, serializeMap); } } /** * Encodes the value in JSON. */ @Override public void jsonEncode(Env env, StringValue sb) { _value.jsonEncode(env, sb); } @Override public void varDumpImpl(Env env, WriteStream out, int depth, IdentityHashMap<Value, String> valueSet) throws IOException { out.print("&"); _value.varDump(env, out, depth, valueSet); } // // Java Serialization // public Object writeReplace() { return _value; } }