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 17 public class ArrayAccessAssign_c extends Assign_c implements ArrayAccessAssign 18 { 19 public ArrayAccessAssign_c(Position pos, ArrayAccess left, Operator op, Expr right) { 20 super(pos, left, op, right); 21 } 22 23 public Assign left(Expr left) { 24 ArrayAccessAssign_c n = (ArrayAccessAssign_c)super.left(left); 25 n.assertLeftType(); 26 return n; 27 } 28 29 private void assertLeftType() { 30 if (!(left() instanceof ArrayAccess)) { 31 throw new InternalCompilerError("left expression of an ArrayAccessAssign must be an array access"); 32 } 33 } 34 35 public Term entry() { 36 return left().entry(); 37 } 38 39 protected void acceptCFGAssign(CFGBuilder v) { 40 ArrayAccess a = (ArrayAccess)left(); 41 42 v.visitCFG(a.array(), a.index().entry()); 44 v.visitCFG(a.index(), right().entry()); 45 v.visitCFG(right(), this); 46 } 47 protected void acceptCFGOpAssign(CFGBuilder v) { 48 ArrayAccess a = (ArrayAccess)left(); 49 50 v.visitCFG(a.array(), a.index().entry()); 52 v.visitCFG(a.index(), a); 53 v.visitThrow(a); 54 v.edge(a, right().entry()); 55 v.visitCFG(right(), this); 56 } 57 58 public List throwTypes(TypeSystem ts) { 59 List l = new ArrayList(super.throwTypes(ts)); 60 61 if (throwsArrayStoreException()) { 62 l.add(ts.ArrayStoreException()); 63 } 64 65 l.add(ts.NullPointerException()); 66 l.add(ts.OutOfBoundsException()); 67 68 return l; 69 } 70 71 72 public boolean throwsArrayStoreException() { 73 return op == ASSIGN && left.type().isReference(); 74 } 75 76 } 77 | Popular Tags |