# HG changeset patch # User Jaroslav Tulach # Date 1355066179 -3600 # Node ID 6d1e8eccdc980e76116489b6032d9880d0a1db30 # Parent 6f696a0ef12f53c908832794ac230a9af4fee416 Rather than exposing Vector, providing abstraction to encapsulate manipulation with TrapData via 'iterator' diff -r 6f696a0ef12f -r 6d1e8eccdc98 javap/src/main/java/org/apidesign/javap/MethodData.java --- a/javap/src/main/java/org/apidesign/javap/MethodData.java Sat Dec 08 10:32:04 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/MethodData.java Sun Dec 09 16:16:19 2012 +0100 @@ -353,10 +353,10 @@ /** * Return exception table in code attributre. */ - public Vector getexception_table(){ - return exception_table; + public TrapDataIterator getTrapDataIterator(){ + return new TrapDataIterator(exception_table); } - + /** * Return method attributes. diff -r 6f696a0ef12f -r 6d1e8eccdc98 javap/src/main/java/org/apidesign/javap/TrapData.java --- a/javap/src/main/java/org/apidesign/javap/TrapData.java Sat Dec 08 10:32:04 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/TrapData.java Sun Dec 09 16:16:19 2012 +0100 @@ -26,7 +26,6 @@ package org.apidesign.javap; -import java.util.*; import java.io.*; /** @@ -34,7 +33,7 @@ * * @author Sucheta Dambalkar (Adopted code from jdis) */ -public class TrapData { +public final class TrapData { public final short start_pc; public final short end_pc; public final short handler_pc; @@ -45,7 +44,7 @@ /** * Read and store exception table data in code attribute. */ - public TrapData(DataInputStream in, int num) throws IOException { + TrapData(DataInputStream in, int num) throws IOException { this.num=num; start_pc = in.readShort(); end_pc=in.readShort(); diff -r 6f696a0ef12f -r 6d1e8eccdc98 javap/src/main/java/org/apidesign/javap/TrapDataIterator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javap/src/main/java/org/apidesign/javap/TrapDataIterator.java Sun Dec 09 16:16:19 2012 +0100 @@ -0,0 +1,42 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.apidesign.javap; + +/** + * + * @author Jaroslav Tulach + */ +public final class TrapDataIterator { + private final java.util.Map exStart = new java.util.HashMap(); + private final java.util.Map exStop = new java.util.HashMap(); + private final java.util.Deque current = new java.util.ArrayDeque(); + + TrapDataIterator(Vector exceptionTable) { + for (int i=0 ; i < exceptionTable.size(); i++) { + final TrapData td = (TrapData)exceptionTable.elementAt(i); + exStart.put(td.start_pc, td); + exStop.put(td.end_pc, td); + } + } + + public void advanceTo(int i) { + TrapData e = exStart.get((short) i); + if (e != null) { + current.addFirst(e); + } + e = exStop.get((short) i); + if (e != null) { + current.remove(e); + } + } + + public boolean useTry() { + return !current.isEmpty(); + } + + public TrapData[] current() { + return current.toArray(new TrapData[0]); + } +} diff -r 6f696a0ef12f -r 6d1e8eccdc98 javap/src/main/java/org/apidesign/javap/Vector.java --- a/javap/src/main/java/org/apidesign/javap/Vector.java Sat Dec 08 10:32:04 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/Vector.java Sun Dec 09 16:16:19 2012 +0100 @@ -8,7 +8,7 @@ * * @author Jaroslav Tulach */ -public final class Vector { +final class Vector { private Object[] arr; Vector() { @@ -27,7 +27,7 @@ setElementAt(obj, s); } - public int size() { + int size() { return arr == null ? 0 : arr.length; } @@ -41,7 +41,7 @@ } } - public Object elementAt(int index) { + Object elementAt(int index) { return arr[index]; } diff -r 6f696a0ef12f -r 6d1e8eccdc98 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 08 10:32:04 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Dec 09 16:16:19 2012 +0100 @@ -25,7 +25,7 @@ import org.apidesign.javap.MethodData; import static org.apidesign.javap.RuntimeConstants.*; import org.apidesign.javap.TrapData; -import org.apidesign.javap.Vector; +import org.apidesign.javap.TrapDataIterator; /** Translator of the code inside class files to JavaScript. * @@ -217,7 +217,7 @@ out.append("arg").append(String.valueOf(i)).append(";\n"); } out.append(" var s = new Array();\n"); - produceCode(code, m.getexception_table()); + produceCode(m); } else { out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n"); } @@ -253,7 +253,7 @@ out.append("arg").append(String.valueOf(i + 1)).append(";\n"); } out.append(";\n var s = new Array();\n"); - produceCode(code, m.getexception_table()); + produceCode(m); } else { out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n"); } @@ -261,33 +261,18 @@ return mn; } - private void produceCode(byte[] byteCodes, Vector exceptionTable) throws IOException { - - final java.util.Map exStart = new java.util.HashMap(); - final java.util.Map exStop = new java.util.HashMap(); - for (int i=0 ; i < exceptionTable.size(); i++) { - final TrapData td = (TrapData)exceptionTable.elementAt(i); - exStart.put(td.start_pc, td); - exStop.put(td.end_pc, td); - } - final java.util.Deque current = new java.util.ArrayDeque(); + private void produceCode(MethodData md) throws IOException { + byte[] byteCodes = md.getCode(); + + TrapDataIterator trap = md.getTrapDataIterator(); out.append("\n var gt = 0;\n for(;;) switch(gt) {\n"); for (int i = 0; i < byteCodes.length; i++) { - { - TrapData e = exStart.get((short)i); - if (e != null) { - current.addFirst(e); - } - e = exStop.get((short)i); - if (e != null) { - current.remove(e); - } - } + trap.advanceTo(i); int prev = i; out.append(" case " + i).append(": "); - if (!current.isEmpty()) { + if (trap.useTry()) { out.append("try {"); } final int c = readByte(byteCodes, i); @@ -810,9 +795,9 @@ } } - if (!current.isEmpty()) { + if (trap.useTry()) { out.append("} catch (e) {"); - for (TrapData e : current) { + for (TrapData e : trap.current()) { if (e.catch_cpx != 0) { //not finally final String classInternalName = jc.getClassName(e.catch_cpx); addReference(classInternalName);