From f05e74203e2d4fb0668c59d724f52c706a62e0ec Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 19 May 2009 11:43:50 -0700 Subject: [PATCH] 6841419: classfile: add constant pool iterator Reviewed-by: mcimadamore --- .../sun/tools/classfile/ClassTranslator.java | 8 +-- .../com/sun/tools/classfile/ClassWriter.java | 9 +--- .../com/sun/tools/classfile/ConstantPool.java | 51 +++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java index 14f62953b19..ef0ef1c0091 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java @@ -95,7 +95,7 @@ public class ClassTranslator if (cp2 == null) { ConstantPool.CPInfo[] pool2 = new ConstantPool.CPInfo[cp.size()]; boolean eq = true; - for (int i = 0; i < cp.size(); i++) { + for (int i = 0; i < cp.size(); ) { ConstantPool.CPInfo cpInfo; try { cpInfo = cp.get(i); @@ -107,11 +107,7 @@ public class ClassTranslator pool2[i] = cpInfo2; if (cpInfo.getTag() != cpInfo2.getTag()) throw new IllegalStateException(); - switch (cpInfo.getTag()) { - case ConstantPool.CONSTANT_Double: - case ConstantPool.CONSTANT_Long: - i += 1; - } + i += cpInfo.size(); } if (eq) diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java index bf1ec011f5e..8541bff3886 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java @@ -118,13 +118,8 @@ public class ClassWriter { ConstantPool pool = classFile.constant_pool; int size = pool.size(); out.writeShort(size); - try { - for (int i = 1; i < size; ) { - i += constantPoolWriter.write(pool.get(i), out); - } - } catch (ConstantPoolException e) { - throw new Error(e); // ?? - } + for (CPInfo cpInfo: pool.entries()) + constantPoolWriter.write(cpInfo, out); } protected void writeFields() throws IOException { diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java index f06c1386689..7c04dc64429 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java @@ -26,6 +26,7 @@ package com.sun.tools.classfile; import java.io.IOException; +import java.util.Iterator; /** * See JVMS3, section 4.5. @@ -223,6 +224,40 @@ public class ConstantPool { throw new EntryNotFound(value); } + public Iterable entries() { + return new Iterable() { + public Iterator iterator() { + return new Iterator() { + + public boolean hasNext() { + return next < pool.length; + } + + public CPInfo next() { + current = pool[next]; + switch (current.getTag()) { + case CONSTANT_Double: + case CONSTANT_Long: + next += 2; + break; + default: + next += 1; + } + return current; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + + private CPInfo current; + private int next = 1; + + }; + } + }; + } + private CPInfo[] pool; public interface Visitor { @@ -250,6 +285,12 @@ public class ConstantPool { public abstract int getTag(); + /** The number of slots in the constant pool used by this entry. + * 2 for CONSTANT_Double and CONSTANT_Long; 1 for everything else. */ + public int size() { + return 1; + } + public abstract R accept(Visitor visitor, D data); protected final ConstantPool cp; @@ -349,6 +390,11 @@ public class ConstantPool { return CONSTANT_Double; } + @Override + public int size() { + return 2; + } + @Override public String toString() { return "CONSTANT_Double_info[value: " + value + "]"; @@ -462,6 +508,11 @@ public class ConstantPool { return CONSTANT_Long; } + @Override + public int size() { + return 2; + } + @Override public String toString() { return "CONSTANT_Long_info[value: " + value + "]";