// // Copyright (C) 2006 United States Government as represented by the // Administrator of the National Aeronautics and Space Administration // (NASA). All Rights Reserved. // // This software is distributed under the NASA Open Source Agreement // (NOSA), version 1.3. The NOSA has been approved by the Open Source // Initiative. See the file NOSA-1.3-JPF at the top of the distribution // directory tree for the complete NOSA document. // // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.vm.serialize; import java.util.ArrayList; import gov.nasa.jpf.Config; import gov.nasa.jpf.util.ObjVector; import gov.nasa.jpf.vm.ClassInfo; import gov.nasa.jpf.vm.FieldInfo; import gov.nasa.jpf.vm.MethodInfo; public class AmmendableFilterConfiguration implements FilterConfiguration { public interface Ammendment { public static final boolean POLICY_IGNORE = false; public static final boolean POLICY_INCLUDE = true; } public interface FrameAmmendment extends Ammendment { FramePolicy ammendFramePolicy(MethodInfo mi, FramePolicy sofar); //BitArray ammendLocalInclusion(MethodInfo mi, BitArray sofar); } public interface InstanceAmmendment extends Ammendment { boolean ammendFieldInclusion(FieldInfo fi, boolean sofar); } public interface StaticAmmendment extends Ammendment { boolean ammendFieldInclusion(FieldInfo fi, boolean sofar); } // convience for implementing both public interface FieldAmmendment extends InstanceAmmendment, StaticAmmendment {} public interface InstanceOverride { boolean isOverriding(ClassInfo ci); Iterable<FieldInfo> getMatchedInstanceFields(ClassInfo ci, Iterable<FieldInfo> preOverride); } protected final ObjVector<FrameAmmendment> frameAmmendments = new ObjVector<FrameAmmendment>(0); protected final ObjVector<InstanceAmmendment> instanceAmmendments = new ObjVector<InstanceAmmendment>(0); protected final ObjVector<StaticAmmendment> staticAmmendments = new ObjVector<StaticAmmendment>(0); protected final ObjVector<InstanceOverride> instanceOverrides = new ObjVector<InstanceOverride>(0); // configuration stuff public void init(Config config) { appendConfiguredFrameAmmendments(config); appendConfiguredInstanceAmmendments(config); appendConfiguredStaticAmmendments(config); appendConfiguredInstanceOverrides(config); } protected void appendConfiguredFrameAmmendments(Config config) { ArrayList<FrameAmmendment> fas = config.getInstances("filter.frame_ammendments", FrameAmmendment.class); if (fas != null) frameAmmendments.append(fas); } protected void appendConfiguredInstanceAmmendments(Config config) { ArrayList<InstanceAmmendment> ias = config.getInstances("filter.instance_ammendments", InstanceAmmendment.class); if (ias != null) instanceAmmendments.append(ias); } protected void appendConfiguredStaticAmmendments(Config config) { ArrayList<StaticAmmendment> sas = config.getInstances("filter.static_ammendments", StaticAmmendment.class); if (sas != null) staticAmmendments.append(sas); } protected void appendConfiguredInstanceOverrides(Config config) { ArrayList<InstanceOverride> ios = config.getInstances("filter.instance_overrides", InstanceOverride.class); if (ios != null) instanceOverrides.append(ios); } // public API for adding to configuration public void appendFrameAmmendment(FrameAmmendment fa) { frameAmmendments.add(fa); } public void appendInstanceAmmendment(InstanceAmmendment ia) { instanceAmmendments.add(ia); } public void appendStaticAmmendment(StaticAmmendment sa) { staticAmmendments.add(sa); } public void appendFieldAmmendment(FieldAmmendment fa) { staticAmmendments.add(fa); instanceAmmendments.add(fa); } public void appendInstanceOverride(InstanceOverride io) { instanceOverrides.add(io); } // FilterConfiguration Stuff public FramePolicy getFramePolicy(MethodInfo mi) { FramePolicy policy = new FramePolicy(); for (FrameAmmendment fa : frameAmmendments) { policy = fa.ammendFramePolicy(mi, policy); } return policy; } // not implemented /*public BitArray getFrameLocalInclusion(MethodInfo mi) { BitArray cur = new BitArray(mi.getMaxLocals()); cur.setAll(); // by default include everything for (FrameAmmendment fa : frameAmmendments) { cur = fa.ammendLocalInclusion(mi, cur); } return cur; }*/ public Iterable<FieldInfo> getMatchedInstanceFields(ClassInfo ci) { int fieldCount = ci.getNumberOfInstanceFields(); ObjVector<FieldInfo> v = new ObjVector<FieldInfo>(fieldCount); for (int i = 0; i < fieldCount; i++) { FieldInfo field = ci.getInstanceField(i); boolean include = true; for (InstanceAmmendment ia : instanceAmmendments) { include = ia.ammendFieldInclusion(field, include); } if (include) { v.add(field); } } Iterable<FieldInfo> ret = v; for (InstanceOverride io : instanceOverrides) { if (io.isOverriding(ci)) { ret = io.getMatchedInstanceFields(ci, ret); } } return ret; } public Iterable<FieldInfo> getMatchedStaticFields(ClassInfo ci) { int fieldCount = ci.getNumberOfStaticFields(); ObjVector<FieldInfo> v = new ObjVector<FieldInfo>(fieldCount); for (int i = 0; i < fieldCount; i++) { FieldInfo field = ci.getStaticField(i); boolean include = true; for (StaticAmmendment sa : staticAmmendments) { include = sa.ammendFieldInclusion(field, include); } if (include) { v.add(field); } } return v; } }