12#ifndef CLASSDESC_JAVACLASS_H
13#define CLASSDESC_JAVACLASS_H
16#pragma omit pack classdesc::u2
17#pragma omit pack classdesc::u4
18#pragma omit pack classdesc::u8
19#pragma omit pack classdesc::cp_info
20#pragma omit pack classdesc::attribute_info
21#pragma omit pack classdesc::ConstantPoolVector
22#pragma omit unpack classdesc::u2
23#pragma omit unpack classdesc::u4
24#pragma omit unpack classdesc::u8
25#pragma omit unpack classdesc::cp_info
26#pragma omit unpack classdesc::attribute_info
27#pragma omit unpack classdesc::ConstantPoolVector
28#pragma omit dump classdesc::u2
29#pragma omit dump classdesc::u4
30#pragma omit dump classdesc::u8
31#pragma omit dump classdesc::attribute_info
32#pragma omit dump classdesc::cp_info
33#pragma omit javaClass classdesc::cp_info
43 typedef unsigned char u1;
51 operator short()
const {
return v;}
54 short operator=(
short x) {
return v=x;}
55 short operator|=(
short x) {
return v|=x;}
56 short operator&=(
short x) {
return v&=x;}
57 bool operator==(
const u2& x)
const {
return v==x.v;}
58 u2 operator++() {v++;
return *
this;}
64 operator unsigned()
const {
return v;}
66 u4(
unsigned v): v(v) {}
67 unsigned operator=(
unsigned x) {
return v=x;}
68 bool operator==(
const u4& x)
const {
return v==x.v;}
74 operator long long()
const {
return v;}
76 u8(
unsigned v): v(v) {}
77 unsigned operator=(
unsigned x) {
return v=x;}
78 bool operator==(
const u8& x)
const {
return v==x.v;}
82 template <
class T>
struct JavaClassVector:
public std::vector<T>
85 JavaClassVector(
size_t sz=0): std::vector<T>(sz) {}
86 size_type size()
const {
return std::vector<T>::size();}
94 JVM_ACC_PUBLIC = 0x0001,
95 JVM_ACC_PRIVATE = 0x0002,
96 JVM_ACC_PROTECTED = 0x0004,
97 JVM_ACC_STATIC = 0x0008,
98 JVM_ACC_FINAL = 0x0010,
99 JVM_ACC_SYNCHRONIZED = 0x0020,
100 JVM_ACC_SUPER = 0x0020,
101 JVM_ACC_VOLATILE = 0x0040,
102 JVM_ACC_BRIDGE = 0x0040,
103 JVM_ACC_TRANSIENT = 0x0080,
104 JVM_ACC_VARARGS = 0x0080,
105 JVM_ACC_NATIVE = 0x0100,
106 JVM_ACC_INTERFACE = 0x0200,
107 JVM_ACC_ABSTRACT = 0x0400,
108 JVM_ACC_STRICT = 0x0800,
109 JVM_ACC_SYNTHETIC = 0x1000,
110 JVM_ACC_ANNOTATION = 0x2000,
111 JVM_ACC_ENUM = 0x4000
130 JVM_CONSTANT_Utf8 = 1,
131 JVM_CONSTANT_Unicode = 2,
132 JVM_CONSTANT_Integer = 3,
133 JVM_CONSTANT_Float = 4,
134 JVM_CONSTANT_Long = 5,
135 JVM_CONSTANT_Double = 6,
136 JVM_CONSTANT_Class = 7,
137 JVM_CONSTANT_String = 8,
138 JVM_CONSTANT_Fieldref = 9,
139 JVM_CONSTANT_Methodref = 10,
140 JVM_CONSTANT_InterfaceMethodref = 11,
141 JVM_CONSTANT_NameAndType = 12
148 JVM_ITEM_Integer = 1,
153 JVM_ITEM_UninitializedThis = 6,
155 JVM_ITEM_Uninitialized = 8
161 JVM_SIGNATURE_ARRAY =
'[',
162 JVM_SIGNATURE_BYTE =
'B',
163 JVM_SIGNATURE_CHAR =
'C',
164 JVM_SIGNATURE_CLASS =
'L',
165 JVM_SIGNATURE_ENDCLASS =
';',
166 JVM_SIGNATURE_ENUM =
'E',
167 JVM_SIGNATURE_FLOAT =
'F',
168 JVM_SIGNATURE_DOUBLE =
'D',
169 JVM_SIGNATURE_FUNC =
'(',
170 JVM_SIGNATURE_ENDFUNC =
')',
171 JVM_SIGNATURE_INT =
'I',
172 JVM_SIGNATURE_LONG =
'J',
173 JVM_SIGNATURE_SHORT =
'S',
174 JVM_SIGNATURE_VOID =
'V',
175 JVM_SIGNATURE_BOOLEAN =
'Z'
182 JVM_OPC_aconst_null = 1,
183 JVM_OPC_iconst_m1 = 2,
184 JVM_OPC_iconst_0 = 3,
185 JVM_OPC_iconst_1 = 4,
186 JVM_OPC_iconst_2 = 5,
187 JVM_OPC_iconst_3 = 6,
188 JVM_OPC_iconst_4 = 7,
189 JVM_OPC_iconst_5 = 8,
190 JVM_OPC_lconst_0 = 9,
191 JVM_OPC_lconst_1 = 10,
192 JVM_OPC_fconst_0 = 11,
193 JVM_OPC_fconst_1 = 12,
194 JVM_OPC_fconst_2 = 13,
195 JVM_OPC_dconst_0 = 14,
196 JVM_OPC_dconst_1 = 15,
207 JVM_OPC_iload_0 = 26,
208 JVM_OPC_iload_1 = 27,
209 JVM_OPC_iload_2 = 28,
210 JVM_OPC_iload_3 = 29,
211 JVM_OPC_lload_0 = 30,
212 JVM_OPC_lload_1 = 31,
213 JVM_OPC_lload_2 = 32,
214 JVM_OPC_lload_3 = 33,
215 JVM_OPC_fload_0 = 34,
216 JVM_OPC_fload_1 = 35,
217 JVM_OPC_fload_2 = 36,
218 JVM_OPC_fload_3 = 37,
219 JVM_OPC_dload_0 = 38,
220 JVM_OPC_dload_1 = 39,
221 JVM_OPC_dload_2 = 40,
222 JVM_OPC_dload_3 = 41,
223 JVM_OPC_aload_0 = 42,
224 JVM_OPC_aload_1 = 43,
225 JVM_OPC_aload_2 = 44,
226 JVM_OPC_aload_3 = 45,
240 JVM_OPC_istore_0 = 59,
241 JVM_OPC_istore_1 = 60,
242 JVM_OPC_istore_2 = 61,
243 JVM_OPC_istore_3 = 62,
244 JVM_OPC_lstore_0 = 63,
245 JVM_OPC_lstore_1 = 64,
246 JVM_OPC_lstore_2 = 65,
247 JVM_OPC_lstore_3 = 66,
248 JVM_OPC_fstore_0 = 67,
249 JVM_OPC_fstore_1 = 68,
250 JVM_OPC_fstore_2 = 69,
251 JVM_OPC_fstore_3 = 70,
252 JVM_OPC_dstore_0 = 71,
253 JVM_OPC_dstore_1 = 72,
254 JVM_OPC_dstore_2 = 73,
255 JVM_OPC_dstore_3 = 74,
256 JVM_OPC_astore_0 = 75,
257 JVM_OPC_astore_1 = 76,
258 JVM_OPC_astore_2 = 77,
259 JVM_OPC_astore_3 = 78,
260 JVM_OPC_iastore = 79,
261 JVM_OPC_lastore = 80,
262 JVM_OPC_fastore = 81,
263 JVM_OPC_dastore = 82,
264 JVM_OPC_aastore = 83,
265 JVM_OPC_bastore = 84,
266 JVM_OPC_castore = 85,
267 JVM_OPC_sastore = 86,
274 JVM_OPC_dup2_x1 = 93,
275 JVM_OPC_dup2_x2 = 94,
340 JVM_OPC_if_icmpeq = 159,
341 JVM_OPC_if_icmpne = 160,
342 JVM_OPC_if_icmplt = 161,
343 JVM_OPC_if_icmpge = 162,
344 JVM_OPC_if_icmpgt = 163,
345 JVM_OPC_if_icmple = 164,
346 JVM_OPC_if_acmpeq = 165,
347 JVM_OPC_if_acmpne = 166,
351 JVM_OPC_tableswitch = 170,
352 JVM_OPC_lookupswitch = 171,
353 JVM_OPC_ireturn = 172,
354 JVM_OPC_lreturn = 173,
355 JVM_OPC_freturn = 174,
356 JVM_OPC_dreturn = 175,
357 JVM_OPC_areturn = 176,
358 JVM_OPC_return = 177,
359 JVM_OPC_getstatic = 178,
360 JVM_OPC_putstatic = 179,
361 JVM_OPC_getfield = 180,
362 JVM_OPC_putfield = 181,
363 JVM_OPC_invokevirtual = 182,
364 JVM_OPC_invokespecial = 183,
365 JVM_OPC_invokestatic = 184,
366 JVM_OPC_invokeinterface = 185,
367 JVM_OPC_xxxunusedxxx = 186,
369 JVM_OPC_newarray = 188,
370 JVM_OPC_anewarray = 189,
371 JVM_OPC_arraylength = 190,
372 JVM_OPC_athrow = 191,
373 JVM_OPC_checkcast = 192,
374 JVM_OPC_instanceof = 193,
375 JVM_OPC_monitorenter = 194,
376 JVM_OPC_monitorexit = 195,
378 JVM_OPC_multianewarray = 197,
379 JVM_OPC_ifnull = 198,
380 JVM_OPC_ifnonnull = 199,
381 JVM_OPC_goto_w = 200,
389#define JVM_OPCODE_LENGTH_INITIALIZER { \
596 u2 name_and_type_index;
598 Ref(
u2 class_index,
u2 name_and_type_index):
599 class_index(class_index), name_and_type_index(name_and_type_index) {}
600 bool operator==(
const Ref& x)
const {
601 return class_index==x.class_index &&
602 name_and_type_index==x.name_and_type_index;}
605 struct NameAndTypeInfo
610 NameAndTypeInfo(
u2 name_index,
u2 descriptor_index):
611 name_index(name_index), descriptor_index(descriptor_index) {}
612 bool operator==(
const NameAndTypeInfo& x)
const {
613 return name_index==x.name_index &&
614 descriptor_index==x.descriptor_index;}
620 shared_ptr<void> info;
623 cp_info(): _tag(0) {}
625 cp_info(u1 t,
const T& v) {set(t,v);}
628 void set(u1 t,
const T& v) {
630 info.reset(
new T(v));
632 template <
class T>
void unpack(
pack_t& t, u1 tag);
636 void unpack_basic(
pack_t& t, u1 tag)
640 case 1: unpack<u1>(t,tag);
break;
641 case 2: unpack<u2>(t,tag);
break;
642 case 4: unpack<u4>(t,tag);
break;
643 case 8: unpack<u8>(t,tag);
break;
651 const T& get()
const {
return *
static_cast<const T*
>(info.get());}
653 u1 tag()
const {
return _tag;}
654 bool operator==(
const cp_info& x)
const;
658 struct ConstantPoolVector:
public std::vector<cp_info>
660 ConstantPoolVector(
size_t sz=0): std::vector<cp_info>(sz) {}
667 u2 attribute_name_index;
670 return attribute_name_index==x.attribute_name_index && info == x.info;
681 return access_flags==x.access_flags && name_index==x.name_index &&
682 descriptor_index == x.descriptor_index && attributes==x.attributes;
693 return access_flags==x.access_flags && name_index==x.name_index &&
694 descriptor_index==x.descriptor_index && attributes==x.attributes;
711 ClassFile(): constant_pool(1) {}
712 bool operator==(
const ClassFile& x)
const {
713 return magic==x.magic && minor_version==x.minor_version &&
714 major_version==x.major_version && constant_pool==x.constant_pool &&
715 access_flags==x.access_flags && this_class == x.this_class &&
716 super_class == x.super_class && interfaces == x.interfaces &&
717 fields == x.fields && methods == x.methods && attributes==x.attributes;
721 void addMethod(
const std::string& method_name,
const std::string& descriptor)
724 mi.name_index=constant_pool.size();
725 constant_pool.push_back(
cp_info(JVM_CONSTANT_Utf8, method_name));
726 mi.descriptor_index=constant_pool.size();
727 constant_pool.push_back(
cp_info(JVM_CONSTANT_Utf8, descriptor));
729 methods.push_back(mi);
734 for (std::vector<method_info>::iterator i=methods.begin(); i!=methods.end(); ++i)
735 i->access_flags = JVM_ACC_NATIVE|JVM_ACC_PUBLIC;
736 access_flags = JVM_ACC_PUBLIC;
741 for (std::vector<method_info>::iterator i=methods.begin(); i!=methods.end(); ++i)
742 i->access_flags = JVM_ACC_ABSTRACT|JVM_ACC_PUBLIC;
743 access_flags = JVM_ACC_INTERFACE|JVM_ACC_ABSTRACT|JVM_ACC_PUBLIC;
Definition javaClass.h:618
Definition pack_base.h:138
descriptor access to a class's privates
#define CLASSDESC_ACCESS(type)
add friend statements for each accessor function
Definition classdesc_access.h:36
Contains definitions related to classdesc functionality.
void makeNative()
make this a concrete class with native methods
Definition javaClass.h:732
void addMethod(const std::string &method_name, const std::string &descriptor)
add a method
Definition javaClass.h:721
void makeInterface()
make this an interface with abstract methods
Definition javaClass.h:739
Definition javaClass.h:659
Definition javaClass.h:663
Definition javaClass.h:83
Definition javaClass.h:666
Definition javaClass.h:687
determines if T is a standard sequence container
Definition classdesc.h:302
Definition javaClass.h:675
Definition javaClass.h:49
Definition javaClass.h:62