8028504: javac generates LocalVariableTable even with -g:none
authorvromero
Tue, 19 Nov 2013 23:35:43 +0000
changeset 21889 7c3939a495ab
parent 21888 568c5da9f16b
child 21890 a627c91c71db
8028504: javac generates LocalVariableTable even with -g:none Reviewed-by: jjg, jlahoda
langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java
langtools/test/tools/javac/T8028504/DontGenerateLVTForGNoneOpTest.java
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Tue Nov 19 22:14:51 2013 +0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Tue Nov 19 23:35:43 2013 +0000
@@ -1174,9 +1174,8 @@
         }
 
         // counter for number of generic local variables
-        int nGenericVars = 0;
-
-        if (code.varBufferSize > 0) {
+        if (code.varDebugInfo && code.varBufferSize > 0) {
+            int nGenericVars = 0;
             int alenIdx = writeAttr(names.LocalVariableTable);
             databuf.appendChar(code.getLVTSize());
             for (int i=0; i<code.varBufferSize; i++) {
@@ -1195,37 +1194,38 @@
                     Type vartype = sym.erasure(types);
                     databuf.appendChar(pool.put(typeSig(vartype)));
                     databuf.appendChar(var.reg);
-                    if (needsLocalVariableTypeEntry(var.sym.type))
+                    if (needsLocalVariableTypeEntry(var.sym.type)) {
                         nGenericVars++;
+                    }
                 }
             }
             endAttr(alenIdx);
             acount++;
-        }
 
-        if (nGenericVars > 0) {
-            int alenIdx = writeAttr(names.LocalVariableTypeTable);
-            databuf.appendChar(nGenericVars);
-            int count = 0;
+            if (nGenericVars > 0) {
+                alenIdx = writeAttr(names.LocalVariableTypeTable);
+                databuf.appendChar(nGenericVars);
+                int count = 0;
 
-            for (int i=0; i<code.varBufferSize; i++) {
-                Code.LocalVar var = code.varBuffer[i];
-                VarSymbol sym = var.sym;
-                if (!needsLocalVariableTypeEntry(sym.type))
-                    continue;
-                for (Code.LocalVar.Range r : var.aliveRanges) {
-                    // write variable info
-                    databuf.appendChar(r.start_pc);
-                    databuf.appendChar(r.length);
-                    databuf.appendChar(pool.put(sym.name));
-                    databuf.appendChar(pool.put(typeSig(sym.type)));
-                    databuf.appendChar(var.reg);
-                    count++;
+                for (int i=0; i<code.varBufferSize; i++) {
+                    Code.LocalVar var = code.varBuffer[i];
+                    VarSymbol sym = var.sym;
+                    if (!needsLocalVariableTypeEntry(sym.type))
+                        continue;
+                    for (Code.LocalVar.Range r : var.aliveRanges) {
+                        // write variable info
+                        databuf.appendChar(r.start_pc);
+                        databuf.appendChar(r.length);
+                        databuf.appendChar(pool.put(sym.name));
+                        databuf.appendChar(pool.put(typeSig(sym.type)));
+                        databuf.appendChar(var.reg);
+                        count++;
+                    }
                 }
+                Assert.check(count == nGenericVars);
+                endAttr(alenIdx);
+                acount++;
             }
-            Assert.check(count == nGenericVars);
-            endAttr(alenIdx);
-            acount++;
         }
 
         if (code.stackMapBufferSize > 0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T8028504/DontGenerateLVTForGNoneOpTest.java	Tue Nov 19 23:35:43 2013 +0000
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8028504
+ * @summary javac generates LocalVariableTable even with -g:none
+ * @compile -g:none DontGenerateLVTForGNoneOpTest.java
+ * @run main DontGenerateLVTForGNoneOpTest
+ */
+
+import java.io.File;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+import java.nio.file.Paths;
+
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.Code_attribute;
+import com.sun.tools.classfile.Method;
+
+public class DontGenerateLVTForGNoneOpTest {
+
+    public static void main(String[] args) throws Exception {
+        new DontGenerateLVTForGNoneOpTest().run();
+    }
+
+    void run() throws Exception {
+        checkClassFile(new File(Paths.get(System.getProperty("test.classes"),
+                this.getClass().getName() + ".class").toUri()));
+    }
+
+    void checkClassFile(final File cfile) throws Exception {
+        ClassFile classFile = ClassFile.read(cfile);
+        for (Method method : classFile.methods) {
+            Code_attribute code = (Code_attribute)method.attributes.get(Attribute.Code);
+            if (code != null) {
+                if (code.attributes.get(Attribute.LocalVariableTable) != null) {
+                    throw new AssertionError("LVT shouldn't be generated for g:none");
+                }
+            }
+        }
+    }
+
+    public void bar() {
+        try {
+            System.out.println();
+        } catch(@TA Exception e) {
+        } catch(Throwable t) {}
+    }
+
+    @Target(ElementType.TYPE_USE)
+    @interface TA {}
+}