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 } |