1 package org.robolectric.internal.bytecode; 2 3 import java.lang.invoke.SwitchPoint; 4 import java.util.Collection; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 public class ShadowInvalidator { 9 private static final SwitchPoint DUMMY = new SwitchPoint(); 10 11 static { 12 SwitchPoint.invalidateAll(new SwitchPoint[] { DUMMY }); 13 } 14 15 private Map<String, SwitchPoint> switchPoints; 16 17 public ShadowInvalidator() { 18 this.switchPoints = new HashMap<>(); 19 } 20 21 public SwitchPoint getSwitchPoint(Class<?> caller) { 22 return getSwitchPoint(caller.getName()); 23 } 24 25 public synchronized SwitchPoint getSwitchPoint(String className) { 26 SwitchPoint switchPoint = switchPoints.get(className); 27 if (switchPoint == null) switchPoints.put(className, switchPoint = new SwitchPoint()); 28 return switchPoint; 29 } 30 31 public synchronized void invalidateClasses(Collection<String> classNames) { 32 if (classNames.isEmpty()) return; 33 SwitchPoint[] points = new SwitchPoint[classNames.size()]; 34 int i = 0; 35 for (String className : classNames) { 36 SwitchPoint switchPoint = switchPoints.put(className, null); 37 if (switchPoint == null) switchPoint = DUMMY; 38 points[i++] = switchPoint; 39 } 40 41 SwitchPoint.invalidateAll(points); 42 } 43 } 44