1 9 package com.vladium.emma.rt; 10 11 import java.io.IOException ; 12 13 import com.vladium.jcd.cls.ClassDef; 14 import com.vladium.jcd.compiler.ClassWriter; 15 import com.vladium.jcd.parser.ClassDefParser; 16 import com.vladium.util.ByteArrayOStream; 17 import com.vladium.util.Descriptors; 18 import com.vladium.util.asserts.$assert; 19 import com.vladium.emma.filter.IInclExclFilter; 20 import com.vladium.emma.instr.InstrVisitor; 21 import com.vladium.emma.data.CoverageOptions; 22 import com.vladium.emma.data.IMetaData; 23 24 30 public 31 final class InstrClassLoadHook implements IClassLoadHook 32 { 33 35 38 public InstrClassLoadHook (final IInclExclFilter filter, final IMetaData mdata) 39 { 40 if (mdata == null) throw new IllegalArgumentException ("null input: mdata"); 41 42 m_filter = filter; m_metadata = mdata; 44 45 final CoverageOptions options = mdata.getOptions (); 47 m_classDefProcessor = new InstrVisitor (options); 48 49 m_instrResult = new InstrVisitor.InstrResult (); 50 } 51 52 53 public boolean processClassDef (final String className, 54 final byte [] bytes, final int length, 55 ByteArrayOStream out) 56 throws IOException 57 { 58 if ($assert.ENABLED) 59 { 60 $assert.ASSERT (className != null, "className is null"); 61 $assert.ASSERT (bytes != null, "bytes is null"); 62 $assert.ASSERT (bytes != null, "out is null"); 63 } 64 65 final IInclExclFilter filter = m_filter; 66 if ((filter == null) || filter.included (className)) 67 { 68 final ClassDef clsDef = ClassDefParser.parseClass (bytes, length); 69 final String classVMName = Descriptors.javaNameToVMName (className); 70 71 final Object lock = m_metadata.lock (); 72 73 final boolean metadataExists; 74 synchronized (lock) 75 { 76 metadataExists = m_metadata.hasDescriptor (classVMName); 77 } 78 79 84 87 m_classDefProcessor.process (clsDef, false, true, ! metadataExists, m_instrResult); 88 89 boolean useOurs = m_instrResult.m_instrumented; 90 91 if (m_instrResult.m_descriptor != null) { 93 98 synchronized (lock) 99 { 100 104 108 if (! m_metadata.add (m_instrResult.m_descriptor, false)) 109 useOurs = false; 110 } 111 } 112 113 if (useOurs) 114 { 115 ClassWriter.writeClassTable (clsDef, out); 116 return true; 117 } 118 } 119 120 return false; 121 } 122 123 125 127 129 130 private final IInclExclFilter m_filter; private final IMetaData m_metadata; private final InstrVisitor m_classDefProcessor; private final InstrVisitor.InstrResult m_instrResult; 134 135 } | Popular Tags |