Changeset 2294


Ignore:
Timestamp:
Jan 26, 2007, 10:32:40 PM (14 years ago)
Author:
yura
Message:

Array type in result is supported.

File:
1 edited

Legend:

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

    r2293 r2294  
    9494                        break;
    9595                case WrapGen.E:
    96                 //TODO
    97                         //mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "([Ljava/lang/Object;)V");
     96                        Type elemType = Type.getType(type.getDescriptor().substring(1));
     97                        Label l1 = new Label();
     98                        Label l2 = new Label();
     99                        mv.visitInsn(Opcodes.DUP);
     100                        mv.visitInsn(Opcodes.ARRAYLENGTH);
     101                        mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
     102                        mv.visitInsn(Opcodes.ICONST_0);
     103                        mv.visitLabel(l1);
     104                        mv.visitInsn(Opcodes.DUP2);
     105                        mv.visitInsn(Opcodes.SWAP);
     106                        mv.visitInsn(Opcodes.ARRAYLENGTH);
     107                        mv.visitJumpInsn(Opcodes.IF_ICMPEQ, l2);
     108                        mv.visitInsn(Opcodes.DUP2_X1);
     109                        mv.visitInsn(Opcodes.POP);
     110                        mv.visitInsn(Opcodes.DUP2_X2);
     111                        mv.visitInsn(Opcodes.POP);
     112                        mv.visitInsn(Opcodes.DUP2_X1);
     113                        mv.visitInsn(Opcodes.DUP2);
     114                        mv.visitInsn(Opcodes.POP);
     115                        mv.visitInsn(elemType.getOpcode(Opcodes.IALOAD));
     116                        convertFrom(mv, elemType);
     117                        mv.visitInsn(Opcodes.AASTORE);
     118                        mv.visitInsn(Opcodes.POP);
     119                        mv.visitInsn(Opcodes.ICONST_1);
     120                        mv.visitInsn(Opcodes.IADD);
     121                        mv.visitJumpInsn(Opcodes.GOTO, l1);
     122                        mv.visitLabel(l2);
     123                        mv.visitInsn(Opcodes.POP);
     124                        mv.visitInsn(Opcodes.SWAP);
     125                        mv.visitInsn(Opcodes.POP);
     126                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "([Ljava/lang/Object;)V");
    98127                        break;
    99128                }
     
    137166                        mv.visitInsn(Opcodes.DUP);
    138167                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Expr", "getLen", "()I");
    139                         if (elemType.getSort() == Type.INT)
    140                                 mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
    141                         else
    142                                 mv.visitTypeInsn(Opcodes.ANEWARRAY, elemType.getSort()==Type.ARRAY?elemType.getDescriptor():elemType.getInternalName());
     168      switch (elemType.getSort()) {
     169      case Type.BOOLEAN: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_BOOLEAN); break;
     170      case Type.CHAR: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_CHAR); break;
     171      case Type.BYTE: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_BYTE); break;
     172      case Type.SHORT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_SHORT); break;
     173      case Type.INT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); break;
     174      case Type.FLOAT: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_FLOAT); break;
     175      case Type.LONG: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_LONG); break;
     176      case Type.DOUBLE: mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_DOUBLE); break;
     177      case Type.ARRAY: mv.visitTypeInsn(Opcodes.ANEWARRAY, elemType.getDescriptor()); break;
     178      case Type.OBJECT: mv.visitTypeInsn(Opcodes.ANEWARRAY, elemType.getInternalName()); break;
     179      }
    143180                        mv.visitInsn(Opcodes.ICONST_0);
    144181                        mv.visitLabel(l1);
     
    229266        }
    230267
     268        public int[] TEST2 (int[] x) {
     269                return x;
     270        }
     271
    231272        public static Integer TEST3 (int[] x) {
    232273                int res = 0;
Note: See TracChangeset for help on using the changeset viewer.