1 29 30 package com.caucho.quercus.program; 31 32 import com.caucho.quercus.Location; 33 import com.caucho.quercus.env.BreakValue; 34 import com.caucho.quercus.env.ContinueValue; 35 import com.caucho.quercus.env.Env; 36 import com.caucho.quercus.env.Value; 37 import com.caucho.quercus.expr.AbstractVarExpr; 38 import com.caucho.quercus.expr.Expr; 39 40 43 public class ForeachStatement 44 extends Statement 45 { 46 protected final Expr _objExpr; 47 48 protected final AbstractVarExpr _key; 49 50 protected final AbstractVarExpr _value; 51 protected final boolean _isRef; 52 53 protected final Statement _block; 54 55 public ForeachStatement(Location location, 56 Expr objExpr, 57 AbstractVarExpr key, 58 AbstractVarExpr value, 59 boolean isRef, 60 Statement block) 61 { 62 super(location); 63 64 _objExpr = objExpr; 65 66 _key = key; 67 _value = value; 68 _isRef = isRef; 69 70 _block = block; 71 } 72 73 public Value execute(Env env) 74 { 75 Value origObj = _objExpr.eval(env); 76 Value obj = origObj.copy(); 77 78 if (_key == null && ! _isRef) { 79 for (Value value : obj.getValueArray(env)) { 80 _value.evalAssign(env, value); 81 82 Value result = _block.execute(env); 83 84 if (result == null || result instanceof ContinueValue) { 85 } else if (result instanceof BreakValue) 86 return null; 87 else 88 return result; 89 } 90 91 return null; 92 } else { 93 for (Value key : obj.getKeyArray()) { 94 if (_key != null) 95 _key.evalAssign(env, key); 96 97 if (_isRef) { 98 Value value = origObj.getRef(key); 99 100 _value.evalAssign(env, value); 101 } else { 102 Value value = obj.get(key).toValue(); 103 104 _value.evalAssign(env, value); 105 } 106 107 Value result = _block.execute(env); 108 109 if (result == null || result instanceof ContinueValue) { 110 } else if (result instanceof BreakValue) 111 return null; 112 else 113 return result; 114 } 115 } 116 117 return null; 118 } 119 } 120 121 | Popular Tags |