at.dms.kjc
Class JShiftExpression

java.lang.Object
  |
  +--at.dms.util.Utils
        |
        +--at.dms.compiler.Phylum
              |
              +--at.dms.kjc.JPhylum
                    |
                    +--at.dms.kjc.JExpression
                          |
                          +--at.dms.kjc.JBinaryExpression
                                |
                                +--at.dms.kjc.JBinaryArithmeticExpression
                                      |
                                      +--at.dms.kjc.JShiftExpression
All Implemented Interfaces:
Constants, Constants

public class JShiftExpression
extends JBinaryArithmeticExpression

A representation of a bitshift operation. See JLS2 15.19


Field Summary
protected  int oper
           
 
Fields inherited from class at.dms.kjc.JBinaryExpression
left, right, type
 
Fields inherited from class at.dms.kjc.JExpression
EMPTY
 
Fields inherited from class at.dms.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface at.dms.kjc.Constants
CMP_VERSION, JAV_CLASS, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_THIS, JAV_THROWABLE, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LE, OPE_LNOT, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VOID
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_NBR_FLAGS, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
JShiftExpression(TokenReference where, int oper, JExpression left, JExpression right)
          Construct a node in the parsing tree.
 
Method Summary
 void accept(KjcVisitor p)
          Accepts the specified visitor
 JExpression checkBinaryBody(CExpressionContext context)
          Check expression and evaluate and alter context
 JExpression checkExpression(CExpressionContext context)
          Check expression and evaluate and alter context
 double compute(double left, double right)
          Cannot perform shift operation on doubles.
 float compute(float left, float right)
          Cannot perform shift operation on floats.
 int compute(int left, int right)
          Computes the result of the operation at compile-time.
 long compute(long left, int right)
          Computes the result of the shift operation at compile-time.
 long compute(long left, long right)
          Cannot perform shift operation on two longs.
static CType computeType(CType leftType, CType rightType, MessageDescription badTypeMessage)
          compute the type of this expression according to operands
 JExpression constantFolding()
          Peforms the operation of the subclass implementation on constant operands.
 void genCode(CodeSequence code)
          Generates a sequence of bytecodes
static int getOpcode(int oper, CType type)
           
 
Methods inherited from class at.dms.kjc.JBinaryExpression
genBooleanResultCode, genBranch, genBranch, getLeft, getRight, getType, promote, setLeft, setRight, setType
 
Methods inherited from class at.dms.kjc.JExpression
checkExpression, convertType, fail, getBooleanLiteral, getLiteral, getNumberLiteral, getOrdinalLiteral, getRealLiteral, getStringLiteral, isAssignableTo, isConstant, isLiteral, isStatementExpression, isSubTypePossible, setConstant, unParenthesize
 
Methods inherited from class at.dms.kjc.JPhylum
check, check, check, check
 
Methods inherited from class at.dms.compiler.Phylum
getTokenReference, setTokenReference
 
Methods inherited from class at.dms.util.Utils
assert, assert, fail, fail, hasFlag, hasMoreThanOneFlag, hasOtherFlags, splitQualifiedName, splitQualifiedName, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

oper

protected int oper
Constructor Detail

JShiftExpression

public JShiftExpression(TokenReference where,
                        int oper,
                        JExpression left,
                        JExpression right)
Construct a node in the parsing tree.
Parameters:
where - the line of this node in the source code
oper - the operator
left - the left operand
right - the right operand
Method Detail

checkExpression

public JExpression checkExpression(CExpressionContext context)
                            throws PositionedError
Check expression and evaluate and alter context
Overrides:
checkExpression in class JBinaryArithmeticExpression
Parameters:
context - the actual context of analyse
Returns:
a pure java expression including promote node
Throws:
PositionedError - if the check fails

checkBinaryBody

public JExpression checkBinaryBody(CExpressionContext context)
                            throws PositionedError
Check expression and evaluate and alter context
Overrides:
checkBinaryBody in class JBinaryArithmeticExpression
Parameters:
context - the actual context of analyse
Returns:
a pure java expression including promote node
Throws:
PositionedError - if the check fails

computeType

public static CType computeType(CType leftType,
                                CType rightType,
                                MessageDescription badTypeMessage)
                         throws UnpositionedError
compute the type of this expression according to operands
Parameters:
leftType - the type of left operand
rightType - the type of right operand
Returns:
the type computed for this binary operation
Throws:
UnpositionedError - this error will be positioned soon

constantFolding

public JExpression constantFolding()
Description copied from class: JBinaryArithmeticExpression
Peforms the operation of the subclass implementation on constant operands. This method must only be called when both operands are constant. These are the default rules for constant folding in binary arithmetic expressions. This involves Binary Numeric Promotion (JLS2 5.6.2) on constants.
Overrides:
constantFolding in class JBinaryArithmeticExpression
Parameters:
left - the left literal
right - the right literal
Returns:
a literal resulting of an operation over two literals

compute

public int compute(int left,
                   int right)
Computes the result of the operation at compile-time. See JLS2 section 15.19.
Overrides:
compute in class JBinaryArithmeticExpression
Parameters:
left - the first operand
right - the second operand
Returns:
the result of the operation

compute

public long compute(long left,
                    int right)
Computes the result of the shift operation at compile-time. See JLS2 section 15.19.
Parameters:
left - the first operand
right - the second operand
Returns:
the result of the operation

compute

public long compute(long left,
                    long right)
Cannot perform shift operation on two longs. (The right expression, if it was long, has been truncated to an int before calling the compute methods, which is allowed by JLS2 15.19)
Overrides:
compute in class JBinaryArithmeticExpression
Following copied from class: at.dms.kjc.JBinaryArithmeticExpression
Parameters:
left - the left operand
right - the right operand
Returns:
the result of the operation

compute

public float compute(float left,
                     float right)
Cannot perform shift operation on floats.
Overrides:
compute in class JBinaryArithmeticExpression
Following copied from class: at.dms.kjc.JBinaryArithmeticExpression
Parameters:
left - the left operand
right - the right operand
Returns:
the result of the operation

compute

public double compute(double left,
                      double right)
Cannot perform shift operation on doubles.
Overrides:
compute in class JBinaryArithmeticExpression
Following copied from class: at.dms.kjc.JBinaryArithmeticExpression
Parameters:
left - the left operand
right - the right operand
Returns:
the result of the operation

accept

public void accept(KjcVisitor p)
Accepts the specified visitor
Overrides:
accept in class JExpression
Parameters:
p - the visitor

getOpcode

public static int getOpcode(int oper,
                            CType type)
Parameters:
type - the type of result
Returns:
the type of opcode for this operation

genCode

public void genCode(CodeSequence code)
Generates a sequence of bytecodes
Overrides:
genCode in class JExpression
Parameters:
code - the code list