Variables brought into inner functions are still mutable reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 04 Dec 2012 12:44:33 +0100
branchreflection
changeset 253962a24ecd8f8
parent 252 55d2676f82c9
child 254 d0013f44e9b1
Variables brought into inner functions are still mutable
emul/src/main/java/java/lang/AnnotationImpl.java
     1.1 --- a/emul/src/main/java/java/lang/AnnotationImpl.java	Tue Dec 04 12:23:06 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/AnnotationImpl.java	Tue Dec 04 12:44:33 2012 +0100
     1.3 @@ -16,12 +16,20 @@
     1.4          return getClass();
     1.5      }
     1.6  
     1.7 -    @JavaScriptBody(args = { "a", "n", "values" }, body =
     1.8 -          "var v = values;"
     1.9 -        + "for (p in values) {"
    1.10 -        + "  a[p] = function() { return v[p]; }"
    1.11 -        + "}"
    1.12 -        + "a['$instOf_' + n] = true;"
    1.13 +    @JavaScriptBody(args = { "a", "n", "values" }, body = ""
    1.14 +        + "function f(v, p) {\n"
    1.15 +        + "  var val = v;\n"
    1.16 +        + "  var prop = p;\n"
    1.17 +        + "  return function() {\n"
    1.18 +        + "    return val[prop];\n"
    1.19 +        + "  };\n"
    1.20 +        + "}\n"
    1.21 +        + "var props = Object.getOwnPropertyNames(values);\n"
    1.22 +        + "for (var i = 0; i < props.length; i++) {\n"
    1.23 +        + "  var p = props[i];\n"
    1.24 +        + "  a[p] = new f(values, p);\n"
    1.25 +        + "}\n"
    1.26 +        + "a['$instOf_' + n] = true;\n"
    1.27          + "return a;"
    1.28      )
    1.29      private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {