--- old/src/share/classes/com/sun/tools/javac/code/Symbol.java 2013-08-19 19:25:48.191160207 -0400 +++ new/src/share/classes/com/sun/tools/javac/code/Symbol.java 2013-08-19 19:25:48.063159069 -0400 @@ -1223,6 +1223,9 @@ /** The extra (synthetic/mandated) parameters of the method. */ public List extraParams = List.nil(); + /** The captured local variables in an anonymous class */ + public List capturedLocals = List.nil(); + /** The parameters of the method. */ public List params = null; --- old/src/share/classes/com/sun/tools/javac/comp/Lower.java 2013-08-19 19:25:48.742165071 -0400 +++ new/src/share/classes/com/sun/tools/javac/comp/Lower.java 2013-08-19 19:25:48.614163933 -0400 @@ -2713,9 +2713,9 @@ for (List l = fvs; l.nonEmpty(); l = l.tail) { if (TreeInfo.isInitialConstructor(tree)) { final Name pName = proxyName(l.head.name); - m.extraParams = - m.extraParams.append((VarSymbol) - (proxies.lookup(pName).sym)); + m.capturedLocals = + m.capturedLocals.append((VarSymbol) + (proxies.lookup(pName).sym)); added = added.prepend( initField(tree.body.pos, pName)); } --- old/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java 2013-08-19 19:25:49.238169466 -0400 +++ new/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java 2013-08-19 19:25:49.111168338 -0400 @@ -657,6 +657,14 @@ databuf.appendChar(pool.put(s.name)); databuf.appendChar(flags); } + // Now write the captured locals + for (VarSymbol s : m.capturedLocals) { + final int flags = + ((int) s.flags() & (FINAL | SYNTHETIC | MANDATED)) | + ((int) m.flags() & SYNTHETIC); + databuf.appendChar(pool.put(s.name)); + databuf.appendChar(flags); + } endAttr(attrIndex); return 1; } else --- old/test/tools/javac/8015701/AnonymousParameters.java 2013-08-19 19:25:49.705173604 -0400 +++ new/test/tools/javac/8015701/AnonymousParameters.java 2013-08-19 19:25:49.580172493 -0400 @@ -31,12 +31,14 @@ import java.lang.Class; import java.lang.reflect.Constructor; import java.lang.reflect.Parameter; -import java.util.concurrent.Callable; +import java.util.List; +import java.util.ArrayList; public class AnonymousParameters { String[] names = { "this$0", + "startSize", "val$message" }; @@ -49,15 +51,15 @@ Constructor ctor = cls.getDeclaredConstructors()[0]; Parameter[] params = ctor.getParameters(); - if(params.length == 2) { - for(int i = 0; i < 2; i++) { + if(params.length == 3) { + for(int i = 0; i < 3; i++) { System.err.println("Testing parameter " + params[i].getName()); if(!params[i].getName().equals(names[i])) error("Expected parameter name " + names[i] + " got " + params[i].getName()); } } else - error("Expected 2 parameters"); + error("Expected 3 parameters"); if(0 != errors) throw new Exception("MethodParameters test failed with " + @@ -74,16 +76,19 @@ class ParameterNames { - public Callable makeInner(final String message) { - return new Callable() { - public String call() throws Exception { - return message; + public ArrayList makeInner(final String message) { + class List extends ArrayList { + public List(int startSize) { + super(startSize); + add(message); } }; + + return new List(2); } public static void main(String... args) throws Exception { ParameterNames test = new ParameterNames(); - System.out.println(test.makeInner("Hello").call()); + System.out.println(test.makeInner("Hello").get(0)); } }