1 package polyglot.ext.jl.ast; 2 3 import polyglot.ast.*; 4 import polyglot.types.*; 5 import polyglot.visit.*; 6 import polyglot.util.*; 7 import java.util.*; 8 9 16 public class FieldAssign_c extends Assign_c implements FieldAssign 17 { 18 public FieldAssign_c(Position pos, Field left, Operator op, Expr right) { 19 super(pos, left, op, right); 20 } 21 22 public Assign left(Expr left) { 23 FieldAssign_c n = (FieldAssign_c)super.left(left); 24 n.assertLeftType(); 25 return n; 26 } 27 28 private void assertLeftType() { 29 if (!(left() instanceof Field)) { 30 throw new InternalCompilerError("left expression of an FieldAssign must be a field"); 31 } 32 } 33 34 public Term entry() { 35 Field f = (Field)left(); 36 if (f.target() instanceof Expr) { 37 return ((Expr) f.target()).entry(); 38 } 39 else { 40 if (operator() != Assign.ASSIGN) { 41 return f; 42 } 43 else { 44 return right().entry(); 45 } 46 } 47 } 48 49 protected void acceptCFGAssign(CFGBuilder v) { 50 Field f = (Field)left(); 51 if (f.target() instanceof Expr) { 52 Expr o = (Expr) f.target(); 53 54 v.visitCFG(o, right().entry()); 56 v.visitCFG(right(), this); 57 } 58 else { 59 v.visitCFG(right(), this); 61 } 62 63 } 64 protected void acceptCFGOpAssign(CFGBuilder v) { 65 Field f = (Field)left(); 66 if (f.target() instanceof Expr) { 67 Expr o = (Expr) f.target(); 68 69 v.visitCFG(o, f); 71 v.visitThrow(f); 72 v.edge(f, right().entry()); 73 v.visitCFG(right(), this); 74 } 75 else { 76 v.visitThrow(f); 78 v.edge(f, right().entry()); 79 v.visitCFG(right(), this); 80 } 81 } 82 83 public List throwTypes(TypeSystem ts) { 84 List l = new ArrayList(super.throwTypes(ts)); 85 86 Field f = (Field)left(); 87 if (f.target() instanceof Expr) { 88 l.add(ts.NullPointerException()); 89 } 90 91 return l; 92 } 93 } 94 | Popular Tags |