001: /*
002: $Id: DumpingClassLoader.java 3790 2006-05-30 18:27:48Z blackdrag $
003:
004: Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005:
006: Redistribution and use of this software and associated documentation
007: ("Software"), with or without modification, are permitted provided
008: that the following conditions are met:
009:
010: 1. Redistributions of source code must retain copyright
011: statements and notices. Redistributions must also contain a
012: copy of this document.
013:
014: 2. Redistributions in binary form must reproduce the
015: above copyright notice, this list of conditions and the
016: following disclaimer in the documentation and/or other
017: materials provided with the distribution.
018:
019: 3. The name "groovy" must not be used to endorse or promote
020: products derived from this Software without prior written
021: permission of The Codehaus. For written permission,
022: please contact info@codehaus.org.
023:
024: 4. Products derived from this Software may not be called "groovy"
025: nor may "groovy" appear in their names without prior written
026: permission of The Codehaus. "groovy" is a registered
027: trademark of The Codehaus.
028:
029: 5. Due credit should be given to The Codehaus -
030: http://groovy.codehaus.org/
031:
032: THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
033: ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
034: NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
035: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
036: THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
037: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
038: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
039: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
040: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
041: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
042: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
043: OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: */
046:
047: package org.codehaus.groovy.classgen;
048:
049: import groovy.lang.GroovyClassLoader;
050:
051: import java.io.OutputStreamWriter;
052: import java.io.PrintWriter;
053: import java.io.StringWriter;
054:
055: import org.codehaus.groovy.ast.ClassNode;
056: import org.codehaus.groovy.ast.CompileUnit;
057: import org.codehaus.groovy.control.CompilationUnit;
058: import org.codehaus.groovy.control.CompilerConfiguration;
059: import org.codehaus.groovy.control.SourceUnit;
060: import org.objectweb.asm.ClassVisitor;
061: import org.objectweb.asm.Opcodes;
062: import org.objectweb.asm.util.CheckClassAdapter;
063: import org.objectweb.asm.util.ASMifierClassVisitor;
064:
065: /**
066: * A class loader used for debugging the bytecode generation.
067: * This will log all bytecode being loaded
068: *
069: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
070: * @version $Revision: 3790 $
071: */
072: public class DumpingClassLoader extends GroovyClassLoader implements
073: Opcodes {
074:
075: protected static boolean CHECK_CLASS = false;
076: protected static boolean DUMP_CLASS = true;
077:
078: public DumpingClassLoader(ClassLoader parentLoader) {
079: super (parentLoader);
080: }
081:
082: protected class DebugCollector extends ClassCollector {
083:
084: DebugCollector(GroovyClassLoader cl, CompilationUnit unit,
085: SourceUnit su) {
086: super (new GroovyClassLoader.InnerLoader(cl), unit, su);
087: }
088:
089: public void call(ClassVisitor classWriter, ClassNode classNode) {
090: // lets test out the class verifier
091: if (DUMP_CLASS) {
092: dumper.visitClass(classNode);
093: }
094:
095: if (CHECK_CLASS) {
096: checker.visitClass(classNode);
097: }
098:
099: super .call(classWriter, classNode);
100: }
101: }
102:
103: protected ClassCollector createCollector(CompilationUnit unit) {
104: return new DebugCollector(this , unit, null);
105: }
106:
107: protected ASMifierClassVisitor dumpVisitor = new ASMifierClassVisitor(
108: new PrintWriter(new OutputStreamWriter(System.out)));
109: protected ASMifierClassVisitor invisibleDumpVisitor = new ASMifierClassVisitor(
110: new PrintWriter(new StringWriter()));
111: protected CompileUnit unit = new CompileUnit(this ,
112: new CompilerConfiguration());
113: protected ClassGenerator checker = new AsmClassGenerator(
114: new GeneratorContext(unit), new CheckClassAdapter(
115: invisibleDumpVisitor), this , null);
116: protected ClassGenerator dumper = new AsmClassGenerator(
117: new GeneratorContext(unit), dumpVisitor, this, null);
118:
119: }
|