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

📄 constfold.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

                case iushrl:
                    return syms.intType.constType(
                            new Integer(intValue(l)>>> intValue(r)));

                case if_icmpeq:
                    return syms.booleanType.constType(
                            b2i(intValue(l) == intValue(r)))
                           ;

                case if_icmpne:
                    return syms.booleanType.constType(
                            b2i(intValue(l) != intValue(r)))
                           ;

                case if_icmplt:
                    return syms.booleanType.constType(b2i(intValue(l) < intValue(r)))
                           ;

                case if_icmpgt:
                    return syms.booleanType.constType(b2i(intValue(l) > intValue(r)))
                           ;

                case if_icmple:
                    return syms.booleanType.constType(
                            b2i(intValue(l) <= intValue(r)))
                           ;

                case if_icmpge:
                    return syms.booleanType.constType(
                            b2i(intValue(l) >= intValue(r)))
                           ;

                case ladd:
                    return syms.longType.constType(
                            new Long(longValue(l) + longValue(r)));

                case lsub:
                    return syms.longType.constType(
                            new Long(longValue(l) - longValue(r)));

                case lmul:
                    return syms.longType.constType(
                            new Long(longValue(l) * longValue(r)));

                case ldiv:
                    return syms.longType.constType(
                            new Long(longValue(l) / longValue(r)));

                case lmod:
                    return syms.longType.constType(
                            new Long(longValue(l) % longValue(r)));

                case land:
                    return syms.longType.constType(
                            new Long(longValue(l) & longValue(r)));

                case lor:
                    return syms.longType.constType(
                            new Long(longValue(l) | longValue(r)));

                case lxor:
                    return syms.longType.constType(
                            new Long(longValue(l) ^ longValue(r)));

                case lshl:

                case lshll:
                    return syms.longType.constType(
                            new Long(longValue(l)<< intValue(r)));

                case lshr:

                case lshrl:
                    return syms.longType.constType(
                            new Long(longValue(l)>> intValue(r)));

                case lushr:
                    return syms.longType.constType(
                            new Long(longValue(l)>>> intValue(r)));

                case lcmp:
                    if (longValue(l) < longValue(r))
                        return syms.intType.constType(minusOne);
                    else if (longValue(l) > longValue(r))
                        return syms.intType.constType(one);
                    else
                        return syms.intType.constType(zero);

                case fadd:
                    return syms.floatType.constType(
                            new Float(floatValue(l) + floatValue(r)));

                case fsub:
                    return syms.floatType.constType(
                            new Float(floatValue(l) - floatValue(r)));

                case fmul:
                    return syms.floatType.constType(
                            new Float(floatValue(l) * floatValue(r)));

                case fdiv:
                    return syms.floatType.constType(
                            new Float(floatValue(l) / floatValue(r)));

                case fmod:
                    return syms.floatType.constType(
                            new Float(floatValue(l) % floatValue(r)));

                case fcmpg:

                case fcmpl:
                    if (floatValue(l) < floatValue(r))
                        return syms.intType.constType(minusOne);
                    else if (floatValue(l) > floatValue(r))
                        return syms.intType.constType(one);
                    else if (floatValue(l) == floatValue(r))
                        return syms.intType.constType(zero);
                    else if (opcode == fcmpg)
                        return syms.intType.constType(one);
                    else
                        return syms.intType.constType(minusOne);

                case dadd:
                    return syms.doubleType.constType(
                            new Double(doubleValue(l) + doubleValue(r)));

                case dsub:
                    return syms.doubleType.constType(
                            new Double(doubleValue(l) - doubleValue(r)));

                case dmul:
                    return syms.doubleType.constType(
                            new Double(doubleValue(l) * doubleValue(r)));

                case ddiv:
                    return syms.doubleType.constType(
                            new Double(doubleValue(l) / doubleValue(r)));

                case dmod:
                    return syms.doubleType.constType(
                            new Double(doubleValue(l) % doubleValue(r)));

                case dcmpg:

                case dcmpl:
                    if (doubleValue(l) < doubleValue(r))
                        return syms.intType.constType(minusOne);
                    else if (doubleValue(l) > doubleValue(r))
                        return syms.intType.constType(one);
                    else if (doubleValue(l) == doubleValue(r))
                        return syms.intType.constType(zero);
                    else if (opcode == dcmpg)
                        return syms.intType.constType(one);
                    else
                        return syms.intType.constType(minusOne);

                case if_acmpeq:
                    return syms.booleanType.constType(b2i(l.equals(r)))
                           ;

                case if_acmpne:
                    return syms.booleanType.constType(b2i(!l.equals(r)))
                           ;

                case string_add:
                    return syms.stringType.constType(left.stringValue() +
                            right.stringValue());

                default:
                    return null;

                }
            }
        } catch (ArithmeticException e) {
            return null;
        }
    }

    /**
      * Coerce constant type to target type.
      *  @param etype      The source type of the coercion,
      *                    which is assumed to be a constant type compatble with
      *                    ttype.
      *  @param ttype      The target type of the coercion.
      */
    Type coerce(Type etype, Type ttype) {
        if (etype.baseType() == ttype.baseType())
            return etype;
        if (etype.tag <= DOUBLE) {
            Object n = etype.constValue;
            switch (ttype.tag) {
            case BYTE:
                return syms.byteType.constType(new Integer((byte) intValue(n)));

            case CHAR:
                return syms.charType.constType(new Integer((char) intValue(n)));

            case SHORT:
                return syms.shortType.constType(new Integer((short) intValue(n)));

            case INT:
                return syms.intType.constType(new Integer(intValue(n)));

            case LONG:
                return syms.longType.constType(new Long(longValue(n)));

            case FLOAT:
                return syms.floatType.constType(new Float(floatValue(n)));

            case DOUBLE:
                return syms.doubleType.constType(new Double(doubleValue(n)));

            }
        }
        return ttype;
    }
}

⌨️ 快捷键说明

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