1 29 30 package com.caucho.quercus.program; 31 32 import com.caucho.quercus.env.Env; 33 import com.caucho.quercus.env.ObjectValue; 34 import com.caucho.quercus.env.QuercusClass; 35 import com.caucho.quercus.env.Value; 36 import com.caucho.quercus.expr.Expr; 37 38 import java.util.HashMap ; 39 import java.util.LinkedHashMap ; 40 import java.util.Map ; 41 import java.util.Set ; 42 43 46 public class InterpretedClassDef extends ClassDef 47 implements InstanceInitializer 48 { 49 protected boolean _isAbstract; 50 protected boolean _isInterface; 51 52 protected final HashMap <String ,AbstractFunction> _functionMap 53 = new HashMap <String ,AbstractFunction>(); 54 55 protected final HashMap <String ,Expr> _fieldMap 56 = new LinkedHashMap <String ,Expr>(); 57 58 protected final HashMap <String ,Expr> _staticFieldMap 59 = new LinkedHashMap <String ,Expr>(); 60 61 protected final HashMap <String ,Expr> _constMap 62 = new HashMap <String ,Expr>(); 63 64 protected AbstractFunction _constructor; 65 protected AbstractFunction _destructor; 66 protected AbstractFunction _getField; 67 protected AbstractFunction _setField; 68 protected AbstractFunction _call; 69 70 public InterpretedClassDef(String name, 71 String parentName, 72 String []ifaceList) 73 { 74 super(name, parentName, ifaceList); 75 } 76 77 80 public void setAbstract(boolean isAbstract) 81 { 82 _isAbstract = isAbstract; 83 } 84 85 88 public boolean isAbstract() 89 { 90 return _isAbstract; 91 } 92 93 96 public void setInterface(boolean isInterface) 97 { 98 _isInterface = isInterface; 99 } 100 101 104 public boolean isInterface() 105 { 106 return _isInterface; 107 } 108 109 112 public void initClass(QuercusClass cl) 113 { 114 if (_constructor != null) 115 cl.setConstructor(_constructor); 116 117 if (_getField != null) 118 cl.setGet(_getField); 119 120 if (_setField != null) 121 cl.setSet(_setField); 122 123 if (_call != null) 124 cl.setCall(_call); 125 126 cl.addInitializer(this); 127 128 for (Map.Entry <String ,AbstractFunction> entry : _functionMap.entrySet()) { 129 cl.addMethod(entry.getKey(), entry.getValue()); 130 } 131 132 for (Map.Entry <String ,Expr> entry : _fieldMap.entrySet()) { 133 cl.addField(entry.getKey(), 0, entry.getValue()); 134 } 135 136 for (Map.Entry <String ,Expr> entry : _staticFieldMap.entrySet()) { 137 cl.addStaticField(entry.getKey(), entry.getValue()); 138 } 139 140 for (Map.Entry <String ,Expr> entry : _constMap.entrySet()) { 141 cl.addConstant(entry.getKey(), entry.getValue()); 142 } 143 } 144 145 148 public void setConstructor(AbstractFunction fun) 149 { 150 _constructor = fun; 151 } 152 153 156 public void addFunction(String name, Function fun) 157 { 158 _functionMap.put(name.intern(), fun); 159 160 if (name.equals("__construct")) 161 _constructor = fun; 162 else if (name.equals("__destruct")) 163 _destructor = fun; 164 else if (name.equals("__get")) 165 _getField = fun; 166 else if (name.equals("__set")) 167 _setField = fun; 168 else if (name.equals("__call")) 169 _call = fun; 170 else if (name.equalsIgnoreCase(getName()) && _constructor == null) 171 _constructor = fun; 172 } 173 174 177 public void addStaticValue(Value name, Expr value) 178 { 179 _staticFieldMap.put(getName() + "::" + name.toString(), value); 180 } 181 182 185 public void addConstant(String name, Expr value) 186 { 187 _constMap.put(name.intern(), value); 188 } 189 190 193 public Expr findConstant(String name) 194 { 195 return _constMap.get(name); 196 } 197 198 201 public void addValue(Value name, Expr value) 202 { 203 _fieldMap.put(name.toString().intern(), value); 204 } 205 206 209 public Expr get(Value name) 210 { 211 return _fieldMap.get(name.toString().intern()); 212 } 213 214 217 public boolean isDeclaredField(String name) 218 { 219 return _fieldMap.get(name) != null; 220 } 221 222 225 public void init(Env env) 226 { 227 for (Map.Entry <String ,Expr> var : _staticFieldMap.entrySet()) { 228 String name = getName() + "::" + var.getKey(); 229 230 env.setGlobalValue(name.intern(), var.getValue().eval(env).copy()); 231 } 232 } 233 234 237 public void initInstance(Env env, Value value) 238 { 239 ObjectValue object = (ObjectValue) value; 240 241 for (Map.Entry <String ,Expr> entry : _fieldMap.entrySet()) 242 object.putFieldInit(env, entry.getKey(), entry.getValue().eval(env).copy()); 243 } 244 245 248 public AbstractFunction findConstructor() 249 { 250 return _constructor; 251 } 252 253 public String toString() 254 { 255 return "Class[" + getName() + "]"; 256 } 257 258 public Set <Map.Entry <String , Expr>> fieldSet() 259 { 260 return _fieldMap.entrySet(); 261 } 262 263 public Set <Map.Entry <String , AbstractFunction>> functionSet() 264 { 265 return _functionMap.entrySet(); 266 } 267 } 268 269 | Popular Tags |