/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.compiler.bytecode.statement; import gw.internal.gosu.ir.compiler.bytecode.AbstractBytecodeCompiler; import gw.internal.gosu.ir.compiler.bytecode.GosuMethodVisitor; import gw.internal.gosu.ir.compiler.bytecode.IRBytecodeContext; import gw.internal.gosu.ir.compiler.bytecode.IRBytecodeCompiler; import gw.lang.ir.statement.IRImplicitReturnStatement; import gw.lang.ir.statement.IRReturnStatement; import gw.internal.ext.org.objectweb.asm.Opcodes; public class IRReturnStatementCompiler extends AbstractBytecodeCompiler { public static void compile(IRReturnStatement statement, IRBytecodeContext context) { if( statement instanceof IRImplicitReturnStatement ) { //look for control-flow above me GosuMethodVisitor gmv = (GosuMethodVisitor) context.getMv(); if( gmv.isLastInstructionJumpOrReturnOrThrow() ) { return; } } if (statement.getReturnValue() != null) { if( statement.hasTempVar() ) { IRBytecodeCompiler.compileIRStatement( statement.getTempVarAssignment(), context ); } else { IRBytecodeCompiler.compileIRExpression( statement.getReturnValue(), context ); } context.inlineFinallyStatements( statement ); if( statement.hasTempVar() ) { IRBytecodeCompiler.compileIRExpression( statement.getReturnValue(), context ); } context.getMv().visitInsn( getIns( Opcodes.IRETURN, statement.getReturnValue().getType() ) ); } else { context.inlineFinallyStatements( statement ); context.getMv().visitInsn(Opcodes.RETURN); } } }