diff -r 5c30fa1c8c5b -r 6c1fa412c72d rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Thu Mar 12 10:32:13 2015 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Fri Mar 13 11:41:04 2015 +0100 @@ -422,8 +422,10 @@ */ public static final class Flow { private final MethodData m; + private byte[] ops; Flow(MethodData m) { this.m = m; + ops = new byte[m.getCode().length]; } /** Access to bytecode of the method to analyse. @@ -441,10 +443,46 @@ return m.getName(); } - public void registerCycle(int offset) { + public void beginLoopAt(int bci) { + ops[bci] |= 0x10; } - public void registerIf(int offset) { + public void beginIfAt(int bci) { + ops[bci] |= 0x20; + } + + + public void breakAt(int bci) { + ops[bci] |= 0x40; + } + + public void beginElseAt(int bci) { + ops[bci] |= 0x80; + } + + public void endAt(int bci) { + int cnt = (ops[bci] & 0x0f) + 1; + int rest = ops[bci] & 0xf0; + ops[bci] = (byte)(rest | cnt); + } + + boolean isFlow(int at) { + return ops[at] != 0; + } + boolean isLoop(int at) { + return (ops[at] & 0x10) != 0; + } + boolean isIf(int at) { + return (ops[at] & 0x20) != 0; + } + boolean isBreak(int at) { + return (ops[at] & 0x40) != 0; + } + boolean isElse(int at) { + return (ops[at] & 0x80) != 0; + } + int isEnd(int at) { + return (ops[at] & 0x0f); } /** Provider of advanced analysis of the code flow inside of