You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2019/09/26 00:09:47 UTC

[commons-bcel] branch master updated: [BCEL-328] java.util.EmptyStackException at org.apache.bcel.classfile.DescendingVisitor.visitModule (DescendingVisitor.java:592).

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-bcel.git


The following commit(s) were added to refs/heads/master by this push:
     new 1d528f6  [BCEL-328] java.util.EmptyStackException at org.apache.bcel.classfile.DescendingVisitor.visitModule (DescendingVisitor.java:592).
1d528f6 is described below

commit 1d528f6cf7ea74db01a03d724f288dd97b2c3f35
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Sep 25 20:09:42 2019 -0400

    [BCEL-328] java.util.EmptyStackException at
    org.apache.bcel.classfile.DescendingVisitor.visitModule
    (DescendingVisitor.java:592).
---
 src/changes/changes.xml                            |    3 +
 .../apache/bcel/classfile/DescendingVisitor.java   | 1314 ++++++++++----------
 2 files changed, 659 insertions(+), 658 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 895ab3b..f4d6014 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -62,6 +62,9 @@ The <action> type attribute can be add,update,fix,remove.
    -->
 
   <body>
+    <release version="6.4.1" date="2019-09-XX" description="Bug fix release.">
+      <action issue="BCEL-328" type="fix" dev="ggregory" due-to="Gary Gregory, Mark Roberts">java.util.EmptyStackException at org.apache.bcel.classfile.DescendingVisitor.visitModule (DescendingVisitor.java:592).</action>
+    </release>  
     <release version="6.4.0" date="2019-09-20" description="Feature and bug fix release.">
       <action issue="BCEL-316" type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default.</action>
       <action issue="BCEL-278" type="fix" dev="ggregory" due-to="Valery Barysoky">InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11.</action>
diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java
index 04a6a51..82236a2 100644
--- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java
+++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java
@@ -1,658 +1,656 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-package org.apache.bcel.classfile;
-
-import java.util.Stack;
-
-/**
- * Traverses a JavaClass with another Visitor object 'piggy-backed' that is
- * applied to all components of a JavaClass object. I.e. this class supplies the
- * traversal strategy, other classes can make use of it.
- *
- */
-public class DescendingVisitor implements Visitor
-{
-    private final JavaClass clazz;
-
-    private final Visitor visitor;
-
-    private final Stack<Object> stack = new Stack<>();
-
-    /**
-     * @return container of current entitity, i.e., predecessor during traversal
-     */
-    public Object predecessor()
-    {
-        return predecessor(0);
-    }
-
-    /**
-     * @param level
-     *            nesting level, i.e., 0 returns the direct predecessor
-     * @return container of current entitity, i.e., predecessor during traversal
-     */
-    public Object predecessor(final int level)
-    {
-        final int size = stack.size();
-        if ((size < 2) || (level < 0))
-        {
-            return null;
-        }
-        return stack.elementAt(size - (level + 2)); // size - 1 == current
-    }
-
-    /**
-     * @return current object
-     */
-    public Object current()
-    {
-        return stack.peek();
-    }
-
-    /**
-     * @param clazz
-     *            Class to traverse
-     * @param visitor
-     *            visitor object to apply to all components
-     */
-    public DescendingVisitor(final JavaClass clazz, final Visitor visitor)
-    {
-        this.clazz = clazz;
-        this.visitor = visitor;
-    }
-
-    /**
-     * Start traversal.
-     */
-    public void visit()
-    {
-        clazz.accept(this);
-    }
-
-    @Override
-    public void visitJavaClass(final JavaClass _clazz)
-    {
-        stack.push(_clazz);
-        _clazz.accept(visitor);
-        final Field[] fields = _clazz.getFields();
-        for (final Field field : fields) {
-            field.accept(this);
-        }
-        final Method[] methods = _clazz.getMethods();
-        for (final Method method : methods) {
-            method.accept(this);
-        }
-        final Attribute[] attributes = _clazz.getAttributes();
-        for (final Attribute attribute : attributes) {
-            attribute.accept(this);
-        }
-        _clazz.getConstantPool().accept(this);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitAnnotation(final Annotations annotation)
-    {
-        stack.push(annotation);
-        annotation.accept(visitor);
-        final AnnotationEntry[] entries = annotation.getAnnotationEntries();
-        for (final AnnotationEntry entrie : entries) {
-            entrie.accept(this);
-        }
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitAnnotationEntry(final AnnotationEntry annotationEntry)
-    {
-        stack.push(annotationEntry);
-        annotationEntry.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitField(final Field field)
-    {
-        stack.push(field);
-        field.accept(visitor);
-        final Attribute[] attributes = field.getAttributes();
-        for (final Attribute attribute : attributes) {
-            attribute.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantValue(final ConstantValue cv)
-    {
-        stack.push(cv);
-        cv.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitMethod(final Method method)
-    {
-        stack.push(method);
-        method.accept(visitor);
-        final Attribute[] attributes = method.getAttributes();
-        for (final Attribute attribute : attributes) {
-            attribute.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitExceptionTable(final ExceptionTable table)
-    {
-        stack.push(table);
-        table.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitCode(final Code code)
-    {
-        stack.push(code);
-        code.accept(visitor);
-        final CodeException[] table = code.getExceptionTable();
-        for (final CodeException element : table) {
-            element.accept(this);
-        }
-        final Attribute[] attributes = code.getAttributes();
-        for (final Attribute attribute : attributes) {
-            attribute.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitCodeException(final CodeException ce)
-    {
-        stack.push(ce);
-        ce.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitLineNumberTable(final LineNumberTable table)
-    {
-        stack.push(table);
-        table.accept(visitor);
-        final LineNumber[] numbers = table.getLineNumberTable();
-        for (final LineNumber number : numbers) {
-            number.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitLineNumber(final LineNumber number)
-    {
-        stack.push(number);
-        number.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitLocalVariableTable(final LocalVariableTable table)
-    {
-        stack.push(table);
-        table.accept(visitor);
-        final LocalVariable[] vars = table.getLocalVariableTable();
-        for (final LocalVariable var : vars) {
-            var.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitStackMap(final StackMap table)
-    {
-        stack.push(table);
-        table.accept(visitor);
-        final StackMapEntry[] vars = table.getStackMap();
-        for (final StackMapEntry var : vars) {
-            var.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitStackMapEntry(final StackMapEntry var)
-    {
-        stack.push(var);
-        var.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitLocalVariable(final LocalVariable var)
-    {
-        stack.push(var);
-        var.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantPool(final ConstantPool cp)
-    {
-        stack.push(cp);
-        cp.accept(visitor);
-        final Constant[] constants = cp.getConstantPool();
-        for (int i = 1; i < constants.length; i++)
-        {
-            if (constants[i] != null)
-            {
-                constants[i].accept(this);
-            }
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantClass(final ConstantClass constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantDouble(final ConstantDouble constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantFieldref(final ConstantFieldref constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantFloat(final ConstantFloat constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantInteger(final ConstantInteger constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantInterfaceMethodref(
-            final ConstantInterfaceMethodref constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitConstantInvokeDynamic(
-            final ConstantInvokeDynamic constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantLong(final ConstantLong constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantMethodref(final ConstantMethodref constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantNameAndType(final ConstantNameAndType constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantString(final ConstantString constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitConstantUtf8(final ConstantUtf8 constant)
-    {
-        stack.push(constant);
-        constant.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitInnerClasses(final InnerClasses ic)
-    {
-        stack.push(ic);
-        ic.accept(visitor);
-        final InnerClass[] ics = ic.getInnerClasses();
-        for (final InnerClass ic2 : ics) {
-            ic2.accept(this);
-        }
-        stack.pop();
-    }
-
-    @Override
-    public void visitInnerClass(final InnerClass inner)
-    {
-        stack.push(inner);
-        inner.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitBootstrapMethods(final BootstrapMethods bm)
-    {
-        stack.push(bm);
-        bm.accept(visitor);
-        // BootstrapMethod[] bms = bm.getBootstrapMethods();
-        // for (int i = 0; i < bms.length; i++)
-        // {
-        //     bms[i].accept(this);
-        // }
-        stack.pop();
-    }
-
-    @Override
-    public void visitDeprecated(final Deprecated attribute)
-    {
-        stack.push(attribute);
-        attribute.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitSignature(final Signature attribute)
-    {
-        stack.push(attribute);
-        attribute.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitSourceFile(final SourceFile attribute)
-    {
-        stack.push(attribute);
-        attribute.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitSynthetic(final Synthetic attribute)
-    {
-        stack.push(attribute);
-        attribute.accept(visitor);
-        stack.pop();
-    }
-
-    @Override
-    public void visitUnknown(final Unknown attribute)
-    {
-        stack.push(attribute);
-        attribute.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitAnnotationDefault(final AnnotationDefault obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitEnclosingMethod(final EnclosingMethod obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitParameterAnnotation(final ParameterAnnotations obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /**
-     * @since 6.0
-     */
-    @Override
-    public void visitMethodParameters(final MethodParameters obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        final MethodParameter[] table = obj.getParameters();
-        for (final MethodParameter element : table) {
-            element.accept(this);
-        }
-        stack.pop();
-    }
-
-    /**
-     * @since 6.4.0
-     */
-    @Override
-    public void visitMethodParameter(final MethodParameter obj)
-    {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.0 */
-    @Override
-    public void visitConstantMethodType(final ConstantMethodType obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.0 */
-    @Override
-    public void visitConstantMethodHandle(final ConstantMethodHandle obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.0 */
-    @Override
-    public void visitParameterAnnotationEntry(final ParameterAnnotationEntry obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.1 */
-    @Override
-    public void visitConstantPackage(final ConstantPackage obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.1 */
-    @Override
-    public void visitConstantModule(final ConstantModule obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.3 */
-    @Override
-    public void visitConstantDynamic(final ConstantDynamic obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModule(final Module obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        final ModuleRequires[] rtable = obj.getRequiresTable();
-        for (final ModuleRequires element : rtable) {
-            element.accept(this);
-        }
-        final ModuleExports[] etable = obj.getExportsTable();
-        for (final ModuleExports element : etable) {
-            element.accept(this);
-        }
-        stack.pop();
-        final ModuleOpens[] otable = obj.getOpensTable();
-        for (final ModuleOpens element : otable) {
-            element.accept(this);
-        }
-        stack.pop();
-        final ModuleProvides[] ptable = obj.getProvidesTable();
-        for (final ModuleProvides element : ptable) {
-            element.accept(this);
-        }
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModuleRequires(final ModuleRequires obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModuleExports(final ModuleExports obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModuleOpens(final ModuleOpens obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModuleProvides(final ModuleProvides obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModulePackages(final ModulePackages obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitModuleMainClass(final ModuleMainClass obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitNestHost(final NestHost obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-
-    /** @since 6.4.0 */
-    @Override
-    public void visitNestMembers(final NestMembers obj) {
-        stack.push(obj);
-        obj.accept(visitor);
-        stack.pop();
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.bcel.classfile;
+
+import java.util.Stack;
+
+/**
+ * Traverses a JavaClass with another Visitor object 'piggy-backed' that is
+ * applied to all components of a JavaClass object. I.e. this class supplies the
+ * traversal strategy, other classes can make use of it.
+ *
+ */
+public class DescendingVisitor implements Visitor
+{
+    private final JavaClass clazz;
+
+    private final Visitor visitor;
+
+    private final Stack<Object> stack = new Stack<>();
+
+    /**
+     * @return container of current entitity, i.e., predecessor during traversal
+     */
+    public Object predecessor()
+    {
+        return predecessor(0);
+    }
+
+    /**
+     * @param level
+     *            nesting level, i.e., 0 returns the direct predecessor
+     * @return container of current entitity, i.e., predecessor during traversal
+     */
+    public Object predecessor(final int level)
+    {
+        final int size = stack.size();
+        if ((size < 2) || (level < 0))
+        {
+            return null;
+        }
+        return stack.elementAt(size - (level + 2)); // size - 1 == current
+    }
+
+    /**
+     * @return current object
+     */
+    public Object current()
+    {
+        return stack.peek();
+    }
+
+    /**
+     * @param clazz
+     *            Class to traverse
+     * @param visitor
+     *            visitor object to apply to all components
+     */
+    public DescendingVisitor(final JavaClass clazz, final Visitor visitor)
+    {
+        this.clazz = clazz;
+        this.visitor = visitor;
+    }
+
+    /**
+     * Start traversal.
+     */
+    public void visit()
+    {
+        clazz.accept(this);
+    }
+
+    @Override
+    public void visitJavaClass(final JavaClass _clazz)
+    {
+        stack.push(_clazz);
+        _clazz.accept(visitor);
+        final Field[] fields = _clazz.getFields();
+        for (final Field field : fields) {
+            field.accept(this);
+        }
+        final Method[] methods = _clazz.getMethods();
+        for (final Method method : methods) {
+            method.accept(this);
+        }
+        final Attribute[] attributes = _clazz.getAttributes();
+        for (final Attribute attribute : attributes) {
+            attribute.accept(this);
+        }
+        _clazz.getConstantPool().accept(this);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitAnnotation(final Annotations annotation)
+    {
+        stack.push(annotation);
+        annotation.accept(visitor);
+        final AnnotationEntry[] entries = annotation.getAnnotationEntries();
+        for (final AnnotationEntry entrie : entries) {
+            entrie.accept(this);
+        }
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitAnnotationEntry(final AnnotationEntry annotationEntry)
+    {
+        stack.push(annotationEntry);
+        annotationEntry.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitField(final Field field)
+    {
+        stack.push(field);
+        field.accept(visitor);
+        final Attribute[] attributes = field.getAttributes();
+        for (final Attribute attribute : attributes) {
+            attribute.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantValue(final ConstantValue cv)
+    {
+        stack.push(cv);
+        cv.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitMethod(final Method method)
+    {
+        stack.push(method);
+        method.accept(visitor);
+        final Attribute[] attributes = method.getAttributes();
+        for (final Attribute attribute : attributes) {
+            attribute.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitExceptionTable(final ExceptionTable table)
+    {
+        stack.push(table);
+        table.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitCode(final Code code)
+    {
+        stack.push(code);
+        code.accept(visitor);
+        final CodeException[] table = code.getExceptionTable();
+        for (final CodeException element : table) {
+            element.accept(this);
+        }
+        final Attribute[] attributes = code.getAttributes();
+        for (final Attribute attribute : attributes) {
+            attribute.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitCodeException(final CodeException ce)
+    {
+        stack.push(ce);
+        ce.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitLineNumberTable(final LineNumberTable table)
+    {
+        stack.push(table);
+        table.accept(visitor);
+        final LineNumber[] numbers = table.getLineNumberTable();
+        for (final LineNumber number : numbers) {
+            number.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitLineNumber(final LineNumber number)
+    {
+        stack.push(number);
+        number.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitLocalVariableTable(final LocalVariableTable table)
+    {
+        stack.push(table);
+        table.accept(visitor);
+        final LocalVariable[] vars = table.getLocalVariableTable();
+        for (final LocalVariable var : vars) {
+            var.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitStackMap(final StackMap table)
+    {
+        stack.push(table);
+        table.accept(visitor);
+        final StackMapEntry[] vars = table.getStackMap();
+        for (final StackMapEntry var : vars) {
+            var.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitStackMapEntry(final StackMapEntry var)
+    {
+        stack.push(var);
+        var.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitLocalVariable(final LocalVariable var)
+    {
+        stack.push(var);
+        var.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantPool(final ConstantPool cp)
+    {
+        stack.push(cp);
+        cp.accept(visitor);
+        final Constant[] constants = cp.getConstantPool();
+        for (int i = 1; i < constants.length; i++)
+        {
+            if (constants[i] != null)
+            {
+                constants[i].accept(this);
+            }
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantClass(final ConstantClass constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantDouble(final ConstantDouble constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantFieldref(final ConstantFieldref constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantFloat(final ConstantFloat constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantInteger(final ConstantInteger constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantInterfaceMethodref(
+            final ConstantInterfaceMethodref constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitConstantInvokeDynamic(
+            final ConstantInvokeDynamic constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantLong(final ConstantLong constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantMethodref(final ConstantMethodref constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantNameAndType(final ConstantNameAndType constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantString(final ConstantString constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitConstantUtf8(final ConstantUtf8 constant)
+    {
+        stack.push(constant);
+        constant.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitInnerClasses(final InnerClasses ic)
+    {
+        stack.push(ic);
+        ic.accept(visitor);
+        final InnerClass[] ics = ic.getInnerClasses();
+        for (final InnerClass ic2 : ics) {
+            ic2.accept(this);
+        }
+        stack.pop();
+    }
+
+    @Override
+    public void visitInnerClass(final InnerClass inner)
+    {
+        stack.push(inner);
+        inner.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitBootstrapMethods(final BootstrapMethods bm)
+    {
+        stack.push(bm);
+        bm.accept(visitor);
+        // BootstrapMethod[] bms = bm.getBootstrapMethods();
+        // for (int i = 0; i < bms.length; i++)
+        // {
+        //     bms[i].accept(this);
+        // }
+        stack.pop();
+    }
+
+    @Override
+    public void visitDeprecated(final Deprecated attribute)
+    {
+        stack.push(attribute);
+        attribute.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitSignature(final Signature attribute)
+    {
+        stack.push(attribute);
+        attribute.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitSourceFile(final SourceFile attribute)
+    {
+        stack.push(attribute);
+        attribute.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitSynthetic(final Synthetic attribute)
+    {
+        stack.push(attribute);
+        attribute.accept(visitor);
+        stack.pop();
+    }
+
+    @Override
+    public void visitUnknown(final Unknown attribute)
+    {
+        stack.push(attribute);
+        attribute.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitAnnotationDefault(final AnnotationDefault obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitEnclosingMethod(final EnclosingMethod obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitParameterAnnotation(final ParameterAnnotations obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /**
+     * @since 6.0
+     */
+    @Override
+    public void visitMethodParameters(final MethodParameters obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        final MethodParameter[] table = obj.getParameters();
+        for (final MethodParameter element : table) {
+            element.accept(this);
+        }
+        stack.pop();
+    }
+
+    /**
+     * @since 6.4.0
+     */
+    @Override
+    public void visitMethodParameter(final MethodParameter obj)
+    {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.0 */
+    @Override
+    public void visitConstantMethodType(final ConstantMethodType obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.0 */
+    @Override
+    public void visitConstantMethodHandle(final ConstantMethodHandle obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.0 */
+    @Override
+    public void visitParameterAnnotationEntry(final ParameterAnnotationEntry obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.1 */
+    @Override
+    public void visitConstantPackage(final ConstantPackage obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.1 */
+    @Override
+    public void visitConstantModule(final ConstantModule obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.3 */
+    @Override
+    public void visitConstantDynamic(final ConstantDynamic obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModule(final Module obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        final ModuleRequires[] rtable = obj.getRequiresTable();
+        for (final ModuleRequires element : rtable) {
+            element.accept(this);
+        }
+        final ModuleExports[] etable = obj.getExportsTable();
+        for (final ModuleExports element : etable) {
+            element.accept(this);
+        }
+        final ModuleOpens[] otable = obj.getOpensTable();
+        for (final ModuleOpens element : otable) {
+            element.accept(this);
+        }
+        final ModuleProvides[] ptable = obj.getProvidesTable();
+        for (final ModuleProvides element : ptable) {
+            element.accept(this);
+        }
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModuleRequires(final ModuleRequires obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModuleExports(final ModuleExports obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModuleOpens(final ModuleOpens obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModuleProvides(final ModuleProvides obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModulePackages(final ModulePackages obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitModuleMainClass(final ModuleMainClass obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitNestHost(final NestHost obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+
+    /** @since 6.4.0 */
+    @Override
+    public void visitNestMembers(final NestMembers obj) {
+        stack.push(obj);
+        obj.accept(visitor);
+        stack.pop();
+    }
+}