package net.sourceforge.javautil.interceptor.type.cjcw;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sourceforge.javautil.bytecode.api.IBytecodeField;
import net.sourceforge.javautil.bytecode.api.IBytecodeReferenceable;
import net.sourceforge.javautil.bytecode.api.IBytecodeResolvable;
import net.sourceforge.javautil.bytecode.api.LiteralValue;
import net.sourceforge.javautil.bytecode.api.TypeDescriptor;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeBlock;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeContextMethod;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeLocalVariableDeclaration;
import net.sourceforge.javautil.bytecode.api.type.method.IBytecodeWriterMethod.ComparisonOperator;
import net.sourceforge.javautil.bytecode.api.type.method.instructions.LoopBase;
import net.sourceforge.javautil.bytecode.api.type.method.invocation.MethodInvocation;
import net.sourceforge.javautil.interceptor.InterceptorCompiler;
import net.sourceforge.javautil.interceptor.IInterceptorManipulator;
import net.sourceforge.javautil.interceptor.asm.InterceptorHelper;
import net.sourceforge.javautil.interceptor.type.InterceptorProxyTypeInterceptor;
/**
* The generated constructors for concrete class interceptor proxies.
*
* @author elponderador
* @author $Author$
* @version $Id$
*
* @see InterceptorCompiler
*/
public class InterceptorProxyConstructor extends BytecodeBlock {
protected final List<IInterceptorManipulator> abilities;
public InterceptorProxyConstructor(List<IInterceptorManipulator> abilities) {
this.abilities = abilities;
}
@Override protected void writeInstructions(BytecodeContextMethod context) {
List<IBytecodeReferenceable> sp = new ArrayList<IBytecodeReferenceable>();
for (int i=2; i<context.getDeclaredParameterCount(); i++) {
sp.add(context.getDeclaredParameter(i));
}
context.superConstruct(sp.toArray(new IBytecodeReferenceable[sp.size()]));
context.set("this", InterceptorProxyTypeInterceptor.CACHE_FIELD_NAME, context.createNewInstanceInvocation(context.resolve(HashMap.class)));
context.set("this", InterceptorProxyTypeInterceptor.INTERCEPTOR_FIELD_NAME, context.getDeclaredParameter(0));
context.set("this", InterceptorProxyTypeCJCW.TARGET_FIELD_NAME, context.getDeclaredParameter(1));
if (abilities != null && abilities.size() > 0) {
BytecodeLocalVariableDeclaration interceptor = context.getDeclaredParameter(0);
IBytecodeField state = context.getEnclosingType().getField(context.getResolutionPool(), InterceptorProxyTypeInterceptor.ABILITIES_FIELD_NAME);
context.set("this", InterceptorProxyTypeInterceptor.ABILITIES_FIELD_NAME, context.createNewInstanceInvocation(context.resolve(HashMap.class)));
for (IInterceptorManipulator ability : abilities) {
ability.manipulate(context, interceptor, state);
}
}
}
}