org.multiverse.stms.alpha.instrumentation.transactionalmethod
Class ClassTransactionalMethodTransformer

java.lang.Object
  extended by org.multiverse.stms.alpha.instrumentation.transactionalmethod.ClassTransactionalMethodTransformer
All Implemented Interfaces:
org.objectweb.asm.Opcodes

public final class ClassTransactionalMethodTransformer
extends Object
implements org.objectweb.asm.Opcodes

Transforms transactionalmethod.

The first generation of transactionalmethod transformers created an instance of the TransactionTemplate that forwards the call but this transformer actually merges the code of the TransactionLogicDonor.

The question is how to transform. The code needs to be placed around the original code. In principle this is no problem (can be done with a try finally clause?). But the question is if this can cause problems with constructors.

If is is placed around the constructor, the constructor will be re-executed on the same atomicobject.

Another reason to drop the template approach is that a lot of boxing/unboxing goes on with primitive return types of the transactionalobject.

Author:
Peter Veentjer.

Field Summary
 
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEDYNAMIC_OWNER, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7
 
Constructor Summary
ClassTransactionalMethodTransformer(ClassLoader classLoader, org.objectweb.asm.tree.ClassNode classNode, org.objectweb.asm.tree.ClassNode donorClassNode, org.multiverse.instrumentation.metadata.MetadataRepository metadataRepository, boolean optimize, org.multiverse.instrumentation.InstrumenterLogger logger)
           
 
Method Summary
 org.objectweb.asm.tree.MethodNode createTransactionalMethod(org.objectweb.asm.tree.MethodNode originalMethod)
          Creates the coordinating method; a method that is responsible for starting/committing aborting and retrying.
 org.objectweb.asm.tree.MethodNode createTransactionalWithTranlocalMethod(org.objectweb.asm.tree.MethodNode methodNode, boolean readonly)
          Creates a method that lifts on an already existing transaction and is going to contains the actual logic.
 int indexOfTranlocalVariable(String methodName, String methodDesc)
           
 int indexOfTransactionVariable(String methodName, String methodDesc)
           
static boolean isReplacementMethod(org.objectweb.asm.tree.MethodInsnNode donorMethodInsnNode)
           
 int newIndexOfLocalVariable(String methodName, String methodDesc, int originalVar)
           
 org.objectweb.asm.tree.ClassNode transform()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ClassTransactionalMethodTransformer

public ClassTransactionalMethodTransformer(ClassLoader classLoader,
                                           org.objectweb.asm.tree.ClassNode classNode,
                                           org.objectweb.asm.tree.ClassNode donorClassNode,
                                           org.multiverse.instrumentation.metadata.MetadataRepository metadataRepository,
                                           boolean optimize,
                                           org.multiverse.instrumentation.InstrumenterLogger logger)
Method Detail

transform

public org.objectweb.asm.tree.ClassNode transform()

createTransactionalWithTranlocalMethod

public org.objectweb.asm.tree.MethodNode createTransactionalWithTranlocalMethod(org.objectweb.asm.tree.MethodNode methodNode,
                                                                                boolean readonly)
Creates a method that lifts on an already existing transaction and is going to contains the actual logic. The Tranlocal and the Transaction will be passed as extra arguments to the method.

A new methodNode will be returned, originalMethod remains untouched.

Parameters:
methodNode - the original MethodNode where the variable table is cloned from.
Returns:
the transformed MethodNode.

createTransactionalMethod

public org.objectweb.asm.tree.MethodNode createTransactionalMethod(org.objectweb.asm.tree.MethodNode originalMethod)
Creates the coordinating method; a method that is responsible for starting/committing aborting and retrying. The real logic is forwarded to the lifting method. So this method doesn't contain the original logic anymore.

The lifting method has received an extra (first) argument; the transaction that is managed by

Parameters:
originalMethod - the original MethodNode.
Returns:
the coordinating method.

isReplacementMethod

public static boolean isReplacementMethod(org.objectweb.asm.tree.MethodInsnNode donorMethodInsnNode)

newIndexOfLocalVariable

public int newIndexOfLocalVariable(String methodName,
                                   String methodDesc,
                                   int originalVar)

indexOfTranlocalVariable

public int indexOfTranlocalVariable(String methodName,
                                    String methodDesc)

indexOfTransactionVariable

public int indexOfTransactionVariable(String methodName,
                                      String methodDesc)


Copyright © 2008-2010 Multiverse. All Rights Reserved.