static void emitNewarray(CodeGenerator generator, int dimensions, TypeInfo elementType) { if (dimensions <= 1) { switch (elementType.TypeKind) { case Boolean: generator.emit(Opcode.Newarray, 4); break; case Char: generator.emit(Opcode.Newarray, 5); break; case Float: generator.emit(Opcode.Newarray, 6); break; case Double: generator.emit(Opcode.Newarray, 7); break; case Byte: generator.emit(Opcode.Newarray, 8); break; case Short: generator.emit(Opcode.Newarray, 9); break; case Int: generator.emit(Opcode.Newarray, 10); break; case Long: generator.emit(Opcode.Newarray, 11); break; default: generator.emit(Opcode.Anewarray, elementType); break; } } else { generator.emit(Opcode.Multianewarray, elementType.ArrayType, dimensions); } }
static void emitNumericConversion(CodeGenerator generator, TypeInfo fromType, TypeInfo toType) { switch (fromType.NumericTypeKind) { case Byte: case Char: case Short: case Int: switch (toType.NumericTypeKind) { case Byte: generator.emit(Opcode.I2b); break; case Char: generator.emit(Opcode.I2c); break; case Short: generator.emit(Opcode.I2s); break; case Long: generator.emit(Opcode.I2l); break; case Float: generator.emit(Opcode.I2f); break; case Double: generator.emit(Opcode.I2d); break; } break; case Long: switch (toType.TypeKind) { case Byte: generator.emit(Opcode.L2i); generator.emit(Opcode.I2b); break; case Char: generator.emit(Opcode.L2i); generator.emit(Opcode.I2c); break; case Short: generator.emit(Opcode.L2i); generator.emit(Opcode.I2s); break; case Int: generator.emit(Opcode.L2i); break; case Float: generator.emit(Opcode.L2f); break; case Double: generator.emit(Opcode.L2d); break; } break; case Float: switch (toType.TypeKind) { case Byte: generator.emit(Opcode.F2i); generator.emit(Opcode.I2b); break; case Char: generator.emit(Opcode.F2i); generator.emit(Opcode.I2c); break; case Short: generator.emit(Opcode.F2i); generator.emit(Opcode.I2s); break; case Int: generator.emit(Opcode.F2i); break; case Long: generator.emit(Opcode.F2l); break; case Double: generator.emit(Opcode.F2d); break; } break; case Double: switch (toType.TypeKind) { case Byte: generator.emit(Opcode.D2i); generator.emit(Opcode.I2b); break; case Char: generator.emit(Opcode.D2i); generator.emit(Opcode.I2c); break; case Short: generator.emit(Opcode.D2i); generator.emit(Opcode.I2s); break; case Int: generator.emit(Opcode.D2i); break; case Long: generator.emit(Opcode.D2l); break; case Float: generator.emit(Opcode.D2f); break; } break; } }
static void emitDoubleConstant(CodeGenerator generator, Object value) { double d = 0; if (value instanceof Double) { d = ((Double)value).doubleValue(); } else if (value instanceof Float) { d = ((Float)value).floatValue(); } else if (value instanceof Long) { d = ((Long)value).longValue(); } else if (value instanceof Integer) { d = ((Integer)value).intValue(); } else if (value instanceof Character) { d = ((Character)value).charValue(); } else if (value instanceof Byte) { d = ((Byte)value).byteValue(); } else if (value instanceof Short) { d = ((Short)value).shortValue(); } if (d == 0d) { generator.emit(Opcode.Dconst_0); } else if (d == 1d) { generator.emit(Opcode.Dconst_1); } else { generator.emit(Opcode.Ldc, Double.valueOf(d)); } }
static void emitFloatConstant(CodeGenerator generator, Object value) { float f = 0; if (value instanceof Float) { f = ((Float)value).floatValue(); } else if (value instanceof Long) { f = ((Long)value).longValue(); } else if (value instanceof Integer) { f = ((Integer)value).intValue(); } else if (value instanceof Character) { f = ((Character)value).charValue(); } else if (value instanceof Byte) { f = ((Byte)value).byteValue(); } else if (value instanceof Short) { f = ((Short)value).shortValue(); } if (f == 0f) { generator.emit(Opcode.Fconst_0); } else if (f == 1f) { generator.emit(Opcode.Fconst_1); } else if (f == 2f) { generator.emit(Opcode.Fconst_2); } else { generator.emit(Opcode.Ldc, Float.valueOf(f)); } }
static void emitLongConstant(CodeGenerator generator, Object value) { long l = 0; if (value instanceof Long) { l = ((Long)value).longValue(); } else if (value instanceof Integer) { l = ((Integer)value).intValue(); } else if (value instanceof Character) { l = ((Character)value).charValue(); } else if (value instanceof Byte) { l = ((Byte)value).byteValue(); } else if (value instanceof Short) { l = ((Short)value).shortValue(); } if (l == 0) { generator.emit(Opcode.Lconst_0); } else if (l == 1) { generator.emit(Opcode.Lconst_1); } else { generator.emit(Opcode.Ldc, Long.valueOf(l)); } }
static void emitIntConstant(CodeGenerator generator, int i) { switch (i) { case -1: generator.emit(Opcode.Iconst_M1); break; case 0: generator.emit(Opcode.Iconst_0); break; case 1: generator.emit(Opcode.Iconst_1); break; case 2: generator.emit(Opcode.Iconst_2); break; case 3: generator.emit(Opcode.Iconst_3); break; case 4: generator.emit(Opcode.Iconst_4); break; case 5: generator.emit(Opcode.Iconst_5); break; default: if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) { generator.emit(Opcode.Bipush, i); } else if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) { generator.emit(Opcode.Sipush, i); } else { generator.emit(Opcode.Ldc, (Object)i); } break; } }
static void emitTypeof(CodeGenerator generator, Library typeSystem, TypeInfo type) { switch (type.TypeKind) { case Boolean: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Boolean").getField("TYPE")); break; case Byte: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Byte").getField("TYPE")); break; case Char: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Character").getField("TYPE")); break; case Double: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Double").getField("TYPE")); break; case Float: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Float").getField("TYPE")); break; case Int: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Integer").getField("TYPE")); break; case Long: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Long").getField("TYPE")); break; case Short: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Short").getField("TYPE")); break; case Void: generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Void").getField("TYPE")); break; default: generator.emit(Opcode.Ldc, type); break; } }