亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flow.java

?? javac是sun公司開發人員使用java語言編寫的優秀的工業級java編譯器
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/** * @(#)Flow.java	1.64 03/04/16 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.tools.javac.v8.comp;import com.sun.tools.javac.v8.util.*;import com.sun.tools.javac.v8.code.*;import com.sun.tools.javac.v8.tree.*;import com.sun.tools.javac.v8.code.Symbol.*;import com.sun.tools.javac.v8.tree.Tree.*;import com.sun.tools.javac.v8.code.Type.*;/** * This pass implements dataflow analysis for Java programs. *  Liveness analysis checks that every statement is reachable. *  Exception analysis ensures that every checked exception that is *  thrown is declared or caught.  Definite assignment analysis *  ensures that each variable is assigned when used.  Definite *  unassignment analysis ensures that no final variable is assigned *  more than once. * *  <p>The second edition of the JLS has a number of problems in the *  specification of these flow analysis problems. This implementation *  attempts to address those issues. * *  <p>First, there is no accommodation for a finally clause that cannot *  complete normally. For liveness analysis, an intervening finally *  clause can cause a break, continue, or return not to reach its *  target.  For exception analysis, an intervening finally clause can *  cause any exception to be "caught".  For DA/DU analysis, the finally *  clause can prevent a transfer of control from propagating DA/DU *  state to the target.  In addition, code in the finally clause can *  affect the DA/DU status of variables. * *  <p>For try statements, we introduce the idea of a variable being *  definitely unassigned "everywhere" in a block.  A variable V is *  "unassigned everywhere" in a block iff it is unassigned at the *  beginning of the block and there is no reachable assignment to V *  in the block.  An assignment V=e is reachable iff V is not DA *  after e.  Then we can say that V is DU at the beginning of the *  catch block iff V is DU everywhere in the try block.  Similarly, V *  is DU at the beginning of the finally block iff V is DU everywhere *  in the try block and in every catch block.  Specifically, the *  following bullet is added to 16.2.2 * *	V is <em>unassigned everywhere</em> in a block if it is *	unassigned before the block and there is no reachable *	assignment to V within the block. * *  In 16.2.15, the third bullet (and all of its sub-bullets) for all *  try blocks is changed to * *	V is definitely unassigned before a catch block iff V is *	definitely unassigned everywhere in the try block. * *  The last bullet (and all of its sub-bullets) for try blocks that *  have a finally block is changed to * *	V is definitely unassigned before the finally block iff *	V is definitely unassigned everywhere in the try block *	and everywhere in each catch block of the try statement. * *  In addition, * *	V is definitely assigned at the end of a constructor iff *	V is definitely assigned after the block that is the body *	of the constructor and V is definitely assigned at every *	return that can return from the constructor. *  </pre> * *  <p>In addition, each continue statement with the loop as its target *  is treated as a jump to the end of the loop body, and "intervening" *  finally clauses are treated as follows: V is DA "due to the *  continue" iff V is DA before the continue statement or V is DA at *  the end of any intervening finally block.  V is DU "due to the *  continue" iff any intervening finally cannot complete normally or V *  is DU at the end of every intervening finally block.  This "due to *  the continue" concept is then used in the spec for the loops. * *  <p>Similarly, break statements must consider intervening finally *  blocks.  For liveness analysis, a break statement for which any *  intervening finally cannot complete normally is not considered to *  cause the target statement to be able to complete normally. Then *  we say V is DA "due to the break" iff V is DA before the break or *  V is DA at the end of any intervening finally block.  V is DU "due *  to the break" iff any intervening finally cannot complete normally *  or V is DU at the break and at the end of every intervening *  finally block.  (I suspect this latter condition can be *  simplified.)  This "due to the break" is then used in the spec for *  all statements that can be "broken". * *  <p>The return statement is treated similarly.  V is DA "due to a *  return statement" iff V is DA before the return statement or V is *  DA at the end of any intervening finally block.  Note that we *  don't have to worry about the return expression because this *  concept is only used for construcrors. * *  <p>There is no spec in JLS2 for when a variable is definitely *  assigned at the end of a constructor, which is needed for final *  fields (8.3.1.2).  We implement the rule that V is DA at the end *  of the constructor iff it is DA and the end of the body of the *  constructor and V is DA "due to" every return of the constructor. * *  <p>Intervening finally blocks similarly affect exception analysis.	An *  intervening finally that cannot complete normally allows us to ignore *  an otherwise uncaught exception. * *  <p>To implement the semantics of intervening finally clauses, all *  nonlocal transfers (break, continue, return, throw, method call that *  can throw a checked exception, and a constructor invocation that can *  thrown a checked exception) are recorded in a queue, and removed *  from the queue when we complete processing the target of the *  nonlocal transfer.  This allows us to modify the queue in accordance *  with the above rules when we encounter a finally clause.  The only *  exception to this [no pun intended] is that checked exceptions that *  are known to be caught or declared to be caught in the enclosing *  method are not recorded in the queue, but instead are recorded in a *  global variable "Set<Type> thrown" that records the type of all *  exceptions that can be thrown. * *  <p>Other minor issues the treatment of members of other classes *  (always considered DA except that within an anonymous class *  constructor, where DA status from the enclosing scope is *  preserved), treatment of the case expression (V is DA before the *  case expression iff V is DA after the switch expression), *  treatment of variables declared in a switch block (the implied *  DA/DU status after the switch expression is DU and not DA for *  variables defined in a switch block), the treatment of boolean ?: *  expressions (The JLS rules only handle b and c non-boolean; the *  new rule is that if b and c are boolean valued, then V is *  (un)assigned after a?b:c when true/false iff V is (un)assigned *  after b when true/false and V is (un)assigned after c when *  true/false). * *  There is the remaining question of what syntactic forms constitute a *  reference to a variable.  It is conventional to allow this.x on the *  left-hand-side to initialize a final instance field named x, yet *  this.x isn't considered a "use" when appearing on a right-hand-side *  in most implementations.  Should parentheses affect what is *  considered a variable reference?  The simplest rule would be to *  allow unqualified forms only, parentheses optional, and phase out *  support for assigning to a final field via this.x. */public class Flow extends TreeScanner implements Flags, Kinds, TypeTags {    private static final Context.Key flowKey = new Context.Key();    private Name.Table names;    private Log log;    private Symtab syms;    private Check chk;    private TreeMaker make;    private boolean switchCheck;    public static Flow instance(Context context) {        Flow instance = (Flow) context.get(flowKey);        if (instance == null)            instance = new Flow(context);        return instance;    }    private Flow(Context context) {        super();        context.put(flowKey, this);        names = Name.Table.instance(context);        log = Log.instance(context);        syms = Symtab.instance(context);        chk = Check.instance(context);        Options options = Options.instance(context);        switchCheck = options.get("-Xswitchcheck") != null;    }    /**      * A flag that indicates whether the last statement could      *	complete normally.      */    private boolean alive;    /**     * The set of definitely assigned variables.     */    Bits inits;    /**     * The set of definitely unassigned variables.     */    Bits uninits;    /**     * The set of variables that are definitely unassigned everywhere     *	in current try block. This variable is maintained lazily; it is     *	updated only when something gets removed from uninits,     *	typically by being assigned in reachable code.	To obtain the     *	correct set of variables which are definitely unassigned     *	anywhere in current try block, intersect uninitsTry and     *	uninits.     */    Bits uninitsTry;    /**     * When analyzing a condition, inits and uninits are null.     *	Instead we have:     */    Bits initsWhenTrue;    Bits initsWhenFalse;    Bits uninitsWhenTrue;    Bits uninitsWhenFalse;    /**     * A mapping from addresses to variable symbols.     */    VarSymbol[] vars;    /**     * The current class being defined.     */    ClassDef classDef;    /**     * The first variable sequence number in this class definition.     */    int firstadr;    /**     * The next available variable sequence number.     */    int nextadr;    /**     * The list of possibly thrown declarable exceptions.     */    List thrown;    /**     * The list of exceptions that are either caught or declared to be     *	thrown.     */    List caught;    /**     * Set when processing a loop body the second time for DU analysis.     */    boolean loopPassTwo = false;    /**     * A pending exit.	 These are the statements return, break, and     *	continue.  In addition, exception-throwing expressions or     *	statements are put here when not known to be caught.  This     *	will typically result in an error unless it is within a     *	try-finally whose finally block cannot complete normally.     */    static class PendingExit {        Tree tree;        Bits inits;        Bits uninits;        Type thrown;        PendingExit(Tree tree, Bits inits, Bits uninits) {            super();            this.tree = tree;            this.inits = inits.dup();            this.uninits = uninits.dup();        }        PendingExit(Tree tree, Type thrown) {            super();            this.tree = tree;            this.thrown = thrown;        }    }    /**      * The currently pending exits that go from current inner blocks      *	to an enclosing block, in source order.      */    ListBuffer pendingExits;    /**     * Complain that pending exceptions are not caught.     */    void errorUncaught() {        for (PendingExit exit = (Flow.PendingExit) pendingExits.next();                exit != null; exit = (Flow.PendingExit) pendingExits.next()) {            boolean synthetic = classDef != null && classDef.pos == exit.tree.pos;            log.error(exit.tree.pos,                    synthetic ? "unreported.exception.default.constructor" : "unreported.exception.need.to.catch.or.throw",                    exit.thrown.toJava());        }    }    /**      * Record that exception is potentially thrown and check that it      *	is caught.      */    void markThrown(Tree tree, Type exc) {        if (!chk.isUnchecked(tree.pos, exc)) {            if (!chk.isHandled(exc, caught))                pendingExits.append(new PendingExit(tree, exc));            thrown = chk.incl(exc, thrown);        }    }    /**      * Do we need to track init/uninit state of this symbol?      *	I.e. is symbol either a local or a blank final variable?      */    boolean trackable(VarSymbol sym) {        return (sym.owner.kind == MTH ||                ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL &&                classDef.sym.isEnclosedBy((ClassSymbol) sym.owner)));    }    /**      * Initialize new trackable variable by setting its address field      *	to the next available sequence number and entering it under that      *	index into the vars array.      */    void newVar(VarSymbol sym) {        if (nextadr == vars.length) {            VarSymbol[] newvars = new VarSymbol[nextadr * 2];            System.arraycopy(vars, 0, newvars, 0, nextadr);            vars = newvars;        }        sym.adr = nextadr;        vars[nextadr] = sym;        inits.excl(nextadr);        uninits.incl(nextadr);        nextadr++;    }    /**      * Record an initialization of a trackable variable.      */    void letInit(int pos, VarSymbol sym) {        if (sym.adr >= firstadr && trackable(sym)) {            if ((sym.flags() & FINAL) != 0) {                if ((sym.flags() & PARAMETER) != 0) {                    log.error(pos, "final.parameter.may.not.be.assigned",                            sym.toJava());                } else if (!uninits.isMember(sym.adr)) {                    log.error(pos,                            loopPassTwo ? "var.might.be.assigned.in.loop" : "var.might.already.be.assigned",                            sym.toJava());                } else if (!inits.isMember(sym.adr)) {                    uninits.excl(sym.adr);                    uninitsTry.excl(sym.adr);                } else {                    uninits.excl(sym.adr);                }            }            inits.incl(sym.adr);        } else if ((sym.flags() & FINAL) != 0) {            log.error(pos, "var.might.already.be.assigned", sym.toJava());        }    }    /**      * If tree is either a simple name or of the form this.name or      *	C.this.name, and tree represents a trackable variable,      *	record an initialization of the variable.      */    void letInit(Tree tree) {        tree = TreeInfo.skipParens(tree);        if (tree.tag == Tree.IDENT || tree.tag == Tree.SELECT) {            Symbol sym = TreeInfo.symbol(tree);            letInit(tree.pos, (VarSymbol) sym);        }    }    /**      * Check that trackable variable is initialized.      */    void checkInit(int pos, VarSymbol sym) {        if ((sym.adr >= firstadr || sym.owner.kind != TYP) && trackable(sym) &&                !inits.isMember(sym.adr)) {            log.error(pos, "var.might.not.have.been.initialized", sym.toJava());            inits.incl(sym.adr);        }    }    /**      * Record an outward transfer of control.      */    void recordExit(Tree tree) {        pendingExits.append(new PendingExit(tree, inits, uninits));        markDead();    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀精品一区二区三区在线观看 | 亚洲男人的天堂在线观看| 国产精品国产三级国产普通话99 | 国产精品福利av| 婷婷一区二区三区| 波波电影院一区二区三区| 日韩精品一区二区三区在线播放| 中文字幕一区二区三区色视频| 日本少妇一区二区| 精品视频全国免费看| 国产欧美日韩不卡免费| 久久99九九99精品| 欧美久久久久久蜜桃| 国产精品麻豆视频| 国产在线视频不卡二| 这里只有精品99re| 亚洲国产另类av| 一本色道综合亚洲| 亚洲欧洲性图库| www.色精品| 国产精品欧美久久久久无广告| 激情亚洲综合在线| 欧美精品一区二区三区蜜桃| 青青草精品视频| 欧美伦理电影网| 无吗不卡中文字幕| 欧美日韩一级黄| 亚洲成在人线在线播放| 欧美日韩在线免费视频| 亚洲国产精品久久不卡毛片| 在线观看国产精品网站| 亚洲精品国产a久久久久久| 91视频91自| 亚洲精品国产a| 欧美色老头old∨ideo| 亚洲福利视频三区| 欧美一区午夜视频在线观看 | 国产在线视频一区二区| 精品精品国产高清a毛片牛牛| 蜜臀av性久久久久蜜臀aⅴ| 日韩欧美国产三级电影视频| 狠狠色综合日日| 国产日韩v精品一区二区| 成人一级视频在线观看| 亚洲欧美在线高清| 欧美在线一区二区三区| 天天操天天综合网| 久久免费美女视频| 99国产麻豆精品| 一区二区三区欧美视频| 欧美一区二区三区公司| 国产剧情在线观看一区二区| 国产精品精品国产色婷婷| 日本乱人伦一区| 热久久免费视频| 国产精品亲子乱子伦xxxx裸| 91极品视觉盛宴| 美脚の诱脚舐め脚责91| 国产精品免费免费| 欧美久久久久中文字幕| 国产成人精品影视| 一区二区在线观看av| 日韩欧美一级在线播放| 成人av网址在线| 午夜成人在线视频| 久久精品亚洲精品国产欧美| 色婷婷精品大在线视频| 美国欧美日韩国产在线播放| 国产精品久久久久久久久图文区| 欧美日韩激情一区二区| 国产曰批免费观看久久久| 1区2区3区国产精品| 欧美一级搡bbbb搡bbbb| 成a人片国产精品| 青青国产91久久久久久 | 成人97人人超碰人人99| 午夜精品成人在线| 国产欧美精品在线观看| 正在播放一区二区| 91在线丨porny丨国产| 美女视频一区二区三区| 亚洲乱码国产乱码精品精可以看| 精品成人a区在线观看| 欧美日韩免费高清一区色橹橹| 国产一区二区不卡老阿姨| 亚洲成人av电影在线| 中文字幕欧美国产| 久久综合久久综合久久综合| 欧美日韩国产欧美日美国产精品| a美女胸又www黄视频久久| 激情国产一区二区 | 国产98色在线|日韩| 免费视频最近日韩| 亚洲宅男天堂在线观看无病毒 | 91精品国产欧美日韩| 91色.com| 成人精品国产福利| 国产一区二区成人久久免费影院| 午夜a成v人精品| 亚洲一区二区三区爽爽爽爽爽| 国产精品久久久久久一区二区三区| 亚洲精品在线三区| 精品少妇一区二区三区视频免付费 | 国产午夜精品一区二区| 欧美成人video| 欧美一级专区免费大片| 91麻豆精品91久久久久久清纯| 在线视频欧美区| 91在线视频18| 色天天综合久久久久综合片| 不卡一二三区首页| 成人18视频在线播放| 成人av网站在线观看| 99精品视频中文字幕| 97久久超碰国产精品| 99在线精品视频| 9l国产精品久久久久麻豆| 菠萝蜜视频在线观看一区| 成人毛片在线观看| www.欧美.com| 97精品电影院| 在线精品视频一区二区三四| 色综合久久中文字幕综合网| 在线亚洲一区观看| 欧美日韩夫妻久久| 7777女厕盗摄久久久| 日韩精品综合一本久道在线视频| 精品久久久久一区二区国产| 久久网站最新地址| 国产精品少妇自拍| 一二三区精品福利视频| 日韩精品电影在线| 国产综合久久久久久鬼色| 成人一区二区三区视频| 色婷婷av一区二区三区之一色屋| 欧美日韩一区三区四区| 日韩一区二区在线观看| 国产亚洲一区二区三区在线观看| 中文字幕精品—区二区四季| 一区二区三区在线视频免费| 日韩av电影免费观看高清完整版| 麻豆一区二区99久久久久| 国产69精品久久久久777| 一本一道久久a久久精品综合蜜臀| 欧美日韩三级一区二区| 26uuu精品一区二区| ...xxx性欧美| 日本不卡一二三区黄网| 成人免费视频视频| 制服丝袜中文字幕一区| 亚洲国产精品成人综合色在线婷婷 | 中文字幕一区二区不卡| 亚洲超丰满肉感bbw| 国产麻豆成人精品| 欧美日韩中文国产| 久久综合国产精品| 一区二区成人在线| 国产一区亚洲一区| 欧美午夜视频网站| 欧美激情一区二区在线| 天使萌一区二区三区免费观看| 国产在线精品免费av| 欧美日韩亚洲综合在线| 精品国产91乱码一区二区三区| 亚洲日本va午夜在线影院| 国产在线精品一区在线观看麻豆| 色婷婷亚洲一区二区三区| 2023国产一二三区日本精品2022| 亚洲欧美一区二区三区久本道91| 美国毛片一区二区| 欧美日韩在线播放三区| 国产精品美女久久久久久2018 | 在线播放/欧美激情| 国产精品久久久久久久久免费樱桃| 日产精品久久久久久久性色| 国产aⅴ精品一区二区三区色成熟| 欧美日韩另类国产亚洲欧美一级| 亚洲国产精品成人综合| 另类中文字幕网| 欧美绝品在线观看成人午夜影视| 中文字幕亚洲在| 国产精品99久久不卡二区| 欧美一卡二卡在线观看| 亚洲激情网站免费观看| 成人福利在线看| 久久久噜噜噜久噜久久综合| 蜜桃av一区二区在线观看| 欧美午夜精品久久久久久超碰 | 久久精品99久久久| 欧美在线视频不卡| 国产精品污www在线观看| 国产一区二区三区日韩| 日韩女优视频免费观看| 美女在线一区二区| 日韩西西人体444www| 蜜桃久久久久久| 欧美一区二区播放| 久久精品久久99精品久久| 欧美成人精品二区三区99精品| 日韩精品午夜视频|