Changeset 2276


Ignore:
Timestamp:
Jan 22, 2007, 9:59:35 PM (14 years ago)
Author:
yura
Message:

Array support in arguments.

File:
1 edited

Legend:

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

    r2273 r2276  
    77import org.objectweb.asm.ClassWriter;
    88import org.objectweb.asm.FieldVisitor;
     9import org.objectweb.asm.Label;
    910import org.objectweb.asm.MethodVisitor;
    1011import org.objectweb.asm.Opcodes;
     
    2021        {
    2122                super(cv);
     23        }
     24       
     25        public void TEST (String[][] x)
     26        {
    2227        }
    2328       
     
    103108                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Word", "toString", "()Ljava/lang/String;");
    104109                }
    105                 else if (type.getSort() == Type.ARRAY)
     110                else if (type.getSort()==Type.ARRAY)
    106111                {
     112                        boolean isOneDim = type.getDimensions()==1;
     113                        Type elemType = isOneDim?type.getElementType():Type.getType(type.getDescriptor().substring(1));
     114                        Label l1 = new Label();
     115                        Label l2 = new Label();
     116                        mv.visitInsn(Opcodes.DUP);
     117                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "getLen", "()I");
     118                        mv.visitTypeInsn(Opcodes.ANEWARRAY, isOneDim?elemType.getInternalName():elemType.getDescriptor());
     119                        mv.visitInsn(Opcodes.ICONST_0);
     120                        mv.visitLabel(l1);
     121                        mv.visitInsn(Opcodes.DUP2);
     122                        mv.visitInsn(Opcodes.SWAP);
     123                        mv.visitInsn(Opcodes.ARRAYLENGTH);
     124                        mv.visitJumpInsn(Opcodes.IF_ICMPEQ, l2);
     125                        mv.visitInsn(Opcodes.DUP2_X1);
    107126                        mv.visitInsn(Opcodes.POP);
    108                         mv.visitInsn(Opcodes.ACONST_NULL);
     127                        mv.visitInsn(Opcodes.DUP2_X2);
     128                        mv.visitInsn(Opcodes.POP);
     129                        mv.visitInsn(Opcodes.DUP2_X1);
     130                        mv.visitInsn(Opcodes.DUP2);
     131                        mv.visitInsn(Opcodes.POP);
     132                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "at", "(I)Ljava/lang/Object;");
     133                        if (isOneDim)
     134                                mv.visitTypeInsn(Opcodes.CHECKCAST, elemType.getInternalName());
     135                        else
     136                        {
     137                                mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Expr");
     138                                putArgToStack(mv, elemType);
     139                        }
     140                        mv.visitInsn(Opcodes.AASTORE);
     141                        mv.visitInsn(Opcodes.POP);
     142                        mv.visitInsn(Opcodes.ICONST_1);
     143                        mv.visitInsn(Opcodes.IADD);
     144                        mv.visitJumpInsn(Opcodes.GOTO, l1);
     145                        mv.visitLabel(l2);
     146                        mv.visitInsn(Opcodes.POP);
     147                        mv.visitInsn(Opcodes.SWAP);
     148                        mv.visitInsn(Opcodes.POP);
     149                       
    109150                }
    110151                else
Note: See TracChangeset for help on using the changeset viewer.