# HG changeset patch # User jjg # Date 1242758630 25200 # Node ID fc634a59381280e16e6faa130aa438daee0e66ec # Parent f838537fb1acfeebc6f236b9c941f8240a53f541 6841419: classfile: add constant pool iterator Reviewed-by: mcimadamore diff -r f838537fb1ac -r fc634a593812 src/share/classes/com/sun/tools/classfile/ClassTranslator.java --- a/src/share/classes/com/sun/tools/classfile/ClassTranslator.java Tue May 19 11:33:13 2009 -0700 +++ b/src/share/classes/com/sun/tools/classfile/ClassTranslator.java Tue May 19 11:43:50 2009 -0700 @@ -95,7 +95,7 @@ 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 @@ 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 -r f838537fb1ac -r fc634a593812 src/share/classes/com/sun/tools/classfile/ClassWriter.java --- a/src/share/classes/com/sun/tools/classfile/ClassWriter.java Tue May 19 11:33:13 2009 -0700 +++ b/src/share/classes/com/sun/tools/classfile/ClassWriter.java Tue May 19 11:43:50 2009 -0700 @@ -118,13 +118,8 @@ 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 -r f838537fb1ac -r fc634a593812 src/share/classes/com/sun/tools/classfile/ConstantPool.java --- a/src/share/classes/com/sun/tools/classfile/ConstantPool.java Tue May 19 11:33:13 2009 -0700 +++ b/src/share/classes/com/sun/tools/classfile/ConstantPool.java Tue May 19 11:43:50 2009 -0700 @@ -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 @@ 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 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; @@ -350,6 +391,11 @@ } @Override + public int size() { + return 2; + } + + @Override public String toString() { return "CONSTANT_Double_info[value: " + value + "]"; } @@ -463,6 +509,11 @@ } @Override + public int size() { + return 2; + } + + @Override public String toString() { return "CONSTANT_Long_info[value: " + value + "]"; }