| 1 24 25 package org.aspectj.compiler.base.ast; 26 27 import org.aspectj.compiler.base.*; 28 import org.aspectj.compiler.base.cst.BlockScope; 29 30 import org.aspectj.compiler.base.bcg.CodeBuilder; 31 import org.aspectj.compiler.base.bcg.Label; 32 33 import org.aspectj.compiler.base.LocalClassPass; 34 35 39 40 public class VarExpr extends AssignableExpr { 41 protected Type discoverType() { 42 return getVarDec().getType(); 43 } 44 45 public Expr makeReference() { 46 return getAST().makeVar(getVarDec()); 47 } 48 49 public final boolean canBeCopied() { 50 return true; 51 } 52 53 public String getId() { return varDec.getId(); } 54 55 62 public ASTObject postMove(MovingWalker walker) { 64 return walker.moveVarExpr(this); 65 } 66 67 public void unparse(CodeWriter writer) { 68 writer.write(varDec.getId()); 69 return; 70 } 71 72 75 public void walkFlow(FlowCheckerPass w) { 76 VarDec dec = getVarDec(); 77 if (! (dec instanceof FormalDec) 78 && ! w.getVars().isDefinitelyAssigned(getVarDec())) { 79 showError("Variable " + getId() + " might not have a value"); 80 } 81 } 82 83 86 public ASTObject postAssignmentCheck(AssignmentCheckerPass walker) { 87 if (isLhs()) return this; 88 Expr initExpr = varDec.getInitializer(); 89 if (initExpr != null && varDec.isFinal() && 90 initExpr instanceof LiteralExpr && ! getType().isObject() ) { 91 return varDec.getType().foldCast((LiteralExpr)initExpr).setSource(this); 92 } else { 93 return this; 94 } 95 } 96 97 100 public void walkAnalysis(LocalClassPass.AnalysisWalker walker) { 101 walker.processVarExpr(this); 102 } 103 104 107 public ASTObject postThreading(LocalClassPass.ThreadingWalker walker) { 108 Object o = walker.lookup(getVarDec()); 109 if (o == null) { 110 return this; 111 } else if (o instanceof FieldDec) { 112 FieldDec fieldDec = (FieldDec)o; 113 return getAST().makeGet(getAST().makePrimary( 116 (NameType)fieldDec.getDeclaringType(), 117 (NameType)getLexicalType(), false, 118 !isInConstructorCallExpr()), 119 fieldDec); 120 } else { 121 return getAST().makeVar((FormalDec) o); 122 } 123 } 124 125 128 protected void cgEffect(CodeBuilder cb) {} 129 protected void cgLvalue(CodeBuilder cb) {} 130 protected void cgLtoRvalue(CodeBuilder cb) { 131 getType().emitLoad(cb, getVarDec().getFrameLoc()); 132 } 133 protected void cgAssignment(CodeBuilder cb) { 134 getType().emitStore(cb, getVarDec().getFrameLoc()); 135 } 136 protected void cgDupLvalue(CodeBuilder cb) {} 137 protected void cgDupRvalue(CodeBuilder cb) { 138 getType().emitDup(cb); 139 } 140 protected boolean isIncable() { 141 return getType() instanceof IntType && 142 getVarDec().getFrameLoc() < 0xFF; 143 } 144 145 protected VarDec varDec; 147 public VarDec getVarDec() { return varDec; } 148 public void setVarDec(VarDec _varDec) { varDec = _varDec; } 149 150 public VarExpr(SourceLocation location, VarDec _varDec) { 151 super(location); 152 setVarDec(_varDec); 153 } 154 protected VarExpr(SourceLocation source) { 155 super(source); 156 } 157 158 public ASTObject copyWalk(CopyWalker walker) { 159 VarExpr ret = new VarExpr(getSourceLocation()); 160 ret.preCopy(walker, this); 161 ret.varDec = varDec; 162 return ret; 163 } 164 165 166 public String getDefaultDisplayName() { 167 return "VarExpr(varDec: "+varDec+")"; 168 } 169 170 } 172 | Popular Tags |