/* * 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 com.caucho.quercus.expr.Expr; import com.caucho.quercus.function.AbstractFunction; import com.caucho.vfs.WriteStream; import java.io.IOException; import java.io.Serializable; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; /** * Represents a reference to a PHP variable in a function call. */ public class ArgRef extends Value implements Serializable { private Var _var; public ArgRef(Var var) { _var = var; } @Override public boolean hasCurrent() { return _var.hasCurrent(); } /** * Returns true for an implementation of a class */ @Override public boolean isA(String name) { return _var.isA(name); } /** * True for a long */ @Override public boolean isLongConvertible() { return _var.isLongConvertible(); } /** * True to a double. */ @Override public boolean isDoubleConvertible() { return _var.isDoubleConvertible(); } /** * True for a number */ @Override public boolean isNumberConvertible() { return _var.isNumberConvertible(); } /** * Returns true for a long-value. */ public boolean isLong() { return _var.isLong(); } /** * Returns true for a long-value. */ public boolean isDouble() { return _var.isDouble(); } @Override public ArrayValue toArrayValue(Env env) { // php/3co1 return _var.toArrayValue(env); } /** * Converts to a boolean. */ @Override public boolean toBoolean() { return _var.toBoolean(); } /** * Converts to a long. */ @Override public long toLong() { return _var.toLong(); } /** * Converts to a double. */ @Override public double toDouble() { return _var.toDouble(); } /** * Converts to a string. * @param env */ @Override public StringValue toString(Env env) { return _var.toString(env); } /** * Converts to an object. */ @Override public Value toObject(Env env) { return _var.toObject(env); } /** * Converts to an object. */ @Override public Object toJavaObject() { return _var.toJavaObject(); } /** * Converts to a raw value. */ @Override public Value toValue() { return _var.toValue(); } /** * Returns true for an object. */ @Override public boolean isObject() { return _var.isObject(); } /** * Returns true for an array. */ @Override public boolean isArray() { return _var.isArray(); } /** * Copy the value. */ @Override public Value copy() { // quercus/0d05 return this; } /** * Converts to an argument value. */ @Override public Value toLocalValueReadOnly() { return _var; } /** * Converts to an argument value. */ @Override public Value toLocalValue() { // php/0471, php/3d4a return _var.toLocalValue(); } /** * Converts to an argument value. */ @Override public Value toLocalRef() { return _var; } /** * Converts to an argument value. */ @Override public Var toLocalVar() { return _var; } /** * Converts to an argument value. */ @Override public Value toRefValue() { return _var; } /** * Converts to a variable */ @Override public Var toVar() { return _var; } /** * Converts to a reference variable */ @Override public Var toLocalVarDeclAsRef() { return _var; } @Override public StringValue toStringValue() { return _var.toStringValue(); } @Override public StringValue toBinaryValue(Env env) { return _var.toBinaryValue(env); } @Override public StringValue toUnicodeValue(Env env) { return _var.toUnicodeValue(env); } @Override public StringValue toStringBuilder() { return _var.toStringBuilder(); } @Override public StringValue toStringBuilder(Env env) { return _var.toStringBuilder(env); } @Override public java.io.InputStream toInputStream() { return _var.toInputStream(); } @Override public Value append(Value index, Value value) { return _var.append(index, value); } @Override public Value containsKey(Value key) { return _var.containsKey(key); } @Override public Value copyArrayItem() { return _var.copyArrayItem(); } @Override public Value current() { return _var.current(); } @Override public Value getArray() { return _var.getArray(); } @Override public Value getArray(Value index) { return _var.getArray(index); } @Override public int getCount(Env env) { return _var.getCount(env); } @Override public Value[] getKeyArray(Env env) { return _var.getKeyArray(env); } @Override public Value key() { return _var.key(); } @Override public Value next() { return _var.next(); } @Override public Value toArray() { return _var.toArray(); } @Override public Value toAutoArray() { return _var.toAutoArray(); } /** * Negates the value. */ @Override public Value neg() { return _var.neg(); } /** * Adds to the following value. */ @Override public Value add(Value rValue) { return _var.add(rValue); } /** * Adds to the following value. */ @Override public Value add(long rValue) { return _var.add(rValue); } /** * Pre-increment the following value. */ @Override public Value preincr(int incr) { return _var.preincr(incr); } /** * Post-increment the following value. */ @Override public Value postincr(int incr) { return _var.postincr(incr); } /** * Increment the following value. */ @Override public Value increment(int incr) { return _var.increment(incr); } /** * Subtracts to the following value. */ @Override public Value sub(Value rValue) { return _var.sub(rValue); } /** * Subtracts to the following value. */ @Override public Value sub(long rValue) { return _var.sub(rValue); } /** * Multiplies to the following value. */ @Override public Value mul(Value rValue) { return _var.mul(rValue); } /** * Multiplies to the following value. */ @Override public Value mul(long lValue) { return _var.mul(lValue); } /** * Divides the following value. */ @Override public Value div(Value rValue) { return _var.div(rValue); } /** * Shifts left by the value. */ @Override public Value lshift(Value rValue) { return _var.lshift(rValue); } /** * Shifts right by the value. */ @Override public Value rshift(Value rValue) { return _var.rshift(rValue); } /** * Absolute value. */ public Value abs() { return _var.abs(); } /** * Returns true for equality */ @Override public boolean eql(Value rValue) { return _var.eql(rValue); } /** * Returns the array/object size */ @Override public int getSize() { return _var.getSize(); } @Override public Iterator<Map.Entry<Value, Value>> getIterator(Env env) { return _var.getIterator(env); } @Override public Iterator<Value> getKeyIterator(Env env) { return _var.getKeyIterator(env); } @Override public Iterator<Value> getValueIterator(Env env) { return _var.getValueIterator(env); } /** * Returns the array ref. */ @Override public Value get(Value index) { return _var.get(index); } /** * Returns the array ref. */ @Override public Var getVar(Value index) { return _var.getVar(index); } /** * Returns the array ref. */ @Override public Value put(Value index, Value value) { return _var.put(index, value); } /** * Returns the array ref. */ @Override public Value put(Value value) { return _var.put(value); } /** * Returns the character at an index */ /* XXX: need test first public Value charAt(long index) { return _ref.charAt(index); } */ /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value []args) { return _var.callMethod(env, methodName, hash, args); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash) { return _var.callMethod(env, methodName, hash); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1) { return _var.callMethod(env, methodName, hash, a1); } /** * Evaluates a method. */ @Override public Value callMethod(Env env, StringValue methodName, int hash, Value a1, Value a2) { return _var.callMethod(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 _var.callMethod(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 _var.callMethod(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 _var.callMethod(env, methodName, hash, a1, a2, a3, a4, a5); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value []args) { return _var.callMethodRef(env, methodName, hash, args); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash) { return _var.callMethodRef(env, methodName, hash); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1) { return _var.callMethodRef(env, methodName, hash, a1); } /** * Evaluates a method. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2) { return _var.callMethodRef(env, methodName, hash, a1, a2); } /** * Evaluates a method with 3 args. */ @Override public Value callMethodRef(Env env, StringValue methodName, int hash, Value a1, Value a2, Value a3) { return _var.callMethodRef(env, methodName, hash, a1, a2, a3); } /** * 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 _var.callMethodRef(env, methodName, hash, a1, a2, a3, a4); } /** * 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 _var.callMethodRef(env, methodName, hash, a1, a2, a3, a4, a5); } /** * Evaluates a method. */ /* @Override public Value callClassMethod(Env env, AbstractFunction fun, Value []args) { return _var.callClassMethod(env, fun, args); } */ /** * Serializes the value. */ public void serialize(Env env, StringBuilder sb) { _var.serialize(env, sb); } /* * Serializes the value. * * @param sb holds result of serialization * @param serializeMap holds reference indexes */ public void serialize(Env env, StringBuilder sb, SerializeMap serializeMap) { _var.serialize(env, sb, serializeMap); } /** * Prints the value. * @param env */ @Override public void print(Env env) { _var.print(env); } @Override public void varDumpImpl(Env env, WriteStream out, int depth, IdentityHashMap<Value,String> valueSet) throws IOException { out.print("&"); toValue().varDumpImpl(env, out, depth, valueSet); } @Override protected void printRImpl(Env env, WriteStream out, int depth, IdentityHashMap<Value, String> valueSet) throws IOException { toValue().printRImpl(env, out, depth, valueSet); } // // Java Serialization // public Object writeReplace() { return _var; } }