-
Notifications
You must be signed in to change notification settings - Fork 0
/
class_file.h
98 lines (80 loc) · 1.79 KB
/
class_file.h
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
#ifndef CLASS_FILE_H
#define CLASS_FILE_H
/*
* Definitions for pieces of a Java class file. If you're interested,
* https://docs.oracle.com/javase/specs/jvms/se12/html/jvms-4.html
* has the complete specification.
*
* Since some of these structs correspond to structs in the JVM specification,
* we use the same names although they don't follow the code quality guidelines.
*/
#include <stdint.h>
typedef uint8_t u1;
typedef uint16_t u2;
typedef uint32_t u4;
typedef struct {
u4 magic;
u2 minor_version;
u2 major_version;
} class_header_t;
typedef struct {
u2 access_flags;
u2 this_class;
u2 super_class;
} class_info_t;
typedef struct {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
} method_info;
typedef struct {
u2 attribute_name_index;
u4 attribute_length;
} attribute_info;
typedef struct {
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 *code;
} code_t;
typedef struct {
char *name;
char *descriptor;
code_t code;
} method_t;
typedef enum {
CONSTANT_Utf8 = 1,
CONSTANT_Integer = 3,
CONSTANT_Class = 7,
CONSTANT_Fieldref = 9,
CONSTANT_Methodref = 10,
CONSTANT_NameAndType = 12
} cp_tag_t;
typedef struct {
u2 string_index;
} CONSTANT_Class_info;
typedef struct {
u2 class_index;
u2 name_and_type_index;
} CONSTANT_FieldOrMethodref_info;
typedef struct {
int32_t bytes;
} CONSTANT_Integer_info;
typedef struct {
u2 name_index;
u2 descriptor_index;
} CONSTANT_NameAndType_info;
typedef struct {
cp_tag_t tag;
u1 *info;
} cp_info;
typedef struct {
u2 constant_pool_count;
cp_info *constant_pool;
} constant_pool_t;
typedef struct {
constant_pool_t constant_pool;
method_t *methods;
} class_file_t;
#endif /* CLASS_FILE_H */