/* * 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. */ /* * EagerFunctionInfo.java * Creation date: April 27, 2006 * By: Raymond Cypher */ package org.openquark.cal.compiler; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.openquark.cal.internal.module.Cal.Collections.CAL_ArrayPrimitives_internal; import org.openquark.cal.internal.module.Cal.Core.CAL_Bits_internal; import org.openquark.cal.internal.module.Cal.Core.CAL_Prelude_internal; import org.openquark.cal.internal.module.Cal.Core.CAL_Record_internal; import org.openquark.cal.module.Cal.Collections.CAL_Array; import org.openquark.cal.module.Cal.Core.CAL_Char; import org.openquark.cal.module.Cal.Core.CAL_Prelude; import org.openquark.cal.module.Cal.Utilities.CAL_Math; /** * Contains info on the functions which can be eagerly evaluated in a CAL runtime. * An eagerly evaluated function is one which will be immediately evaluated in a * lazy context if it can be determined that all the function arguments are in WHNF. * <p> * Currently this contains: * Map of ModuleName -> (String Set). This maps module names to a map of Set of String which contains * function names. These functions will be eagerly evaluated. Note that various integral division * functions are also included here which are not always eagerly evaluated- the code generator must * check that at compilation time the divisor is not 0. * * @author Raymond Cypher */ final class EagerFunctionInfo { private EagerFunctionInfo() {} /** * @param name * @return true if the named function is marked as being eagerly evaluated. */ final static boolean canFunctionBeEagerlyEvaluated(QualifiedName name) { Set<String> s = eagerlyEvaluatedFunctions.get(name.getModuleName()); if (s != null) { return s.contains(name.getUnqualifiedName()); } return false; } /** * Map of ModuleName -> (String Set). This maps module names to a map of Set of String which contains * function names. These functions will be eagerly evaluated. Note that various integral division * functions are also included here which are not always eagerly evaluated- the code generator must * check that at compilation time the divisor is not 0. * * Since this map is only mutated by code in the static initialization block * it isn't synchronized. If, however, the map is ever mutated by code outside * the static initialization block it will need to be synchronized. */ static private final Map<ModuleName, Set<String>> eagerlyEvaluatedFunctions = new HashMap<ModuleName, Set<String>>(); static { // These are sets of functions, by Module, which can be treated specially. // When encountered in a lazy context these functions will be directly evaluated, // rather than building a lazy graph, if all the arguments are known to be in WHNF. // This is an optimization intended for functions where, when the arguments are already // evaluated, it is cheaper to simply evaluate the function than it is to build a // graph of the function application. // NOTE: functions optimized in this fashion must be safe. i.e. there are no possible // side effects, no possibility of a thrown exception, etc. // This is because the optimization can cause a change in reduction order, which is only // safe if the function has no side effects and will never fail (i.e. throw an exception). { final Set<String> preludeSet = new HashSet<String> (); eagerlyEvaluatedFunctions.put (CAL_Prelude_internal.MODULE_NAME, Collections.unmodifiableSet(preludeSet)); // Add the primitive ops that make sense. preludeSet.add(CAL_Prelude_internal.Functions.equalsInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderDouble.getUnqualifiedName()); //remainderDouble never throws an exception. preludeSet.add(CAL_Prelude.Functions.truncate.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.divideDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.equalsFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.notEqualsFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.greaterThanEqualsFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.lessThanEqualsFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.addFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.subtractFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.multiplyFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.divideFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.negateFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderFloat.getUnqualifiedName()); //the primitive casting functions //note casting functions for non-primitives (such as Integer and Decimal cannot be included preludeSet.add(CAL_Prelude_internal.Functions.byteToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.byteToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.shortToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.charToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.intToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.longToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.floatToDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.doubleToDouble.getUnqualifiedName()); // These String functions cannot be optimized since they are // foreign functions which act on a java.lang.String object. If the // object is null they can throw an exception. A null String // cannot be directly created in CAL source, but it can be marshaled // from the result of a foreign function call. //preludeSet.add("equalsString"); //preludeSet.add("notEqualsString"); //preludeSet.add("greaterThanString"); //preludeSet.add("greaterThanEqualsString"); //preludeSet.add("lessThanString"); //preludeSet.add("lessThanEqualsString"); // This function is now in the String module: //preludeSet.add("appendCharToString"); // These can only be optimized if the second argument is not zero. // They are handled specially in the code generation and the // optimization is only applied if the second argument can be // determined to be non-zero at compile time. // Adding or removing a function of this nature requires updating // the code generation. preludeSet.add(CAL_Prelude_internal.Functions.divideLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.divideInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.divideByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderByte.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.divideShort.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.remainderShort.getUnqualifiedName()); ////////////////////////////////////////////////////////////// preludeSet.add(CAL_Prelude_internal.Functions.compareInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.maxInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.minInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.absInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.signumInt.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.compareDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.jCompareDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.maxDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.minDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.absDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.signumDouble.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.compareFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.jCompareFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.maxFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.minFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.absFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.signumFloat.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.compareLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.maxLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.minLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.absLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.signumLong.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.compareChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.maxChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.minChar.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.integer_ONE.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.integer_ZERO.getUnqualifiedName()); // These Integer functions cannot be optimized since they are // foreign functions which act on a BigInteger object. If the // object is null they can throw an exception. A null Integer // cannot be directly created in CAL source, but it can be marshaled // from the result of a foreign function call. //preludeSet.add("maxInteger"); //preludeSet.add("minInteger"); //preludeSet.add("absInteger"); //preludeSet.add("signumInteger"); //preludeSet.add("addInteger"); //preludeSet.add("subtractInteger"); //preludeSet.add("multiplyInteger"); //preludeSet.add("negateInteger"); //preludeSet.add("longToInteger"); //preludeSet.add("integerToString"); //preludeSet.add("integerToInt"); //preludeSet.add("integerToLong"); //preludeSet.add("appendString"); //preludeSet.add("integerToDouble"); preludeSet.add(CAL_Prelude.Functions.round.getUnqualifiedName()); preludeSet.add(CAL_Prelude.Functions.ceiling.getUnqualifiedName()); preludeSet.add(CAL_Prelude.Functions.floor.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.internal_algebraicValue_new.getUnqualifiedName()); //Can't be optimized since AlgebraicValue may be null and hence we get an exception. //preludeSet.add("algebraicValue_getDataConstructorName"); //preludeSet.add("algebraicValue_getNArguments"); // Can't optimize algebraicValue_getNthArgument since it can throw an exception if // the argument number is not valid. //preludeSet.add("algebraicValue_getNthArgument"); preludeSet.add(CAL_Prelude_internal.Functions.jArrayList_new.getUnqualifiedName()); // These two jList functions can throw an exception if the list is null. //preludeSet.add("jList_size"); //preludeSet.add("jList_get"); preludeSet.add(CAL_Prelude.Functions.notANumber.getUnqualifiedName()); preludeSet.add(CAL_Prelude.Functions.isNotANumber.getUnqualifiedName()); preludeSet.add(CAL_Prelude_internal.Functions.jStringBuilder_new.getUnqualifiedName()); } { final Set<String> bitsSet = new HashSet<String> (); eagerlyEvaluatedFunctions.put (CAL_Bits_internal.MODULE_NAME, Collections.unmodifiableSet(bitsSet)); bitsSet.add(CAL_Bits_internal.Functions.bitwiseAndInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.bitwiseOrInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.bitwiseXorInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.complementInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftLInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftRInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftRUnsignedInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.highestBitMaskInt.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.bitwiseAndLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.bitwiseOrLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.bitwiseXorLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.complementLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftLLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftRLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.shiftRUnsignedLong.getUnqualifiedName()); bitsSet.add(CAL_Bits_internal.Functions.highestBitMaskLong.getUnqualifiedName()); } { final Set<String> arrayPrimitivesSet = new HashSet<String> (); eagerlyEvaluatedFunctions.put (CAL_ArrayPrimitives_internal.MODULE_NAME, Collections.unmodifiableSet(arrayPrimitivesSet)); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.charArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.booleanArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.byteArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.shortArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.intArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.longArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.floatArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.doubleArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.objectArray_length.getUnqualifiedName()); arrayPrimitivesSet.add(CAL_ArrayPrimitives_internal.Functions.calValueArray_length.getUnqualifiedName()); } { final Set<String> arraySet = new HashSet<String> (); eagerlyEvaluatedFunctions.put (CAL_Array.MODULE_NAME, Collections.unmodifiableSet(arraySet)); arraySet.add(CAL_Array.Functions.length.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array1.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array2.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array3.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array4.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array5.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array6.getUnqualifiedName()); arraySet.add(CAL_Array.Functions.array7.getUnqualifiedName()); // Note: Array.update and Array.subscript (and the type specific versions) cannot be optimized // because they can throw an exception if the array index is not valid. } { final Set<String> charSet = new HashSet<String> (); eagerlyEvaluatedFunctions.put(CAL_Char.MODULE_NAME, Collections.unmodifiableSet(charSet)); charSet.add(CAL_Char.Functions.toInt.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isSpaceChar.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isWhitespace.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isUpperCase.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isLowerCase.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isLetter.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isDigit.getUnqualifiedName()); charSet.add(CAL_Char.Functions.isLetterOrDigit.getUnqualifiedName()); charSet.add(CAL_Char.Functions.toUpperCase.getUnqualifiedName()); charSet.add(CAL_Char.Functions.toLowerCase.getUnqualifiedName()); } { final Set<String> mathSet = new HashSet<String>(); eagerlyEvaluatedFunctions.put(CAL_Math.MODULE_NAME, Collections.unmodifiableSet(mathSet)); mathSet.add(CAL_Math.Functions.pi.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.exp.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.log.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.sqrt.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.power.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.logBase.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.sin.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.cos.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.tan.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.asin.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.acos.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.atan.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.atan2.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.sinh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.cosh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.tanh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.asinh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.acosh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.atanh.getUnqualifiedName()); mathSet.add(CAL_Math.Functions.sqrt.getUnqualifiedName()); } { final Set<String> recordSet = new HashSet<String>(); eagerlyEvaluatedFunctions.put(CAL_Record_internal.MODULE_NAME, Collections.unmodifiableSet(recordSet)); recordSet.add(CAL_Record_internal.Functions.fieldNamesPrimitive.getUnqualifiedName()); recordSet.add(CAL_Record_internal.Functions.hasFieldPrimitive.getUnqualifiedName()); } } }