diff --git a/js/rhino/src/org/mozilla/classfile/ClassFileWriter.java b/js/rhino/src/org/mozilla/classfile/ClassFileWriter.java index d10c79e8920..106f2be9802 100644 --- a/js/rhino/src/org/mozilla/classfile/ClassFileWriter.java +++ b/js/rhino/src/org/mozilla/classfile/ClassFileWriter.java @@ -68,7 +68,7 @@ public class ClassFileWriter { public ClassFileWriter(String className, String superClassName, String sourceFileName) { - itsConstantPool = new ConstantPool(); + itsConstantPool = new ConstantPool(this); itsThisClassIndex = itsConstantPool.addClass(className); itsSuperClassIndex = itsConstantPool.addClass(superClassName); if (sourceFileName != null) @@ -120,10 +120,32 @@ public class ClassFileWriter { itsFlags = flags; } - public static String fullyQualifiedForm(String name) { + static String getSlashedForm(String name) + { return name.replace('.', '/'); } - + + /** + * Convert Java class name in dot notation into + * "Lname-with-dots-replaced-by-slashes;" form suitable for use as + * JVM type signatures. + */ + public String classNameToSignature(String name) + { + int nameLength = name.length(); + int colonPos = 1 + nameLength; + char[] buf = getCharBuffer(colonPos + 1); + buf[0] = 'L'; + buf[colonPos] = ';'; + name.getChars(0, nameLength, buf, 1); + for (int i = 1; i != colonPos; ++i) { + if (buf[i] == '.') { + buf[i] = '/'; + } + } + return new String(buf, 0, colonPos + 1); + } + /** * Add a field to the class. * @@ -2245,6 +2267,16 @@ public class ClassFileWriter { } return ""; } + + final char[] getCharBuffer(int minimalSize) + { + if (minimalSize > tmpCharBuffer.length) { + int newSize = tmpCharBuffer.length * 2; + if (minimalSize > newSize) { newSize = minimalSize; } + tmpCharBuffer = new char[newSize]; + } + return tmpCharBuffer; + } private static final int LineNumberTableSize = 16; private static final int ExceptionTableSize = 4; @@ -2285,6 +2317,8 @@ public class ClassFileWriter { private short itsSourceFileNameIndex; private LabelTable itsLabels = new LabelTable(); + + private char[] tmpCharBuffer = new char[64]; } final class ExceptionTableEntry @@ -2433,8 +2467,9 @@ final class ClassFileMethod final class ConstantPool { - ConstantPool() + ConstantPool(ClassFileWriter cfw) { + this.cfw = cfw; itsTopIndex = 1; // the zero'th entry is reserved itsPool = new byte[ConstantPoolSize]; itsTop = 0; @@ -2574,7 +2609,7 @@ final class ConstantPool itsPool[top++] = CONSTANT_Utf8; top += 2; // skip length - char[] chars = getCharBuffer(strLen); + char[] chars = cfw.getCharBuffer(strLen); k.getChars(0, strLen, chars, 0); for (int i = 0; i != strLen; i++) { @@ -2628,7 +2663,7 @@ final class ConstantPool if (theIndex == -1) { String slashed = className; if (className.indexOf('.') > 0) { - slashed = ClassFileWriter.fullyQualifiedForm(className); + slashed = ClassFileWriter.getSlashedForm(className); theIndex = itsClassHash.get(slashed, -1); if (theIndex != -1) { itsClassHash.put(className, theIndex); @@ -2713,15 +2748,8 @@ final class ConstantPool } } - private char[] getCharBuffer(int minimalSize) { - if (minimalSize > tmpCharBuffer.length) { - int newSize = tmpCharBuffer.length * 2; - if (minimalSize > newSize) { newSize = minimalSize; } - tmpCharBuffer = new char[newSize]; - } - return tmpCharBuffer; - } - + private ClassFileWriter cfw; + private static final int MAX_UTF_ENCODING_SIZE = 65535; private UintMap itsStringConstHash = new UintMap(); @@ -2730,7 +2758,6 @@ final class ConstantPool private ObjToIntMap itsMethodRefHash = new ObjToIntMap(); private UintMap nameAndTypeHash = new UintMap(); private ObjToIntMap itsClassHash = new ObjToIntMap(); - private char[] tmpCharBuffer = new char[64]; private int itsTop; private int itsTopIndex;