private List<Object[]> buildJVMExceptionTable() { List<Object[]> etEntries = new ArrayList<Object[]>(); for (BasicBlock b: linearizedBBList) { // We need handlers for: // - Unrescuable (handled by ensures), // - Throwable (handled by rescues) // in that order since Throwable < Unrescuable BasicBlock rBB = cfg().getRescuerBBFor(b); BasicBlock eBB = cfg().getEnsurerBBFor(b); if ((eBB != null) && (rBB == eBB || rBB == null)) { // 1. same rescue and ensure handler ==> just spit out one entry with a Throwable class // 2. only ensure handler ==> just spit out one entry with a Throwable class etEntries.add(new Object[] {b.getLabel(), eBB.getLabel(), Throwable.class}); } else if (rBB != null) { // Unrescuable comes before Throwable if (eBB != null) etEntries.add(new Object[] {b.getLabel(), eBB.getLabel(), Unrescuable.class}); etEntries.add(new Object[] {b.getLabel(), rBB.getLabel(), Throwable.class}); } } // SSS FIXME: This could be optimized by compressing entries for adjacent BBs that have identical handlers // This could be optimized either during generation or as another pass over the table. But, if the JVM // does that already, do we need to bother with it? return etEntries; }
private List<Object[]> buildJVMExceptionTable() { List<Object[]> etEntries = new ArrayList<Object[]>(); for (BasicBlock b: linearizedBBList) { // We need handlers for: // - Unrescuable (handled by ensures), // - Throwable (handled by rescues) // in that order since Throwable < Unrescuable BasicBlock rBB = cfg().getRescuerBBFor(b); BasicBlock eBB = cfg().getEnsurerBBFor(b); if ((eBB != null) && (rBB == eBB || rBB == null)) { // 1. same rescue and ensure handler ==> just spit out one entry with a Throwable class // 2. only ensure handler ==> just spit out one entry with a Throwable class etEntries.add(new Object[] {b.getLabel(), eBB.getLabel(), Throwable.class}); } else if (rBB != null) { // Unrescuable comes before Throwable if (eBB != null) etEntries.add(new Object[] {b.getLabel(), eBB.getLabel(), Unrescuable.class}); etEntries.add(new Object[] {b.getLabel(), rBB.getLabel(), Throwable.class}); } } // SSS FIXME: This could be optimized by compressing entries for adjacent BBs that have identical handlers // This could be optimized either during generation or as another pass over the table. But, if the JVM // does that already, do we need to bother with it? return etEntries; }
public int getEnsurerPC(Instr excInstr) { depends(cfg()); for (BasicBlock b : linearizedBBList) { for (Instr i : b.getInstrs()) { if (i == excInstr) { BasicBlock ensurerBB = cfg.getEnsurerBBFor(b); return (ensurerBB == null) ? -1 : ensurerBB.getLabel().getTargetPC(); } } } // SSS FIXME: Cannot happen! Throw runtime exception LOG.error("Fell through looking for ensurer ipc for " + excInstr); return -1; }
public int getEnsurerPC(Instr excInstr) { depends(cfg()); for (BasicBlock b : linearizedBBList) { for (Instr i : b.getInstrs()) { if (i == excInstr) { BasicBlock ensurerBB = cfg.getEnsurerBBFor(b); return (ensurerBB == null) ? -1 : ensurerBB.getLabel().getTargetPC(); } } } // SSS FIXME: Cannot happen! Throw runtime exception LOG.error("Fell through looking for ensurer ipc for " + excInstr); return -1; }
BasicBlock aE = getEnsurerBBFor(a); BasicBlock bE = getEnsurerBBFor(b); if ((aE == null) && (bE != null)) { setRescuerBB(a, bE);
BasicBlock aE = getEnsurerBBFor(a); BasicBlock bE = getEnsurerBBFor(b); if ((aE == null) && (bE != null)) { setRescuerBB(a, bE);
if (callBBrescuer != null) cfg.setRescuerBB(splitBB, callBBrescuer); BasicBlock callBBensurer = cfg.getEnsurerBBFor(callBB); if (callBBensurer != null) cfg.setEnsurerBB(splitBB, callBBensurer); BasicBlock xEnsurer = methodCFG.getEnsurerBBFor(x); if (xEnsurer != null) { cfg.setEnsurerBB(xRenamed, ii.getRenamedBB(xEnsurer));
if (callBBrescuer != null) cfg.setRescuerBB(splitBB, callBBrescuer); BasicBlock callBBensurer = cfg.getEnsurerBBFor(callBB); if (callBBensurer != null) cfg.setEnsurerBB(splitBB, callBBensurer); BasicBlock xEnsurer = methodCFG.getEnsurerBBFor(x); if (xEnsurer != null) { cfg.setEnsurerBB(xRenamed, ii.getRenamedBB(xEnsurer));
if (yieldBBrescuer != null) cfg.setRescuerBB(splitBB, yieldBBrescuer); BasicBlock yieldBBensurer = cfg.getEnsurerBBFor(yieldBB); if (yieldBBensurer != null) cfg.setEnsurerBB(splitBB, yieldBBensurer); BasicBlock cbEnsurer = ii.getRenamedBB(closureCFG.getEnsurerBBFor(cb)); if (cbEnsurer != null) { cfg.setEnsurerBB(cb, cbEnsurer);
if (yieldBBrescuer != null) cfg.setRescuerBB(splitBB, yieldBBrescuer); BasicBlock yieldBBensurer = cfg.getEnsurerBBFor(yieldBB); if (yieldBBensurer != null) cfg.setEnsurerBB(splitBB, yieldBBensurer); BasicBlock cbEnsurer = ii.getRenamedBB(closureCFG.getEnsurerBBFor(cb)); if (cbEnsurer != null) { cfg.setEnsurerBB(cb, cbEnsurer);