scalaprimitives.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 647 行 · 第 1/2 页

SCALA
647
字号
    addPrimitives(CharClass, nme.MOD, MOD)    addPrimitives(CharClass, nme.LT, LT)    addPrimitives(CharClass, nme.LE, LE)    addPrimitives(CharClass, nme.GT, GT)    addPrimitives(CharClass, nme.GE, GE)    addPrimitives(CharClass, nme.XOR, XOR)    addPrimitives(CharClass, nme.OR, OR)    addPrimitives(CharClass, nme.AND, AND)    addPrimitives(CharClass, nme.LSL, LSL)    addPrimitives(CharClass, nme.LSR, LSR)    addPrimitives(CharClass, nme.ASR, ASR)      // conversions    addPrimitives(CharClass, nme.toByte,   C2B)    addPrimitives(CharClass, nme.toShort,  C2S)    addPrimitives(CharClass, nme.toChar,   C2C)    addPrimitives(CharClass, nme.toInt,    C2I)    addPrimitives(CharClass, nme.toLong,   C2L)    // unary methods    addPrimitives(CharClass, nme.UNARY_+, POS)    addPrimitives(CharClass, nme.UNARY_-, NEG)    addPrimitives(CharClass, nme.UNARY_~, NOT)    if (!forCLDC) {      addPrimitives(CharClass, nme.toFloat,  C2F)      addPrimitives(CharClass, nme.toDouble, C2D)    }    // scala.Int    addPrimitives(IntClass, nme.EQ, EQ)    addPrimitives(IntClass, nme.NE, NE)    addPrimitives(IntClass, nme.ADD, ADD)    addPrimitives(IntClass, nme.SUB, SUB)    addPrimitives(IntClass, nme.MUL, MUL)    addPrimitives(IntClass, nme.DIV, DIV)    addPrimitives(IntClass, nme.MOD, MOD)    addPrimitives(IntClass, nme.LT, LT)    addPrimitives(IntClass, nme.LE, LE)    addPrimitives(IntClass, nme.GT, GT)    addPrimitives(IntClass, nme.GE, GE)    addPrimitives(IntClass, nme.XOR, XOR)    addPrimitives(IntClass, nme.OR, OR)    addPrimitives(IntClass, nme.AND, AND)    addPrimitives(IntClass, nme.LSL, LSL)    addPrimitives(IntClass, nme.LSR, LSR)    addPrimitives(IntClass, nme.ASR, ASR)      // conversions    addPrimitives(IntClass, nme.toByte,   I2B)    addPrimitives(IntClass, nme.toShort,  I2S)    addPrimitives(IntClass, nme.toChar,   I2C)    addPrimitives(IntClass, nme.toInt,    I2I)    addPrimitives(IntClass, nme.toLong,   I2L)    // unary methods    addPrimitives(IntClass, nme.UNARY_+, POS)    addPrimitives(IntClass, nme.UNARY_-, NEG)    addPrimitives(IntClass, nme.UNARY_~, NOT)    if (!forCLDC) {      addPrimitives(IntClass, nme.toFloat,  I2F)      addPrimitives(IntClass, nme.toDouble, I2D)    }    // scala.Long    addPrimitives(LongClass, nme.EQ, EQ)    addPrimitives(LongClass, nme.NE, NE)    addPrimitives(LongClass, nme.ADD, ADD)    addPrimitives(LongClass, nme.SUB, SUB)    addPrimitives(LongClass, nme.MUL, MUL)    addPrimitives(LongClass, nme.DIV, DIV)    addPrimitives(LongClass, nme.MOD, MOD)    addPrimitives(LongClass, nme.LT, LT)    addPrimitives(LongClass, nme.LE, LE)    addPrimitives(LongClass, nme.GT, GT)    addPrimitives(LongClass, nme.GE, GE)    addPrimitives(LongClass, nme.XOR, XOR)    addPrimitives(LongClass, nme.OR, OR)    addPrimitives(LongClass, nme.AND, AND)    addPrimitives(LongClass, nme.LSL, LSL)    addPrimitives(LongClass, nme.LSR, LSR)    addPrimitives(LongClass, nme.ASR, ASR)      // conversions    addPrimitives(LongClass, nme.toByte,   L2B)    addPrimitives(LongClass, nme.toShort,  L2S)    addPrimitives(LongClass, nme.toChar,   L2C)    addPrimitives(LongClass, nme.toInt,    L2I)    addPrimitives(LongClass, nme.toLong,   L2L)    // unary methods    addPrimitives(LongClass, nme.UNARY_+, POS)    addPrimitives(LongClass, nme.UNARY_-, NEG)    addPrimitives(LongClass, nme.UNARY_~, NOT)    if (!forCLDC) {      addPrimitives(LongClass, nme.toFloat,  L2F)      addPrimitives(LongClass, nme.toDouble, L2D)    }    if (!forCLDC) {      // scala.Float      addPrimitives(FloatClass, nme.EQ, EQ)      addPrimitives(FloatClass, nme.NE, NE)      addPrimitives(FloatClass, nme.ADD, ADD)      addPrimitives(FloatClass, nme.SUB, SUB)      addPrimitives(FloatClass, nme.MUL, MUL)      addPrimitives(FloatClass, nme.DIV, DIV)      addPrimitives(FloatClass, nme.MOD, MOD)      addPrimitives(FloatClass, nme.LT, LT)      addPrimitives(FloatClass, nme.LE, LE)      addPrimitives(FloatClass, nme.GT, GT)      addPrimitives(FloatClass, nme.GE, GE)      // conversions      addPrimitives(FloatClass, nme.toByte,   F2B)      addPrimitives(FloatClass, nme.toShort,  F2S)      addPrimitives(FloatClass, nme.toChar,   F2C)      addPrimitives(FloatClass, nme.toInt,    F2I)      addPrimitives(FloatClass, nme.toLong,   F2L)      addPrimitives(FloatClass, nme.toFloat,  F2F)      addPrimitives(FloatClass, nme.toDouble, F2D)      // unary methods      addPrimitives(FloatClass, nme.UNARY_+, POS)      addPrimitives(FloatClass, nme.UNARY_-, NEG)      // scala.Double      addPrimitives(DoubleClass, nme.EQ, EQ)      addPrimitives(DoubleClass, nme.NE, NE)      addPrimitives(DoubleClass, nme.ADD, ADD)      addPrimitives(DoubleClass, nme.SUB, SUB)      addPrimitives(DoubleClass, nme.MUL, MUL)      addPrimitives(DoubleClass, nme.DIV, DIV)      addPrimitives(DoubleClass, nme.MOD, MOD)      addPrimitives(DoubleClass, nme.LT, LT)      addPrimitives(DoubleClass, nme.LE, LE)      addPrimitives(DoubleClass, nme.GT, GT)      addPrimitives(DoubleClass, nme.GE, GE)      // conversions      addPrimitives(DoubleClass, nme.toByte,   D2B)      addPrimitives(DoubleClass, nme.toShort,  D2S)      addPrimitives(DoubleClass, nme.toChar,   D2C)      addPrimitives(DoubleClass, nme.toInt,    D2I)      addPrimitives(DoubleClass, nme.toLong,   D2L)      addPrimitives(DoubleClass, nme.toFloat,  D2F)      addPrimitives(DoubleClass, nme.toDouble, D2D)      // unary methods      addPrimitives(DoubleClass, nme.UNARY_+, POS)      addPrimitives(DoubleClass, nme.UNARY_-, NEG)    }    // and the type map!    initPrimitiveTypeMap  }  /** Add a primitive operation to the map */  def addPrimitive(s: Symbol, code: Int) {    assert(!(primitives contains s), "Duplicate primitive " + s)    primitives(s) = code  }    def addPrimitives(cls: Symbol, method: Name, code: Int) {    val tpe = cls.info    val sym = tpe.member(method)    if (sym == NoSymbol)      inform("Unknown primitive method " + cls + "." + method)    for (s <- sym.alternatives)      addPrimitive(        s,         if (code == ADD && s.info.paramTypes.head == definitions.StringClass.tpe) CONCAT        else code)  }  def isCoercion(code: Int): Boolean = (code >= B2B) && (code <= D2D)  /** Check whether the given operation code is an array operation. */  def isArrayOp(code: Int): Boolean =    isArrayNew(code) | isArrayLength(code) | isArrayGet(code) | isArraySet(code)  def isArrayNew(code: Int): Boolean = code match {    case NEW_ZARRAY | NEW_BARRAY | NEW_SARRAY | NEW_CARRAY |         NEW_IARRAY | NEW_LARRAY | NEW_FARRAY | NEW_DARRAY |         NEW_OARRAY => true    case _ => false  }  def isArrayLength(code: Int): Boolean = code match {    case ZARRAY_LENGTH | BARRAY_LENGTH | SARRAY_LENGTH | CARRAY_LENGTH |         IARRAY_LENGTH | LARRAY_LENGTH | FARRAY_LENGTH | DARRAY_LENGTH |         OARRAY_LENGTH | LENGTH => true    case _ => false  }  def isArrayGet(code: Int): Boolean = code match {    case ZARRAY_GET | BARRAY_GET | SARRAY_GET | CARRAY_GET |         IARRAY_GET | LARRAY_GET | FARRAY_GET | DARRAY_GET |         OARRAY_GET | APPLY => true    case _ => false  }  def isArraySet(code: Int): Boolean = code match {    case ZARRAY_SET | BARRAY_SET | SARRAY_SET | CARRAY_SET |         IARRAY_SET | LARRAY_SET | FARRAY_SET | DARRAY_SET |         OARRAY_SET | UPDATE => true;    case _ => false;  }  /** Check whether the given code is a comparison operator */  def isComparisonOp(code: Int): Boolean = code match {    case ID | NI | EQ | NE |         LT | LE | GT | GE => true    case _ => false  }  def isArithmeticOp(code: Int): Boolean = code match {    case POS | NEG | NOT => true; // unary    case ADD | SUB | MUL |          DIV | MOD       => true; // binary    case OR  | XOR | AND |          LSL | LSR | ASR => true; // bitwise    case _ => false;  }  def isLogicalOp(code: Int): Boolean = code match {    case ZNOT | ZAND | ZOR => true    case _ => false  }  def isShiftOp(code: Int): Boolean = code match {    case LSL | LSR | ASR => true    case _ => false  }  def isBitwiseOp(code: Int): Boolean = code match {    case OR | XOR | AND => true    case _ => false  }  /** If code is a coercion primitive, the result type */  def generatedKind(code: Int): TypeKind = code match {    case B2B | C2B | S2B | I2B | L2B | F2B | D2B => BYTE    case B2C | C2C | S2C | I2C | L2C | F2C | D2C => CHAR    case B2S | C2S | S2S | I2S | L2S | F2S | D2S => SHORT    case B2I | C2I | S2I | I2I | L2I | F2I | D2I => INT    case B2L | C2L | S2L | I2L | L2L | F2L | D2L => LONG    case B2F | C2F | S2F | I2F | L2F | F2F | D2F => FLOAT    case B2D | C2D | S2D | I2D | L2D | F2D | D2D => DOUBLE  }    def isPrimitive(sym: Symbol): Boolean = primitives contains sym  /** Return the code for the givem symbol. */  def getPrimitive(sym: Symbol): Int = {    assert(isPrimitive(sym), "Unkown primitive " + sym)    primitives(sym)  }  /**    * Return the primitive code of the given operation. If the    * operation is an array get/set, we inspect the type of the receiver   * to demux the operation.   *   * @param fun The method symbol   * @param tpe The type of the receiver object. It is used only for array   *            operations   */  def getPrimitive(fun: Symbol, tpe: Type): Int = {    import definitions._    val code = getPrimitive(fun)    var elem: Type = null    tpe match {      case TypeRef(_, sym, _elem :: Nil)           if (sym == ArrayClass) => elem = _elem      case _ => ()    }    code match {      case APPLY =>        toTypeKind(elem) match {          case BOOL    => ZARRAY_GET          case BYTE    => BARRAY_GET          case SHORT   => SARRAY_GET          case CHAR    => CARRAY_GET          case INT     => IARRAY_GET          case LONG    => LARRAY_GET          case FLOAT   => FARRAY_GET          case DOUBLE  => DARRAY_GET          case REFERENCE(_) | ARRAY(_) => OARRAY_GET          case _ =>            abort("Unexpected array element type: " + elem)        }      case UPDATE =>        toTypeKind(elem) match {          case BOOL    => ZARRAY_SET          case BYTE    => BARRAY_SET          case SHORT   => SARRAY_SET          case CHAR    => CARRAY_SET          case INT     => IARRAY_SET          case LONG    => LARRAY_SET          case FLOAT   => FARRAY_SET          case DOUBLE  => DARRAY_SET          case REFERENCE(_) | ARRAY(_) => OARRAY_SET          case _ =>            abort("Unexpected array element type: " + elem)        }      case LENGTH =>        assert(elem != null)        toTypeKind(elem) match {          case BOOL    => ZARRAY_LENGTH          case BYTE    => BARRAY_LENGTH          case SHORT   => SARRAY_LENGTH          case CHAR    => CARRAY_LENGTH          case INT     => IARRAY_LENGTH          case LONG    => LARRAY_LENGTH          case FLOAT   => FARRAY_LENGTH          case DOUBLE  => DARRAY_LENGTH          case REFERENCE(_) | ARRAY(_) => OARRAY_LENGTH          case _ =>            abort("Unexpected array element type: " + elem)        }      case _ =>        code    }  }}

⌨️ 快捷键说明

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