⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 constantvalue.java

📁 专业汽车级嵌入式操作系统OSEK的源代码
💻 JAVA
字号:
package js.tinyvm;import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;import js.tinyvm.io.IByteWriter;import org.apache.bcel.classfile.Constant;import org.apache.bcel.classfile.ConstantDouble;import org.apache.bcel.classfile.ConstantFloat;import org.apache.bcel.classfile.ConstantInteger;import org.apache.bcel.classfile.ConstantLong;import org.apache.bcel.classfile.ConstantPool;import org.apache.bcel.classfile.ConstantString;/** * This class represents a constant value of a basic type. */public class ConstantValue extends WritableDataWithOffset{   /**    * The dereferenced value.    */   Object _value;   /**    * Constructor.    *     * @param pool constant pool    * @param constant constant    */   public ConstantValue (ConstantPool pool, Constant constant)   {      _value = value(pool, constant);      assert _value != null: "Postconditon: result != null";   }   // use Object.equals() for equality   // use Object.hashCode() for hash code   /**    * Dereferenced value.    */   public Object value ()   {      assert _value != null: "Postconditon: result != null";      return _value;   }   /**    * Get type of this value.    */   public TinyVMType getType ()   {      if (_value instanceof Double)      {         // TODO map long to double correct?         return TinyVMType.T_LONG;      }      else if (_value instanceof Float)      {         return TinyVMType.T_FLOAT;      }      else if (_value instanceof Integer)      {         return TinyVMType.T_INT;      }      else if (_value instanceof Long)      {         return TinyVMType.T_LONG;      }      else if (_value instanceof String)      {         return TinyVMType.T_OBJECT;      }      else      {         assert false: "Check: known type";         return null;      }   }   /**    * Get length in bytes of value.    */   public int getLength ()   {      if (_value instanceof Double)      {         return 8;      }      else if (_value instanceof Float)      {         return 4;      }      else if (_value instanceof Integer)      {         return 4;      }      else if (_value instanceof Long)      {         return 8;      }      else if (_value instanceof String)      {         return ((String) _value).getBytes().length;      }      else      {         assert false: "Check: known type";         return -1;      }   }   /**    * Dump.    *     * @param writer byte writer    */   public void dump (IByteWriter writer) throws TinyVMException   {      assert writer != null: "Precondition: writer != null";      try      {         // Constant values must be dumped in Big Endian order.         if (_value instanceof Double)         {            double doubleValue = ((Double) _value).doubleValue();            float floatValue = (float) doubleValue;            if (doubleValue != 0.0               && Math.abs((doubleValue - floatValue) / doubleValue) > 0.1)            {               _logger.log(Level.WARNING, "Double " + doubleValue                  + " truncated to " + floatValue + "f.");            }            writer.writeInt(0);            writer.writeInt(Float.floatToIntBits(floatValue));         }         else if (_value instanceof Float)         {            writer               .writeInt(Float.floatToIntBits(((Float) _value).floatValue()));         }         else if (_value instanceof Integer)         {            writer.writeInt(((Integer) _value).intValue());         }         else if (_value instanceof Long)         {            long longValue = ((Long) _value).longValue();            int intValue = (int) longValue;            if (intValue != longValue)            {               _logger.log(Level.WARNING, "Long " + longValue                  + "L truncated to " + intValue + ".");            }            writer.writeInt(0);            writer.writeInt(intValue);         }         else if (_value instanceof String)         {            byte[] bytes = ((String) _value).getBytes();            writer.write(bytes);         }         else         {            assert false: "Check: known entry type";         }      }      catch (IOException e)      {         throw new TinyVMException(e.getMessage(), e);      }   }   //   // protected interface   //   /**    * Get value from constant.    *     * @param pool constant pool    * @param constant constant to get value from    * @return Double, Float, Integer, Long or String    */   private Object value (ConstantPool pool, Constant constant)   {      assert pool != null: "Precondition: pool != null";      assert constant != null: "Precondition: constant != null";      Object result = null;      if (constant instanceof ConstantDouble)      {         result = new Double(((ConstantDouble) constant).getBytes());      }      else if (constant instanceof ConstantFloat)      {         result = new Float(((ConstantFloat) constant).getBytes());      }      else if (constant instanceof ConstantInteger)      {         result = new Integer(((ConstantInteger) constant).getBytes());      }      else if (constant instanceof ConstantLong)      {         result = new Long(((ConstantLong) constant).getBytes());      }      else if (constant instanceof ConstantString)      {         result = new String(((ConstantString) constant).getBytes(pool));      }      else      {         assert false: "Check: known type";      }      assert result != null: "Postconditon: result != null";      return result;   }   private static final Logger _logger = Logger.getLogger("TinyVM");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -