BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; prev.exit = makeArray(bb); return blocks.toArray(makeArray(blocks.size()));
if ((Opcode.IFEQ <= op && op <= Opcode.IF_ACMPNE) || op == Opcode.IFNULL || op == Opcode.IFNONNULL) { Mark to = makeMark(marks, index + ci.s16bitAt(index + 1)); Mark next = makeMark(marks, index + 3); makeMark(marks, index, makeArray(to.block, next.block), 3, false); case Opcode.GOTO : case Opcode.JSR : makeGotoJsr(marks, index, index + ci.s16bitAt(index + 1), op == Opcode.GOTO, 3); break; case Opcode.RET : makeMark(marks, index, null, 1, true); break; case Opcode.TABLESWITCH : { int high = ci.s32bitAt(pos + 8); int ncases = high - low + 1; BasicBlock[] to = makeArray(ncases + 1); to[0] = makeMark(marks, index + ci.s32bitAt(pos)).block; // default branch target int p = pos + 12; int n = p + ncases * 4; int k = 1; while (p < n) { to[k++] = makeMark(marks, index + ci.s32bitAt(p)).block; p += 4; makeMark(marks, index, to, n - index, true); break; }
if ((Opcode.IFEQ <= op && op <= Opcode.IF_ACMPNE) || op == Opcode.IFNULL || op == Opcode.IFNONNULL) { Mark to = makeMark(marks, index + ci.s16bitAt(index + 1)); Mark next = makeMark(marks, index + 3); makeMark(marks, index, makeArray(to.block, next.block), 3, false); makeGoto(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.JSR : makeJsr(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.RET : makeMark(marks, index, null, 2, true); break; case Opcode.TABLESWITCH : { int high = ci.s32bitAt(pos + 8); int ncases = high - low + 1; BasicBlock[] to = makeArray(ncases + 1); to[0] = makeMark(marks, index + ci.s32bitAt(pos)).block; // default branch target int p = pos + 12; int n = p + ncases * 4; int k = 1; while (p < n) { to[k++] = makeMark(marks, index + ci.s32bitAt(p)).block; p += 4; makeMark(marks, index, to, n - index, true); break; }
if ((Opcode.IFEQ <= op && op <= Opcode.IF_ACMPNE) || op == Opcode.IFNULL || op == Opcode.IFNONNULL) { Mark to = makeMark(marks, index + ci.s16bitAt(index + 1)); Mark next = makeMark(marks, index + 3); makeMark(marks, index, makeArray(to.block, next.block), 3, false); makeGoto(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.JSR : makeJsr(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.RET : makeMark(marks, index, null, 2, true); break; case Opcode.TABLESWITCH : { int high = ci.s32bitAt(pos + 8); int ncases = high - low + 1; BasicBlock[] to = makeArray(ncases + 1); to[0] = makeMark(marks, index + ci.s32bitAt(pos)).block; // default branch target int p = pos + 12; int n = p + ncases * 4; int k = 1; while (p < n) { to[k++] = makeMark(marks, index + ci.s32bitAt(p)).block; p += 4; makeMark(marks, index, to, n - index, true); break; }
if ((Opcode.IFEQ <= op && op <= Opcode.IF_ACMPNE) || op == Opcode.IFNULL || op == Opcode.IFNONNULL) { Mark to = makeMark(marks, index + ci.s16bitAt(index + 1)); Mark next = makeMark(marks, index + 3); makeMark(marks, index, makeArray(to.block, next.block), 3, false); makeGoto(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.JSR : makeJsr(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.RET : makeMark(marks, index, null, 2, true); break; case Opcode.TABLESWITCH : { int high = ci.s32bitAt(pos + 8); int ncases = high - low + 1; BasicBlock[] to = makeArray(ncases + 1); to[0] = makeMark(marks, index + ci.s32bitAt(pos)).block; // default branch target int p = pos + 12; int n = p + ncases * 4; int k = 1; while (p < n) { to[k++] = makeMark(marks, index + ci.s32bitAt(p)).block; p += 4; makeMark(marks, index, to, n - index, true); break; }
if ((Opcode.IFEQ <= op && op <= Opcode.IF_ACMPNE) || op == Opcode.IFNULL || op == Opcode.IFNONNULL) { Mark to = makeMark(marks, index + ci.s16bitAt(index + 1)); Mark next = makeMark(marks, index + 3); makeMark(marks, index, makeArray(to.block, next.block), 3, false); makeGoto(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.JSR : makeJsr(marks, index, index + ci.s16bitAt(index + 1), 3); break; case Opcode.RET : makeMark(marks, index, null, 2, true); break; case Opcode.TABLESWITCH : { int high = ci.s32bitAt(pos + 8); int ncases = high - low + 1; BasicBlock[] to = makeArray(ncases + 1); to[0] = makeMark(marks, index + ci.s32bitAt(pos)).block; // default branch target int p = pos + 12; int n = p + ncases * 4; int k = 1; while (p < n) { to[k++] = makeMark(marks, index + ci.s32bitAt(p)).block; p += 4; makeMark(marks, index, to, n - index, true); break; }
BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; prev.exit = makeArray(bb); return (BasicBlock[])blocks.toArray(makeArray(blocks.size()));
BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; prev.exit = makeArray(bb); return (BasicBlock[])blocks.toArray(makeArray(blocks.size()));
BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prevPos + prev.length); prev.length = m.position - prevPos; prev.exit = makeArray(bb); return (BasicBlock[])blocks.toArray(makeArray(blocks.size()));
BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; prev.exit = makeArray(bb); return (BasicBlock[])blocks.toArray(makeArray(blocks.size()));
BasicBlock prev; if (marks.length > 0 && marks[0].position == 0 && marks[0].block != null) prev = getBBlock(marks[i++]); else prev = makeBlock(0); BasicBlock bb = getBBlock(m); if (bb == null) { prev = makeBlock(prev.position + prev.length); blocks.add(prev); prev.length = m.position - prev.position; bb.incoming++; prev.exit = makeArray(bb); prev = makeBlock(prevPos + prev.length); prev.length = m.position - prevPos; prev.exit = makeArray(bb); return (BasicBlock[])blocks.toArray(makeArray(blocks.size()));
private Mark makeMark0(HashMap table, int pos, boolean isBlockBegin, boolean isTarget) { Integer p = new Integer(pos); Mark m = (Mark)table.get(p); if (m == null) { m = new Mark(pos); table.put(p, m); } if (isBlockBegin) { if (m.block == null) m.block = makeBlock(pos); if (isTarget) m.block.incoming++; } return m; }
private Mark makeMark0(HashMap table, int pos, boolean isBlockBegin, boolean isTarget) { Integer p = new Integer(pos); Mark m = (Mark)table.get(p); if (m == null) { m = new Mark(pos); table.put(p, m); } if (isBlockBegin) { if (m.block == null) m.block = makeBlock(pos); if (isTarget) m.block.incoming++; } return m; }
private Mark makeMark0(HashMap table, int pos, boolean isBlockBegin, boolean isTarget) { Integer p = new Integer(pos); Mark m = (Mark)table.get(p); if (m == null) { m = new Mark(pos); table.put(p, m); } if (isBlockBegin) { if (m.block == null) m.block = makeBlock(pos); if (isTarget) m.block.incoming++; } return m; }
private Mark makeMark0(HashMap table, int pos, boolean isBlockBegin, boolean isTarget) { Integer p = new Integer(pos); Mark m = (Mark)table.get(p); if (m == null) { m = new Mark(pos); table.put(p, m); } if (isBlockBegin) { if (m.block == null) m.block = makeBlock(pos); if (isTarget) m.block.incoming++; } return m; }
private Mark makeMark(HashMap table, int pos) { return makeMark0(table, pos, true, true); }
private Mark makeMark(HashMap table, int pos) { return makeMark0(table, pos, true, true); }
private Mark makeMark0(HashMap table, int pos, boolean isBlockBegin, boolean isTarget) { Integer p = new Integer(pos); Mark m = (Mark)table.get(p); if (m == null) { m = new Mark(pos); table.put(p, m); } if (isBlockBegin) { if (m.block == null) m.block = makeBlock(pos); if (isTarget) m.block.incoming++; } return m; }
private Mark makeMark(HashMap table, int pos) { return makeMark0(table, pos, true, true); }
private Mark makeMark(HashMap table, int pos) { return makeMark0(table, pos, true, true); }