📄 transinner.java
字号:
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 != null) { thisArg = attr.makeNullCheck(translate(tree.encl)); thisArg.type = tree.encl.type; } else if ((c.owner.kind & (MTH | VAR)) != 0) { thisArg = makeThis(tree.pos, c.type.outer().tsym); } else { thisArg = makeOwnerThis(tree.pos, c, false); } tree.args = tree.args.prepend(thisArg); } tree.encl = null; if (tree.def != null) { translate(tree.def); tree.clazz = access(make.at(tree.clazz.pos).Ident(tree.def.sym)); tree.def = null; } else { tree.clazz = access(c, tree.clazz, enclOp, false); } result = tree; } /** * Visitor method for conditional expressions. */ public void visitConditional(Conditional tree) { Tree cond = tree.cond = translate(tree.cond); if (cond.type.isTrue()) { result = convert(translate(tree.truepart), tree.type); } else if (cond.type.isFalse()) { result = convert(translate(tree.falsepart), tree.type); } else { tree.truepart = translate(tree.truepart); tree.falsepart = translate(tree.falsepart); result = tree; } } private Tree convert(Tree tree, Type pt) { if (tree.type == pt) return tree; Tree result = make.at(tree.pos).TypeCast(make.Type(pt), tree); result.type = (tree.type.constValue != null) ? cfolder.coerce(tree.type, pt) : pt; return result; } /** * Visitor method for if statements. */ public void visitIf(If tree) { Tree cond = tree.cond = translate(tree.cond);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -