nashorn/src/jdk/nashorn/internal/codegen/types/IntType.java
changeset 24719 f726e9d67629
parent 17259 a8d0cb25d725
child 24751 ccbd9cd3f720
equal deleted inserted replaced
23083:8c74590d5df1 24719:f726e9d67629
    26 package jdk.nashorn.internal.codegen.types;
    26 package jdk.nashorn.internal.codegen.types;
    27 
    27 
    28 import static jdk.internal.org.objectweb.asm.Opcodes.BIPUSH;
    28 import static jdk.internal.org.objectweb.asm.Opcodes.BIPUSH;
    29 import static jdk.internal.org.objectweb.asm.Opcodes.I2D;
    29 import static jdk.internal.org.objectweb.asm.Opcodes.I2D;
    30 import static jdk.internal.org.objectweb.asm.Opcodes.I2L;
    30 import static jdk.internal.org.objectweb.asm.Opcodes.I2L;
    31 import static jdk.internal.org.objectweb.asm.Opcodes.IADD;
       
    32 import static jdk.internal.org.objectweb.asm.Opcodes.IAND;
    31 import static jdk.internal.org.objectweb.asm.Opcodes.IAND;
    33 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_0;
    32 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_0;
    34 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_1;
    33 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_1;
    35 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_2;
    34 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_2;
    36 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_3;
    35 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_3;
    37 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_4;
    36 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_4;
    38 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_5;
    37 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_5;
    39 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_M1;
    38 import static jdk.internal.org.objectweb.asm.Opcodes.ICONST_M1;
    40 import static jdk.internal.org.objectweb.asm.Opcodes.IDIV;
       
    41 import static jdk.internal.org.objectweb.asm.Opcodes.ILOAD;
    39 import static jdk.internal.org.objectweb.asm.Opcodes.ILOAD;
    42 import static jdk.internal.org.objectweb.asm.Opcodes.IMUL;
       
    43 import static jdk.internal.org.objectweb.asm.Opcodes.INEG;
       
    44 import static jdk.internal.org.objectweb.asm.Opcodes.IOR;
    40 import static jdk.internal.org.objectweb.asm.Opcodes.IOR;
    45 import static jdk.internal.org.objectweb.asm.Opcodes.IREM;
    41 import static jdk.internal.org.objectweb.asm.Opcodes.IREM;
    46 import static jdk.internal.org.objectweb.asm.Opcodes.IRETURN;
    42 import static jdk.internal.org.objectweb.asm.Opcodes.IRETURN;
    47 import static jdk.internal.org.objectweb.asm.Opcodes.ISHL;
    43 import static jdk.internal.org.objectweb.asm.Opcodes.ISHL;
    48 import static jdk.internal.org.objectweb.asm.Opcodes.ISHR;
    44 import static jdk.internal.org.objectweb.asm.Opcodes.ISHR;
    49 import static jdk.internal.org.objectweb.asm.Opcodes.ISTORE;
    45 import static jdk.internal.org.objectweb.asm.Opcodes.ISTORE;
    50 import static jdk.internal.org.objectweb.asm.Opcodes.ISUB;
       
    51 import static jdk.internal.org.objectweb.asm.Opcodes.IUSHR;
    46 import static jdk.internal.org.objectweb.asm.Opcodes.IUSHR;
    52 import static jdk.internal.org.objectweb.asm.Opcodes.IXOR;
    47 import static jdk.internal.org.objectweb.asm.Opcodes.IXOR;
    53 import static jdk.internal.org.objectweb.asm.Opcodes.SIPUSH;
    48 import static jdk.internal.org.objectweb.asm.Opcodes.SIPUSH;
    54 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
    49 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
    55 
    50 import static jdk.nashorn.internal.runtime.JSType.UNDEFINED_INT;
    56 import jdk.internal.org.objectweb.asm.MethodVisitor;
    51 import jdk.internal.org.objectweb.asm.MethodVisitor;
    57 import jdk.nashorn.internal.codegen.CompilerConstants;
    52 import jdk.nashorn.internal.codegen.CompilerConstants;
    58 import jdk.nashorn.internal.codegen.ObjectClassGenerator;
       
    59 
    53 
    60 /**
    54 /**
    61  * Type class: INT
    55  * Type class: INT
    62  */
    56  */
    63 class IntType extends BitwiseType {
    57 class IntType extends BitwiseType {
    78     public Class<?> getBoxedType() {
    72     public Class<?> getBoxedType() {
    79         return Integer.class;
    73         return Integer.class;
    80     }
    74     }
    81 
    75 
    82     @Override
    76     @Override
       
    77     public char getBytecodeStackType() {
       
    78         return 'I';
       
    79     }
       
    80 
       
    81     @Override
    83     public Type ldc(final MethodVisitor method, final Object c) {
    82     public Type ldc(final MethodVisitor method, final Object c) {
    84         assert c instanceof Integer;
    83         assert c instanceof Integer;
    85 
    84 
    86         final int value = ((Integer) c).intValue();
    85         final int value = ((Integer) c).intValue();
    87 
    86 
    88         switch (value) {
    87         switch (value) {
    89             case -1:
    88         case -1:
    90                 method.visitInsn(ICONST_M1);
    89             method.visitInsn(ICONST_M1);
    91                 break;
    90             break;
    92             case 0:
    91         case 0:
    93                 method.visitInsn(ICONST_0);
    92             method.visitInsn(ICONST_0);
    94                 break;
    93             break;
    95             case 1:
    94         case 1:
    96                 method.visitInsn(ICONST_1);
    95             method.visitInsn(ICONST_1);
    97                 break;
    96             break;
    98             case 2:
    97         case 2:
    99                 method.visitInsn(ICONST_2);
    98             method.visitInsn(ICONST_2);
   100                 break;
    99             break;
   101             case 3:
   100         case 3:
   102                 method.visitInsn(ICONST_3);
   101             method.visitInsn(ICONST_3);
   103                 break;
   102             break;
   104             case 4:
   103         case 4:
   105                 method.visitInsn(ICONST_4);
   104             method.visitInsn(ICONST_4);
   106                 break;
   105             break;
   107             case 5:
   106         case 5:
   108                 method.visitInsn(ICONST_5);
   107             method.visitInsn(ICONST_5);
   109                 break;
   108             break;
   110             default:
   109         default:
   111                 if (value == (byte) value) {
   110             if (value == (byte) value) {
   112                     method.visitIntInsn(BIPUSH, value);
   111                 method.visitIntInsn(BIPUSH, value);
   113                 } else if (value == (short) value) {
   112             } else if (value == (short) value) {
   114                     method.visitIntInsn(SIPUSH, value);
   113                 method.visitIntInsn(SIPUSH, value);
   115                 } else {
   114             } else {
   116                     method.visitLdcInsn(c);
   115                 method.visitLdcInsn(c);
   117                 }
   116             }
   118                 break;
   117             break;
   119         }
   118         }
   120 
   119 
   121         return Type.INT;
   120         return Type.INT;
   122     }
   121     }
   123 
   122 
   132         } else if (to.isLong()) {
   131         } else if (to.isLong()) {
   133             method.visitInsn(I2L);
   132             method.visitInsn(I2L);
   134         } else if (to.isBoolean()) {
   133         } else if (to.isBoolean()) {
   135             //nop
   134             //nop
   136         } else if (to.isString()) {
   135         } else if (to.isString()) {
   137             invokeStatic(method, TO_STRING);
   136             invokestatic(method, TO_STRING);
   138         } else if (to.isObject()) {
   137         } else if (to.isObject()) {
   139             invokeStatic(method, VALUE_OF);
   138             invokestatic(method, VALUE_OF);
   140         } else {
   139         } else {
   141             assert false : "Illegal conversion " + this + " -> " + to;
   140             throw new UnsupportedOperationException("Illegal conversion " + this + " -> " + to);
   142         }
   141         }
   143 
   142 
   144         return to;
   143         return to;
   145     }
   144     }
   146 
   145 
   147     @Override
   146     @Override
   148     public Type add(final MethodVisitor method) {
   147     public Type add(final MethodVisitor method, final int programPoint) {
   149         method.visitInsn(IADD);
   148         method.visitInvokeDynamicInsn("iadd", "(II)I", MATHBOOTSTRAP, programPoint);
   150         return INT;
   149         return INT;
   151     }
   150     }
   152 
   151 
   153     @Override
   152     @Override
   154     public Type shr(final MethodVisitor method) {
   153     public Type shr(final MethodVisitor method) {
   198         assert slot != -1;
   197         assert slot != -1;
   199         method.visitVarInsn(ISTORE, slot);
   198         method.visitVarInsn(ISTORE, slot);
   200     }
   199     }
   201 
   200 
   202     @Override
   201     @Override
   203     public Type sub(final MethodVisitor method) {
   202     public Type sub(final MethodVisitor method, final int programPoint) {
   204         method.visitInsn(ISUB);
   203         method.visitInvokeDynamicInsn("isub", "(II)I", MATHBOOTSTRAP, programPoint);
   205         return INT;
   204         return INT;
   206     }
   205     }
   207 
   206 
   208     @Override
   207     @Override
   209     public Type mul(final MethodVisitor method) {
   208     public Type mul(final MethodVisitor method, final int programPoint) {
   210         method.visitInsn(IMUL);
   209         method.visitInvokeDynamicInsn("imul", "(II)I", MATHBOOTSTRAP, programPoint);
   211         return INT;
   210         return INT;
   212     }
   211     }
   213 
   212 
   214     @Override
   213     @Override
   215     public Type div(final MethodVisitor method) {
   214     public Type div(final MethodVisitor method, final int programPoint) {
   216         method.visitInsn(IDIV);
   215         method.visitInvokeDynamicInsn("idiv", "(II)I", MATHBOOTSTRAP, programPoint);
   217         return INT;
   216         return INT;
   218     }
   217     }
   219 
   218 
   220     @Override
   219     @Override
   221     public Type rem(final MethodVisitor method) {
   220     public Type rem(final MethodVisitor method) {
   222         method.visitInsn(IREM);
   221         method.visitInsn(IREM);
   223         return INT;
   222         return INT;
   224     }
   223     }
   225 
   224 
   226     @Override
   225     @Override
   227     public Type neg(final MethodVisitor method) {
   226     public Type neg(final MethodVisitor method, final int programPoint) {
   228         method.visitInsn(INEG);
   227         method.visitInvokeDynamicInsn("ineg", "(I)I", MATHBOOTSTRAP, programPoint);
   229         return INT;
   228         return INT;
   230     }
   229     }
   231 
   230 
   232     @Override
   231     @Override
   233     public void _return(final MethodVisitor method) {
   232     public void _return(final MethodVisitor method) {
   234         method.visitInsn(IRETURN);
   233         method.visitInsn(IRETURN);
   235     }
   234     }
   236 
   235 
   237     @Override
   236     @Override
   238     public Type loadUndefined(final MethodVisitor method) {
   237     public Type loadUndefined(final MethodVisitor method) {
   239         method.visitLdcInsn(ObjectClassGenerator.UNDEFINED_INT);
   238         method.visitLdcInsn(UNDEFINED_INT);
       
   239         return INT;
       
   240     }
       
   241 
       
   242     @Override
       
   243     public Type loadForcedInitializer(MethodVisitor method) {
       
   244         method.visitInsn(ICONST_0);
   240         return INT;
   245         return INT;
   241     }
   246     }
   242 
   247 
   243     @Override
   248     @Override
   244     public Type cmp(final MethodVisitor method, final boolean isCmpG) {
   249     public Type cmp(final MethodVisitor method, final boolean isCmpG) {
   245         assert false : "unsupported operation";
   250         throw new UnsupportedOperationException("cmp" + (isCmpG ? 'g' : 'l'));
   246         return null;
       
   247     }
   251     }
   248 
   252 
   249     @Override
   253     @Override
   250     public Type cmp(final MethodVisitor method) {
   254     public Type cmp(final MethodVisitor method) {
   251         assert false : "unsupported operation";
   255         throw new UnsupportedOperationException("cmp");
   252         return null;
   256     }
   253     }
   257 
   254 }
   258 }