private static void writeLocations()

in log4j-weaver/src/main/java/org/apache/logging/log4j/weaver/LocationCacheGenerator.java [135:165]


    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();
    }