1 package ch.ethz.prose.jvmai.jikesrvm.advice_weaver; 2 3 import java.lang.reflect.Field ; 4 import java.lang.reflect.Method ; 5 import java.util.*; 6 7 import com.ibm.JikesRVM.classloader.*; 8 9 16 public class FieldWeaver { 17 18 22 protected static Map weavers = new HashMap(); 23 24 29 public static synchronized FieldWeaver getWeaver(Field target) { 30 if (target == null) 31 throw new NullPointerException ("Parameter `target' must not be null."); 32 33 FieldWeaver result = (FieldWeaver) weavers.get(target.toString()); 34 if (result == null) { 35 result = new FieldWeaver(target); 36 weavers.put(target.toString(), result); 37 } 38 39 return result; 40 }; 41 42 45 public static synchronized void commit() { 46 Iterator it = weavers.values().iterator(); 47 while (it.hasNext()) { 48 FieldWeaver fw = (FieldWeaver) it.next(); 49 if (fw.modified) { 50 fw.weave(); 52 } 53 } 54 } 55 56 59 public static synchronized void resetAll() { 60 weavers = new HashMap(); 61 } 62 63 66 protected Field target; 67 68 71 protected boolean fieldAccessEnabled; 72 73 76 protected boolean fieldModificationEnabled; 77 78 81 protected boolean modified; 82 83 88 protected FieldWeaver(Field target) { 89 this.target = target; 90 } 91 92 97 public void setFieldAccessEnabled(boolean flag) { 98 fieldAccessEnabled = flag; 99 modified = true; 100 } 101 102 107 public void setFieldModificationEnabled(boolean flag) { 108 fieldModificationEnabled = flag; 109 modified = true; 110 } 111 112 public String debugString() { 113 StringBuffer sb = new StringBuffer (); 114 115 sb.append("FieldWeaver for: "); 116 sb.append(target); 117 sb.append("\n\tfieldAccessEnabled: "); 118 sb.append(fieldAccessEnabled); 119 sb.append("\n\tfieldModificationEnabled: "); 120 sb.append(fieldModificationEnabled); 121 sb.append("\n\tmodified: "); 122 sb.append(modified); 123 124 return sb.toString(); 125 } 126 127 132 protected void weave() { 133 VM_Field f = java.lang.reflect.JikesRVMSupport.getFieldOf(target); 134 VM_FieldReference fr = f.getMemberRef().asFieldReference(); 135 136 Iterator it = fr.accessors.iterator(); 137 while (it.hasNext()) { 138 Method m = getMethod(((Integer ) it.next()).intValue()); 139 140 if (fieldAccessEnabled) 141 MethodWeaver.getWeaver(m).addFieldAccessor(target); 142 else 143 MethodWeaver.getWeaver(m).removeFieldAccessor(target); 144 } 145 146 it = fr.modifiers.iterator(); 147 while (it.hasNext()) { 148 Method m = getMethod(((Integer ) it.next()).intValue()); 149 150 if (fieldModificationEnabled) 151 MethodWeaver.getWeaver(m).addFieldModifier(target); 152 else 153 MethodWeaver.getWeaver(m).removeFieldModifier(target); 154 } 155 156 modified = false; 157 } 158 159 165 protected Method getMethod(int id) { 166 VM_MethodReference mr = VM_MemberReference.getMemberRef(id).asMethodReference(); 167 VM_Method m = (VM_NormalMethod) mr.resolve(); 168 169 return java.lang.reflect.JikesRVMSupport.createMethod(m); 170 } 171 172 } 173 | Popular Tags |