1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 | package Torello.Java.Additional.DataFiles;
import static Torello.Java.C.BYELLOW;
import static Torello.Java.C.RESET;
import Torello.Java.ReadOnly.ReadOnlyArrayList;
import Torello.Java.ReadOnly.ReadOnlyList;
import Torello.Java.FileRW;
import Torello.Java.Additional.Ret2;
public class ConstantPoolData
implements Torello.Java.Build.DataFileBuilderClass
{
public ConstantPoolData() { }
private static final String DATA_FILE_NAME = "data3.r2dat";
public void build(String rootDir) throws java.io.IOException
{
final Ret2<
ReadOnlyList<String>,
ReadOnlyList<Byte>
>
r2part1 = new Ret2<>(tagNames, tagWidthBytes);
System.out.println("Writing File: " + BYELLOW + rootDir + DATA_FILE_NAME + RESET);
FileRW.writeObjectToFileNOCNFE(r2part1, rootDir + DATA_FILE_NAME, true);
}
// NOTE: THIS IS REUSED / BORROWED IN CLASS "ConstPooToStringData"
// MUST BE PACKAGE-PRIVATE, CANNOT BE PRIVATE
static final ReadOnlyList<String> tagNames = new ReadOnlyArrayList<>(
// Note: The (String) cast is to "help" the Java-Compiler deal with its inability
// to over-come some self-conscious behavior it has at dealing with Generic
// Type Parameters. It is only needed in the very first 'null'.
//
// Precisely because it is 'null', the Java-Compiler is trying to associate the
// Var-Args Parameter with a different constructor than the one I am trying to use.
// Saying (String) forces it to accept which of the Constructor's I am trying to use!
(String) null, // tag=0, UNUSED
"UTF-8", // tag=1,
null, // tag=2, UNUSED
"Integer", // tag=3
"Float", // tag=4
"Long", // tag=5
"Double", // tag=6
"Class", // tag=7
"String", // tag=8
"FieldRef", // tag=9
"MethodRef", // tag=10
"InterfaceMethodRef", // tag=11
"NameAndType", // tag=12
null, // tag=13, UNUSED
null, // tag=14, UNUSED
"MethodHandle", // tag=15
"MethodType", // tag=16
"Dynamic", // tag=17
"InvokeDynamic", // tag=18
"Module", // tag=19
"Package" // tag=20
);
private static final ReadOnlyList<Byte> tagWidthBytes = new ReadOnlyArrayList<>(
// This is a little "Helper Parameter" to the class "ReadOnlyArrayList"
// It is doing nothing more than helping the Java-Compiler with its Generic
// Type-Parameter foibles, vagaries and vicissitudes. Generic Erasure even seemed
// to make Chat-GPT angry today.
Byte.class,
// These are Parameter-Values to a Var-Args Parameter
(Byte) null, // tag=0, NOT A TAG
null, // tag=1, CONSTANT_Utf8 - 'null' because the Size of a UTF-8 are Variable
null, // tag=2 UNUSED
(byte) 4, // tag=3, CONSTANT_Integer
(byte) 4, // tag=4, CONSTANT_Float
(byte) 8, // tag=5, CONSTANT_Long
(byte) 8, // tag=6, CONSTANT_Double
(byte) 2, // tag=7, CONSTANT_Class, The reference stores an index
(byte) 2, // tag=8, CONSTANT_String, The reference stores an index
(byte) 4, // tag=9, CONSTANT_Fieldref Each reference stores 2 indices
(byte) 4, // tag=10, CONSTANT_Methodref Each reference stores 2 indices
(byte) 4, // tag=11, CONSTANT_InterfaceMethodref Each reference stores 2 indices
(byte) 4, // tag=12, CONSTANT_NameAndType Each reference stores 2 indices
null, // tag=13, UNUSED
null, // tag=14, UNUSED
(byte) 3, // tag=15, CONSTANT_MethodHandle
// 1 byte for reference kind + 2 bytes for index
(byte) 2, // tag=16, CONSTANT_MethodType
// 2 bytes for the index to a CONSTANT_Utf8 string
(byte) 4, // tag=17 CONSTANT_Dynamic
// 2 bytes for the bootstrap method index +
// 2 bytes for the name and type index
(byte) 4, // tag=18, CONSTANT_InvokeDynamic
// 2 bytes for the bootstrap method index +
// 2 bytes for the name and type index
(byte) 2, // tag=19 CONSTANT_Module, The reference stores an index
(byte) 2 // tag=20 CONSTANT_Package, The reference stores an index
);
}
|