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

📄 transinner.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    names.valueOf, Type.emptyList.prepend(tree.type));
            return make.App(make.QualIdent(valueOfSym), List.make(tree));
        }
    }

    /**
      * Create an empty anonymous class definition and enter and complete
      *  its symbol. Return the class definition's symbol.
      *  and create
      *  @param flags    The class symbol's flags
      *  @param owner    The class symbol's owner
      */
    ClassSymbol makeEmptyClass(long flags, ClassSymbol owner) {
        ClassSymbol c = reader.defineClass(names.empty, owner);
        c.flatname = chk.localClassName(c);
        c.sourcefile = owner.sourcefile;
        c.completer = null;
        c.members_field = new Scope(c);
        c.flags_field = flags;
        ClassType ctype = (ClassType) c.type;
        ctype.supertype_field = syms.objectType;
        ctype.interfaces_field = Type.emptyList;
        ClassDef odef = classDef(owner);
        enterSynthetic(odef.pos, c, owner.members());
        chk.compiled.put(c.flatname, c);
        ClassDef cdef =
                make.ClassDef(flags, names.empty, TypeParameter.emptyList, null,
                Tree.emptyList, Tree.emptyList);
        cdef.sym = c;
        cdef.type = c.type;
        odef.defs = odef.defs.prepend(cdef);
        return c;
    }

    /**
      * Report a conflict between a user symbol and a synthetic symbol.
      */
    private void duplicateError(int pos, Symbol sym) {
        if (!sym.type.isErroneous()) {
            log.error(pos, "synthetic.name.conflict", sym.toJava(),
                    sym.javaLocation());
        }
    }

    /**
      * Enter a synthetic symbol in a given scope, but complain if there was already one there.
      *  @param pos           Position for error reporting.
      *  @param sym           The symbol.
      *  @param s             The scope.
      */
    private void enterSynthetic(int pos, Symbol sym, Scope s) {
        if (sym.name != names.error && sym.name != names.empty) {
            for (Scope.Entry e = s.lookup(sym.name); e.scope == s; e = e.next()) {
                if (sym != e.sym && sym.kind == e.sym.kind) {
                    if ((sym.kind & (MTH | VAR)) != 0 &&
                            !sym.type.erasure().equals(e.sym.type.erasure()))
                        continue;
                    duplicateError(pos, e.sym);
                    break;
                }
            }
        }
        s.enter(sym);
    }

    /**
      * Look up a synthetic name in a given scope.
      *  @param scope	    The scope.
      *  @param name	    The name.
      */
    private Symbol lookupSynthetic(Name name, Scope s) {
        Symbol sym = s.lookup(name).sym;
        return (sym == null || (sym.flags() & SYNTHETIC) == 0) ? null : sym;
    }

    /**
      * Access codes for dereferencing, assignment,
      *  and pre/post increment/decrement.
      *  Access codes for assignment operations are determined by method accessCode
      *  below.
      *
      *  All access codes for accesses to the current class are even.
      *  If a member of the superclass should be accessed instead (because
      *  access was via a qualified super), add one to the corresponding code
      *  for the current class, making the number odd.
      *  This numbering scheme is used by the backend to decide whether
      *  to issue an invokevirtual or invokespecial call.
      *
      *  @see Gen.visitSelect(Select tree)
      */
    private static final int DEREFcode = 0;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int ASSIGNcode = 2;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int PREINCcode = 4;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int PREDECcode = 6;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int POSTINCcode = 8;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int POSTDECcode = 10;

    /**
     * Access codes for dereferencing, assignment,
     *  and pre/post increment/decrement.
     *  Access codes for assignment operations are determined by method accessCode
     *  below.
     *
     *  All access codes for accesses to the current class are even.
     *  If a member of the superclass should be accessed instead (because
     *  access was via a qualified super), add one to the corresponding code
     *  for the current class, making the number odd.
     *  This numbering scheme is used by the backend to decide whether
     *  to issue an invokevirtual or invokespecial call.
     *
     *  @see Gen.visitSelect(Select tree)
     */
    private static final int FIRSTASGOPcode = 12;

    /**
     * Number of access codes
     */
    private static final int NCODES = accessCode(ByteCodes.lushrl) + 2;

    /**
     * A mapping from symbols to their access numbers.
     */
    private Hashtable accessNums;

    /**
     * A mapping from symbols to an array of access symbols, indexed by
     *  access code.
     */
    private Hashtable accessSyms;

    /**
     * A mapping from (constructor) symbols to access constructor symbols.
     */
    private Hashtable accessConstrs;

    /**
     * A queue for all accessed symbols.
     */
    private ListBuffer accessed;

    /**
     * Map bytecode of binary operation to access code of corresponding
     *  assignment operation. This is always an even number.
     */
    private static int accessCode(int bytecode) {
        if (ByteCodes.iadd <= bytecode && bytecode <= ByteCodes.lxor)
            return (bytecode - iadd) * 2 + FIRSTASGOPcode;
        else if (bytecode == ByteCodes.string_add)
            return (ByteCodes.lxor + 1 - iadd) * 2 + FIRSTASGOPcode;
        else if (ByteCodes.ishll <= bytecode && bytecode <= ByteCodes.lushrl)
            return (bytecode - ishll + ByteCodes.lxor + 2 - iadd) * 2 +
                    FIRSTASGOPcode;
        else
            return -1;
    }

    /**
      * return access code for identifier,
      *  @param tree     The tree representing the identifier use.
      *  @param enclOp   The closest enclosing operation node of tree,
      *                  null if tree is not a subtree of an operation.
      */
    private static int accessCode(Tree tree, Tree enclOp) {
        if (enclOp == null)
            return DEREFcode;
        else if (enclOp.tag == Tree.ASSIGN &&
                tree == TreeInfo.skipParens(((Assign) enclOp).lhs))
            return ASSIGNcode;
        else if (Tree.PREINC <= enclOp.tag && enclOp.tag <= Tree.POSTDEC &&
                tree == TreeInfo.skipParens(((Unary) enclOp).arg))
            return (enclOp.tag - Tree.PREINC) * 2 + PREINCcode;
        else if (Tree.BITOR_ASG <= enclOp.tag && enclOp.tag <= Tree.MOD_ASG &&
                tree == TreeInfo.skipParens(((Assignop) enclOp).lhs))
            return accessCode(((OperatorSymbol)((Assignop) enclOp).operator).opcode);
        else
            return DEREFcode;
    }

    /**
      * Return binary operator that corresponds to given access code.
      */
    private OperatorSymbol binaryAccessOperator(int acode) {
        for (Scope.Entry e = syms.predefClass.members().elems; e != null;
                e = e.sibling) {
            if (e.sym instanceof OperatorSymbol) {
                OperatorSymbol op = (OperatorSymbol) e.sym;
                if (accessCode(op.opcode) == acode)
                    return op;
            }
        }
        return null;
    }

    /**
      * Return tree tag for assignment operation corresponding
      *  to given binary operator.
      */
    private static int treeTag(OperatorSymbol operator) {
        switch (operator.opcode) {
        case ByteCodes.ior:

        case ByteCodes.lor:
            return Tree.BITOR_ASG;

        case ByteCodes.ixor:

        case ByteCodes.lxor:
            return Tree.BITXOR_ASG;

        case ByteCodes.iand:

        case ByteCodes.land:
            return Tree.BITAND_ASG;

        case ByteCodes.ishl:

        case ByteCodes.lshl:

        case ByteCodes.ishll:

        case ByteCodes.lshll:
            return Tree.SL_ASG;

        case ByteCodes.ishr:

        case ByteCodes.lshr:

        case ByteCodes.ishrl:

        case ByteCodes.lshrl:
            return Tree.SR_ASG;

        case ByteCodes.iushr:

        case ByteCodes.lushr:

        case ByteCodes.iushrl:

        case ByteCodes.lushrl:
            return Tree.USR_ASG;

        case ByteCodes.iadd:

        case ByteCodes.ladd:

        case ByteCodes.fadd:

        case ByteCodes.dadd:

        case ByteCodes.string_add:
            return Tree.PLUS_ASG;

        case ByteCodes.isub:

        case ByteCodes.lsub:

        case ByteCodes.fsub:

        case ByteCodes.dsub:
            return Tree.MINUS_ASG;

        case ByteCodes.imul:

        case ByteCodes.lmul:

        case ByteCodes.fmul:

        case ByteCodes.dmul:
            return Tree.MUL_ASG;

⌨️ 快捷键说明

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