1. Added ClassFileWriter.classNameToSignature to convert Java class name into JVM signature.

2. The public method getFullyQualifieedForm that was used to replace . to / is removed since all classname API accepts both form of class names and convertion to the internal /-form can be done in ClassFileWriter in a more efficient way.
This commit is contained in:
igor%mir2.org 2003-08-20 07:32:48 +00:00
Родитель c4b928f49a
Коммит 429111a705
1 изменённых файлов: 43 добавлений и 16 удалений

Просмотреть файл

@ -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;