changeset 43:7ffe29bde4fe

7902334: JCov fails to instrument JDK 11 classfiles with NestHost/NestMates attributes Reviewed-by: lkuskov Contributed-by: jan.lahoda@oracle.com
author jjg
date Thu, 11 Oct 2018 10:20:39 -0700
parents 996f55f99d75
children 3d6e43ef0636
files src/classes/com/sun/tdk/jcov/JREInstr.java src/classes/com/sun/tdk/jcov/instrument/DeferringMethodClassAdapter.java src/classes/com/sun/tdk/jcov/instrument/EntryCodeMethodAdapter.java src/classes/com/sun/tdk/jcov/instrument/FieldAnnotationVisitor.java src/classes/com/sun/tdk/jcov/instrument/ForkingMethodAdapter.java src/classes/com/sun/tdk/jcov/instrument/InstrumentedAttributeClassAdapter.java src/classes/com/sun/tdk/jcov/instrument/InvokeClassAdapter.java src/classes/com/sun/tdk/jcov/instrument/InvokeMethodAdapter.java src/classes/com/sun/tdk/jcov/instrument/MethodAnnotationAdapter.java src/classes/com/sun/tdk/jcov/instrument/OffsetRecordingMethodAdapter.java src/classes/com/sun/tdk/jcov/instrument/SavePointsMethodAdapter.java src/classes/com/sun/tdk/jcov/instrument/StaticInvokeMethodAdapter.java src/classes/com/sun/tdk/jcov/util/Utils.java test/unit/com/sun/tdk/jcov/instrument/IntrumentNestHostTest.java
diffstat 14 files changed, 236 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/classes/com/sun/tdk/jcov/JREInstr.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/JREInstr.java	Thu Oct 11 10:20:39 2018 -0700
@@ -271,7 +271,7 @@
             ClassReader cr = new ClassReader(in);
             ClassWriter cw = new OverriddenClassWriter(cr, ClassWriter.COMPUTE_FRAMES, cl);
 
-            ClassVisitor cv = new ClassVisitor(Opcodes.ASM6, cw) {
+            ClassVisitor cv = new ClassVisitor(Utils.ASM_API_VERSION, cw) {
                 @Override
                 public ModuleVisitor visitModule(String name, int access, String version) {
                     ModuleVisitor mv = super.visitModule(name, access, version);
--- a/src/classes/com/sun/tdk/jcov/instrument/DeferringMethodClassAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/DeferringMethodClassAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -30,7 +30,6 @@
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 import static org.objectweb.asm.Opcodes.*;
 import org.objectweb.asm.tree.MethodNode;
 
@@ -44,7 +43,7 @@
     private final InstrumentationParams params;
 
     public DeferringMethodClassAdapter(final ClassVisitor cv, DataClass k, InstrumentationParams params) {
-        super(ASM6, cv);
+        super(Utils.ASM_API_VERSION, cv);
         this.k = k;
         this.params = params;
     }
@@ -172,7 +171,7 @@
         MethodVisitor mv = visitMethodCoverage(access, name, desc, signature, exceptions);
 
         if ("<clinit>".equals(name) && !params.isDynamicCollect() && (k.getPackageName().startsWith("java/lang/"))) {
-            mv = new MethodVisitor(Opcodes.ASM6, mv) {
+            mv = new MethodVisitor(Utils.ASM_API_VERSION, mv) {
                 public void visitCode() {
                     mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/Collect", "init", "()V");
                     super.visitCode();
@@ -208,7 +207,7 @@
         if (params.isDataSaveFilterAccept(k.getFullname(), name, false)) {
             mv = new SavePointsMethodAdapter(mv, false);
         }
-        mv = new MethodVisitor(Opcodes.ASM6, mv) {
+        mv = new MethodVisitor(Utils.ASM_API_VERSION, mv) {
             @Override
             public void visitLocalVariable(String arg0, String arg1, String arg2, Label arg3, Label arg4, int arg5) {
                 //super.visitLocalVariable(arg0, arg1, arg2, arg3, arg4, arg5);
--- a/src/classes/com/sun/tdk/jcov/instrument/EntryCodeMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/EntryCodeMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -43,7 +43,7 @@
     EntryCodeMethodAdapter(final MethodVisitor mv,
             final DataMethodEntryOnly method,
             final InstrumentationParams params) {
-        super(Opcodes.ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.method = method;
         this.params = params;
     }
--- a/src/classes/com/sun/tdk/jcov/instrument/FieldAnnotationVisitor.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/FieldAnnotationVisitor.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,10 +24,10 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Opcodes;
 
 /**
  * Field visitor collecting runtime annotations
@@ -40,7 +40,7 @@
     final FieldVisitor fv;
 
     FieldAnnotationVisitor(final FieldVisitor fv, final DataField field) {
-        super(Opcodes.ASM6, fv);
+        super(Utils.ASM_API_VERSION, fv);
         this.fv = fv;
         this.field = field;
     }
--- a/src/classes/com/sun/tdk/jcov/instrument/ForkingMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/ForkingMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,12 +24,12 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
 
 /**
  * ForkingMethodAdapter
@@ -44,7 +44,7 @@
         final AnnotationVisitor av2;
 
         DuplicatingAnnotationAdapter(final AnnotationVisitor av1, final AnnotationVisitor av2) {
-            super(Opcodes.ASM6);
+            super(Utils.ASM_API_VERSION);
             this.av1 = av1;
             this.av2 = av2;
         }
@@ -88,7 +88,7 @@
      * @param mv the code visitor to which this adapter must delegate calls.
      */
     public ForkingMethodAdapter(final MethodVisitor mv1, final MethodVisitor mv2) {
-        super(Opcodes.ASM6);
+        super(Utils.ASM_API_VERSION);
         this.mv1 = mv1;
         this.mv2 = mv2;
     }
--- a/src/classes/com/sun/tdk/jcov/instrument/InstrumentedAttributeClassAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/InstrumentedAttributeClassAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,13 +24,13 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.ByteVector;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
 
 /**
  * @author Dmitry Fazunenko
@@ -45,7 +45,7 @@
     }
 
     public InstrumentedAttributeClassAdapter(final ClassVisitor cv) {
-        super(Opcodes.ASM6, cv);
+        super(Utils.ASM_API_VERSION, cv);
     }
 
     public void visitAttribute(Attribute attr) {
--- a/src/classes/com/sun/tdk/jcov/instrument/InvokeClassAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/InvokeClassAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,9 +24,9 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 
 /**
  *
@@ -38,7 +38,7 @@
     private final InstrumentationParams params;
 
     public InvokeClassAdapter(final ClassVisitor cv, final InstrumentationParams params) {
-        super(Opcodes.ASM6, cv);
+        super(Utils.ASM_API_VERSION, cv);
         this.params = params;
     }
 
--- a/src/classes/com/sun/tdk/jcov/instrument/InvokeMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/InvokeMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -29,6 +29,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.tree.InsnList;
 import org.objectweb.asm.tree.LdcInsnNode;
@@ -70,7 +71,7 @@
             Collections.synchronizedMap(new HashMap<String, Integer>());
 
     public InvokeMethodAdapter(MethodVisitor mv, String className, final InstrumentationParams params) {
-        super(ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.className = className;
         this.params = params;
     }
--- a/src/classes/com/sun/tdk/jcov/instrument/MethodAnnotationAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/MethodAnnotationAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,9 +24,9 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 
 /**
  * Class that does nothing but collects runtime annotations
@@ -45,7 +45,7 @@
 
     MethodAnnotationAdapter(final MethodVisitor mv,
             final DataMethod method) {
-        super(Opcodes.ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.meth = method;
     }
 }
--- a/src/classes/com/sun/tdk/jcov/instrument/OffsetRecordingMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/OffsetRecordingMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -29,7 +29,6 @@
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
 
 /**
  * OffsetRecordingMethodAdapter
@@ -45,7 +44,7 @@
 
     public OffsetRecordingMethodAdapter(final MethodVisitor mv,
             final DataMethodWithBlocks method) {
-        super(Opcodes.ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.currentInstructionIndex = 0;
         this.bcis = new int[60];
         this.method = method;
--- a/src/classes/com/sun/tdk/jcov/instrument/SavePointsMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/SavePointsMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -24,8 +24,8 @@
  */
 package com.sun.tdk.jcov.instrument;
 
+import com.sun.tdk.jcov.util.Utils;
 import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
 import static org.objectweb.asm.Opcodes.*;
 
 /**
@@ -41,7 +41,7 @@
     private final boolean isBegin;
 
     public SavePointsMethodAdapter(final MethodVisitor mv, boolean isBegin) {
-        super(Opcodes.ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.isBegin = isBegin;
     }
 
--- a/src/classes/com/sun/tdk/jcov/instrument/StaticInvokeMethodAdapter.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/instrument/StaticInvokeMethodAdapter.java	Thu Oct 11 10:20:39 2018 -0700
@@ -69,7 +69,7 @@
     public static final Map<String, Integer> map = new HashMap<String, Integer>();
 
     public StaticInvokeMethodAdapter(MethodVisitor mv, String className, String methName, int access, final InstrumentationParams params) {
-        super(Opcodes.ASM6, mv);
+        super(Utils.ASM_API_VERSION, mv);
         this.className = className;
         this.params = params;
         this.methName = methName;
--- a/src/classes/com/sun/tdk/jcov/util/Utils.java	Fri Aug 03 04:01:19 2018 -0700
+++ b/src/classes/com/sun/tdk/jcov/util/Utils.java	Thu Oct 11 10:20:39 2018 -0700
@@ -60,6 +60,8 @@
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
+import org.objectweb.asm.Opcodes;
+
 /**
  * This class implements miscellaneous utilities, necessary for Jcov
  *
@@ -67,6 +69,11 @@
  */
 public final class Utils {
 
+    /**
+     * The ASM API version that should be used by jcov.
+     */
+    public static final int ASM_API_VERSION = Opcodes.ASM7_EXPERIMENTAL;
+
     private static Handler loggerHandler = null;
     private final static int ASCII_CHARS_TOTAL = 128;
     private static char[] buf = new char[32];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/com/sun/tdk/jcov/instrument/IntrumentNestHostTest.java	Thu Oct 11 10:20:39 2018 -0700
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tdk.jcov.instrument;
+
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import com.sun.tdk.jcov.Instr;
+import com.sun.tdk.jcov.io.Reader;
+import com.sun.tdk.jcov.runtime.Collect;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class IntrumentNestHostTest {
+    @Test
+    public void testNestHostMembers() throws Exception {
+        Path temp = Files.createTempDirectory("jcov");
+        Path template = temp.resolve("template.xml");
+        Path classes = temp.resolve("classes");
+        Files.createDirectories(classes);
+        try (OutputStream out = Files.newOutputStream(classes.resolve("Simple.class"))) {
+            out.write(SIMPLE_CLASS);
+        }
+        try (OutputStream out = Files.newOutputStream(classes.resolve("Simple$I.class"))) {
+            out.write(SIMPLE$I_CLASS);
+        }
+        Path outDir = temp.resolve("out");
+        Files.createDirectories(outDir);
+        Instr instr = new Instr();
+        instr.setTemplate(template.toFile().getAbsolutePath());
+        instr.instrumentFile(classes.toFile(), outDir.toFile(), null);
+        instr.finishWork();
+        Assert.assertNotEquals(Files.size(outDir.resolve("Simple.class")),
+                               Files.size(classes.resolve("Simple.class")),
+                               "File size should differ.");
+        Assert.assertNotEquals(Files.size(outDir.resolve("Simple$I.class")),
+                               Files.size(classes.resolve("Simple$I.class")),
+                               "File size should differ.");
+        Collect.enableCounts(); //reset
+        if (new BigDecimal(System.getProperty("java.class.version")).compareTo(new BigDecimal("55.0")) >= 0) {
+            //run the code, and check coverage outcome:
+            ClassLoader cl = new URLClassLoader(new URL[] {outDir.toUri().toURL()});
+            Class<?> simple = Class.forName("Simple", false, cl);
+            Method run = simple.getMethod("run");
+            run.invoke(null);
+            DataRoot root = Reader.readXML(template.toFile().getAbsolutePath(), true, null);
+            int blocks = 0;
+            for (DataClass dc : root.getClasses()) {
+                for (DataMethod dm : dc.getMethods()) {
+                    if ("<init>".equals(dm.name))
+                        continue;
+                    for (DataBlock db : dm.getBlocks()) {
+                        Assert.assertEquals(Collect.countFor(db.slot), 1);
+                        blocks++;
+                    }
+                }
+            }
+            Assert.assertEquals(blocks, 3);
+        } else {
+            System.err.println("Warning: skipping run of the test sample, as the runtime JDK cannot handle classfiles version 55.");
+        }
+    }
+
+    //classfiles based on:
+    //public class Simple {
+    //    public static void run() {
+    //        I.run();
+    //    }
+    //    private static class I {
+    //        public static void run() {
+    //            d();
+    //        }
+    //        private static void d() {}
+    //    }
+    //}
+    private static final byte[] SIMPLE_CLASS = new byte[] {
+        (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x37, (byte) 0x00, (byte) 0x15, (byte) 0x0A, (byte) 0x00, (byte) 0x04, (byte) 0x00,
+        (byte) 0x10, (byte) 0x0A, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x11, (byte) 0x07,
+        (byte) 0x00, (byte) 0x12, (byte) 0x07, (byte) 0x00, (byte) 0x13, (byte) 0x07, (byte) 0x00,
+        (byte) 0x14, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x49, (byte) 0x01, (byte) 0x00,
+        (byte) 0x0C, (byte) 0x49, (byte) 0x6E, (byte) 0x6E, (byte) 0x65, (byte) 0x72, (byte) 0x43,
+        (byte) 0x6C, (byte) 0x61, (byte) 0x73, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x01,
+        (byte) 0x00, (byte) 0x06, (byte) 0x3C, (byte) 0x69, (byte) 0x6E, (byte) 0x69, (byte) 0x74,
+        (byte) 0x3E, (byte) 0x01, (byte) 0x00, (byte) 0x03, (byte) 0x28, (byte) 0x29, (byte) 0x56,
+        (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x43, (byte) 0x6F, (byte) 0x64, (byte) 0x65,
+        (byte) 0x01, (byte) 0x00, (byte) 0x0F, (byte) 0x4C, (byte) 0x69, (byte) 0x6E, (byte) 0x65,
+        (byte) 0x4E, (byte) 0x75, (byte) 0x6D, (byte) 0x62, (byte) 0x65, (byte) 0x72, (byte) 0x54,
+        (byte) 0x61, (byte) 0x62, (byte) 0x6C, (byte) 0x65, (byte) 0x01, (byte) 0x00, (byte) 0x03,
+        (byte) 0x72, (byte) 0x75, (byte) 0x6E, (byte) 0x01, (byte) 0x00, (byte) 0x0A, (byte) 0x53,
+        (byte) 0x6F, (byte) 0x75, (byte) 0x72, (byte) 0x63, (byte) 0x65, (byte) 0x46, (byte) 0x69,
+        (byte) 0x6C, (byte) 0x65, (byte) 0x01, (byte) 0x00, (byte) 0x0B, (byte) 0x53, (byte) 0x69,
+        (byte) 0x6D, (byte) 0x70, (byte) 0x6C, (byte) 0x65, (byte) 0x2E, (byte) 0x6A, (byte) 0x61,
+        (byte) 0x76, (byte) 0x61, (byte) 0x01, (byte) 0x00, (byte) 0x0B, (byte) 0x4E, (byte) 0x65,
+        (byte) 0x73, (byte) 0x74, (byte) 0x4D, (byte) 0x65, (byte) 0x6D, (byte) 0x62, (byte) 0x65,
+        (byte) 0x72, (byte) 0x73, (byte) 0x0C, (byte) 0x00, (byte) 0x08, (byte) 0x00, (byte) 0x09,
+        (byte) 0x0C, (byte) 0x00, (byte) 0x0C, (byte) 0x00, (byte) 0x09, (byte) 0x01, (byte) 0x00,
+        (byte) 0x06, (byte) 0x53, (byte) 0x69, (byte) 0x6D, (byte) 0x70, (byte) 0x6C, (byte) 0x65,
+        (byte) 0x01, (byte) 0x00, (byte) 0x10, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
+        (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67, (byte) 0x2F, (byte) 0x4F,
+        (byte) 0x62, (byte) 0x6A, (byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x01, (byte) 0x00,
+        (byte) 0x08, (byte) 0x53, (byte) 0x69, (byte) 0x6D, (byte) 0x70, (byte) 0x6C, (byte) 0x65,
+        (byte) 0x24, (byte) 0x49, (byte) 0x00, (byte) 0x21, (byte) 0x00, (byte) 0x03, (byte) 0x00,
+        (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
+        (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x08, (byte) 0x00, (byte) 0x09, (byte) 0x00,
+        (byte) 0x01, (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x1D,
+        (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x05, (byte) 0x2A, (byte) 0xB7, (byte) 0x00, (byte) 0x01, (byte) 0xB1, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x0B, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x01, (byte) 0x00, (byte) 0x09, (byte) 0x00, (byte) 0x0C, (byte) 0x00, (byte) 0x09,
+        (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x20, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x04, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0xB1, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x0B, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x03, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x03,
+        (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00,
+        (byte) 0x0E, (byte) 0x00, (byte) 0x0F, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+        (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x07, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x05,
+        (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x0A
+    };
+
+    private static final byte[] SIMPLE$I_CLASS = new byte[] {
+        (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x37, (byte) 0x00, (byte) 0x16, (byte) 0x0A, (byte) 0x00, (byte) 0x04, (byte) 0x00,
+        (byte) 0x0F, (byte) 0x0A, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x10, (byte) 0x07,
+        (byte) 0x00, (byte) 0x11, (byte) 0x07, (byte) 0x00, (byte) 0x14, (byte) 0x01, (byte) 0x00,
+        (byte) 0x06, (byte) 0x3C, (byte) 0x69, (byte) 0x6E, (byte) 0x69, (byte) 0x74, (byte) 0x3E,
+        (byte) 0x01, (byte) 0x00, (byte) 0x03, (byte) 0x28, (byte) 0x29, (byte) 0x56, (byte) 0x01,
+        (byte) 0x00, (byte) 0x04, (byte) 0x43, (byte) 0x6F, (byte) 0x64, (byte) 0x65, (byte) 0x01,
+        (byte) 0x00, (byte) 0x0F, (byte) 0x4C, (byte) 0x69, (byte) 0x6E, (byte) 0x65, (byte) 0x4E,
+        (byte) 0x75, (byte) 0x6D, (byte) 0x62, (byte) 0x65, (byte) 0x72, (byte) 0x54, (byte) 0x61,
+        (byte) 0x62, (byte) 0x6C, (byte) 0x65, (byte) 0x01, (byte) 0x00, (byte) 0x03, (byte) 0x72,
+        (byte) 0x75, (byte) 0x6E, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x64, (byte) 0x01,
+        (byte) 0x00, (byte) 0x0A, (byte) 0x53, (byte) 0x6F, (byte) 0x75, (byte) 0x72, (byte) 0x63,
+        (byte) 0x65, (byte) 0x46, (byte) 0x69, (byte) 0x6C, (byte) 0x65, (byte) 0x01, (byte) 0x00,
+        (byte) 0x0B, (byte) 0x53, (byte) 0x69, (byte) 0x6D, (byte) 0x70, (byte) 0x6C, (byte) 0x65,
+        (byte) 0x2E, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x01, (byte) 0x00,
+        (byte) 0x08, (byte) 0x4E, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x48, (byte) 0x6F,
+        (byte) 0x73, (byte) 0x74, (byte) 0x07, (byte) 0x00, (byte) 0x15, (byte) 0x0C, (byte) 0x00,
+        (byte) 0x05, (byte) 0x00, (byte) 0x06, (byte) 0x0C, (byte) 0x00, (byte) 0x0A, (byte) 0x00,
+        (byte) 0x06, (byte) 0x01, (byte) 0x00, (byte) 0x08, (byte) 0x53, (byte) 0x69, (byte) 0x6D,
+        (byte) 0x70, (byte) 0x6C, (byte) 0x65, (byte) 0x24, (byte) 0x49, (byte) 0x01, (byte) 0x00,
+        (byte) 0x01, (byte) 0x49, (byte) 0x01, (byte) 0x00, (byte) 0x0C, (byte) 0x49, (byte) 0x6E,
+        (byte) 0x6E, (byte) 0x65, (byte) 0x72, (byte) 0x43, (byte) 0x6C, (byte) 0x61, (byte) 0x73,
+        (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x01, (byte) 0x00, (byte) 0x10, (byte) 0x6A,
+        (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
+        (byte) 0x67, (byte) 0x2F, (byte) 0x4F, (byte) 0x62, (byte) 0x6A, (byte) 0x65, (byte) 0x63,
+        (byte) 0x74, (byte) 0x01, (byte) 0x00, (byte) 0x06, (byte) 0x53, (byte) 0x69, (byte) 0x6D,
+        (byte) 0x70, (byte) 0x6C, (byte) 0x65, (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x03,
+        (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x03, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x06,
+        (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x1D, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x05, (byte) 0x2A, (byte) 0xB7, (byte) 0x00, (byte) 0x01, (byte) 0xB1,
+        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x08, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x09, (byte) 0x00, (byte) 0x09, (byte) 0x00,
+        (byte) 0x06, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0xB1,
+        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x08, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x00,
+        (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x08, (byte) 0x00,
+        (byte) 0x0A, (byte) 0x00, (byte) 0x0A, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x01,
+        (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x19, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+        (byte) 0xB1, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x08,
+        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x01, (byte) 0x00,
+        (byte) 0x00, (byte) 0x00, (byte) 0x09, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x0B,
+        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x0C, (byte) 0x00,
+        (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x0E,
+        (byte) 0x00, (byte) 0x13, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0A, (byte) 0x00,
+        (byte) 0x01, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x0E, (byte) 0x00, (byte) 0x12,
+        (byte) 0x00, (byte) 0x0A
+    };
+}