in log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java [132:160]
private static void writeLocations(final String innerClassName, final ClassVisitor cv,
final List<StackTraceElement> locations) {
cv.visitField(Opcodes.ACC_STATIC, LOCATION_FIELD, STACK_TRACE_ELEMENT_ARRAY_TYPE.getInternalName(), null, null)
.visitEnd();
final InstructionAdapter mv = new InstructionAdapter(
cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null));
mv.visitCode();
mv.visitMaxs(9, 0);
mv.iconst(locations.size());
mv.newarray(STACK_TRACE_ELEMENT_TYPE);
for (int i = 0; i < locations.size(); i++) {
final StackTraceElement location = locations.get(i);
mv.dup();
mv.iconst(i);
mv.anew(STACK_TRACE_ELEMENT_TYPE);
mv.dup();
mv.aconst(location.getClassName());
mv.aconst(location.getMethodName());
mv.aconst(location.getFileName());
mv.iconst(location.getLineNumber());
mv.invokespecial(STACK_TRACE_ELEMENT_TYPE.getInternalName(), "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, STRING_TYPE, STRING_TYPE, STRING_TYPE, Type.INT_TYPE),
false);
mv.visitInsn(Opcodes.AASTORE);
}
mv.putstatic(innerClassName, LOCATION_FIELD, STACK_TRACE_ELEMENT_ARRAY_TYPE.getInternalName());
mv.areturn(Type.VOID_TYPE);
mv.visitEnd();
}