1 29 30 package com.caucho.quercus.expr; 31 32 import com.caucho.quercus.Location; 33 import com.caucho.quercus.env.ArrayValue; 34 import com.caucho.quercus.env.ArrayValueImpl; 35 import com.caucho.quercus.env.Env; 36 import com.caucho.quercus.env.NullValue; 37 import com.caucho.quercus.env.Value; 38 39 42 public class ArrayTailExpr extends AbstractVarExpr { 43 protected final Expr _expr; 44 45 public ArrayTailExpr(Location location, Expr expr) 46 { 47 super(location); 48 _expr = expr; 49 } 50 51 public ArrayTailExpr(Expr expr) 52 { 53 _expr = expr; 54 } 55 56 59 public boolean canRead() 60 { 61 return false; 62 } 63 64 67 public Expr getExpr() 68 { 69 return _expr; 70 } 71 72 79 public Value eval(Env env) 80 { 81 return env.error("Cannot use [] as a read-value."); 82 } 83 84 91 public Value evalArg(Env env) 92 { 93 return evalRef(env); 94 } 95 96 103 public Value evalRef(Env env) 104 { 105 Value obj = _expr.evalArray(env); 106 107 if (obj instanceof ArrayValue) { 108 ArrayValue array = (ArrayValue) obj; 109 Value key = array.createTailKey(); 110 111 return array.getRef(key); 112 } 113 else 114 return NullValue.NULL; 115 } 116 117 124 public Value evalArray(Env env) 125 { 126 Value obj = _expr.evalArray(env); 127 128 ArrayValue array = new ArrayValueImpl(); 129 130 obj.put(array); 131 132 return array; 133 } 134 135 142 public Value evalObject(Env env) 143 { 144 Value array = _expr.evalArray(env); 145 146 Value value = env.createObject(); 147 148 array.put(value); 149 150 return value; 151 } 152 153 160 public void evalAssign(Env env, Value value) 161 { 162 Value array = _expr.evalArray(env); 163 164 array.put(value); 165 } 166 167 174 public void evalUnset(Env env) 175 { 176 throw new UnsupportedOperationException (); 177 } 178 179 public String toString() 180 { 181 return _expr + "[]"; 182 } 183 } 184 185 | Popular Tags |