/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.compiler.bytecode; import gw.lang.ir.IRElement; import gw.lang.ir.IRType; import gw.internal.ext.org.objectweb.asm.Type; import gw.internal.ext.org.objectweb.asm.Label; import gw.internal.ext.org.objectweb.asm.MethodVisitor; import gw.internal.ext.org.objectweb.asm.Opcodes; public class AbstractBytecodeCompiler { public static final Type OBJECT_TYPE = Type.getType( Object.class ); public static int getIns( int opcode, IRType type ) { if( opcode == Opcodes.DUP ) { return isWide( type ) ? Opcodes.DUP2 : opcode; } if( opcode == Opcodes.POP ) { return isWide( type ) ? Opcodes.POP2 : opcode; } switch( opcode ) { case Opcodes.ILOAD: case Opcodes.ISTORE: case Opcodes.IALOAD: case Opcodes.IASTORE: case Opcodes.IADD: case Opcodes.ISUB: case Opcodes.IMUL: case Opcodes.IDIV: case Opcodes.IREM: case Opcodes.INEG: case Opcodes.ISHL: case Opcodes.ISHR: case Opcodes.IUSHR: case Opcodes.IAND: case Opcodes.IOR: case Opcodes.IXOR: case Opcodes.IRETURN: break; default: throw new IllegalArgumentException( "Opcode: " + Integer.toHexString( opcode ) + " is not handled" ); } if( type.isByte() ) { return Type.BYTE_TYPE.getOpcode( opcode ); } else if( type.isChar() ) { return Type.CHAR_TYPE.getOpcode( opcode ); } else if( type.isShort() ) { return Type.SHORT_TYPE.getOpcode( opcode ); } else if( type.isBoolean() ) { return Type.BOOLEAN_TYPE.getOpcode( opcode ); } else if( type.isInt() ) { return Type.INT_TYPE.getOpcode( opcode ); } else if( type.isLong() ) { return Type.LONG_TYPE.getOpcode( opcode ); } else if( type.isFloat() ) { return Type.FLOAT_TYPE.getOpcode( opcode ); } else if( type.isDouble() ) { return Type.DOUBLE_TYPE.getOpcode( opcode ); } else // handles array/ref types { return OBJECT_TYPE.getOpcode( opcode ); } } public static boolean isWide( IRType type ) { return (type.getName().equals("long") || type.getName().equals("double") ); } }