varaccess.java

来自「JDK1.4编译器后端」· Java 代码 · 共 753 行 · 第 1/2 页

JAVA
753
字号

package AST;
import java.util.HashSet;import java.util.LinkedHashSet;import java.io.FileNotFoundException;import java.io.File;import java.util.*;import beaver.*;import java.util.ArrayList;import java.util.zip.*;import java.io.*;public class VarAccess extends Access implements Cloneable {
    public void flushCache() {        super.flushCache();        isConstant_visited = 0;        isConstant_computed = false;        isConstant_initialized = false;        isDAafter_Variable_values = null;        decls_computed = false;        decls_value = null;        decl_computed = false;        decl_value = null;        isFieldAccess_computed = false;        type_computed = false;        type_value = null;    }     @SuppressWarnings({"unchecked", "cast"})  public VarAccess clone() throws CloneNotSupportedException {        VarAccess node = (VarAccess)super.clone();        node.isConstant_visited = 0;        node.isConstant_computed = false;        node.isConstant_initialized = false;        node.isDAafter_Variable_values = null;        node.decls_computed = false;        node.decls_value = null;        node.decl_computed = false;        node.decl_value = null;        node.isFieldAccess_computed = false;        node.type_computed = false;        node.type_value = null;        node.in$Circle(false);        node.is$Final(false);    return node;    }     @SuppressWarnings({"unchecked", "cast"})  public VarAccess copy() {      try {          VarAccess node = (VarAccess)clone();          if(children != null) node.children = (ASTNode[])children.clone();          return node;      } catch (CloneNotSupportedException e) {      }      System.err.println("Error: Could not clone node of type " + getClass().getName() + "!");      return null;    }     @SuppressWarnings({"unchecked", "cast"})  public VarAccess fullCopy() {        VarAccess res = (VarAccess)copy();        for(int i = 0; i < getNumChildNoTransform(); i++) {          ASTNode node = getChildNoTransform(i);          if(node != null) node = node.fullCopy();          res.setChild(node, i);        }        return res;    }    // Declared in DefiniteAssignment.jrag at line 94    public void definiteAssignment() {    if(isSource()) {      if(decl() instanceof VariableDeclaration) {        VariableDeclaration v = (VariableDeclaration)decl();        //System.err.println("Is " + v + " final? " + v.isFinal() + ", DAbefore: " + isDAbefore(v));        if(v.isValue()) {        }        else if(v.isBlankFinal()) {          //if(!isDAbefore(v) && !v.hasInit() && !v.getInit().isConstant())          if(!isDAbefore(v))            error("Final variable " + v.name() + " is not assigned before used");        }        else {          //if(!v.hasInit() && !isDAbefore(v)) {          if(!isDAbefore(v))          error("Local variable " + v.name() + " in not assigned before used");        }      }            else if(decl() instanceof FieldDeclaration && !isQualified()) {        FieldDeclaration f = (FieldDeclaration)decl();        //if(f.isFinal() && f.isInstanceVariable() && !isDAbefore(f)) {        //if(f.isFinal() && !isDAbefore(f) && (!f.hasInit() || !f.getInit().isConstant())) {        //if(f.isFinal() && (!f.hasInit() || !f.getInit().isConstant()) && !isDAbefore(f)) {        if(f.isFinal() && !f.hasInit() && !isDAbefore(f)) {          error("Final field " + f + " is not assigned before used");        }      }          }    if(isDest()) {      Variable v = decl();      // Blank final field      if(v.isFinal() && v.isBlank() && !hostType().instanceOf(v.hostType()))        error("The final variable is not a blank final in this context, so it may not be assigned.");      else if(v.isFinal() && isQualified() && (!qualifier().isThisAccess() || ((Access)qualifier()).isQualified()))        error("the blank final field " + v.name() + " may only be assigned by simple name");            // local variable or parameter      else if(v instanceof VariableDeclaration) {        VariableDeclaration var = (VariableDeclaration)v;        //System.out.println("### is variable");        if(!var.isValue() && var.getParent().getParent().getParent() instanceof SwitchStmt && var.isFinal()) {          if(!isDUbefore(var))            error("Final variable " + var.name() + " may only be assigned once");        }        else if(var.isValue()) {          if(var.hasInit() || !isDUbefore(var))            error("Final variable " + var.name() + " may only be assigned once");        }        else if(var.isBlankFinal()) {          if(var.hasInit() || !isDUbefore(var))            error("Final variable " + var.name() + " may only be assigned once");        }        if(var.isFinal() && (var.hasInit() || !isDUbefore(var))) {        //if(var.isFinal() && ((var.hasInit() && var.getInit().isConstant()) || !isDUbefore(var))) {        }      }      // field      else if(v instanceof FieldDeclaration) {        FieldDeclaration f = (FieldDeclaration)v;        if(f.isFinal()) {          if(f.hasInit())            error("initialized field " + f.name() + " can not be assigned");          else {            BodyDecl bodyDecl = enclosingBodyDecl();            if(!(bodyDecl instanceof ConstructorDecl) && !(bodyDecl instanceof InstanceInitializer) && !(bodyDecl instanceof StaticInitializer) && !(bodyDecl instanceof FieldDeclaration))              error("final field " + f.name() + " may only be assigned in constructors and initializers");            else if(!isDUbefore(f))              error("Final field " + f.name() + " may only be assigned once");          }        }      }      else if(v instanceof ParameterDeclaration) {        ParameterDeclaration p = (ParameterDeclaration)v;        // 8.4.1        if(p.isFinal()) {          error("Final parameter " + p.name() + " may not be assigned");        }      }          }  }    // Declared in DefiniteAssignment.jrag at line 458  protected boolean checkDUeverywhere(Variable v) {    if(isDest() && decl() == v)      return false;    return super.checkDUeverywhere(v);  }    // Declared in NameCheck.jrag at line 177  public void nameCheck() {    if(decls().isEmpty() && (!isQualified() || !qualifier().type().isUnknown() || qualifier().isPackageAccess()))      error("no field named " + name());    if(decls().size() > 1) {      StringBuffer s = new StringBuffer();      s.append("several fields named " + name());      for(Iterator iter = decls().iterator(); iter.hasNext(); ) {        Variable v = (Variable)iter.next();        s.append("\n    " + v.type().typeName() + "." + v.name() + " declared in " + v.hostType().typeName());      }      error(s.toString());    }          // 8.8.5.1    if(inExplicitConstructorInvocation() && !isQualified() && decl().isInstanceVariable() && hostType() == decl().hostType())      error("instance variable " + name() + " may not be accessed in an explicit constructor invocation");    Variable v = decl();    if(!v.isFinal() && !v.isClassVariable() && !v.isInstanceVariable() && v.hostType() != hostType())      error("A parameter/variable used but not declared in an inner class must be declared final");    // 8.3.2.3    if((decl().isInstanceVariable() || decl().isClassVariable()) && !isQualified()) {      if(hostType() != null && !hostType().declaredBeforeUse(decl(), this)) {        if(inSameInitializer() && !simpleAssignment() && inDeclaringClass()) {          BodyDecl b = closestBodyDecl(hostType());          error("variable " + decl().name() + " is used in " + b + " before it is declared");        }      }    }  }    // Declared in NameCheck.jrag at line 211  // find the bodydecl declared in t in which this construct is nested  public BodyDecl closestBodyDecl(TypeDecl t) {    ASTNode node = this;    while(!(node.getParent().getParent() instanceof Program) && node.getParent().getParent() != t) {      node = node.getParent();    }    if(node instanceof BodyDecl)      return (BodyDecl)node;    return null;  }    // Declared in NodeConstructors.jrag at line 38  public VarAccess(String name, int start, int end) {    this(name);    this.start = start;    this.end = end;  }    // Declared in PrettyPrint.jadd at line 469  public void toString(StringBuffer s) {    s.append(name());  }    // Declared in CodeGeneration.jrag at line 704  public void emitStore(CodeGeneration gen) {    Variable v = decl();    if(v instanceof VariableDeclaration) {      VariableDeclaration decl = (VariableDeclaration)v;      if(isDUbefore(v))         gen.addLocalVariableEntryAtCurrentPC(decl.name(), decl.type().typeDescriptor(), decl.localNum(), decl.variableScopeEndLabel(gen));      decl.type().emitStoreLocal(gen, decl.localNum());    }    else if(v instanceof ParameterDeclaration) {      ParameterDeclaration decl = (ParameterDeclaration)v;      decl.type().emitStoreLocal(gen, decl.localNum());    }    else if(v instanceof FieldDeclaration) {      FieldDeclaration f = (FieldDeclaration)v;      if(f.isPrivate() && !hostType().hasField(v.name()))        f.createAccessorWrite(fieldQualifierType()).emitInvokeMethod(gen, fieldQualifierType());      else        f.emitStoreField(gen, fieldQualifierType());    }  }    // Declared in CreateBCode.jrag at line 337  public void createAssignSimpleLoadDest(CodeGeneration gen) {    createLoadQualifier(gen);  }    // Declared in CreateBCode.jrag at line 351  public void createPushAssignmentResult(CodeGeneration gen) {    if(hostType().needsAccessorFor(decl()))      return;    if(decl().isInstanceVariable())      type().emitDup_x1(gen);    else      type().emitDup(gen);  }    // Declared in CreateBCode.jrag at line 369  public void createAssignLoadDest(CodeGeneration gen) {    createLoadQualifier(gen);    Variable v = decl();    if(v.isInstanceVariable())      gen.emitDup();    if(v instanceof VariableDeclaration) {      VariableDeclaration decl = (VariableDeclaration)v;      decl.type().emitLoadLocal(gen, decl.localNum());    }    else if(v instanceof ParameterDeclaration) {      ParameterDeclaration decl = (ParameterDeclaration)v;      decl.type().emitLoadLocal(gen, decl.localNum());    }    else if(v instanceof FieldDeclaration) {      FieldDeclaration f = (FieldDeclaration)v;      if(f.isPrivate() && !hostType().hasField(v.name()))        f.createAccessor(fieldQualifierType()).emitInvokeMethod(gen, fieldQualifierType());      else        f.emitLoadField(gen, fieldQualifierType());    }  }    // Declared in CreateBCode.jrag at line 418  public void createBCode(CodeGeneration gen) {    Variable v = decl();    if(v instanceof VariableDeclaration) {      VariableDeclaration decl = (VariableDeclaration)v;      if(decl.hostType() == hostType())        decl.type().emitLoadLocal(gen, decl.localNum());      else        emitLoadLocalInNestedClass(gen, decl);    }    else if(v instanceof ParameterDeclaration) {      ParameterDeclaration decl = (ParameterDeclaration)v;      if(decl.hostType() == hostType())        decl.type().emitLoadLocal(gen, decl.localNum());      else        emitLoadLocalInNestedClass(gen, decl);    }    else if(v instanceof FieldDeclaration) {      FieldDeclaration f = (FieldDeclaration)v;      createLoadQualifier(gen);      if(f.isConstant() && (f.type().isPrimitive() || f.type().isString())) {        if(!f.isStatic())          fieldQualifierType().emitPop(gen);        f.constant().createBCode(gen);      }      else if(f.isPrivate() && !hostType().hasField(v.name()))        f.createAccessor(fieldQualifierType()).emitInvokeMethod(gen, fieldQualifierType());      else        f.emitLoadField(gen, fieldQualifierType());    }  }    // Declared in CreateBCode.jrag at line 474  protected void createLoadQualifier(CodeGeneration gen) {    Variable v = decl();    if(v instanceof FieldDeclaration) {      FieldDeclaration f = (FieldDeclaration)v;      if(hasPrevExpr()) {        // load explicit qualifier        prevExpr().createBCode(gen);        // pop qualifier stack element for class variables        // this qualifier must be computed to ensure side effects        if(!prevExpr().isTypeAccess() && f.isClassVariable())          prevExpr().type().emitPop(gen);      }      else if(f.isInstanceVariable()) {        emitThis(gen, fieldQualifierType());      }    }  }    // Declared in InnerClasses.jrag at line 25  private TypeDecl fieldQualifierType() {    if(hasPrevExpr())      return prevExpr().type();    TypeDecl typeDecl = hostType();    while(typeDecl != null && !typeDecl.hasField(name()))      typeDecl = typeDecl.enclosingType();    if(typeDecl != null)      return typeDecl;    return decl().hostType();  }    // Declared in InnerClasses.jrag at line 159  public void collectEnclosingVariables(HashSet set, TypeDecl typeDecl) {    Variable v = decl();    if(!v.isInstanceVariable() && !v.isClassVariable() && v.hostType() == typeDecl)      set.add(v);    super.collectEnclosingVariables(set, typeDecl);  }    // Declared in Transformations.jrag at line 102  // remote collection / demand driven creation of accessor  public void transformation() {    Variable v = decl();    if(v instanceof FieldDeclaration) {      FieldDeclaration f = (FieldDeclaration)v;      if(requiresAccessor()) {        TypeDecl typeDecl = fieldQualifierType();        if(isSource())          f.createAccessor(typeDecl);        if(isDest())          f.createAccessorWrite(typeDecl);      }

⌨️ 快捷键说明

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