/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: MetaDataCloneableAdapter.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.site.instrument;
import com.uwyn.rife.asm.MethodAdapter;
import com.uwyn.rife.asm.MethodVisitor;
import com.uwyn.rife.asm.Opcodes;
class MetaDataCloneableAdapter extends MethodAdapter implements Opcodes
{
private String mBaseInternalName = null;
private String mMetaDataInternalName = null;
MetaDataCloneableAdapter(String baseInternalName, String metaDataInternalName, MethodVisitor visitor)
{
super(visitor);
mBaseInternalName = baseInternalName;
mMetaDataInternalName = metaDataInternalName;
}
public void visitInsn(int opcode)
{
if (ARETURN == opcode)
{
mv.visitTypeInsn(CHECKCAST, mBaseInternalName);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";");
mv.visitMethodInsn(INVOKEVIRTUAL, mMetaDataInternalName, "clone", "()Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, mMetaDataInternalName);
mv.visitFieldInsn(PUTFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";");
mv.visitVarInsn(ALOAD, 1);
mv.visitFieldInsn(GETFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";");
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, mMetaDataInternalName, "setMetaDataBean", "(Ljava/lang/Object;)V");
mv.visitVarInsn(ALOAD, 1);
}
super.visitInsn(opcode);
}
}