|
@@ -200,6 +200,9 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
200
|
200
|
final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
|
201
|
201
|
final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
|
202
|
202
|
|
|
203
|
+ writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
|
|
204
|
+
|
|
205
|
+
|
203
|
206
|
option.setTag(JavaClass.class, optionClass);
|
204
|
207
|
|
205
|
208
|
|
|
@@ -221,12 +224,36 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
221
|
224
|
optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
|
222
|
225
|
final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
|
223
|
226
|
|
|
227
|
+
|
|
228
|
+ final StringBuilder optionInitDescBuilder = new StringBuilder("(");
|
|
229
|
+
|
224
|
230
|
ITypeID[] types = option.types;
|
225
|
231
|
for (int i = 0; i < types.length; ++i) {
|
226
|
|
- final ITypeID type = types[i];
|
227
|
|
- final String internalName = type.accept(JavaTypeVisitor.INSTANCE).getInternalName();
|
|
232
|
+ final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
|
|
233
|
+ final String internalName = type.getDescriptor();
|
|
234
|
+ optionInitDescBuilder.append(internalName);
|
228
|
235
|
optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
|
229
|
236
|
}
|
|
237
|
+ optionInitDescBuilder.append(")V");
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+ final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitDescBuilder.toString(), null);
|
|
241
|
+ initWriter.start();
|
|
242
|
+ initWriter.loadObject(0);
|
|
243
|
+ initWriter.dup();
|
|
244
|
+ initWriter.invokeSpecial(variantName, "<init>", "()V");
|
|
245
|
+ for (int i = 0; i < types.length; ++i) {
|
|
246
|
+ initWriter.dup();
|
|
247
|
+ initWriter.loadObject(i + 1);
|
|
248
|
+
|
|
249
|
+ final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
|
|
250
|
+ final String internalName = type.getDescriptor();
|
|
251
|
+
|
|
252
|
+ initWriter.putField(optionClassName, "Field" + i, internalName);
|
|
253
|
+ }
|
|
254
|
+ initWriter.pop();
|
|
255
|
+ initWriter.ret();
|
|
256
|
+ initWriter.end();
|
230
|
257
|
|
231
|
258
|
|
232
|
259
|
//Denominator for switch-cases
|
|
@@ -237,12 +264,14 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
237
|
264
|
getDenominator.end();
|
238
|
265
|
|
239
|
266
|
|
240
|
|
- //Print the option files, won't be in production
|
241
|
267
|
optionVisitor.end();
|
242
|
268
|
optionWriter.visitEnd();
|
243
|
|
- JavaModule.classes.put(optionClassName, optionWriter.toByteArray());
|
|
269
|
+ final byte[] byteArray = optionWriter.toByteArray();
|
|
270
|
+ JavaModule.classes.put(optionClassName, byteArray);
|
|
271
|
+
|
|
272
|
+ //Print the option files, won't be in production
|
244
|
273
|
try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
|
245
|
|
- out.write(optionWriter.toByteArray());
|
|
274
|
+ out.write(byteArray);
|
246
|
275
|
} catch (IOException e) {
|
247
|
276
|
e.printStackTrace();
|
248
|
277
|
}
|
|
@@ -253,6 +282,13 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
253
|
282
|
member.accept(visitor);
|
254
|
283
|
}
|
255
|
284
|
|
|
285
|
+ final JavaWriter superInitWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<init>", "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
|
|
286
|
+ superInitWriter.start();
|
|
287
|
+ superInitWriter.loadObject(0);
|
|
288
|
+ superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
|
|
289
|
+ superInitWriter.ret();
|
|
290
|
+ superInitWriter.end();
|
|
291
|
+
|
256
|
292
|
visitor.end();
|
257
|
293
|
writer.visitEnd();
|
258
|
294
|
|