/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.compiler.bytecode; import gw.internal.gosu.ir.compiler.bytecode.expression.IRArithmeticExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRArrayLengthExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRArrayLoadExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRBooleanLiteralCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRCastExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRCharacterLiteralCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRClassLiteralCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRCompositeExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRConditionalAndExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRConditionalOrExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IREqualityExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRFieldGetExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRIdentifierCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRInstanceOfExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRMethodCallExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNegationExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNewArrayExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNewExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNewMultiDimensionalArrayExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNotExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNullLiteralCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRNumericLiteralCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRPrimitiveTypeConversionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRRelationalExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRStringLiteralExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.expression.IRTernaryExpressionCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRArrayStoreStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRAssignmentStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRBreakStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRContinueStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRDoWhileStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IREvalStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRFieldSetStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRForEachStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRIfStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRMethodCallStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRMonitorLockAcquireCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRMonitorLockReleaseCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRNewStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRReturnStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRStatementListCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRSwitchStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRSyntheticStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRThrowStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRTryCatchFinallyStatementCompiler; import gw.internal.gosu.ir.compiler.bytecode.statement.IRWhileStatementCompiler; import gw.lang.ir.IRElement; import gw.lang.ir.IRExpression; import gw.lang.ir.IRStatement; import gw.lang.ir.expression.IRArithmeticExpression; import gw.lang.ir.expression.IRArrayLengthExpression; import gw.lang.ir.expression.IRArrayLoadExpression; import gw.lang.ir.expression.IRBooleanLiteral; import gw.lang.ir.expression.IRCastExpression; import gw.lang.ir.expression.IRCharacterLiteral; import gw.lang.ir.expression.IRClassLiteral; import gw.lang.ir.expression.IRCompositeExpression; import gw.lang.ir.expression.IRConditionalAndExpression; import gw.lang.ir.expression.IRConditionalOrExpression; import gw.lang.ir.expression.IREqualityExpression; import gw.lang.ir.expression.IRFieldGetExpression; import gw.lang.ir.expression.IRIdentifier; import gw.lang.ir.expression.IRInstanceOfExpression; import gw.lang.ir.expression.IRMethodCallExpression; import gw.lang.ir.expression.IRNegationExpression; import gw.lang.ir.expression.IRNewArrayExpression; import gw.lang.ir.expression.IRNewExpression; import gw.lang.ir.expression.IRNewMultiDimensionalArrayExpression; import gw.lang.ir.expression.IRNoOpExpression; import gw.lang.ir.expression.IRNotExpression; import gw.lang.ir.expression.IRNullLiteral; import gw.lang.ir.expression.IRNumericLiteral; import gw.lang.ir.expression.IRPrimitiveTypeConversion; import gw.lang.ir.expression.IRRelationalExpression; import gw.lang.ir.expression.IRStringLiteralExpression; import gw.lang.ir.expression.IRTernaryExpression; import gw.lang.ir.statement.IRArrayStoreStatement; import gw.lang.ir.statement.IRAssignmentStatement; import gw.lang.ir.statement.IRBreakStatement; import gw.lang.ir.statement.IRContinueStatement; import gw.lang.ir.statement.IRDoWhileStatement; import gw.lang.ir.statement.IREvalStatement; import gw.lang.ir.statement.IRFieldSetStatement; import gw.lang.ir.statement.IRForEachStatement; import gw.lang.ir.statement.IRIfStatement; import gw.lang.ir.statement.IRMethodCallStatement; import gw.lang.ir.statement.IRMonitorLockAcquireStatement; import gw.lang.ir.statement.IRMonitorLockReleaseStatement; import gw.lang.ir.statement.IRNewStatement; import gw.lang.ir.statement.IRNoOpStatement; import gw.lang.ir.statement.IRReturnStatement; import gw.lang.ir.statement.IRStatementList; import gw.lang.ir.statement.IRSwitchStatement; import gw.lang.ir.statement.IRSyntheticStatement; import gw.lang.ir.statement.IRThrowStatement; import gw.lang.ir.statement.IRTryCatchFinallyStatement; import gw.lang.ir.statement.IRWhileStatement; public class IRBytecodeCompiler { public static void compileIRElement(IRElement element, IRBytecodeContext context) { if (element instanceof IRStatement) { compileIRStatement((IRStatement) element, context); } else { compileIRExpression((IRExpression) element, context); } } public static void compileIRStatement(IRStatement statement, IRBytecodeContext context) { if (statement == null) { return; } context.setLineNumber( statement.getLineNumber() ); if (statement instanceof IRAssignmentStatement) { IRAssignmentStatementCompiler.compile((IRAssignmentStatement) statement, context); } else if (statement instanceof IRFieldSetStatement) { IRFieldSetStatementCompiler.compile((IRFieldSetStatement) statement, context); } else if (statement instanceof IRIfStatement) { IRIfStatementCompiler.compile((IRIfStatement) statement, context); } else if (statement instanceof IRMethodCallStatement) { IRMethodCallStatementCompiler.compile((IRMethodCallStatement) statement, context); } else if (statement instanceof IRNewStatement ) { IRNewStatementCompiler.compile( (IRNewStatement)statement, context ); } else if (statement instanceof IRNoOpStatement) { // Do nothing } else if (statement instanceof IRReturnStatement) { IRReturnStatementCompiler.compile((IRReturnStatement) statement, context); } else if (statement instanceof IRStatementList) { IRStatementListCompiler.compile((IRStatementList) statement, context); } else if (statement instanceof IRArrayStoreStatement) { IRArrayStoreStatementCompiler.compile((IRArrayStoreStatement) statement, context); } else if (statement instanceof IRThrowStatement) { IRThrowStatementCompiler.compile((IRThrowStatement) statement, context); } else if (statement instanceof IRForEachStatement ) { IRForEachStatementCompiler.compile((IRForEachStatement) statement, context); } else if (statement instanceof IRWhileStatement ) { IRWhileStatementCompiler.compile((IRWhileStatement) statement, context); } else if (statement instanceof IRDoWhileStatement ) { IRDoWhileStatementCompiler.compile((IRDoWhileStatement) statement, context); } else if (statement instanceof IRBreakStatement ) { IRBreakStatementCompiler.compile((IRBreakStatement) statement, context); } else if (statement instanceof IRContinueStatement) { IRContinueStatementCompiler.compile((IRContinueStatement) statement, context); } else if (statement instanceof IRTryCatchFinallyStatement) { IRTryCatchFinallyStatementCompiler.compile((IRTryCatchFinallyStatement) statement, context); } else if (statement instanceof IRMonitorLockAcquireStatement ) { IRMonitorLockAcquireCompiler.compile((IRMonitorLockAcquireStatement) statement, context); } else if (statement instanceof IRMonitorLockReleaseStatement ) { IRMonitorLockReleaseCompiler.compile((IRMonitorLockReleaseStatement) statement, context); } else if (statement instanceof IRSyntheticStatement) { IRSyntheticStatementCompiler.compile((IRSyntheticStatement) statement, context); } else if (statement instanceof IRSwitchStatement) { IRSwitchStatementCompiler.compile((IRSwitchStatement) statement, context); } else if (statement instanceof IREvalStatement ) { IREvalStatementCompiler.compile((IREvalStatement) statement, context); } else { throw new IllegalArgumentException("Unrecognized statement of type " + statement.getClass()); } } public static void compileIRExpression(IRExpression expression, IRBytecodeContext context) { if (expression == null) { return; } int previousLineNumber = context.setLineNumber( expression.getLineNumber() ); try { if (expression instanceof IRArithmeticExpression) { IRArithmeticExpressionCompiler.compile((IRArithmeticExpression) expression, context); } else if (expression instanceof IRArrayLoadExpression) { IRArrayLoadExpressionCompiler.compile((IRArrayLoadExpression) expression, context); } else if (expression instanceof IRBooleanLiteral) { IRBooleanLiteralCompiler.compile((IRBooleanLiteral) expression, context); } else if (expression instanceof IRCompositeExpression) { IRCompositeExpressionCompiler.compile((IRCompositeExpression) expression, context); } else if (expression instanceof IREqualityExpression) { IREqualityExpressionCompiler.compile((IREqualityExpression) expression, context); } else if (expression instanceof IRFieldGetExpression) { IRFieldGetExpressionCompiler.compile((IRFieldGetExpression) expression, context); } else if (expression instanceof IRIdentifier) { IRIdentifierCompiler.compile((IRIdentifier) expression, context); } else if (expression instanceof IRMethodCallExpression) { IRMethodCallExpressionCompiler.compile((IRMethodCallExpression) expression, context); } else if (expression instanceof IRNullLiteral) { IRNullLiteralCompiler.compile((IRNullLiteral) expression, context); } else if (expression instanceof IRPrimitiveTypeConversion) { IRPrimitiveTypeConversionCompiler.compile((IRPrimitiveTypeConversion) expression, context); } else if (expression instanceof IRTernaryExpression) { IRTernaryExpressionCompiler.compile((IRTernaryExpression) expression, context); } else if (expression instanceof IRNumericLiteral) { IRNumericLiteralCompiler.compile((IRNumericLiteral) expression, context); } else if (expression instanceof IRCharacterLiteral ) { IRCharacterLiteralCompiler.compile((IRCharacterLiteral) expression, context); } else if (expression instanceof IRStringLiteralExpression) { IRStringLiteralExpressionCompiler.compile((IRStringLiteralExpression) expression, context); } else if (expression instanceof IRNewArrayExpression) { IRNewArrayExpressionCompiler.compile((IRNewArrayExpression) expression, context); } else if (expression instanceof IRArrayLengthExpression) { IRArrayLengthExpressionCompiler.compile((IRArrayLengthExpression) expression, context); } else if (expression instanceof IRCastExpression) { IRCastExpressionCompiler.compile((IRCastExpression) expression, context); } else if (expression instanceof IRNewExpression) { IRNewExpressionCompiler.compile((IRNewExpression) expression, context); } else if (expression instanceof IRRelationalExpression) { IRRelationalExpressionCompiler.compile((IRRelationalExpression) expression, context); } else if (expression instanceof IRClassLiteral) { IRClassLiteralCompiler.compile((IRClassLiteral) expression, context); } else if (expression instanceof IRNegationExpression) { IRNegationExpressionCompiler.compile((IRNegationExpression) expression, context); } else if (expression instanceof IRNotExpression) { IRNotExpressionCompiler.compile((IRNotExpression) expression, context); } else if (expression instanceof IRConditionalAndExpression) { IRConditionalAndExpressionCompiler.compile((IRConditionalAndExpression) expression, context); } else if (expression instanceof IRConditionalOrExpression) { IRConditionalOrExpressionCompiler.compile((IRConditionalOrExpression) expression, context); } else if (expression instanceof IRInstanceOfExpression) { IRInstanceOfExpressionCompiler.compile((IRInstanceOfExpression) expression, context); } else if (expression instanceof IRNewMultiDimensionalArrayExpression) { IRNewMultiDimensionalArrayExpressionCompiler.compile((IRNewMultiDimensionalArrayExpression) expression, context); } else if (expression instanceof IRNoOpExpression) { // Do nothing } else { throw new IllegalArgumentException("Unrecognized expression of type " + expression.getClass()); } } finally { context.setLineNumber( previousLineNumber ); } } }