001: /*
002: * Copyright 2001-2007 Geert Bevin <gbevin[remove] at uwyn dot com>
003: * Distributed under the terms of either:
004: * - the common development and distribution license (CDDL), v1.0; or
005: * - the GNU Lesser General Public License, v2.1 or later
006: * $Id: TypesClassVisitor.java 3810 2007-06-25 13:36:58Z gbevin $
007: */
008: package com.uwyn.rife.continuations.instrument;
009:
010: import com.uwyn.rife.asm.*;
011:
012: import com.uwyn.rife.continuations.ContinuationConfigInstrument;
013: import com.uwyn.rife.continuations.instrument.MetricsClassVisitor;
014: import com.uwyn.rife.continuations.instrument.NoOpAnnotationVisitor;
015: import com.uwyn.rife.continuations.instrument.TypesContext;
016: import com.uwyn.rife.continuations.instrument.TypesMethodVisitor;
017:
018: class TypesClassVisitor implements ClassVisitor {
019: private ContinuationConfigInstrument mConfig = null;
020: private MetricsClassVisitor mMetrics = null;
021: private String mClassName = null;
022: private String mEntryMethodDesc = null;
023: private String mEntryMethodName = null;
024: private TypesContext[] mPauseContexts = null;
025: private TypesContext[] mLabelContexts = null;
026: private int mPauseContextCounter = 0;
027: private int mLabelContextCounter = 0;
028: private NoOpAnnotationVisitor mAnnotationVisitor = new NoOpAnnotationVisitor();
029:
030: TypesClassVisitor(ContinuationConfigInstrument config,
031: MetricsClassVisitor metrics, String className) {
032: mConfig = config;
033: mMetrics = metrics;
034: mClassName = className;
035: mEntryMethodName = config.getEntryMethodName();
036: mEntryMethodDesc = Type.getMethodDescriptor(config
037: .getEntryMethodReturnType(), config
038: .getEntryMethodArgumentTypes());
039: }
040:
041: MetricsClassVisitor getMetrics() {
042: return mMetrics;
043: }
044:
045: void setPauseContexts(TypesContext[] pauseContexts) {
046: mPauseContexts = pauseContexts;
047: }
048:
049: TypesContext nextPauseContext() {
050: return mPauseContexts[mPauseContextCounter++];
051: }
052:
053: void setLabelContexts(TypesContext[] labelContexts) {
054: mLabelContexts = labelContexts;
055: }
056:
057: TypesContext nextLabelTypes() {
058: return mLabelContexts[mLabelContextCounter++];
059: }
060:
061: public MethodVisitor visitMethod(int access, String name,
062: String desc, String signature, String[] exceptions) {
063: if (mEntryMethodName.equals(name)
064: && mEntryMethodDesc.equals(desc)) {
065: return new TypesMethodVisitor(mConfig, this , mClassName);
066: }
067:
068: return null;
069: }
070:
071: public void visitInnerClass(String name, String outerName,
072: String innerName, int access) {
073: }
074:
075: public void visitOuterClass(String owner, String name, String desc) {
076: }
077:
078: public void visit(int version, int access, String name,
079: String signature, String super Name, String[] interfaces) {
080: }
081:
082: public void visitSource(String source, String debug) {
083: }
084:
085: public FieldVisitor visitField(int access, String name,
086: String desc, String signature, Object value) {
087: return null;
088: }
089:
090: public void visitAttribute(Attribute attr) {
091: }
092:
093: public AnnotationVisitor visitAnnotation(String desc,
094: boolean visible) {
095: return mAnnotationVisitor;
096: }
097:
098: public void visitEnd() {
099: }
100: }
|