Changeset 2283


Ignore:
Timestamp:
Jan 24, 2007, 7:48:23 PM (14 years ago)
Author:
yura
Message:

Convert all types (no array creation of primitive type)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/java/org/refal/plus/wrapgen/WrapGen.java

    r2277 r2283  
    22import java.io.FileInputStream;
    33import java.io.FileOutputStream;
     4
    45import org.objectweb.asm.ClassAdapter;
    56import org.objectweb.asm.ClassReader;
     
    2425        }
    2526       
     27        public static Integer TEST3 (int[] x)
     28        {
     29                int res = 0;
     30                for(int i = 0; i < x.length; i++)
     31                        res += x[i];
     32                return new Integer(res);
     33        }
     34
    2635        public String TEST1 (String[][] x)
    2736        {
     
    5564        public MethodVisitor visitMethod (int access, String name, String desc, String signature, String[] exceptions)
    5665        {
    57                 if ((access & Opcodes.ACC_PUBLIC)==0)
     66                if ((access & Opcodes.ACC_PUBLIC)==0 || name.equals("<init>"))
    5867                        return null;
    5968                Type[] argTypes = Type.getArgumentTypes(desc);
     
    122131        void convert (MethodVisitor mv, Type type)
    123132        {
    124                 if (type.equals(Type.INT_TYPE))
     133                switch (type.getSort())
    125134                {
     135                case Type.BOOLEAN:
     136                        mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Word");
     137                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Word", "boolValue", "()B");
     138                        break;
     139                case Type.CHAR:
     140                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Character");
     141                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C");
     142                        break;
     143                case Type.BYTE:
     144                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/math/BigInteger");
     145                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/math/BigInteger", "byteValue", "()B");
     146                        break;
     147                case Type.SHORT:
     148                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/math/BigInteger");
     149                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/math/BigInteger", "shortValue", "()S");
     150                        break;
     151                case Type.INT:
    126152                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/math/BigInteger");
    127153                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/math/BigInteger", "intValue", "()I");
    128                 }
    129                 else if (type.equals(Type.getType("Ljava/lang/String;")))
    130                 {
    131                         mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Word");
    132                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Word", "toString", "()Ljava/lang/String;");
    133                 }
    134                 else if (type.getSort()==Type.ARRAY)
    135                 {
     154                        break;
     155                case Type.LONG:
     156                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/math/BigInteger");
     157                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/math/BigInteger", "longValue", "()J");
     158                        break;
     159                case Type.ARRAY:
    136160                        boolean isOneDim = type.getDimensions()==1;
    137161                        Type elemType = isOneDim?type.getElementType():Type.getType(type.getDescriptor().substring(1));
     
    141165                        mv.visitInsn(Opcodes.DUP);
    142166                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "getLen", "()I");
    143                         mv.visitTypeInsn(Opcodes.ANEWARRAY, isOneDim?elemType.getInternalName():elemType.getDescriptor());
     167                        if (elemType.getSort() == Type.INT)
     168                                mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
     169                        else
     170                                mv.visitTypeInsn(Opcodes.ANEWARRAY, isOneDim?elemType.getInternalName():elemType.getDescriptor());
    144171                        mv.visitInsn(Opcodes.ICONST_0);
    145172                        mv.visitLabel(l1);
     
    157184                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
    158185                        convert(mv, elemType);
    159                         if (elemType.equals(Type.INT_TYPE))
    160                                 mv.visitInsn(Opcodes.IASTORE);
    161                         else
    162                                 mv.visitInsn(Opcodes.AASTORE);
     186                        mv.visitInsn(elemType.getOpcode(Opcodes.IASTORE));
    163187                        mv.visitInsn(Opcodes.POP);
    164188                        mv.visitInsn(Opcodes.ICONST_1);
     
    169193                        mv.visitInsn(Opcodes.SWAP);
    170194                        mv.visitInsn(Opcodes.POP);
     195                        break;
     196                case Type.OBJECT:
     197                        if (type.equals(Type.getType("Ljava/lang/String;")))
     198                        {
     199                                mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Word");
     200                                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Word", "toString", "()Ljava/lang/String;");
     201                        }
     202                        else
     203                                mv.visitTypeInsn(Opcodes.CHECKCAST, type.getInternalName());
     204                        break;
    171205                }
    172                 else
    173                         mv.visitTypeInsn(Opcodes.CHECKCAST, type.getInternalName());
    174         }
    175 
     206        }
     207       
    176208        public static void main(String[] args) throws Exception
    177209        {
Note: See TracChangeset for help on using the changeset viewer.