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.env;
031:
032: import com.caucho.quercus.expr.Expr;
033: import com.caucho.quercus.program.AbstractFunction;
034: import com.caucho.vfs.WriteStream;
035:
036: import java.io.IOException;
037: import java.io.Serializable;
038: import java.util.IdentityHashMap;
039: import java.util.Iterator;
040: import java.util.Map;
041:
042: /**
043: * Represents a reference to a PHP variable in a function call.
044: */
045: public class RefVar extends Value implements Serializable {
046: private Var _var;
047:
048: public RefVar(Var var) {
049: _var = var;
050: }
051:
052: /**
053: * Returns true for an implementation of a class
054: */
055: @Override
056: public boolean isA(String name) {
057: return _var.isA(name);
058: }
059:
060: /**
061: * True for a long
062: */
063: @Override
064: public boolean isLongConvertible() {
065: return _var.isLongConvertible();
066: }
067:
068: /**
069: * True to a double.
070: */
071: @Override
072: public boolean isDoubleConvertible() {
073: return _var.isDoubleConvertible();
074: }
075:
076: /**
077: * True for a number
078: */
079: @Override
080: public boolean isNumberConvertible() {
081: return _var.isNumberConvertible();
082: }
083:
084: /**
085: * Converts to a boolean.
086: */
087: @Override
088: public boolean toBoolean() {
089: return _var.toBoolean();
090: }
091:
092: /**
093: * Converts to a long.
094: */
095: @Override
096: public long toLong() {
097: return _var.toLong();
098: }
099:
100: /**
101: * Converts to a double.
102: */
103: @Override
104: public double toDouble() {
105: return _var.toDouble();
106: }
107:
108: /**
109: * Converts to a string.
110: * @param env
111: */
112: @Override
113: public StringValue toString(Env env) {
114: return _var.toString(env);
115: }
116:
117: /**
118: * Converts to an object.
119: */
120: @Override
121: public Value toObject(Env env) {
122: return _var.toObject(env);
123: }
124:
125: /**
126: * Converts to an object.
127: */
128: @Override
129: public Object toJavaObject() {
130: return _var.toJavaObject();
131: }
132:
133: /**
134: * Converts to a raw value.
135: */
136: @Override
137: public Value toValue() {
138: return _var.toValue();
139: }
140:
141: /**
142: * Returns true for an object.
143: */
144: @Override
145: public boolean isObject() {
146: return _var.isObject();
147: }
148:
149: /**
150: * Returns true for an array.
151: */
152: @Override
153: public boolean isArray() {
154: return _var.isArray();
155: }
156:
157: /**
158: * Copy the value.
159: */
160: @Override
161: public Value copy() {
162: // quercus/0d05
163: return this ;
164: }
165:
166: /**
167: * Converts to an argument value.
168: */
169: @Override
170: public Value toArgValueReadOnly() {
171: return _var;
172: }
173:
174: /**
175: * Converts to an argument value.
176: */
177: @Override
178: public Value toArgValue() {
179: // php/343k
180: return _var;
181: }
182:
183: /**
184: * Converts to an argument value.
185: */
186: @Override
187: public Value toRefValue() {
188: return _var;
189: }
190:
191: /**
192: * Converts to a variable
193: */
194: @Override
195: public Var toVar() {
196: return _var;
197: }
198:
199: /**
200: * Converts to a reference variable
201: */
202: @Override
203: public Var toRefVar() {
204: return _var;
205: }
206:
207: /**
208: * Negates the value.
209: */
210: @Override
211: public Value neg() {
212: return _var.neg();
213: }
214:
215: /**
216: * Adds to the following value.
217: */
218: @Override
219: public Value add(Value rValue) {
220: return _var.add(rValue);
221: }
222:
223: /**
224: * Adds to the following value.
225: */
226: @Override
227: public Value add(long rValue) {
228: return _var.add(rValue);
229: }
230:
231: /**
232: * Pre-increment the following value.
233: */
234: @Override
235: public Value preincr(int incr) {
236: return _var.preincr(incr);
237: }
238:
239: /**
240: * Post-increment the following value.
241: */
242: @Override
243: public Value postincr(int incr) {
244: return _var.postincr(incr);
245: }
246:
247: /**
248: * Subtracts to the following value.
249: */
250: @Override
251: public Value sub(Value rValue) {
252: return _var.sub(rValue);
253: }
254:
255: /**
256: * Subtracts to the following value.
257: */
258: @Override
259: public Value sub(long rValue) {
260: return _var.sub(rValue);
261: }
262:
263: /**
264: * Multiplies to the following value.
265: */
266: @Override
267: public Value mul(Value rValue) {
268: return _var.mul(rValue);
269: }
270:
271: /**
272: * Multiplies to the following value.
273: */
274: @Override
275: public Value mul(long lValue) {
276: return _var.mul(lValue);
277: }
278:
279: /**
280: * Divides the following value.
281: */
282: @Override
283: public Value div(Value rValue) {
284: return _var.div(rValue);
285: }
286:
287: /**
288: * Shifts left by the value.
289: */
290: @Override
291: public Value lshift(Value rValue) {
292: return _var.lshift(rValue);
293: }
294:
295: /**
296: * Shifts right by the value.
297: */
298: @Override
299: public Value rshift(Value rValue) {
300: return _var.rshift(rValue);
301: }
302:
303: /**
304: * Returns true for equality
305: */
306: @Override
307: public boolean eql(Value rValue) {
308: return _var.eql(rValue);
309: }
310:
311: /**
312: * Returns the array/object size
313: */
314: @Override
315: public int getSize() {
316: return _var.getSize();
317: }
318:
319: @Override
320: public Iterator<Map.Entry<Value, Value>> getIterator(Env env) {
321: return _var.getIterator(env);
322: }
323:
324: @Override
325: public Iterator<Value> getKeyIterator(Env env) {
326: return _var.getKeyIterator(env);
327: }
328:
329: @Override
330: public Iterator<Value> getValueIterator(Env env) {
331: return _var.getValueIterator(env);
332: }
333:
334: /**
335: * Returns the array ref.
336: */
337: @Override
338: public Value get(Value index) {
339: return _var.get(index);
340: }
341:
342: /**
343: * Returns the array ref.
344: */
345: @Override
346: public Value getRef(Value index) {
347: return _var.getRef(index);
348: }
349:
350: /**
351: * Returns the array ref.
352: */
353: @Override
354: public Value put(Value index, Value value) {
355: return _var.put(index, value);
356: }
357:
358: /**
359: * Returns the array ref.
360: */
361: @Override
362: public Value put(Value value) {
363: return _var.put(value);
364: }
365:
366: /**
367: * Returns the character at an index
368: */
369: /* XXX: need test first
370: public Value charAt(long index)
371: {
372: return _ref.charAt(index);
373: }
374: */
375:
376: /**
377: * Evaluates a method.
378: */
379: @Override
380: public Value callMethod(Env env, int hash, char[] name,
381: int nameLen, Expr[] args) {
382: return _var.callMethod(env, hash, name, nameLen, args);
383: }
384:
385: /**
386: * Evaluates a method.
387: */
388: @Override
389: public Value callMethod(Env env, int hash, char[] name,
390: int nameLen, Value[] args) {
391: return _var.callMethod(env, hash, name, nameLen, args);
392: }
393:
394: /**
395: * Evaluates a method.
396: */
397: @Override
398: public Value callMethod(Env env, int hash, char[] name, int nameLen) {
399: return _var.callMethod(env, hash, name, nameLen);
400: }
401:
402: /**
403: * Evaluates a method.
404: */
405: @Override
406: public Value callMethod(Env env, int hash, char[] name,
407: int nameLen, Value a0) {
408: return _var.callMethod(env, hash, name, nameLen, a0);
409: }
410:
411: /**
412: * Evaluates a method.
413: */
414: @Override
415: public Value callMethod(Env env, int hash, char[] name,
416: int nameLen, Value a0, Value a1) {
417: return _var.callMethod(env, hash, name, nameLen, a0, a1);
418: }
419:
420: /**
421: * Evaluates a method with 3 args.
422: */
423: @Override
424: public Value callMethod(Env env, int hash, char[] name,
425: int nameLen, Value a0, Value a1, Value a2) {
426: return _var.callMethod(env, hash, name, nameLen, a0, a1, a2);
427: }
428:
429: /**
430: * Evaluates a method with 4 args.
431: */
432: @Override
433: public Value callMethod(Env env, int hash, char[] name,
434: int nameLen, Value a0, Value a1, Value a2, Value a3) {
435: return _var
436: .callMethod(env, hash, name, nameLen, a0, a1, a2, a3);
437: }
438:
439: /**
440: * Evaluates a method with 5 args.
441: */
442: @Override
443: public Value callMethod(Env env, int hash, char[] name,
444: int nameLen, Value a0, Value a1, Value a2, Value a3,
445: Value a4) {
446: return _var.callMethod(env, hash, name, nameLen, a0, a1, a2,
447: a3, a4);
448: }
449:
450: /**
451: * Evaluates a method.
452: */
453: @Override
454: public Value callMethodRef(Env env, int hash, char[] name,
455: int nameLen, Expr[] args) {
456: return _var.callMethodRef(env, hash, name, nameLen, args);
457: }
458:
459: /**
460: * Evaluates a method.
461: */
462: @Override
463: public Value callMethodRef(Env env, int hash, char[] name,
464: int nameLen, Value[] args) {
465: return _var.callMethodRef(env, hash, name, nameLen, args);
466: }
467:
468: /**
469: * Evaluates a method.
470: */
471: @Override
472: public Value callMethodRef(Env env, int hash, char[] name,
473: int nameLen) {
474: return _var.callMethodRef(env, hash, name, nameLen);
475: }
476:
477: /**
478: * Evaluates a method.
479: */
480: @Override
481: public Value callMethodRef(Env env, int hash, char[] name,
482: int nameLen, Value a0) {
483: return _var.callMethodRef(env, hash, name, nameLen, a0);
484: }
485:
486: /**
487: * Evaluates a method.
488: */
489: @Override
490: public Value callMethodRef(Env env, int hash, char[] name,
491: int nameLen, Value a0, Value a1) {
492: return _var.callMethodRef(env, hash, name, nameLen, a0, a1);
493: }
494:
495: /**
496: * Evaluates a method with 3 args.
497: */
498: @Override
499: public Value callMethodRef(Env env, int hash, char[] name,
500: int nameLen, Value a0, Value a1, Value a2) {
501: return _var.callMethodRef(env, hash, name, nameLen, a0, a1, a2);
502: }
503:
504: /**
505: * Evaluates a method with 4 args.
506: */
507: @Override
508: public Value callMethodRef(Env env, int hash, char[] name,
509: int nameLen, Value a0, Value a1, Value a2, Value a3) {
510: return _var.callMethodRef(env, hash, name, nameLen, a0, a1, a2,
511: a3);
512: }
513:
514: /**
515: * Evaluates a method with 5 args.
516: */
517: @Override
518: public Value callMethodRef(Env env, int hash, char[] name,
519: int nameLen, Value a0, Value a1, Value a2, Value a3,
520: Value a4) {
521: return _var.callMethodRef(env, hash, name, nameLen, a0, a1, a2,
522: a3, a4);
523: }
524:
525: /**
526: * Evaluates a method.
527: */
528: @Override
529: public Value callClassMethod(Env env, AbstractFunction fun,
530: Value[] args) {
531: return _var.callClassMethod(env, fun, args);
532: }
533:
534: /**
535: * Prints the value.
536: * @param env
537: */
538: @Override
539: public void print(Env env) {
540: _var.print(env);
541: }
542:
543: @Override
544: public void varDumpImpl(Env env, WriteStream out, int depth,
545: IdentityHashMap<Value, String> valueSet) throws IOException {
546: out.print("&");
547: toValue().varDumpImpl(env, out, depth, valueSet);
548: }
549:
550: @Override
551: protected void printRImpl(Env env, WriteStream out, int depth,
552: IdentityHashMap<Value, String> valueSet) throws IOException {
553: toValue().printRImpl(env, out, depth, valueSet);
554: }
555:
556: //
557: // Java Serialization
558: //
559:
560: public Object writeReplace() {
561: return _var;
562: }
563: }
|