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

📄 transinner.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    rs.resolveInternalMethod(make.pos, attrEnv, syms.classType,
                    names.forName,
                    Type.emptyList.prepend(syms.classLoaderType).prepend(
                    syms.booleanType).prepend(syms.stringType));
            Tree clvalue = make.Conditional( makeBinary(Tree.EQ, make.Ident(clsym),
                    make.Ident(syms.nullConst)),
                    make.Assign(make.Ident(clsym),
                    makeCall(
                    makeCall(makeCall(newcache, names.getClass, Tree.emptyList),
                    names.getComponentType, Tree.emptyList),
                    names.getClassLoader, Tree.emptyList)).setType(
                    syms.classLoaderType),
                    make.Ident(clsym)).setType(syms.classLoaderType);
            List args = Tree.emptyList.prepend(clvalue).prepend(
                    make.Ident(syms.falseConst)).prepend(
                    make.Ident(((Tree.VarDef) md.params.head).sym));
            returnResult = make.Block(0,
                    Tree.emptyList.prepend(
                    make.Call(make.App(make.Ident(forNameSym), args))));
        } else {
            Symbol forNameSym =
                    rs.resolveInternalMethod(make.pos, attrEnv, syms.classType,
                    names.forName, Type.emptyList.prepend(syms.stringType));
            returnResult = make.Block(0,
                    Tree.emptyList.prepend( make.Call(
                    make.App(make.QualIdent(forNameSym),
                    List.make(make.Ident(((Tree.VarDef) md.params.head).sym))))));
        }
        VarSymbol catchParam = new VarSymbol(0, make.paramName(1),
                syms.classNotFoundExceptionType, classDollarSym);
        Tree rethrow;
        if (target.ordinal >= Target.JDK1_4.ordinal) {
            Tree throwExpr = makeCall(
                    makeNewClass(syms.noClassDefFoundErrorType, Tree.emptyList),
                    names.initCause, Tree.emptyList.prepend(make.Ident(catchParam)));
            rethrow = make.Throw(throwExpr);
        } else {
            Symbol getMessageSym = rs.resolveInternalMethod(make.pos, attrEnv,
                    syms.classNotFoundExceptionType, names.getMessage,
                    Type.emptyList);
            rethrow = make.Throw( makeNewClass(syms.noClassDefFoundErrorType,
                    List.make(
                    make.App(make.Select(make.Ident(catchParam), getMessageSym),
                    Tree.emptyList))));
        }
        Tree rethrowStmt = make.Block(0, Tree.emptyList.prepend(rethrow));
        Catch catchBlock = make.Catch(make.VarDef(catchParam, null), rethrowStmt);
        Tree tryCatch =
                make.Try(returnResult, Catch.emptyList.prepend(catchBlock), null);
        return make.Block(0, Tree.emptyList.prepend(tryCatch));
    }

    /**
      * Create an attributed tree of the form left.name().
      */
    private Tree makeCall(Tree left, Name name, List args) {
        assert left.type != null;
        List types = Type.emptyList;
        Symbol funcsym = rs.resolveInternalMethod(make.pos, attrEnv, left.type, name,
                TreeInfo.types(args));
        return make.App(make.Select(left, funcsym), args);
    }

    /**
      * The Name Of The variable to cache T.class values.
      *  @param sig      The signature of type T.
      */
    private Name cacheName(String sig) {
        StringBuffer buf = new StringBuffer();
        if (sig.startsWith("[")) {
            buf = buf.append("array");
            while (sig.startsWith("[")) {
                buf = buf.append("$");
                sig = sig.substring(1);
            }
            if (sig.startsWith("L")) {
                sig = sig.substring(0, sig.length() - 1);
            }
        } else {
            buf = buf.append("class$");
        }
        buf = buf.append(sig.replace('.', '$'));
        return names.fromString(buf.toString());
    }

    /**
      * The variable symbol that caches T.class values.
      *  If none exists yet, create a definition.
      *  @param sig      The signature of type T.
      *  @param pos	The position to report diagnostics, if any.
      */
    private VarSymbol cacheSym(int pos, String sig) {
        ClassSymbol outerCacheClass = outerCacheClass();
        Name cname = cacheName(sig);
        VarSymbol cacheSym =
                (VarSymbol) lookupSynthetic(cname, outerCacheClass.members());
        if (cacheSym == null) {
            cacheSym = new VarSymbol(STATIC | SYNTHETIC, cname, syms.classType,
                    outerCacheClass);
            enterSynthetic(pos, cacheSym, outerCacheClass.members());
            VarDef cacheDef = make.VarDef(cacheSym, null);
            ClassDef outerCacheClassDef = classDef(outerCacheClass);
            outerCacheClassDef.defs = outerCacheClassDef.defs.prepend(cacheDef);
        }
        return cacheSym;
    }

    /**
      * The tree simulating a T.class expression.
      *  @param clazz      The tree identifying type T.
      */
    private Tree classOf(Tree clazz) {
        return classOfType(clazz.type, clazz.pos);
    }

    private Tree classOfType(Type type, int pos) {
        switch (type.tag) {
        case BYTE:

        case SHORT:

        case CHAR:

        case INT:

        case LONG:

        case FLOAT:

        case DOUBLE:

        case BOOLEAN:

        case VOID:
            Name bname = syms.boxedName[type.tag];
            ClassSymbol c = reader.enterClass(bname);
            Symbol typeSym = rs.access(
                    rs.findIdentInType(attrEnv, c.type, names.TYPE, VAR), pos,
                    c.type, names.TYPE, true);
            if (typeSym.kind == VAR)
                attr.evalInit((VarSymbol) typeSym);
            return make.QualIdent(typeSym);

        case CLASS:

        case ARRAY:
            String sig = writer.xClassName(type).toString().replace('/', '.');
            Symbol cs = cacheSym(pos, sig);
            return make.at(pos).Conditional( makeBinary(Tree.EQ, make.Ident(cs),
                    make.Ident(syms.nullConst)),
                    make.Assign(make.Ident(cs),
                    make.App(make.Ident(classDollarSym(pos)),
                    List.make(
                    make.Literal(Type.CLASS, sig).setType(syms.stringType)))).
                    setType(syms.classType), make.Ident(cs)).setType(syms.classType);

        default:
            throw new AssertionError();

        }
    }

    /**
      * Code for enabling/disabling assertions.
      */
    private Tree assertFlagTest(int pos) {
        ClassSymbol outermostClass = outermostClassDef.sym;
        ClassSymbol container = currentClass;
        VarSymbol assertDisabledSym =
                (VarSymbol) lookupSynthetic(names.dollarAssertionsDisabled,
                container.members());
        if (assertDisabledSym == null) {
            assertDisabledSym = new VarSymbol(STATIC | FINAL | SYNTHETIC,
                    names.dollarAssertionsDisabled, syms.booleanType, container);
            enterSynthetic(pos, assertDisabledSym, container.members());
            Symbol desiredAssertionStatusSym =
                    rs.resolveInternalMethod(pos, attrEnv, syms.classType,
                    names.desiredAssertionStatus, Type.emptyList);
            ClassDef containerDef = classDef(container);
            make.at(containerDef.pos);
            Tree notStatus = makeUnary(Tree.NOT,
                    make.App( make.Select(
                    classOfType(outermostClass.type, containerDef.pos),
                    desiredAssertionStatusSym), Tree.emptyList));
            VarDef assertDisabledDef = make.VarDef(assertDisabledSym, notStatus);
            containerDef.defs = containerDef.defs.prepend(assertDisabledDef);
        }
        make.at(pos);
        return makeUnary(Tree.NOT, make.Ident(assertDisabledSym));
    }

    /**
      * Visitor argument: enclosing operator node.
      */
    private Tree enclOp;

    /**
     * Visitor method: Translate a single node.
     *  Attach the source position from the old tree to its replacement tree.
     */
    public Tree translate(Tree tree) {
        if (tree == null) {
            return null;
        } else {
            make.at(tree.pos);
            tree.accept(this);
            if (endPositions != null && result != tree) {
                Integer endPos = (Integer) endPositions.remove(tree);
                if (endPos != null)
                    endPositions.put(result, endPos);
            }
            return result;
        }
    }

    /**
      * Visitor method: Translate tree.
      */
    public Tree translate(Tree tree, Tree enclOp) {
        Tree prevEnclOp = this.enclOp;
        this.enclOp = enclOp;
        Tree res = translate(tree);
        this.enclOp = prevEnclOp;
        return res;
    }

    /**
      * Visitor method: Translate list of trees.
      */
    public List translate(List trees, Tree enclOp) {
        Tree prevEnclOp = this.enclOp;
        this.enclOp = enclOp;
        List res = translate(trees);
        this.enclOp = prevEnclOp;
        return res;
    }

    public void visitClassDef(ClassDef tree) {
        ClassSymbol currentClassPrev = currentClass;
        currentClass = tree.sym;
        classdefs.put(currentClass, tree);
        proxies = proxies.dup();
        List prevOuterThisStack = outerThisStack;
        VarDef otdef = null;
        if (currentClass.hasOuterInstance())
            otdef = outerThisDef(tree.pos, currentClass);
        List fvdefs = freevarDefs(tree.pos, freevars(currentClass), currentClass);
        tree.extending = translate(tree.extending);
        tree.implementing = translate(tree.implementing);
        List seen = Tree.emptyList;
        while (tree.defs != seen) {
            List unseen = tree.defs;
            for (List l = unseen; l.nonEmpty() && l != seen; l = l.tail) {
                Tree outermostMemberDefPrev = outermostMemberDef;
                if (outermostMemberDefPrev == null)
                    outermostMemberDef = (Tree) l.head;
                l.head = translate((Tree) l.head);
                outermostMemberDef = outermostMemberDefPrev;
            }
            seen = unseen;
        }
        if ((tree.flags & PROTECTED) != 0)
            tree.flags |= PUBLIC;
        tree.flags &= ClassFlags;
        tree.name = Convert.shortName(currentClass.flatName());
        for (List l = fvdefs; l.nonEmpty(); l = l.tail) {
            tree.defs = tree.defs.prepend(l.head);
            enterSynthetic(tree.pos, ((Tree.VarDef) l.head).sym,
                    currentClass.members());
        }
        if (currentClass.hasOuterInstance()) {
            tree.defs = tree.defs.prepend(otdef);
            enterSynthetic(tree.pos, otdef.sym, currentClass.members());
        }
        proxies = proxies.leave();
        outerThisStack = prevOuterThisStack;
        translated.append(tree);
        currentClass = currentClassPrev;
        result = make.at(tree.pos).Block(0, Tree.emptyList);
    }

    public void visitMethodDef(MethodDef tree) {
        if (tree.name == names.init && (currentClass.isInner() ||
                (currentClass.owner.kind & (VAR | MTH)) != 0)) {
            MethodSymbol m = tree.sym;
            proxies = proxies.dup();
            List prevOuterThisStack = outerThisStack;
            List fvs = freevars(currentClass);
            VarDef otdef = null;
            if (currentClass.hasOuterInstance())
                otdef = outerThisDef(tree.pos, m);
            List fvdefs = freevarDefs(tree.pos, fvs, m);
            tree.restype = translate(tree.restype);
            tree.params = translateVarDefs(tree.params);
            tree.thrown = translate(tree.thrown);
            tree.params = tree.params.appendList(fvdefs);
            if (currentClass.hasOuterInstance())
                tree.params = tree.params.prepend(otdef);
            Tree selfCall = translate((Tree) tree.body.stats.head);
            List added = Tree.emptyList;
            if (fvs.nonEmpty()) {
                List addedargtypes = new List();
                for (List l = fvs; l.nonEmpty(); l = l.tail) {
                    if (TreeInfo.isInitialConstructor(tree))
                        added = added.prepend( initField(tree.body.pos,
                                proxyName(((Symbol.VarSymbol) l.head).name)));
                    addedargtypes = addedargtypes.prepend(
                            ((Symbol.VarSymbol) l.head).erasure());
                }
                Type olderasure = m.erasure();
                m.erasure_field = new MethodType(
                        olderasure.argtypes().appendList(addedargtypes),
                        olderasure.restype(), olderasure.thrown(), syms.methodClass);
            }
            if (currentClass.hasOuterInstance() &&
                    TreeInfo.isInitialConstructor(tree)) {
                added = added.prepend(initOuterThis(tree.body.pos));
            }
            proxies = proxies.leave();
            List stats = translate(tree.body.stats.tail);
            if (target.initializeFieldsBeforeSuper())
                tree.body.stats = stats.prepend(selfCall).prependList(added);
            else
                tree.body.stats = stats.prependList(added).prepend(selfCall);
            outerThisStack = prevOuterThisStack;
        } else {
            super.visitMethodDef(tree);
        }
        result = tree;
    }

    public void visitNewClass(NewClass tree) {
        ClassSymbol c = (ClassSymbol) tree.constructor.owner;
        tree.args = translate(tree.args);
        if ((c.owner.kind & (VAR | MTH)) != 0) {
            tree.args = tree.args.appendList(loadFreevars(tree.pos, freevars(c)));
        }
        Symbol constructor = accessConstructor(tree.pos, tree.constructor);
        if (constructor != tree.constructor) {
            tree.args = tree.args.append(make.Ident(syms.nullConst));
            tree.constructor = constructor;
        }
        if (c.hasOuterInstance()) {
            Tree thisArg;
            if (tree.encl != nul

⌨️ 快捷键说明

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