PageRenderTime 84ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/jEdit/tags/jedit-4-3-pre5/bsh/BSHUnaryExpression.java

#
Java | 133 lines | 80 code | 17 blank | 36 comment | 29 complexity | 955d06d1755fc52c2b842a898763fa3e MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*****************************************************************************
  2. * *
  3. * This file is part of the BeanShell Java Scripting distribution. *
  4. * Documentation and updates may be found at http://www.beanshell.org/ *
  5. * *
  6. * Sun Public License Notice: *
  7. * *
  8. * The contents of this file are subject to the Sun Public License Version *
  9. * 1.0 (the "License"); you may not use this file except in compliance with *
  10. * the License. A copy of the License is available at http://www.sun.com *
  11. * *
  12. * The Original Code is BeanShell. The Initial Developer of the Original *
  13. * Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright *
  14. * (C) 2000. All Rights Reserved. *
  15. * *
  16. * GNU Public License Notice: *
  17. * *
  18. * Alternatively, the contents of this file may be used under the terms of *
  19. * the GNU Lesser General Public License (the "LGPL"), in which case the *
  20. * provisions of LGPL are applicable instead of those above. If you wish to *
  21. * allow use of your version of this file only under the terms of the LGPL *
  22. * and not to allow others to use your version of this file under the SPL, *
  23. * indicate your decision by deleting the provisions above and replace *
  24. * them with the notice and other provisions required by the LGPL. If you *
  25. * do not delete the provisions above, a recipient may use your version of *
  26. * this file under either the SPL or the LGPL. *
  27. * *
  28. * Patrick Niemeyer (pat@pat.net) *
  29. * Author of Learning Java, O'Reilly & Associates *
  30. * http://www.pat.net/~pat/ *
  31. * *
  32. *****************************************************************************/
  33. package bsh;
  34. class BSHUnaryExpression extends SimpleNode implements ParserConstants
  35. {
  36. public int kind;
  37. public boolean postfix = false;
  38. BSHUnaryExpression(int id) { super(id); }
  39. public Object eval( CallStack callstack, Interpreter interpreter)
  40. throws EvalError
  41. {
  42. SimpleNode node = (SimpleNode)jjtGetChild(0);
  43. // If this is a unary increment of decrement (either pre or postfix)
  44. // then we need an LHS to which to assign the result. Otherwise
  45. // just do the unary operation for the value.
  46. try {
  47. if ( kind == INCR || kind == DECR ) {
  48. LHS lhs = ((BSHPrimaryExpression)node).toLHS(
  49. callstack, interpreter );
  50. return lhsUnaryOperation( lhs, interpreter.getStrictJava() );
  51. } else
  52. return
  53. unaryOperation( node.eval(callstack, interpreter), kind );
  54. } catch ( UtilEvalError e ) {
  55. throw e.toEvalError( this, callstack );
  56. }
  57. }
  58. private Object lhsUnaryOperation( LHS lhs, boolean strictJava )
  59. throws UtilEvalError
  60. {
  61. if ( Interpreter.DEBUG ) Interpreter.debug("lhsUnaryOperation");
  62. Object prevalue, postvalue;
  63. prevalue = lhs.getValue();
  64. postvalue = unaryOperation(prevalue, kind);
  65. Object retVal;
  66. if ( postfix )
  67. retVal = prevalue;
  68. else
  69. retVal = postvalue;
  70. lhs.assign( postvalue, strictJava );
  71. return retVal;
  72. }
  73. private Object unaryOperation( Object op, int kind ) throws UtilEvalError
  74. {
  75. if (op instanceof Boolean || op instanceof Character
  76. || op instanceof Number)
  77. return primitiveWrapperUnaryOperation( op, kind );
  78. if ( !(op instanceof Primitive) )
  79. throw new UtilEvalError( "Unary operation " + tokenImage[kind]
  80. + " inappropriate for object" );
  81. return Primitive.unaryOperation((Primitive)op, kind);
  82. }
  83. private Object primitiveWrapperUnaryOperation(Object val, int kind)
  84. throws UtilEvalError
  85. {
  86. Class operandType = val.getClass();
  87. Object operand = Primitive.promoteToInteger(val);
  88. if ( operand instanceof Boolean )
  89. return new Boolean(
  90. Primitive.booleanUnaryOperation((Boolean)operand, kind));
  91. else
  92. if ( operand instanceof Integer )
  93. {
  94. int result = Primitive.intUnaryOperation((Integer)operand, kind);
  95. // ++ and -- must be cast back the original type
  96. if(kind == INCR || kind == DECR)
  97. {
  98. if(operandType == Byte.TYPE)
  99. return new Byte((byte)result);
  100. if(operandType == Short.TYPE)
  101. return new Short((short)result);
  102. if(operandType == Character.TYPE)
  103. return new Character((char)result);
  104. }
  105. return new Integer(result);
  106. }
  107. else if(operand instanceof Long)
  108. return new Long(Primitive.longUnaryOperation((Long)operand, kind));
  109. else if(operand instanceof Float)
  110. return new Float(Primitive.floatUnaryOperation((Float)operand, kind));
  111. else if(operand instanceof Double)
  112. return new Double(Primitive.doubleUnaryOperation((Double)operand, kind));
  113. else
  114. throw new InterpreterError("An error occurred. Please call technical support.");
  115. }
  116. }