@@ -70,11 +70,23 @@ void bytecode_freeBytecode(TBytecode *b)
70
70
return ;
71
71
}
72
72
73
+ free (b -> variables );
73
74
free (b -> functions );
74
75
free (b -> imports );
75
76
free (b -> export_functions );
76
77
free (b -> exceptions );
77
78
free (b -> export_types );
79
+ free (b -> export_exceptions );
80
+
81
+ for (i = 0 ; i < b -> constantsize ; i ++ ) {
82
+ free (b -> export_constants [i ].value );
83
+ }
84
+ free (b -> export_constants );
85
+ for (i = 0 ; i < b -> interfaceexportsize ; i ++ ) {
86
+ free (b -> export_interfaces [i ].method_descriptors );
87
+ }
88
+ free (b -> export_interfaces );
89
+
78
90
for (i = 0 ; i < b -> strtablelen ; i ++ ) {
79
91
string_freeString (b -> strings [i ]);
80
92
}
@@ -104,53 +116,46 @@ void bytecode_loadBytecode(TBytecode *b, const uint8_t *bytecode, unsigned int l
104
116
b -> strings = getstrtable (bytecode , b -> strtablesize + i , & i , & b -> strtablelen );
105
117
106
118
b -> typesize = get_vint (bytecode , len , & i );
107
- /*
108
- typesize = struct.unpack(">H", bytecode[i:i+2])[0]
109
- i += 2
110
- self.export_types = []
111
- while typesize > 0:
112
- t = Type()
113
- t.name = struct.unpack(">H", bytecode[i:i+2])[0]
114
- i += 2
115
- t.descriptor = struct.unpack(">H", bytecode[i:i+2])[0]
116
- i += 2
117
- self.export_types.append(t)
118
- typesize -= 1
119
- */
119
+ b -> export_types = malloc (sizeof (ExportType ) * b -> typesize );
120
+ if (b -> export_types == NULL ) {
121
+ fatal_error ("Could not allocate memory for exported type info." );
122
+ }
123
+ for (uint32_t f = 0 ; f < b -> typesize ; f ++ ) {
124
+ b -> export_types [f ].name = get_vint (bytecode , len , & i );
125
+ b -> export_types [f ].descriptor = get_vint (bytecode , len , & i );
126
+ }
127
+
120
128
b -> constantsize = get_vint (bytecode , len , & i );
121
- /*
122
- constantsize = struct.unpack(">H", bytecode[i:i+2])[0]
123
- i += 2
124
- self.export_constants = []
125
- while constantsize > 0:
126
- c = Constant()
127
- c.name = struct.unpack(">H", bytecode[i:i+2])[0]
128
- i += 2
129
- c.type = struct.unpack(">H", bytecode[i:i+2])[0]
130
- i += 2
131
- size = struct.unpack(">H", bytecode[i:i+2])[0]
132
- i += 2
133
- c.value = bytecode[i:i+size]
134
- i += size
135
- self.export_constants.append(c)
136
- constantsize -= 1;
137
- */
129
+ b -> export_constants = malloc (sizeof (Constant ) * b -> constantsize );
130
+ if (b -> export_constants == NULL ) {
131
+ fatal_error ("Could not allocate memory for constants." );
132
+ }
133
+ for (uint32_t c = 0 ; c < b -> constantsize ; c ++ ) {
134
+ b -> export_constants [c ].name = get_vint (bytecode , len , & i );
135
+ b -> export_constants [c ].vtype = get_vint (bytecode , len , & i );
136
+ unsigned int datasize = get_vint (bytecode , len , & i );
137
+ if (i + datasize > len ) {
138
+ fatal_error ("Invalid constant data size." );
139
+ }
140
+ b -> export_constants [c ].value = malloc (sizeof (unsigned char ) * datasize );
141
+ if (b -> export_constants [c ].value == NULL ) {
142
+ fatal_error ("Could not allocate memory for value of constant \"%s\"." , b -> strings [b -> export_constants [c ].name ]-> data );
143
+ }
144
+ memcpy (b -> export_constants [c ].value , & bytecode [i ], datasize );
145
+ i += datasize ;
146
+ }
147
+
138
148
b -> variablesize = get_vint (bytecode , len , & i );
139
- /*
140
- variablesize = struct.unpack(">H", bytecode[i:i+2])[0]
141
- i += 2
142
- self.export_variables = []
143
- while variablesize > 0:
144
- v = Variable()
145
- v.name = struct.unpack(">H", bytecode[i:i+2])[0]
146
- i += 2
147
- v.type = struct.unpack(">H", bytecode[i:i+2])[0]
148
- i += 2
149
- v.index = struct.unpack(">H", bytecode[i:i+2])[0]
150
- i += 2
151
- self.export_variables.append(v)
152
- variablesize -= 1
153
- */
149
+ b -> variables = malloc (sizeof (Variable ) * b -> variablesize );
150
+ if (b -> variables == NULL ) {
151
+ fatal_error ("Could not allocate memory %d for variables." , b -> variablesize );
152
+ }
153
+ for (uint32_t v = 0 ; v < b -> variablesize ; v ++ ) {
154
+ b -> variables [v ].name = get_vint (bytecode , len , & i );
155
+ b -> variables [v ].type = get_vint (bytecode , len , & i );
156
+ b -> variables [v ].index = get_vint (bytecode , len , & i );
157
+ }
158
+
154
159
b -> export_functionsize = get_vint (bytecode , len , & i );
155
160
b -> export_functions = malloc (sizeof (ExportFunction ) * b -> export_functionsize );
156
161
if (b -> export_functions == NULL ) {
@@ -161,29 +166,35 @@ void bytecode_loadBytecode(TBytecode *b, const uint8_t *bytecode, unsigned int l
161
166
b -> export_functions [f ].descriptor = get_vint (bytecode , len , & i );
162
167
b -> export_functions [f ].index = get_vint (bytecode , len , & i );
163
168
}
169
+
164
170
b -> exceptionexportsize = get_vint (bytecode , len , & i );
165
- /*
166
- exceptionexportsize = struct.unpack(">H", bytecode[i:i+2])[0]
167
- i += 2
168
- self.export_exceptions = []
169
- while exceptionexportsize > 0:
170
- e = ExceptionExport()
171
- e.name = struct.unpack(">H", bytecode[i:i+2])[0]
172
- i += 2
173
- self.export_exceptions.append(e)
174
- exceptionexportsize -= 1
175
- */
171
+ b -> export_exceptions = malloc (sizeof (ExportException ) * b -> exceptionexportsize );
172
+ if (b -> export_exceptions == NULL ) {
173
+ fatal_error ("Could not allocate memory for exported exceptions." );
174
+ }
175
+ for (uint32_t e = 0 ; e < b -> exceptionexportsize ; e ++ ) {
176
+ b -> export_exceptions [e ].name = get_vint (bytecode , len , & i );
177
+ }
178
+
176
179
b -> interfaceexportsize = get_vint (bytecode , len , & i );
177
- /*
178
- interfaceexportsize = struct.unpack(">H", bytecode[i:i+2])[0]
179
- i += 2
180
- while interfaceexportsize > 0:
181
- assert False, interfaceexportsize
182
- */
180
+ b -> export_interfaces = malloc (sizeof (ExportInterface ) * b -> interfaceexportsize );
181
+ for (uint32_t e = 0 ; e < b -> interfaceexportsize ; e ++ ) {
182
+ b -> export_interfaces [e ].name = get_vint (bytecode , len , & i );
183
+ unsigned int methoddescriptorsize = get_vint (bytecode , len , & i );
184
+ b -> export_interfaces [e ].method_descriptors = malloc (sizeof (MethodDescriptor ) * methoddescriptorsize );
185
+ if (b -> export_interfaces [e ].method_descriptors == NULL ) {
186
+ fatal_error ("Could not allocate memory for method descriptors for exported interface: %s" , b -> strings [b -> export_interfaces [e ].name ]-> data );
187
+ }
188
+ for (uint32_t m = 0 ; m < methoddescriptorsize ; m ++ ) {
189
+ b -> export_interfaces [e ].method_descriptors [m ].first = get_vint (bytecode , len , & i );
190
+ b -> export_interfaces [e ].method_descriptors [m ].second = get_vint (bytecode , len , & i );
191
+ }
192
+ }
193
+
183
194
b -> importsize = get_vint (bytecode , len , & i );
184
195
b -> imports = malloc (sizeof (Import ) * b -> importsize );
185
196
if (b -> imports == NULL ) {
186
- fatal_error ("Could not allocate memory for exported function info." );
197
+ fatal_error ("Could not allocate memory for imported module info." );
187
198
}
188
199
for (uint32_t f = 0 ; f < b -> importsize ; f ++ ) {
189
200
b -> imports [f ].name = get_vint (bytecode , len , & i );
@@ -227,7 +238,7 @@ void bytecode_loadBytecode(TBytecode *b, const uint8_t *bytecode, unsigned int l
227
238
b -> classes [c ].interfacesize = get_vint (bytecode , len , & i );
228
239
b -> classes [c ].interfaces = malloc (sizeof (Interface ) * b -> classes [c ].interfacesize );
229
240
if (b -> classes [c ].interfaces == NULL ) {
230
- fatal_error ("Could not allocate memory for (%d) interfaces." , b -> classes [c ].interfacesize );
241
+ fatal_error ("Could not allocate memory for (%d) interfaces of class \"%s\" ." , b -> classes [c ].interfacesize , b -> strings [ b -> classes [ c ]. name ] -> data );
231
242
}
232
243
for (uint32_t in = 0 ; in < b -> classes [c ].interfacesize ; in ++ ) {
233
244
b -> classes [c ].interfaces [in ].methodsize = get_vint (bytecode , len , & i );
0 commit comments