I'm looking at using the CodeConverter.redirectMethodCall(CtMethod, CtMethod) 
to redirect a jdk5 autobox utility method call such as 
java.lang.Integer.valueOf(int) to another static utility method as part of a 
jdk5 to jdk1.4.2 conversion tool, but I'm not seeing the redirect show up. The 
following is the little test program and associated classes:


  | package org.jboss.test.weaver;
  | 
  | import java.io.File;
  | import java.io.DataInputStream;
  | import java.io.FileInputStream;
  | import java.io.FileOutputStream;
  | import java.io.DataOutputStream;
  | 
  | import org.jboss.ant.tasks.retro.AutoboxCodeConverter;
  | import javassist.bytecode.ClassFile;
  | import javassist.CtClass;
  | import javassist.ClassPool;
  | 
  | public class WeaverTestCase
  | {
  |     public static void main(String[] args)
  |       throws Exception
  |    {
  |       File inputFile = new 
File("/cvs/JBossHead/jbossretro/output/test-classes/org/jboss/test/weaver/AutoboxUsage.class");
  |       DataInputStream is = new DataInputStream(new 
FileInputStream(inputFile));
  |       ClassFile inputCF = new ClassFile(is);
  |       is.close();
  |       CtClass clazz = ClassPool.getDefault().get(inputCF.getName());
  |       clazz.instrument(new AutoboxCodeConverter());
  | 
  |       File outputFile = new 
File("/cvs/JBossHead/jbossretro/output/test-classes14/org/jboss/test/weaver/AutoboxUsage.class");
  |       FileOutputStream os = new FileOutputStream(outputFile);
  |       DataOutputStream dos = new DataOutputStream(os);
  |       inputCF.write(dos);
  |       dos.close();
  |    }
  | 
  | 


  | package org.jboss.test.weaver;
  | 
  | import java.util.ArrayList;
  | // Sample autobox usage
  | public class AutoboxUsage
  | {
  |    public static void main(String[] args)
  |    {
  |       ArrayList<Integer> ial = new ArrayList<Integer>();
  |       for(int i = 1; i <= 10; i ++)
  |          ial.add(i);
  | 
  |       if(ial.get(0) == 1);
  |          System.out.println("iol(0) == 1 as expected");
  |    }
  | }
  | 


  | package org.jboss.ant.tasks.retro;
  | 
  | import javassist.CannotCompileException;
  | import javassist.CodeConverter;
  | import javassist.CtClass;
  | import javassist.ClassPool;
  | import javassist.NotFoundException;
  | import javassist.CtMethod;
  | 
  | // Registers the Integer.valueOf(int) to AutoboxCodeConverter.valueOf(int) 
redirect
  | public class AutoboxCodeConverter extends CodeConverter
  | {
  |    public AutoboxCodeConverter()
  |       throws NotFoundException, CannotCompileException
  |    {
  |       ClassPool defaultPool = ClassPool.getDefault();
  |       CtClass integerClass = defaultPool.get("java.lang.Integer");
  |       CtClass intClass = defaultPool.get("int");
  |       CtClass[] intSig = {intClass};
  |       CtClass autoboxClass = 
defaultPool.get("org.jboss.ant.tasks.retro.AutoboxCodeConverter");
  |       CtMethod valueOfInt2 = autoboxClass.getDeclaredMethod("valueOf", 
intSig);
  |       CtMethod valueOfInt = integerClass.getDeclaredMethod("valueOf", 
intSig);
  |       System.out.println("redirecting: "+valueOfInt+" to: "+valueOfInt2);
  |       redirectMethodCall(valueOfInt, valueOfInt2);
  |    }
  | 
  |    public static Integer valueOf(int i)
  |    {
  |       return new Integer(i);
  |    }
  | }
  | 

javap -verbose on the resulting 
output/test-classes14/org/jboss/test/weaver/AutoboxUsage.class is still showing 
an "invokestatic        #4; //Method 
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;" rather than the desired 
invokestatic on the AutoboxCodeConverter.valueOf(int) method:


  | Compiled from "AutoboxUsage.java"
  | public class org.jboss.test.weaver.AutoboxUsage extends java.lang.Object
  |   SourceFile: "AutoboxUsage.java"
  |   minor version: 0
  |   major version: 48
  |   Constant pool:
  | const #1 = Method   #13.#33;        //  java/lang/Object."<init>":()V
  | const #2 = class    #34;    //  java/util/ArrayList
  | const #3 = Method   #2.#33; //  java/util/ArrayList."<init>":()V
  | const #4 = Method   #7.#35; //  
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  | const #5 = Method   #2.#36; //  
java/util/ArrayList.add:(Ljava/lang/Object;)Z
  | const #6 = Method   #2.#37; //  
java/util/ArrayList.get:(I)Ljava/lang/Object;
  | const #7 = class    #38;    //  java/lang/Integer
  | const #8 = Method   #7.#39; //  java/lang/Integer.intValue:()I
  | const #9 = Field    #40.#41;        //  
java/lang/System.out:Ljava/io/PrintStream;
  | const #10 = String  #42;    //  iol(0) == 1 as expected
  | const #11 = Method  #43.#44;        //  
java/io/PrintStream.println:(Ljava/lang/String;)V
  | const #12 = class   #45;    //  org/jboss/test/weaver/AutoboxUsage
  | const #13 = class   #46;    //  java/lang/Object
  | const #14 = Asciz   <init>;
  | const #15 = Asciz   ()V;
  | const #16 = Asciz   Code;
  | const #17 = Asciz   LineNumberTable;
  | const #18 = Asciz   LocalVariableTable;
  | const #19 = Asciz   this;
  | const #20 = Asciz   Lorg/jboss/test/weaver/AutoboxUsage;;
  | const #21 = Asciz   main;
  | const #22 = Asciz   ([Ljava/lang/String;)V;
  | const #23 = Asciz   i;
  | const #24 = Asciz   I;
  | const #25 = Asciz   args;
  | const #26 = Asciz   [Ljava/lang/String;;
  | const #27 = Asciz   ial;
  | const #28 = Asciz   Ljava/util/ArrayList;;
  | const #29 = Asciz   LocalVariableTypeTable;
  | const #30 = Asciz   Ljava/util/ArrayList<Ljava/lang/Integer;>;;
  | const #31 = Asciz   SourceFile;
  | const #32 = Asciz   AutoboxUsage.java;
  | const #33 = NameAndType     #14:#15;//  "<init>":()V
  | const #34 = Asciz   java/util/ArrayList;
  | const #35 = NameAndType     #47:#48;//  valueOf:(I)Ljava/lang/Integer;
  | const #36 = NameAndType     #49:#50;//  add:(Ljava/lang/Object;)Z
  | const #37 = NameAndType     #51:#52;//  get:(I)Ljava/lang/Object;
  | const #38 = Asciz   java/lang/Integer;
  | const #39 = NameAndType     #53:#54;//  intValue:()I
  | const #40 = class   #55;    //  java/lang/System
  | const #41 = NameAndType     #56:#57;//  out:Ljava/io/PrintStream;
  | const #42 = Asciz   iol(0) == 1 as expected;
  | const #43 = class   #58;    //  java/io/PrintStream
  | const #44 = NameAndType     #59:#60;//  println:(Ljava/lang/String;)V
  | const #45 = Asciz   org/jboss/test/weaver/AutoboxUsage;
  | const #46 = Asciz   java/lang/Object;
  | const #47 = Asciz   valueOf;
  | const #48 = Asciz   (I)Ljava/lang/Integer;;
  | const #49 = Asciz   add;
  | const #50 = Asciz   (Ljava/lang/Object;)Z;
  | const #51 = Asciz   get;
  | const #52 = Asciz   (I)Ljava/lang/Object;;
  | const #53 = Asciz   intValue;
  | const #54 = Asciz   ()I;
  | const #55 = Asciz   java/lang/System;
  | const #56 = Asciz   out;
  | const #57 = Asciz   Ljava/io/PrintStream;;
  | const #58 = Asciz   java/io/PrintStream;
  | const #59 = Asciz   println;
  | const #60 = Asciz   (Ljava/lang/String;)V;
  | 
  | {
  | public org.jboss.test.weaver.AutoboxUsage();
  |   Code:
  |    Stack=1, Locals=1, Args_size=1
  |    0:       aload_0
  |    1:       invokespecial   #1; //Method java/lang/Object."<init>":()V
  |    4:       return
  |   LineNumberTable: 
  |    line 16: 0
  |   LocalVariableTable: 
  |    Start  Length  Slot  Name   Signature
  |    0      5      0    this       Lorg/jboss/test/weaver/AutoboxUsage;
  | 
  | public static void main(java.lang.String[]);
  |   Code:
  |    Stack=2, Locals=3, Args_size=1
  |    0:       new     #2; //class java/util/ArrayList
  |    3:       dup
  |    4:       invokespecial   #3; //Method java/util/ArrayList."<init>":()V
  |    7:       astore_1
  |    8:       iconst_1
  |    9:       istore_2
  |    10:      iload_2
  |    11:      bipush  10
  |    13:      if_icmpgt       31
  |    16:      aload_1
  |    17:      iload_2
  |    18:      invokestatic    #4; //Method 
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  |    21:      invokevirtual   #5; //Method 
java/util/ArrayList.add:(Ljava/lang/Object;)Z
  |    24:      pop
  |    25:      iinc    2, 1
  |    28:      goto    10
  |    31:      aload_1
  |    32:      iconst_0
  |    33:      invokevirtual   #6; //Method 
java/util/ArrayList.get:(I)Ljava/lang/Object;
  |    36:      checkcast       #7; //class java/lang/Integer
  |    39:      invokevirtual   #8; //Method java/lang/Integer.intValue:()I
  |    42:      iconst_1
  |    43:      if_icmpne       46
  |    46:      getstatic       #9; //Field 
java/lang/System.out:Ljava/io/PrintStream;
  |    49:      ldc     #10; //String iol(0) == 1 as expected
  |    51:      invokevirtual   #11; //Method 
java/io/PrintStream.println:(Ljava/lang/String;)V
  |    54:      return
  |   LineNumberTable: 
  |    line 20: 0
  |    line 21: 8
  |    line 22: 16
  |    line 21: 25
  |    line 24: 31
  |    line 25: 46
  |    line 26: 54
  |   LocalVariableTable: 
  |    Start  Length  Slot  Name   Signature
  |    10      21      2    i       I
  |    0      55      0    args       [Ljava/lang/String;
  |    8      47      1    ial       Ljava/util/ArrayList;
  |   LocalVariableTypeTable: length = 0xC
  |    00 01 00 08 00 2F 00 1B 00 1E 00 01 
  | 
  | }
  | 
  | 

Is the CodeConverter.redirectMethodCall the correct way to try to do this?


View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3915134#3915134

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3915134


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to