interpretedclassdef.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 305 行

JAVA
305
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.quercus.program;import com.caucho.quercus.env.*;import com.caucho.quercus.expr.Expr;import com.caucho.quercus.Location;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;import java.util.Set;/** * Represents an interpreted PHP class definition. */public class InterpretedClassDef extends ClassDef  implements InstanceInitializer{  protected boolean _isAbstract;  protected boolean _isInterface;  protected boolean _isFinal;    protected boolean _hasNonPublicMethods;    protected final HashMap<String,AbstractFunction> _functionMap    = new HashMap<String,AbstractFunction>();  protected final HashMap<StringValue,Expr> _fieldMap    = new LinkedHashMap<StringValue,Expr>();  protected final HashMap<String,Expr> _staticFieldMap    = new LinkedHashMap<String,Expr>();  protected final HashMap<String,Expr> _constMap    = new HashMap<String,Expr>();  protected AbstractFunction _constructor;  protected AbstractFunction _destructor;  protected AbstractFunction _getField;  protected AbstractFunction _setField;  protected AbstractFunction _call;  public InterpretedClassDef(Location location,                             String name,                             String parentName,                             String []ifaceList)  {    super(location, name, parentName, ifaceList);  }  public InterpretedClassDef(String name,                             String parentName,                             String []ifaceList)  {    super(null, name, parentName, ifaceList);  }  /**   * true for an abstract class.   */  public void setAbstract(boolean isAbstract)  {    _isAbstract = isAbstract;  }  /**   * True for an abstract class.   */  public boolean isAbstract()  {    return _isAbstract;  }  /**   * true for an interface class.   */  public void setInterface(boolean isInterface)  {    _isInterface = isInterface;  }  /**   * True for an interface class.   */  public boolean isInterface()  {    return _isInterface;  }    /*   * True for a final class.   */  public void setFinal(boolean isFinal)  {    _isFinal = isFinal;  }    /*   * Returns true for a final class.   */  public boolean isFinal()  {    return _isFinal;  }    /*   * Returns true if class has protected or private methods.   */  public boolean getHasNonPublicMethods()  {    return _hasNonPublicMethods;  }  /**   * Initialize the quercus class.   */  public void initClass(QuercusClass cl)  {    if (_constructor != null) {      cl.setConstructor(_constructor);      cl.addMethod("__construct", _constructor);    }        if (_getField != null)      cl.setFieldGet(_getField);        if (_setField != null)      cl.setFieldSet(_setField);        if (_call != null)      cl.setCall(_call);        cl.addInitializer(this);        for (Map.Entry<String,AbstractFunction> entry : _functionMap.entrySet()) {      cl.addMethod(entry.getKey(), entry.getValue());    }        for (Map.Entry<StringValue,Expr> entry : _fieldMap.entrySet()) {      cl.addField(entry.getKey(), 0, entry.getValue());    }    String className = getName();    for (Map.Entry<String,Expr> entry : _staticFieldMap.entrySet()) {      cl.addStaticFieldExpr(className, entry.getKey(), entry.getValue());    }    for (Map.Entry<String,Expr> entry : _constMap.entrySet()) {      cl.addConstant(entry.getKey(), entry.getValue());    }  }  /**   * Sets the constructor.   */  public void setConstructor(AbstractFunction fun)  {    _constructor = fun;  }    /**   * Adds a function.   */  public void addFunction(String name, Function fun)  {    _functionMap.put(name.intern(), fun);        if (! fun.isPublic()) {      _hasNonPublicMethods = true;    }    if (name.equals("__construct"))      _constructor = fun;    else if (name.equals("__destruct"))      _destructor = fun;    else if (name.equals("__get"))      _getField = fun;    else if (name.equals("__set"))      _setField = fun;    else if (name.equals("__call"))      _call = fun;    else if (name.equalsIgnoreCase(getName()) && _constructor == null)      _constructor = fun;  }  /**   * Adds a static value.   */  public void addStaticValue(Value name, Expr value)  {    _staticFieldMap.put(name.toString(), value);  }  /**   * Adds a const value.   */  public void addConstant(String name, Expr value)  {    _constMap.put(name.intern(), value);  }  /**   * Return a const value.   */  public Expr findConstant(String name)  {    return _constMap.get(name);  }  /**   * Adds a value.   */  public void addValue(Value name, Expr value)  {    _fieldMap.put(name.toStringValue(), value);  }  /**   * Adds a value.   */  public Expr get(Value name)  {    return _fieldMap.get(name.toStringValue());  }  /**   * Return true for a declared field.   */  public boolean isDeclaredField(StringValue name)  {    return _fieldMap.get(name) != null;  }  /**   * Initialize the class.   */  public void init(Env env)  {    for (Map.Entry<String,Expr> var : _staticFieldMap.entrySet()) {      String name = getName() + "::" + var.getKey();      env.setGlobalValue(name.intern(), var.getValue().eval(env).copy());    }  }  /**   * Initialize the fields   */  public void initInstance(Env env, Value value)  {    ObjectValue object = (ObjectValue) value;        for (Map.Entry<StringValue,Expr> entry : _fieldMap.entrySet()) {      object.initField(entry.getKey(), entry.getValue().eval(env).copy());    }  }  /**   * Returns the constructor   */  public AbstractFunction findConstructor()  {    return _constructor;  }  public Set<Map.Entry<StringValue, Expr>> fieldSet()  {    return _fieldMap.entrySet();  }    public Set<Map.Entry<String, AbstractFunction>> functionSet()  {    return _functionMap.entrySet();  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?