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 + -
显示快捷键?