/* * Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Business Objects nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PrimOp.java * Created: May 8, 2003 5:55:26 PM * By: Raymond Cypher */ package org.openquark.cal.internal.machine.lecc; import org.openquark.cal.internal.javamodel.JavaExpression; import org.openquark.cal.internal.javamodel.JavaOperator; import org.openquark.cal.internal.javamodel.JavaTypeName; import org.openquark.cal.internal.javamodel.JavaExpression.CastExpression; import org.openquark.cal.internal.javamodel.JavaExpression.MethodInvocation; import org.openquark.cal.internal.javamodel.JavaExpression.MethodVariable; import org.openquark.cal.internal.javamodel.JavaExpression.OperatorExpression; import org.openquark.cal.internal.javamodel.JavaExpression.MethodInvocation.InvocationType; import org.openquark.cal.internal.machine.CodeGenerationException; import org.openquark.cal.internal.machine.primitiveops.PrimOps; /** * This is the PrimOp class/interface. * This class contains defintions for the primitive operations. * <p> * Note that there is an assumption that all PrimOps produce a value in weak-head normal form. * * <p> * Created: May 8, 2003 3:19:37 PM * @author RCypher */ final class PrimOp { /** * Get the Java expression corresponding to a given primOp * @param code the PrimOp code. This is defined in class PrimOps. Shouldn't be NOP. * @param args the arguments to the op. * @return JavaExpression * @throws CodeGenerationException */ static JavaExpression getPrimOpDefinition(int code, JavaExpression[] args) throws CodeGenerationException { switch (code) { case PrimOps.PRIMOP_NOP: throw new CodeGenerationException ("Attempt to generate code for PRIMOP_NOP."); case PrimOps.PRIMOP_OR: return new OperatorExpression.Binary(JavaOperator.CONDITIONAL_OR, args); case PrimOps.PRIMOP_AND: return new OperatorExpression.Binary(JavaOperator.CONDITIONAL_AND, args); case PrimOps.PRIMOP_EQUALS_INT: return new OperatorExpression.Binary(JavaOperator.EQUALS_INT, args); case PrimOps.PRIMOP_NOT_EQUALS_INT: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_INT, args); case PrimOps.PRIMOP_GREATER_THAN_INT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_INT, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_INT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_INT, args); case PrimOps.PRIMOP_LESS_THAN_INT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_INT, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_INT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_INT, args); case PrimOps.PRIMOP_ADD_INT: return new OperatorExpression.Binary(JavaOperator.ADD_INT, args); case PrimOps.PRIMOP_SUBTRACT_INT: return new OperatorExpression.Binary(JavaOperator.SUBTRACT_INT, args); case PrimOps.PRIMOP_MULTIPLY_INT: return new OperatorExpression.Binary(JavaOperator.MULTIPLY_INT, args); case PrimOps.PRIMOP_DIVIDE_INT: return new OperatorExpression.Binary(JavaOperator.DIVIDE_INT, args); case PrimOps.PRIMOP_ADD_DOUBLE: return new OperatorExpression.Binary(JavaOperator.ADD_DOUBLE, args); case PrimOps.PRIMOP_SUBTRACT_DOUBLE: return new OperatorExpression.Binary(JavaOperator.SUBTRACT_DOUBLE, args); case PrimOps.PRIMOP_MULTIPLY_DOUBLE: return new OperatorExpression.Binary(JavaOperator.MULTIPLY_DOUBLE, args); case PrimOps.PRIMOP_DIVIDE_DOUBLE: return new OperatorExpression.Binary(JavaOperator.DIVIDE_DOUBLE, args); case PrimOps.PRIMOP_EQUALS_DOUBLE: return new OperatorExpression.Binary(JavaOperator.EQUALS_DOUBLE, args); case PrimOps.PRIMOP_NOT_EQUALS_DOUBLE: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_DOUBLE, args); case PrimOps.PRIMOP_GREATER_THAN_DOUBLE: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_DOUBLE, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_DOUBLE: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_DOUBLE, args); case PrimOps.PRIMOP_LESS_THAN_DOUBLE: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_DOUBLE, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_DOUBLE: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_DOUBLE, args); case PrimOps.PRIMOP_ADD_FLOAT: return new OperatorExpression.Binary(JavaOperator.ADD_FLOAT, args); case PrimOps.PRIMOP_SUBTRACT_FLOAT: return new OperatorExpression.Binary(JavaOperator.SUBTRACT_FLOAT, args); case PrimOps.PRIMOP_MULTIPLY_FLOAT: return new OperatorExpression.Binary(JavaOperator.MULTIPLY_FLOAT, args); case PrimOps.PRIMOP_DIVIDE_FLOAT: return new OperatorExpression.Binary(JavaOperator.DIVIDE_FLOAT, args); case PrimOps.PRIMOP_EQUALS_FLOAT: return new OperatorExpression.Binary(JavaOperator.EQUALS_FLOAT, args); case PrimOps.PRIMOP_NOT_EQUALS_FLOAT: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_FLOAT, args); case PrimOps.PRIMOP_GREATER_THAN_FLOAT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_FLOAT, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_FLOAT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_FLOAT, args); case PrimOps.PRIMOP_LESS_THAN_FLOAT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_FLOAT, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_FLOAT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_FLOAT, args); case PrimOps.PRIMOP_ADD_LONG: return new OperatorExpression.Binary(JavaOperator.ADD_LONG, args); case PrimOps.PRIMOP_SUBTRACT_LONG: return new OperatorExpression.Binary(JavaOperator.SUBTRACT_LONG, args); case PrimOps.PRIMOP_MULTIPLY_LONG: return new OperatorExpression.Binary(JavaOperator.MULTIPLY_LONG, args); case PrimOps.PRIMOP_DIVIDE_LONG: return new OperatorExpression.Binary(JavaOperator.DIVIDE_LONG, args); case PrimOps.PRIMOP_EQUALS_LONG: return new OperatorExpression.Binary(JavaOperator.EQUALS_LONG, args); case PrimOps.PRIMOP_NOT_EQUALS_LONG: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_LONG, args); case PrimOps.PRIMOP_GREATER_THAN_LONG: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_LONG, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_LONG: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_LONG, args); case PrimOps.PRIMOP_LESS_THAN_LONG: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_LONG, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_LONG: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_LONG, args); case PrimOps.PRIMOP_EQUALS_SHORT: return new OperatorExpression.Binary(JavaOperator.EQUALS_SHORT, args); case PrimOps.PRIMOP_NOT_EQUALS_SHORT: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_SHORT, args); case PrimOps.PRIMOP_GREATER_THAN_SHORT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_SHORT, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_SHORT: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_SHORT, args); case PrimOps.PRIMOP_LESS_THAN_SHORT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_SHORT, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_SHORT: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_SHORT, args); case PrimOps.PRIMOP_EQUALS_BYTE: return new OperatorExpression.Binary(JavaOperator.EQUALS_BYTE, args); case PrimOps.PRIMOP_NOT_EQUALS_BYTE: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_BYTE, args); case PrimOps.PRIMOP_GREATER_THAN_BYTE: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_BYTE, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_BYTE: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_BYTE, args); case PrimOps.PRIMOP_LESS_THAN_BYTE: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_BYTE, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_BYTE: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_BYTE, args); case PrimOps.PRIMOP_EQUALS_CHAR: return new OperatorExpression.Binary(JavaOperator.EQUALS_CHAR, args); case PrimOps.PRIMOP_NOT_EQUALS_CHAR: return new OperatorExpression.Binary(JavaOperator.NOT_EQUALS_CHAR, args); case PrimOps.PRIMOP_GREATER_THAN_CHAR: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_CHAR, args); case PrimOps.PRIMOP_GREATER_THAN_EQUALS_CHAR: return new OperatorExpression.Binary(JavaOperator.GREATER_THAN_EQUALS_CHAR, args); case PrimOps.PRIMOP_LESS_THAN_CHAR: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_CHAR, args); case PrimOps.PRIMOP_LESS_THAN_EQUALS_CHAR: return new OperatorExpression.Binary(JavaOperator.LESS_THAN_EQUALS_CHAR, args); case PrimOps.PRIMOP_NEGATE_INT: return new OperatorExpression.Unary(JavaOperator.NEGATE_INT, args[0]); case PrimOps.PRIMOP_REMAINDER_INT: return new OperatorExpression.Binary(JavaOperator.REM_INT, args); case PrimOps.PRIMOP_NEGATE_DOUBLE: return new OperatorExpression.Unary(JavaOperator.NEGATE_DOUBLE, args[0]); case PrimOps.PRIMOP_REMAINDER_DOUBLE: return new OperatorExpression.Binary(JavaOperator.REM_DOUBLE, args); case PrimOps.PRIMOP_NEGATE_FLOAT: return new OperatorExpression.Unary(JavaOperator.NEGATE_FLOAT, args[0]); case PrimOps.PRIMOP_REMAINDER_FLOAT: return new OperatorExpression.Binary(JavaOperator.REM_FLOAT, args); case PrimOps.PRIMOP_NEGATE_LONG: return new OperatorExpression.Unary(JavaOperator.NEGATE_LONG, args[0]); case PrimOps.PRIMOP_REMAINDER_LONG: return new OperatorExpression.Binary(JavaOperator.REM_LONG, args); case PrimOps.PRIMOP_FIELD_NAMES: { //((RTRecordValue)args[0]).fieldNames() return new MethodInvocation.Instance(new CastExpression(JavaTypeNames.RTRECORD_VALUE, args[0]), "fieldNames", JavaTypeName.LIST, InvocationType.VIRTUAL); } case PrimOps.PRIMOP_FIELD_VALUES: { //((RTRecordValue)args[0]).fieldValues() return new MethodInvocation.Instance(new CastExpression(JavaTypeNames.RTRECORD_VALUE, args[0]), "fieldValues", JavaTypeName.LIST, InvocationType.VIRTUAL); } case PrimOps.PRIMOP_HAS_FIELD: { //((RTRecordValue)args[0]).hasField(args[1]) return new MethodInvocation.Instance(new CastExpression(JavaTypeNames.RTRECORD_VALUE, args[0]), "hasField", args[1], JavaTypeName.STRING, JavaTypeName.BOOLEAN, InvocationType.VIRTUAL); } case PrimOps.PRIMOP_RECORD_FIELD_INDEX: { //((RTRecordValue)args[0]).indexOfField(args[1]) return new MethodInvocation.Instance( new CastExpression(JavaTypeNames.RTRECORD_VALUE, args[0]), "indexOfField", args[1], JavaTypeName.STRING, JavaTypeName.INT, InvocationType.VIRTUAL); } case PrimOps.PRIMOP_CAL_VALUE_TO_OBJECT: { return new JavaExpression.MethodInvocation.Static (JavaTypeNames.RTDATA_OPAQUE, "make", args[0], JavaTypeName.OBJECT, JavaTypeNames.RTDATA_OPAQUE); } case PrimOps.PRIMOP_OBJECT_TO_CAL_VALUE: { //note that the call to evaluate is necessary because the code generator makes some assumptions that all PrimOps produce //a value in weak-head normal form. //((RTValue) args[0]).evaluate($ec); return SCJavaDefn.createInvocation(new JavaExpression.CastExpression(JavaTypeNames.RTVALUE, args[0]), SCJavaDefn.EVALUATE, SCJavaDefn.EXECUTION_CONTEXT_VAR); } case PrimOps.PRIMOP_MAKE_ITERATOR: { //new RTCalListIterator(args[0], args[1], $ec) JavaExpression[] arguments = new JavaExpression[] {args[0], args[1], new MethodVariable(SCJavaDefn.EXECUTION_CONTEXT_NAME)}; JavaTypeName[] argTypes = new JavaTypeName[] {JavaTypeNames.RTVALUE, JavaTypeNames.RTVALUE, JavaTypeNames.RTEXECUTION_CONTEXT}; return new JavaExpression.ClassInstanceCreationExpression(JavaTypeNames.RTCAL_LIST_ITERATOR, arguments, argTypes); } case PrimOps.PRIMOP_MAKE_COMPARATOR: { //new RTComparator(args[0], $ec) JavaExpression[] arguments = new JavaExpression[] {args[0], new MethodVariable(SCJavaDefn.EXECUTION_CONTEXT_NAME)}; JavaTypeName[] argTypes = new JavaTypeName[] {JavaTypeNames.RTVALUE, JavaTypeNames.RTEXECUTION_CONTEXT}; return new JavaExpression.ClassInstanceCreationExpression(JavaTypeNames.RTCOMPARATOR, arguments, argTypes); } case PrimOps.PRIMOP_MAKE_EQUIVALENCE_RELATION: { //new RTEquivalenceRelation(args[0], $ec) JavaExpression[] arguments = new JavaExpression[] {args[0], new MethodVariable(SCJavaDefn.EXECUTION_CONTEXT_NAME)}; JavaTypeName[] argTypes = new JavaTypeName[] {JavaTypeNames.RTVALUE, JavaTypeNames.RTEXECUTION_CONTEXT}; return new JavaExpression.ClassInstanceCreationExpression(JavaTypeNames.RTEQUIVALENCE_RELATION, arguments, argTypes); } case PrimOps.PRIMOP_MAKE_CAL_FUNCTION: { //new RTCalFunction(args[0], $ec) JavaExpression[] arguments = new JavaExpression[] {args[0], new MethodVariable(SCJavaDefn.EXECUTION_CONTEXT_NAME)}; JavaTypeName[] argTypes = new JavaTypeName[] {JavaTypeNames.RTVALUE, JavaTypeNames.RTEXECUTION_CONTEXT}; return new JavaExpression.ClassInstanceCreationExpression(JavaTypeNames.RTCAL_FUNCTION, arguments, argTypes); } case PrimOps.PRIMOP_BITWISE_AND_INT: { return new OperatorExpression.Binary (JavaOperator.BITWISE_AND_INT, args); } case PrimOps.PRIMOP_BITWISE_OR_INT: { return new OperatorExpression.Binary (JavaOperator.BITWISE_OR_INT, args); } case PrimOps.PRIMOP_BITWISE_XOR_INT: { return new OperatorExpression.Binary (JavaOperator.BITWISE_XOR_INT, args); } case PrimOps.PRIMOP_COMPLEMENT_INT: { return new OperatorExpression.Unary (JavaOperator.COMPLEMENT_INT, args[0]); } case PrimOps.PRIMOP_SHIFTL_INT: { return new OperatorExpression.Binary (JavaOperator.SHIFTL_INT, args); } case PrimOps.PRIMOP_SHIFTR_INT: { return new OperatorExpression.Binary (JavaOperator.SHIFTR_INT, args); } case PrimOps.PRIMOP_SHIFTR_UNSIGNED_INT: { return new OperatorExpression.Binary (JavaOperator.SHIFTR_UNSIGNED_INT, args); } case PrimOps.PRIMOP_BITWISE_AND_LONG: { return new OperatorExpression.Binary (JavaOperator.BITWISE_AND_LONG, args); } case PrimOps.PRIMOP_BITWISE_OR_LONG: { return new OperatorExpression.Binary (JavaOperator.BITWISE_OR_LONG, args); } case PrimOps.PRIMOP_BITWISE_XOR_LONG: { return new OperatorExpression.Binary (JavaOperator.BITWISE_XOR_LONG, args); } case PrimOps.PRIMOP_COMPLEMENT_LONG: { return new OperatorExpression.Unary (JavaOperator.COMPLEMENT_LONG, args[0]); } case PrimOps.PRIMOP_SHIFTL_LONG: { return new OperatorExpression.Binary (JavaOperator.SHIFTL_LONG, args); } case PrimOps.PRIMOP_SHIFTR_LONG: { return new OperatorExpression.Binary (JavaOperator.SHIFTR_LONG, args); } case PrimOps.PRIMOP_SHIFTR_UNSIGNED_LONG: { return new OperatorExpression.Binary (JavaOperator.SHIFTR_UNSIGNED_LONG, args); } case PrimOps.PRIMOP_EXECUTION_CONTEXT: { //reference to the "$ec" execution context variable return SCJavaDefn.EXECUTION_CONTEXT_VAR; } // This is now handled higher up since more context information is needed // in order to add the source position to the error message. // default: { throw new CodeGenerationException("Unrecognized PrimOp: " + code + "."); } } } /** * @param primOp * @return return type of the primitive op. null for the case of PRIMOP_FOREIGNSC. * @throws CodeGenerationException */ static JavaTypeName getTypeNameForPrimOp (int primOp) throws CodeGenerationException { switch (primOp) { case PrimOps.PRIMOP_NOP: throw new CodeGenerationException ("attempt to get type for primop_nop."); case PrimOps.PRIMOP_OR: case PrimOps.PRIMOP_AND: case PrimOps.PRIMOP_EQUALS_INT: case PrimOps.PRIMOP_NOT_EQUALS_INT: case PrimOps.PRIMOP_GREATER_THAN_INT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_INT: case PrimOps.PRIMOP_LESS_THAN_INT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_INT: case PrimOps.PRIMOP_EQUALS_DOUBLE: case PrimOps.PRIMOP_NOT_EQUALS_DOUBLE: case PrimOps.PRIMOP_GREATER_THAN_DOUBLE: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_DOUBLE: case PrimOps.PRIMOP_LESS_THAN_DOUBLE: case PrimOps.PRIMOP_LESS_THAN_EQUALS_DOUBLE: case PrimOps.PRIMOP_EQUALS_LONG: case PrimOps.PRIMOP_NOT_EQUALS_LONG: case PrimOps.PRIMOP_GREATER_THAN_LONG: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_LONG: case PrimOps.PRIMOP_LESS_THAN_LONG: case PrimOps.PRIMOP_LESS_THAN_EQUALS_LONG: case PrimOps.PRIMOP_EQUALS_CHAR: case PrimOps.PRIMOP_NOT_EQUALS_CHAR: case PrimOps.PRIMOP_GREATER_THAN_CHAR: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_CHAR: case PrimOps.PRIMOP_LESS_THAN_CHAR: case PrimOps.PRIMOP_LESS_THAN_EQUALS_CHAR: case PrimOps.PRIMOP_EQUALS_SHORT: case PrimOps.PRIMOP_NOT_EQUALS_SHORT: case PrimOps.PRIMOP_GREATER_THAN_SHORT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_SHORT: case PrimOps.PRIMOP_LESS_THAN_SHORT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_SHORT: case PrimOps.PRIMOP_EQUALS_FLOAT: case PrimOps.PRIMOP_NOT_EQUALS_FLOAT: case PrimOps.PRIMOP_GREATER_THAN_FLOAT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_FLOAT: case PrimOps.PRIMOP_LESS_THAN_FLOAT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_FLOAT: case PrimOps.PRIMOP_EQUALS_BYTE: case PrimOps.PRIMOP_NOT_EQUALS_BYTE: case PrimOps.PRIMOP_GREATER_THAN_BYTE: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_BYTE: case PrimOps.PRIMOP_LESS_THAN_BYTE: case PrimOps.PRIMOP_LESS_THAN_EQUALS_BYTE: case PrimOps.PRIMOP_HAS_FIELD: return JavaTypeName.BOOLEAN; case PrimOps.PRIMOP_ADD_INT: case PrimOps.PRIMOP_SUBTRACT_INT: case PrimOps.PRIMOP_MULTIPLY_INT: case PrimOps.PRIMOP_DIVIDE_INT: case PrimOps.PRIMOP_NEGATE_INT: case PrimOps.PRIMOP_REMAINDER_INT: case PrimOps.PRIMOP_BITWISE_AND_INT: case PrimOps.PRIMOP_BITWISE_OR_INT: case PrimOps.PRIMOP_BITWISE_XOR_INT: case PrimOps.PRIMOP_COMPLEMENT_INT: case PrimOps.PRIMOP_SHIFTL_INT: case PrimOps.PRIMOP_SHIFTR_INT: case PrimOps.PRIMOP_SHIFTR_UNSIGNED_INT: case PrimOps.PRIMOP_RECORD_FIELD_INDEX: return JavaTypeName.INT; case PrimOps.PRIMOP_ADD_DOUBLE: case PrimOps.PRIMOP_SUBTRACT_DOUBLE: case PrimOps.PRIMOP_MULTIPLY_DOUBLE: case PrimOps.PRIMOP_DIVIDE_DOUBLE: case PrimOps.PRIMOP_NEGATE_DOUBLE: case PrimOps.PRIMOP_REMAINDER_DOUBLE: return JavaTypeName.DOUBLE; case PrimOps.PRIMOP_ADD_LONG: case PrimOps.PRIMOP_SUBTRACT_LONG: case PrimOps.PRIMOP_MULTIPLY_LONG: case PrimOps.PRIMOP_DIVIDE_LONG: case PrimOps.PRIMOP_NEGATE_LONG: case PrimOps.PRIMOP_REMAINDER_LONG: case PrimOps.PRIMOP_BITWISE_AND_LONG: case PrimOps.PRIMOP_BITWISE_OR_LONG: case PrimOps.PRIMOP_BITWISE_XOR_LONG: case PrimOps.PRIMOP_COMPLEMENT_LONG: case PrimOps.PRIMOP_SHIFTL_LONG: case PrimOps.PRIMOP_SHIFTR_LONG: case PrimOps.PRIMOP_SHIFTR_UNSIGNED_LONG: return JavaTypeName.LONG; case PrimOps.PRIMOP_ADD_FLOAT: case PrimOps.PRIMOP_SUBTRACT_FLOAT: case PrimOps.PRIMOP_MULTIPLY_FLOAT: case PrimOps.PRIMOP_DIVIDE_FLOAT: case PrimOps.PRIMOP_NEGATE_FLOAT: case PrimOps.PRIMOP_REMAINDER_FLOAT: return JavaTypeName.FLOAT; case PrimOps.PRIMOP_FIELD_NAMES: case PrimOps.PRIMOP_FIELD_VALUES: return JavaTypeName.LIST; case PrimOps.PRIMOP_OBJECT_TO_CAL_VALUE: return JavaTypeName.CAL_VALUE; case PrimOps.PRIMOP_CAL_VALUE_TO_OBJECT: return JavaTypeName.OBJECT; case PrimOps.PRIMOP_MAKE_ITERATOR: return JavaTypeName.ITERATOR; case PrimOps.PRIMOP_MAKE_COMPARATOR: return JavaTypeName.COMPARATOR; case PrimOps.PRIMOP_MAKE_EQUIVALENCE_RELATION: return JavaTypeName.EQUIVALENCE_RELATION; case PrimOps.PRIMOP_MAKE_CAL_FUNCTION: return JavaTypeName.CAL_FUNCTION; case PrimOps.PRIMOP_EXECUTION_CONTEXT: return JavaTypeNames.RTEXECUTION_CONTEXT; case PrimOps.PRIMOP_FOREIGN_FUNCTION: //more information is needed to determine the return type of a foreign function... return null; default: { throw new CodeGenerationException("Unrecognized primitive op code " + primOp); } } } static final JavaTypeName getTypeNameForPrimOpArgument (int op, int argNum) throws CodeGenerationException { switch (op) { case PrimOps.PRIMOP_NOP: throw new CodeGenerationException ("Attemp to get argument type for PRIMOP_NOP"); case PrimOps.PRIMOP_OR: case PrimOps.PRIMOP_AND: return JavaTypeName.BOOLEAN; case PrimOps.PRIMOP_EQUALS_INT: case PrimOps.PRIMOP_NOT_EQUALS_INT: case PrimOps.PRIMOP_GREATER_THAN_INT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_INT: case PrimOps.PRIMOP_LESS_THAN_INT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_INT: case PrimOps.PRIMOP_ADD_INT: case PrimOps.PRIMOP_SUBTRACT_INT: case PrimOps.PRIMOP_MULTIPLY_INT: case PrimOps.PRIMOP_DIVIDE_INT: case PrimOps.PRIMOP_NEGATE_INT: case PrimOps.PRIMOP_REMAINDER_INT: case PrimOps.PRIMOP_BITWISE_AND_INT: case PrimOps.PRIMOP_BITWISE_OR_INT: case PrimOps.PRIMOP_BITWISE_XOR_INT: case PrimOps.PRIMOP_COMPLEMENT_INT: case PrimOps.PRIMOP_SHIFTL_INT: case PrimOps.PRIMOP_SHIFTR_INT: case PrimOps.PRIMOP_SHIFTR_UNSIGNED_INT: return JavaTypeName.INT; case PrimOps.PRIMOP_EQUALS_LONG: case PrimOps.PRIMOP_NOT_EQUALS_LONG: case PrimOps.PRIMOP_GREATER_THAN_LONG: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_LONG: case PrimOps.PRIMOP_LESS_THAN_LONG: case PrimOps.PRIMOP_LESS_THAN_EQUALS_LONG: case PrimOps.PRIMOP_ADD_LONG: case PrimOps.PRIMOP_SUBTRACT_LONG: case PrimOps.PRIMOP_MULTIPLY_LONG: case PrimOps.PRIMOP_DIVIDE_LONG: case PrimOps.PRIMOP_NEGATE_LONG: case PrimOps.PRIMOP_REMAINDER_LONG: case PrimOps.PRIMOP_BITWISE_AND_LONG: case PrimOps.PRIMOP_BITWISE_OR_LONG: case PrimOps.PRIMOP_BITWISE_XOR_LONG: case PrimOps.PRIMOP_COMPLEMENT_LONG: case PrimOps.PRIMOP_SHIFTL_LONG: case PrimOps.PRIMOP_SHIFTR_LONG: case PrimOps.PRIMOP_SHIFTR_UNSIGNED_LONG: return JavaTypeName.LONG; case PrimOps.PRIMOP_EQUALS_SHORT: case PrimOps.PRIMOP_NOT_EQUALS_SHORT: case PrimOps.PRIMOP_GREATER_THAN_SHORT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_SHORT: case PrimOps.PRIMOP_LESS_THAN_SHORT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_SHORT: return JavaTypeName.SHORT; case PrimOps.PRIMOP_EQUALS_BYTE: case PrimOps.PRIMOP_NOT_EQUALS_BYTE: case PrimOps.PRIMOP_GREATER_THAN_BYTE: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_BYTE: case PrimOps.PRIMOP_LESS_THAN_BYTE: case PrimOps.PRIMOP_LESS_THAN_EQUALS_BYTE: return JavaTypeName.BYTE; case PrimOps.PRIMOP_EQUALS_FLOAT: case PrimOps.PRIMOP_NOT_EQUALS_FLOAT: case PrimOps.PRIMOP_GREATER_THAN_FLOAT: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_FLOAT: case PrimOps.PRIMOP_LESS_THAN_FLOAT: case PrimOps.PRIMOP_LESS_THAN_EQUALS_FLOAT: case PrimOps.PRIMOP_ADD_FLOAT: case PrimOps.PRIMOP_SUBTRACT_FLOAT: case PrimOps.PRIMOP_MULTIPLY_FLOAT: case PrimOps.PRIMOP_DIVIDE_FLOAT: case PrimOps.PRIMOP_NEGATE_FLOAT: case PrimOps.PRIMOP_REMAINDER_FLOAT: return JavaTypeName.FLOAT; case PrimOps.PRIMOP_EQUALS_DOUBLE: case PrimOps.PRIMOP_NOT_EQUALS_DOUBLE: case PrimOps.PRIMOP_GREATER_THAN_DOUBLE: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_DOUBLE: case PrimOps.PRIMOP_LESS_THAN_DOUBLE: case PrimOps.PRIMOP_LESS_THAN_EQUALS_DOUBLE: case PrimOps.PRIMOP_ADD_DOUBLE: case PrimOps.PRIMOP_SUBTRACT_DOUBLE: case PrimOps.PRIMOP_MULTIPLY_DOUBLE: case PrimOps.PRIMOP_DIVIDE_DOUBLE: case PrimOps.PRIMOP_NEGATE_DOUBLE: case PrimOps.PRIMOP_REMAINDER_DOUBLE: return JavaTypeName.DOUBLE; case PrimOps.PRIMOP_EQUALS_CHAR: case PrimOps.PRIMOP_NOT_EQUALS_CHAR: case PrimOps.PRIMOP_GREATER_THAN_CHAR: case PrimOps.PRIMOP_GREATER_THAN_EQUALS_CHAR: case PrimOps.PRIMOP_LESS_THAN_CHAR: case PrimOps.PRIMOP_LESS_THAN_EQUALS_CHAR: return JavaTypeName.CHAR; case PrimOps.PRIMOP_FIELD_NAMES: case PrimOps.PRIMOP_FIELD_VALUES: return JavaTypeNames.RTVALUE; case PrimOps.PRIMOP_HAS_FIELD: case PrimOps.PRIMOP_RECORD_FIELD_INDEX: { if (argNum == 0) { return JavaTypeNames.RTVALUE; } else { return JavaTypeName.STRING; } } case PrimOps.PRIMOP_OBJECT_TO_CAL_VALUE: return JavaTypeName.OBJECT; case PrimOps.PRIMOP_CAL_VALUE_TO_OBJECT: return JavaTypeNames.RTVALUE; case PrimOps.PRIMOP_MAKE_ITERATOR: case PrimOps.PRIMOP_MAKE_COMPARATOR: case PrimOps.PRIMOP_MAKE_EQUIVALENCE_RELATION: case PrimOps.PRIMOP_MAKE_CAL_FUNCTION: return JavaTypeNames.RTVALUE; case PrimOps.PRIMOP_EXECUTION_CONTEXT: throw new CodeGenerationException("PRIMOP_EXECUTION_CONTEXT has no arguments."); case PrimOps.PRIMOP_FOREIGN_FUNCTION: // can't determine the arg type here. return null; default: throw new CodeGenerationException("Unrecognized primop " + op + " in PrimOp.getTypeNameForPrimOpArgument."); } } }