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
package Torello.Java.Additional;

import Torello.Java.ReadOnly.ReadOnlyList;

class DereferencedValue
{
    @SuppressWarnings("unchecked")
    static Object get(
            final ReadOnlyList<Byte>    tags,
            final ReadOnlyList<Object>  values,
            final byte                  tag,
            final int                   i
        )
    {
        try
        {
            // 0 & 2: UNUSED
            // 1-String, 3-Integer, 4-Float, 5-Long, 6-Double

            if (tag < 7) return values.get(i);

            switch (tag)
            {
                case /* 07 */ ConstantPool.TAG_CLASS:
                case /* 08 */ ConstantPool.TAG_STRING: 
                    return values.get((Integer) values.get(i));

                case /* 09 */ ConstantPool.TAG_FIELD_REF: 
                case /* 10 */ ConstantPool.TAG_METHOD_REF: 
                case /* 10 */ ConstantPool.TAG_INTERFACE_METHOD_REF: 
                    return new ConstantPool.Reference(tags, values, i);

                case /* 12 */ ConstantPool.TAG_NAME_AND_TYPE:

                    final Ret2<Integer, Integer> r2 =
                        (Ret2<Integer, Integer>) values.get(i);

                    return new Ret2<String, String>
                        ((String) values.get(r2.a), (String) values.get(r2.b));

                case /* 15 */ ConstantPool.TAG_METHOD_HANDLE:
                    return new ConstantPool.MethodHandle(tags, values, i);

                case /* 16 */ ConstantPool.TAG_METHOD_TYPE:
                    return values.get(i);

                case /* 17 */ ConstantPool.TAG_DYNAMIC:
                case /* 18 */ ConstantPool.TAG_INVOKE_DYNAMIC:
                    return new ConstantPool.Dynamic(tags, values, i);

                case /* 19 */ ConstantPool.TAG_MODULE:
                case /* 20 */ ConstantPool.TAG_PACKAGE:
                    return values.get((Integer) values.get(i));

                default:
                    throw new ConstantPoolError("Unrecognized Tag in Constant-Pool tags List: " + tag);
            }
        }

        catch (ClassCastException cce)
        {
            throw new ConstantPoolError(
                "The internal Constant-Pool Lists are corrupted.  A Class Cast Exception " +
                "was thrown.",
                cce
            );
        }
    }
}