Changeset 2310


Ignore:
Timestamp:
Feb 2, 2007, 12:59:45 AM (14 years ago)
Author:
yura
Message:
  • Null converted to and from org.refal.plus.library.Java$Null
Location:
to-imperative/trunk/java/org/refal/plus
Files:
3 edited

Legend:

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

    r2306 r2310  
    2727        private HashMap constants;
    2828        private RFIFile rfiFile;
    29 
     29       
    3030        public WrapGen () {
    3131                super(new ClassWriter(ClassWriter.COMPUTE_FRAMES+ClassWriter.COMPUTE_MAXS));
     
    3939                this.constants = new HashMap();
    4040                this.rfiFile = new RFIFile(this.newName);
    41                 super.visit(0, Opcodes.ACC_PUBLIC, this.newName, null, "java/lang/Object", null);
     41                super.visit(version, Opcodes.ACC_PUBLIC, this.newName, null, "java/lang/Object", null);
    4242        }
    4343
     
    131131                super.visitEnd();
    132132                this.rfiFile.writeClass(((ClassWriter)this.cv).toByteArray());
    133         }
    134 
    135         private void getResFromStack (MethodVisitor mv, Type type, int refType, int argNum) {
    136                 mv.visitVarInsn(Opcodes.ALOAD, argNum);
    137                 mv.visitInsn(Opcodes.SWAP);
    138                 switch (refType) {
    139                 case WrapGen.S:
    140                         convertFrom(mv, type);
    141                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "(Ljava/lang/Object;)V");
    142                         break;
    143                 case WrapGen.E:
    144                         Type elemType = Type.getType(type.getDescriptor().substring(1));
    145                         Label l1 = new Label();
    146                         Label l2 = new Label();
    147                         mv.visitInsn(Opcodes.DUP);
    148                         mv.visitInsn(Opcodes.ARRAYLENGTH);
    149                         mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
    150                         mv.visitInsn(Opcodes.ICONST_0);
    151                         mv.visitLabel(l1);
    152                         mv.visitInsn(Opcodes.DUP2);
    153                         mv.visitInsn(Opcodes.SWAP);
    154                         mv.visitInsn(Opcodes.ARRAYLENGTH);
    155                         mv.visitJumpInsn(Opcodes.IF_ICMPEQ, l2);
    156                         mv.visitInsn(Opcodes.DUP2_X1);
    157                         mv.visitInsn(Opcodes.POP);
    158                         mv.visitInsn(Opcodes.DUP2_X2);
    159                         mv.visitInsn(Opcodes.POP);
    160                         mv.visitInsn(Opcodes.DUP2_X1);
    161                         mv.visitInsn(Opcodes.DUP2);
    162                         mv.visitInsn(Opcodes.POP);
    163                         mv.visitInsn(elemType.getOpcode(Opcodes.IALOAD));
    164                         convertFrom(mv, elemType);
    165                         mv.visitInsn(Opcodes.AASTORE);
    166                         mv.visitInsn(Opcodes.POP);
    167                         mv.visitInsn(Opcodes.ICONST_1);
    168                         mv.visitInsn(Opcodes.IADD);
    169                         mv.visitJumpInsn(Opcodes.GOTO, l1);
    170                         mv.visitLabel(l2);
    171                         mv.visitInsn(Opcodes.POP);
    172                         mv.visitInsn(Opcodes.SWAP);
    173                         mv.visitInsn(Opcodes.POP);
    174                         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "([Ljava/lang/Object;)V");
    175                         break;
    176                 }
    177         }
    178 
    179         private void convertFrom (MethodVisitor mv, Type type) {
    180                 switch (type.getSort()) {
    181                 case Type.BOOLEAN:
    182                         mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/refal/plus/Word", "valueOf", "(B)Lorg/refal/plus/Word;");
    183                         break;
    184                 case Type.CHAR:
    185                         mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/math/Character", "charValue", "(C)Ljava/math/Character;");
    186                         break;
    187                 case Type.BYTE:
    188                 case Type.SHORT:
    189                 case Type.INT:
    190                         mv.visitInsn(Opcodes.I2L);
    191                 case Type.LONG:
    192                         mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/math/BigInteger", "valueOf", "(J)Ljava/math/BigInteger;");
    193                         break;
    194                 default:
    195                         if (type.equals(Type.getType("Ljava/lang/String;")))
    196                                 mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/refal/plus/Word", "valueOf", "(Ljava/lang/String;)Lorg/refal/plus/Word;");
    197                         break;
    198                 }
    199                 mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Object"); // TODO: It is not needed.
    200133        }
    201134
     
    280213                        break;
    281214                default:
     215                        Label l1 = new Label();
     216                        Label l2 = new Label();
     217                        mv.visitInsn(Opcodes.DUP);
     218                        mv.visitFieldInsn(Opcodes.GETSTATIC, "org/refal/plus/library/Java", "null_obj", "Lorg/refal/plus/library/Java$Null;");
     219                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Object"); // TODO: It is not needed.
     220                        mv.visitJumpInsn(Opcodes.IF_ACMPEQ, l1);
    282221                        if (type.equals(Type.getType("Ljava/lang/String;"))) {
    283222                                mv.visitTypeInsn(Opcodes.CHECKCAST, "org/refal/plus/Word");
     
    285224                        }       else
    286225                                mv.visitTypeInsn(Opcodes.CHECKCAST, type.getSort()==Type.ARRAY?type.getDescriptor():type.getInternalName());
    287                         break;
    288                 }
     226                        mv.visitJumpInsn(Opcodes.GOTO, l2);
     227                        mv.visitLabel(l1);
     228                        mv.visitInsn(Opcodes.POP);
     229                        mv.visitInsn(Opcodes.ACONST_NULL);
     230                        mv.visitLabel(l2);
     231                        break;
     232                }
     233        }
     234
     235        private void getResFromStack (MethodVisitor mv, Type type, int refType, int argNum) {
     236                mv.visitVarInsn(Opcodes.ALOAD, argNum);
     237                mv.visitInsn(Opcodes.SWAP);
     238                switch (refType) {
     239                case WrapGen.S:
     240                        convertFrom(mv, type);
     241                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assign", "(Ljava/lang/Object;)V");
     242                        break;
     243                case WrapGen.E:
     244                        Type elemType = Type.getType(type.getDescriptor().substring(1));
     245                        Label l1 = new Label();
     246                        Label l2 = new Label();
     247                        Label l3 = new Label();
     248                        Label l4 = new Label();
     249                        mv.visitInsn(Opcodes.DUP);
     250                        mv.visitJumpInsn(Opcodes.IFNULL, l3);
     251                        mv.visitInsn(Opcodes.DUP);
     252                        mv.visitInsn(Opcodes.ARRAYLENGTH);
     253                        mv.visitJumpInsn(Opcodes.GOTO, l4);
     254                        mv.visitLabel(l3);
     255                        mv.visitInsn(Opcodes.ICONST_0);
     256                        mv.visitLabel(l4);
     257                        mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
     258                        mv.visitInsn(Opcodes.ICONST_0);
     259                        mv.visitLabel(l1);
     260                        mv.visitInsn(Opcodes.DUP2);
     261                        mv.visitInsn(Opcodes.SWAP);
     262                        mv.visitInsn(Opcodes.ARRAYLENGTH);
     263                        mv.visitJumpInsn(Opcodes.IF_ICMPEQ, l2);
     264                        mv.visitInsn(Opcodes.DUP2_X1);
     265                        mv.visitInsn(Opcodes.POP);
     266                        mv.visitInsn(Opcodes.DUP2_X2);
     267                        mv.visitInsn(Opcodes.POP);
     268                        mv.visitInsn(Opcodes.DUP2_X1);
     269                        mv.visitInsn(Opcodes.DUP2);
     270                        mv.visitInsn(Opcodes.POP);
     271                        mv.visitInsn(elemType.getOpcode(Opcodes.IALOAD));
     272                        convertFrom(mv, elemType);
     273                        mv.visitInsn(Opcodes.AASTORE);
     274                        mv.visitInsn(Opcodes.POP);
     275                        mv.visitInsn(Opcodes.ICONST_1);
     276                        mv.visitInsn(Opcodes.IADD);
     277                        mv.visitJumpInsn(Opcodes.GOTO, l1);
     278                        mv.visitLabel(l2);
     279                        mv.visitInsn(Opcodes.POP);
     280                        mv.visitInsn(Opcodes.SWAP);
     281                        mv.visitInsn(Opcodes.POP);
     282                        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/refal/plus/Result", "assignUnsafe", "([Ljava/lang/Object;)V");
     283                        break;
     284                }
     285        }
     286
     287        private void convertFrom (MethodVisitor mv, Type type) {
     288                switch (type.getSort()) {
     289                case Type.BOOLEAN:
     290                        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/refal/plus/Word", "valueOf", "(B)Lorg/refal/plus/Word;");
     291                        break;
     292                case Type.CHAR:
     293                        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/math/Character", "charValue", "(C)Ljava/math/Character;");
     294                        break;
     295                case Type.BYTE:
     296                case Type.SHORT:
     297                case Type.INT:
     298                        mv.visitInsn(Opcodes.I2L);
     299                case Type.LONG:
     300                        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/math/BigInteger", "valueOf", "(J)Ljava/math/BigInteger;");
     301                        break;
     302                default:
     303                        Label l1 = new Label();
     304                        Label l2 = new Label();
     305                        mv.visitInsn(Opcodes.DUP);
     306                        mv.visitJumpInsn(Opcodes.IFNULL, l1);
     307                        if (type.equals(Type.getType("Ljava/lang/String;")))
     308                                mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/refal/plus/Word", "valueOf", "(Ljava/lang/String;)Lorg/refal/plus/Word;");
     309                        mv.visitJumpInsn(Opcodes.GOTO, l2);
     310                        mv.visitLabel(l1);
     311                        mv.visitInsn(Opcodes.POP);
     312                        mv.visitFieldInsn(Opcodes.GETSTATIC, "org/refal/plus/library/Java", "null_obj", "Lorg/refal/plus/library/Java$Null;");
     313                        mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Object"); // TODO: It is not needed.
     314                        mv.visitLabel(l2);
     315                        break;
     316                }
     317                mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Object"); // TODO: It is not needed.
    289318        }
    290319
Note: See TracChangeset for help on using the changeset viewer.