Index: core/java12/com/vladium/emma/data/CoverageOptions.java =================================================================== RCS file: /cvsroot/emma/emma/core/java12/com/vladium/emma/data/CoverageOptions.java,v retrieving revision 1.1.1.1 diff -u -d -b -w -r1.1.1.1 CoverageOptions.java --- core/java12/com/vladium/emma/data/CoverageOptions.java 9 May 2004 16:57:31 -0000 1.1.1.1 +++ core/java12/com/vladium/emma/data/CoverageOptions.java 14 Jul 2004 12:53:42 -0000 @@ -36,10 +36,13 @@ final boolean excludeBridgeMethods = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_EXCLUDE_BRIDGE_METHODS, InstrProcessor.DEFAULT_EXCLUDE_BRIDGE_METHODS)); + final boolean excludeEmptyPrivateConstructor = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR, + InstrProcessor.DEFAULT_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR)); + final boolean doSUIDCompensaton = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_DO_SUID_COMPENSATION, InstrProcessor.DEFAULT_DO_SUID_COMPENSATION)); - return new CoverageOptions (excludeSyntheticMethods, excludeBridgeMethods, doSUIDCompensaton); + return new CoverageOptions (excludeSyntheticMethods, excludeBridgeMethods, doSUIDCompensaton, excludeEmptyPrivateConstructor); } public static CoverageOptions create (final IProperties properties) @@ -50,10 +53,12 @@ final boolean excludeBridgeMethods = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_EXCLUDE_BRIDGE_METHODS, InstrProcessor.DEFAULT_EXCLUDE_BRIDGE_METHODS)); + final boolean excludeEmptyPrivateConstructor = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR, + InstrProcessor.DEFAULT_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR)); final boolean doSUIDCompensaton = Property.toBoolean (properties.getProperty (InstrProcessor.PROPERTY_DO_SUID_COMPENSATION, InstrProcessor.DEFAULT_DO_SUID_COMPENSATION)); - return new CoverageOptions (excludeSyntheticMethods, excludeBridgeMethods, doSUIDCompensaton); + return new CoverageOptions (excludeSyntheticMethods, excludeBridgeMethods, doSUIDCompensaton, excludeEmptyPrivateConstructor); } @@ -67,6 +72,11 @@ return m_excludeBridgeMethods; } + public boolean excludeEmptyPrivateConstructor() + { + return m_excludeEmptyPrivateConstructor; + } + public boolean doSUIDCompensation () { return m_doSUIDCompensation; @@ -82,6 +92,7 @@ { return new CoverageOptions (in.readBoolean (), in.readBoolean (), + in.readBoolean (), in.readBoolean ()); } @@ -91,6 +102,7 @@ out.writeBoolean (options.m_excludeSyntheticMethods); out.writeBoolean (options.m_excludeBridgeMethods); out.writeBoolean (options.m_doSUIDCompensation); + out.writeBoolean (options.m_excludeEmptyPrivateConstructor); } // private: ............................................................... @@ -98,17 +110,20 @@ private CoverageOptions (final boolean excludeSyntheticMethods, final boolean excludeBridgeMethods, - final boolean doSUIDCompensation) + final boolean doSUIDCompensation, + final boolean excludeEmptyPrivateConstructor) { m_excludeSyntheticMethods = excludeSyntheticMethods; m_excludeBridgeMethods = excludeBridgeMethods; m_doSUIDCompensation = doSUIDCompensation; + m_excludeEmptyPrivateConstructor = excludeEmptyPrivateConstructor; } private final boolean m_excludeSyntheticMethods; private final boolean m_excludeBridgeMethods; private final boolean m_doSUIDCompensation; + private final boolean m_excludeEmptyPrivateConstructor; } // end of class // ---------------------------------------------------------------------------- \ No newline at end of file Index: core/java12/com/vladium/emma/instr/InstrProcessor.java =================================================================== RCS file: /cvsroot/emma/emma/core/java12/com/vladium/emma/instr/InstrProcessor.java,v retrieving revision 1.1.1.1 diff -u -d -b -w -r1.1.1.1 InstrProcessor.java --- core/java12/com/vladium/emma/instr/InstrProcessor.java 9 May 2004 16:57:33 -0000 1.1.1.1 +++ core/java12/com/vladium/emma/instr/InstrProcessor.java 14 Jul 2004 12:53:42 -0000 @@ -36,10 +36,12 @@ public static final String PROPERTY_EXCLUDE_SYNTHETIC_METHODS = "instr.exclude_synthetic_methods"; public static final String PROPERTY_EXCLUDE_BRIDGE_METHODS = "instr.exclude_bridge_methods"; public static final String PROPERTY_DO_SUID_COMPENSATION = "instr.do_suid_compensation"; + public static final String PROPERTY_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR = "instr.exclude_empty_private_constructor"; public static final String DEFAULT_EXCLUDE_SYNTHETIC_METHODS = "true"; public static final String DEFAULT_EXCLUDE_BRIDGE_METHODS = "true"; public static final String DEFAULT_DO_SUID_COMPENSATION = "true"; + public static final String DEFAULT_EXCLUDE_EMPTY_PRIVATE_CONSTRUCTOR = "true"; public abstract void run (); Index: core/java12/com/vladium/emma/instr/InstrVisitor.java =================================================================== RCS file: /cvsroot/emma/emma/core/java12/com/vladium/emma/instr/InstrVisitor.java,v retrieving revision 1.1.1.1 diff -u -d -b -w -r1.1.1.1 InstrVisitor.java --- core/java12/com/vladium/emma/instr/InstrVisitor.java 9 May 2004 16:57:36 -0000 1.1.1.1 +++ core/java12/com/vladium/emma/instr/InstrVisitor.java 14 Jul 2004 12:53:42 -0000 @@ -61,6 +61,7 @@ m_excludeSyntheticMethods = options.excludeSyntheticMethods (); m_excludeBridgeMethods = options.excludeBridgeMethods (); m_doSUIDCompensation = options.doSUIDCompensation (); + m_excludeEmptyPrivateConstructor = options.excludeEmptyPrivateConstructor (); } /** @@ -379,6 +380,11 @@ excluded = true; if (trace2) Logger.trace2 ("visit", "skipped bridge method"); } + else if (m_excludeEmptyPrivateConstructor && method.isEmptyPrivateConstructor (cls)) + { + excluded = true; + if (trace2) Logger.trace2 ("visit", "skipped empty private constructor"); + } } if (excluded) @@ -2060,6 +2066,7 @@ private final boolean m_excludeSyntheticMethods; private final boolean m_excludeBridgeMethods; + private final boolean m_excludeEmptyPrivateConstructor; private final boolean m_doSUIDCompensation; // non-resettable state: Index: core/java12/com/vladium/jcd/cls/Method_info.java =================================================================== RCS file: /cvsroot/emma/emma/core/java12/com/vladium/jcd/cls/Method_info.java,v retrieving revision 1.1.1.1 diff -u -d -b -w -r1.1.1.1 Method_info.java --- core/java12/com/vladium/jcd/cls/Method_info.java 9 May 2004 16:57:47 -0000 1.1.1.1 +++ core/java12/com/vladium/jcd/cls/Method_info.java 14 Jul 2004 12:53:42 -0000 @@ -14,6 +14,7 @@ import com.vladium.jcd.cls.constant.CONSTANT_Utf8_info; import com.vladium.jcd.lib.UDataInputStream; import com.vladium.jcd.lib.UDataOutputStream; +import com.vladium.jcd.opcodes.IOpcodes; // ---------------------------------------------------------------------------- /** @@ -52,7 +53,7 @@ * @author (C) 2001, Vlad Roubtsov */ public -final class Method_info implements Cloneable, IAccessFlags +final class Method_info implements Cloneable, IAccessFlags, IOpcodes { // public: ................................................................ @@ -137,6 +138,26 @@ return ((m_access_flags & ACC_BRIDGE) != 0) || m_attributes.hasBridge (); } + public boolean isEmptyPrivateConstructor (final ClassDef cls) + { + if (IClassDefConstants.INIT_NAME.equals(getName(cls)) && + (m_access_flags & ACC_PRIVATE) != 0) { + CodeAttribute_info ca_i = (CodeAttribute_info)m_attributes.get (0); + if (ca_i.getCodeSize() != 5) { + return false; + } + byte[] code = ca_i.getCode(); + // This is a bit strange, but empty constructors always have + // three instructions, aload_0, invokespecial, and return, in + // that order. So, we check for those three instructions. + return ((code[0] == (byte)_aload_0) && + (code[1] == (byte)_invokespecial) && + (code[4] == (byte)_return)); + } + + return false; + } + // IAccessFlags: public final void setAccessFlags (final int flags)