Changeset 2277


Ignore:
Timestamp:
Jan 22, 2007, 11:14:53 PM (14 years ago)
Author:
yura
Message:

.rfi-gen
Full array in arg support.
TODO: support all types in result.

File:
1 edited

Legend:

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

    r2276 r2277  
    1717        String oldName;
    1818        String newName;
     19        public String rfi;
    1920
    2021        public WrapGen (ClassVisitor cv)
     
    2324        }
    2425       
    25         public void TEST (String[][] x)
     26        public String TEST1 (String[][] x)
    2627        {
     28                return "";
    2729        }
    2830       
     31        public String[] TEST2 (String[][] x)
     32        {
     33                return null;
     34        }
     35
    2936        public void visit (int version, int access, String name, String signature, String superName, String[] interfaces)
    3037        {
     
    3239                this.oldType = Type.getType("L"+name+";");
    3340                this.newName = "org/refal/plus/javawrap/"+this.oldName;
     41                this.rfi = "";
    3442                super.visit(version, access, this.newName, signature, this.oldName, null);
    3543        }
     
    7078                if (! isVoid)
    7179                        mv.visitVarInsn(Opcodes.ALOAD, (isStatic?0:1)+argTypes.length);
    72 
     80               
     81                this.rfi = this.rfi+"$func "+name;
    7382                if (! isStatic)
    74                 {
    75                         mv.visitVarInsn(Opcodes.ALOAD, 0);
    76                         putArgToStack(mv, this.oldType);
    77                 }
     83                        putArgToStack(mv, this.oldType, 0);
    7884                for (int i = 0; i < argTypes.length; i++)
    79                 {
    80                         mv.visitVarInsn(Opcodes.ALOAD, (isStatic?0:1)+i);
    81                         putArgToStack(mv, argTypes[i]);
    82                 }
     85                        putArgToStack(mv, argTypes[i], (isStatic?0:1)+i);
    8386                mv.visitMethodInsn(isStatic?Opcodes.INVOKESTATIC:Opcodes.INVOKEVIRTUAL, this.oldName, name, desc);
    8487               
     88                this.rfi = this.rfi+" = ";
    8589                if (! isVoid)
    86                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "(Ljava/lang/Object;)V");
     90                        if (retType.getSort()==Type.ARRAY)
     91                        {
     92                                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "([Ljava/lang/Object;)V");
     93                                this.rfi = this.rfi+"(e)";
     94                        }
     95                        else
     96                        {
     97                                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "(Ljava/lang/Object;)V");
     98                                this.rfi = this.rfi+"s";
     99                        }
     100                this.rfi = this.rfi+";\n";
    87101                mv.visitInsn(Opcodes.RETURN);
    88102
     
    92106        }
    93107       
    94         void putArgToStack (MethodVisitor mv, Type type)
     108        void putArgToStack (MethodVisitor mv, Type type, int argNum)
     109        {
     110                mv.visitVarInsn(Opcodes.ALOAD, argNum);
     111                if (type.getSort()!=Type.ARRAY)
     112                {
     113                        mv.visitInsn(Opcodes.ICONST_0);
     114                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
     115                        this.rfi = this.rfi+" s";
     116                }
     117                else
     118                        this.rfi = this.rfi+" (e)";
     119                convert(mv, type);
     120        }
     121
     122        void convert (MethodVisitor mv, Type type)
    95123        {
    96124                if (type.equals(Type.INT_TYPE))
    97125                {
    98                         mv.visitInsn(Opcodes.ICONST_0);
    99                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
    100126                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/math/BigInteger");
    101127                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/math/BigInteger", "intValue", "()I");
     
    103129                else if (type.equals(Type.getType("Ljava/lang/String;")))
    104130                {
    105                         mv.visitInsn(Opcodes.ICONST_0);
    106                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
    107131                        mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Word");
    108132                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Word", "toString", "()Ljava/lang/String;");
     
    114138                        Label l1 = new Label();
    115139                        Label l2 = new Label();
     140                        mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Expr");
    116141                        mv.visitInsn(Opcodes.DUP);
    117142                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "getLen", "()I");
     
    131156                        mv.visitInsn(Opcodes.POP);
    132157                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
    133                         if (isOneDim)
    134                                 mv.visitTypeInsn(Opcodes.CHECKCAST, elemType.getInternalName());
     158                        convert(mv, elemType);
     159                        if (elemType.equals(Type.INT_TYPE))
     160                                mv.visitInsn(Opcodes.IASTORE);
    135161                        else
    136                         {
    137                                 mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Expr");
    138                                 putArgToStack(mv, elemType);
    139                         }
    140                         mv.visitInsn(Opcodes.AASTORE);
     162                                mv.visitInsn(Opcodes.AASTORE);
    141163                        mv.visitInsn(Opcodes.POP);
    142164                        mv.visitInsn(Opcodes.ICONST_1);
     
    147169                        mv.visitInsn(Opcodes.SWAP);
    148170                        mv.visitInsn(Opcodes.POP);
    149                        
    150171                }
    151172                else
    152                 {
    153                         mv.visitInsn(Opcodes.ICONST_0);
    154                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
    155173                        mv.visitTypeInsn(Opcodes.CHECKCAST, type.getInternalName());
    156                 }
    157174        }
    158175
     
    165182                WrapGen wg = new WrapGen(cw);
    166183                cr.accept(wg, 0);
    167                 FileOutputStream outs = new FileOutputStream(wg.newName.replaceFirst(".*/", "")+".class");
    168                 outs.write(cw.toByteArray());
     184                FileOutputStream outs1 = new FileOutputStream(wg.newName.replaceFirst(".*/", "")+".rfi");
     185                outs1.write(wg.rfi.getBytes());
     186                FileOutputStream outs2 = new FileOutputStream(wg.newName.replaceFirst(".*/", "")+".class");
     187                outs2.write(cw.toByteArray());
    169188        }
    170189}
Note: See TracChangeset for help on using the changeset viewer.