]> source.dussan.org Git - aspectj.git/commitdiff
Fix for Bug 82570: Weaved code does not include debug lines
authoraclement <aclement>
Wed, 19 Jan 2005 09:36:46 +0000 (09:36 +0000)
committeraclement <aclement>
Wed, 19 Jan 2005 09:36:46 +0000 (09:36 +0000)
tests/.classpath
tests/bugs150/PR82570_1.java [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc150/Ajc150TestsNoHarness.java
weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java

index c312f108f4d8bc865afbd076c61d84573fef9c75..148ca222993ff6e8a9c09aa9545d71b3ecf4c6f3 100644 (file)
@@ -10,5 +10,6 @@
        <classpathentry kind="src" path="/bridge"/>
        <classpathentry kind="src" path="/ajde"/>
        <classpathentry kind="src" path="/asm"/>
+       <classpathentry sourcepath="/lib/bcel/bcel-src.zip" kind="lib" path="/lib/bcel/bcel.jar"/>
        <classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/tests/bugs150/PR82570_1.java b/tests/bugs150/PR82570_1.java
new file mode 100644 (file)
index 0000000..074ad22
--- /dev/null
@@ -0,0 +1,32 @@
+
+public class PR82570_1 {
+  public static void main(String[] args) {
+       new PR82570_1().m();
+  }
+  
+  public void m() {
+       
+  }
+}
+
+aspect X {
+       
+       
+       public PR82570_1.new(String p) {}
+       
+       public int PR82570_1.itdField;
+       
+       public void PR82570_1.itdMethod(String s) {
+               
+       }
+       
+       before(): call(* m(..)) {
+               System.err.println("m");
+       }
+       
+       void around(): call(* m(..)) {
+               
+       }
+       
+}
+
index e0b22155aca9ab5142bb665a54acd65ce6b1fb7e..44c65430a437b2d731bea66904ac373fa80c95e0 100644 (file)
@@ -12,6 +12,10 @@ package org.aspectj.systemtest.ajc150;
 
 import java.io.File;
 
+import org.aspectj.apache.bcel.classfile.JavaClass;
+import org.aspectj.apache.bcel.classfile.Method;
+import org.aspectj.apache.bcel.util.ClassPath;
+import org.aspectj.apache.bcel.util.SyntheticRepository;
 import org.aspectj.tools.ajc.CompilationResult;
 
 
@@ -31,10 +35,60 @@ public class Ajc150TestsNoHarness extends TestUtils {
        if (verbose) {System.err.println(rR.getStdErr());}
   }
   
+  
   public void testIncorrectExceptionTableWhenReturnInMethod_pr79554() {
        CompilationResult cR=ajc(baseDir,new String[]{"PR79554.java"});
        if (verbose) { System.err.println(cR); System.err.println(cR.getStandardError());}
        RunResult rR = run("PR79554");
        if (verbose) {System.err.println(rR.getStdErr());}
   }
+  
+  
+  public void testMissingDebugInfoForGeneratedMethods_pr82570() throws ClassNotFoundException {
+       boolean f = false;
+    CompilationResult cR = ajc(baseDir,new String[]{"PR82570_1.java"});
+    System.err.println(cR.getStandardError());
+    assertTrue("Expected no compile problem:"+cR,!cR.hasErrorMessages());
+    JavaClass jc = getClassFrom(ajc.getSandboxDirectory(),"PR82570_1");
+    Method[] meths = jc.getMethods();
+    for (int i = 0; i < meths.length; i++) {
+               Method method = meths[i];
+               if (f) System.err.println("Line number table for "+method.getName()+method.getSignature()+" = "+method.getLineNumberTable());
+               assertTrue("Didn't find a line number table for method "+method.getName()+method.getSignature(),
+                               method.getLineNumberTable()!=null);
+       }
+
+    // This test would determine the info isn't there if you pass -g:none ...
+//    cR = ajc(baseDir,new String[]{"PR82570_1.java","-g:none"});
+//    assertTrue("Expected no compile problem:"+cR,!cR.hasErrorMessages());
+//    System.err.println(cR.getStandardError());
+//    jc = getClassFrom(ajc.getSandboxDirectory(),"PR82570_1");
+//    meths = jc.getMethods();
+//    for (int i = 0; i < meths.length; i++) {
+//             Method method = meths[i];
+//             assertTrue("Found a line number table for method "+method.getName(),
+//                             method.getLineNumberTable()==null);
+//     }
+  }
+  
+  
+  
+  
+  
+  
+  
+  
+  ///////////////////////////////////////// TESTCASE HELPER METHODS BELOW HERE //////////////////////////
+  
+  // Some util methods for accessing .class contents as BCEL objects
+  
+  public SyntheticRepository createRepos(File cpentry) {
+       ClassPath cp = new ClassPath(cpentry+File.pathSeparator+System.getProperty("java.class.path"));
+       return SyntheticRepository.getInstance(cp);
+  }
+  
+  private JavaClass getClassFrom(File where,String clazzname) throws ClassNotFoundException {
+       SyntheticRepository repos = createRepos(where);
+       return repos.loadClass(clazzname);
+  }
 }
\ No newline at end of file
index 88f3978183e8fc16f37a4d1bcfd8cc2f82c952b5..5da038ef6eb5b71ef95bea358c566b0e12089d54 100644 (file)
@@ -970,7 +970,14 @@ public final class LazyMethodGen {
                 (InstructionHandle) localVariableStarts.get(tag),
                 (InstructionHandle) localVariableEnds.get(tag));
         }
-
+        
+        // JAVAC adds line number tables (with just one entry) to generated accessor methods - this
+        // keeps some tools that rely on finding at least some form of linenumbertable happy.
+        // Let's check if we have one - if we don't then let's add one.
+        // TODO Could be made conditional on whether line debug info is being produced
+        if (gen.getLineNumbers().length==0) { 
+               gen.addLineNumber(gen.getInstructionList().getStart(),1);
+        }
     }
 
        /** This procedure should not currently be used.