001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Scott Ferguson
028: */
029:
030: package com.caucho.quercus.expr;
031:
032: import com.caucho.quercus.Location;
033: import com.caucho.quercus.env.ArrayValue;
034: import com.caucho.quercus.env.ArrayValueImpl;
035: import com.caucho.quercus.env.Env;
036: import com.caucho.quercus.env.NullValue;
037: import com.caucho.quercus.env.Value;
038:
039: /**
040: * Represents a PHP variable expression.
041: */
042: public class VarVarExpr extends AbstractVarExpr {
043: private static final NullValue NULL = NullValue.create();
044:
045: protected final Expr _var;
046:
047: public VarVarExpr(Location location, Expr var) {
048: super (location);
049: _var = var;
050: }
051:
052: public VarVarExpr(Expr var) {
053: _var = var;
054: }
055:
056: public Expr getExpr() {
057: return _var;
058: }
059:
060: /**
061: * Evaluates the expression.
062: *
063: * @param env the calling environment.
064: *
065: * @return the expression value.
066: */
067: public Value eval(Env env) {
068: String varName = _var.evalString(env).intern();
069:
070: Value value = env.getValue(varName);
071:
072: if (value != null)
073: return value;
074: else
075: return NULL;
076: }
077:
078: /**
079: * Evaluates the expression, returning a copy as necessary.
080: *
081: * @param env the calling environment.
082: *
083: * @return the expression value.
084: */
085: public Value evalCopy(Env env) {
086: String varName = _var.evalString(env).intern();
087:
088: Value value = env.getValue(varName);
089:
090: if (value != null)
091: return value.copy();
092: else
093: return NULL;
094: }
095:
096: /**
097: * Evaluates the expression.
098: *
099: * @param env the calling environment.
100: *
101: * @return the expression value.
102: */
103: public void evalAssign(Env env, Value value) {
104: String varName = _var.evalString(env).intern();
105:
106: env.getVar(varName).set(value);
107: }
108:
109: /**
110: * Evaluates the expression.
111: *
112: * @param env the calling environment.
113: *
114: * @return the expression value.
115: */
116: public void evalUnset(Env env) {
117: String varName = _var.evalString(env).intern();
118:
119: env.unsetVar(varName);
120: }
121:
122: /**
123: * Evaluates the expression.
124: *
125: * @param env the calling environment.
126: *
127: * @return the expression value.
128: */
129: public Value evalRef(Env env) {
130: String varName = _var.evalString(env).intern();
131:
132: Value value = env.getVar(varName);
133:
134: if (value != null)
135: return value;
136: else
137: return NULL;
138: }
139:
140: /**
141: * Evaluates the expression.
142: *
143: * @param env the calling environment.
144: *
145: * @return the expression value.
146: */
147: public Value evalArg(Env env) {
148: String varName = _var.evalString(env).intern();
149:
150: Value value = env.getVar(varName);
151:
152: if (value != null)
153: return value;
154: else
155: return NULL;
156: }
157:
158: /**
159: * Evaluates the expression, converting to an array if necessary.
160: *
161: * @param env the calling environment.
162: *
163: * @return the expression value.
164: */
165: public Value evalArray(Env env) {
166: String varName = _var.evalString(env).intern();
167:
168: Value value = env.getVar(varName);
169:
170: if (value != null)
171: return value.getArray();
172: else {
173: ArrayValue array = new ArrayValueImpl();
174:
175: env.setVar(varName, array);
176:
177: return array;
178: }
179: }
180:
181: public String toString() {
182: return "$" + _var;
183: }
184: }
|