/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: MetricsClassVisitor.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.continuations.instrument;
import com.uwyn.rife.asm.*;
import com.uwyn.rife.continuations.ContinuationConfigInstrument;
import com.uwyn.rife.continuations.instrument.ContinuationDebug;
import com.uwyn.rife.continuations.instrument.MetricsMethodVisitor;
import com.uwyn.rife.continuations.instrument.NoOpAnnotationVisitor;
import java.util.ArrayList;
import java.util.logging.Level;
class MetricsClassVisitor implements ClassVisitor
{
private ContinuationConfigInstrument mConfig = null;
private String mClassName = null;
private String mEntryMethodName = null;
private String mEntryMethodDesc = null;
private int mMaxLocals = -1;
private int mPauseCount = -1;
private int mAnswerCount = -1;
private ArrayList<String> mExceptionTypes = null;
private NoOpAnnotationVisitor mAnnotationVisitor = new NoOpAnnotationVisitor();
MetricsClassVisitor(ContinuationConfigInstrument config, String className)
{
mConfig = config;
mClassName = className;
mEntryMethodName = config.getEntryMethodName();
mEntryMethodDesc = Type.getMethodDescriptor(config.getEntryMethodReturnType(), config.getEntryMethodArgumentTypes());
}
void setMaxLocals(int maxLocals)
{
///CLOVER:OFF
if (ContinuationDebug.LOGGER.isLoggable(Level.FINEST))
ContinuationDebug.LOGGER.finest("maxlocals = "+maxLocals);
///CLOVER:ON
mMaxLocals = maxLocals;
}
int getMaxLocals()
{
return mMaxLocals;
}
void setPauseCount(int pauseCount)
{
///CLOVER:OFF
if (ContinuationDebug.LOGGER.isLoggable(Level.FINEST))
ContinuationDebug.LOGGER.finest("pauseCount = "+pauseCount);
///CLOVER:ON
mPauseCount = pauseCount;
}
void setAnswerCount(int answerCount)
{
///CLOVER:OFF
if (ContinuationDebug.LOGGER.isLoggable(Level.FINEST))
ContinuationDebug.LOGGER.finest("answerCount = "+answerCount);
///CLOVER:ON
mAnswerCount = answerCount;
}
void setExceptionTypes(ArrayList<String> exceptionTypes)
{
mExceptionTypes = exceptionTypes;
}
String nextExceptionType()
{
return mExceptionTypes.remove(0);
}
int getPauseCount()
{
return mPauseCount;
}
int getAnswerCount()
{
return mAnswerCount;
}
boolean makeResumable()
{
return mPauseCount > 0 || mAnswerCount > 0;
}
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
{
if (mEntryMethodName.equals(name) &&
mEntryMethodDesc.equals(desc))
{
return new MetricsMethodVisitor(mConfig, this, mClassName);
}
return null;
}
public void visitInnerClass(String name, String outerName, String innerName, int access)
{
}
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
{
}
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value)
{
return null;
}
public void visitAttribute(Attribute attr)
{
}
public void visitSource(String source, String debug)
{
}
public void visitOuterClass(String owner, String name, String desc)
{
}
public AnnotationVisitor visitAnnotation(String desc, boolean visible)
{
return mAnnotationVisitor;
}
public void visitEnd()
{
}
}