Need to make sure all VALUES fields of enums are exported closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 13 May 2014 11:27:01 +0200
branchclosure
changeset 1561f6200b8decc4
parent 1560 2e415b91c046
child 1562 761c0938ed82
Need to make sure all VALUES fields of enums are exported
rt/emul/compact/src/main/java/java/util/EnumMap.java
rt/emul/compact/src/main/java/java/util/EnumSet.java
rt/emul/mini/src/main/java/java/lang/Enum.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java
     1.1 --- a/rt/emul/compact/src/main/java/java/util/EnumMap.java	Mon May 12 16:40:57 2014 +0200
     1.2 +++ b/rt/emul/compact/src/main/java/java/util/EnumMap.java	Tue May 13 11:27:01 2014 +0200
     1.3 @@ -737,7 +737,7 @@
     1.4       * Returns all of the values comprising K.
     1.5       * The result is uncloned, cached, and shared by all callers.
     1.6       */
     1.7 -    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;")
     1.8 +    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();")
     1.9      private static native <K extends Enum<K>> K[] getKeyUniverse(Class<K> keyType);
    1.10  
    1.11      private static final long serialVersionUID = 458661240069192865L;
     2.1 --- a/rt/emul/compact/src/main/java/java/util/EnumSet.java	Mon May 12 16:40:57 2014 +0200
     2.2 +++ b/rt/emul/compact/src/main/java/java/util/EnumSet.java	Tue May 13 11:27:01 2014 +0200
     2.3 @@ -384,7 +384,7 @@
     2.4       * Returns all of the values comprising E.
     2.5       * The result is uncloned, cached, and shared by all callers.
     2.6       */
     2.7 -    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;")
     2.8 +    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();")
     2.9      private static native <E extends Enum<E>> E[] getUniverse(Class<E> elementType);
    2.10  
    2.11      /**
     3.1 --- a/rt/emul/mini/src/main/java/java/lang/Enum.java	Mon May 12 16:40:57 2014 +0200
     3.2 +++ b/rt/emul/mini/src/main/java/java/lang/Enum.java	Tue May 13 11:27:01 2014 +0200
     3.3 @@ -235,7 +235,7 @@
     3.4          throw new IllegalArgumentException();
     3.5      }
     3.6      
     3.7 -    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.fld_$VALUES;")
     3.8 +    @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.prototype['_$VALUES']();")
     3.9      private static native Object[] values(Class<?> enumType);
    3.10  
    3.11      /**
     4.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java	Mon May 12 16:40:57 2014 +0200
     4.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java	Tue May 13 11:27:01 2014 +0200
     4.3 @@ -55,8 +55,20 @@
     4.4      }
     4.5  
     4.6      boolean isExported(FieldData fieldData) throws IOException {
     4.7 -        return isAccessible(fieldData.access) && isExported(fieldData.cls)
     4.8 -                   || isMarkedAsExported(fieldData);
     4.9 +        if (
    4.10 +            isAccessible(fieldData.access) && 
    4.11 +            isExported(fieldData.cls) || isMarkedAsExported(fieldData)
    4.12 +        ) {
    4.13 +            return true;
    4.14 +        }
    4.15 +        if (
    4.16 +            fieldData.isStatic() && fieldData.getName().equals("$VALUES") &&
    4.17 +            "java/lang/Enum".equals(fieldData.cls.getSuperClassName())
    4.18 +        ) {
    4.19 +            // enum values need to be exported
    4.20 +            return true;
    4.21 +        }
    4.22 +        return false;
    4.23      }
    4.24  
    4.25      private boolean isMarkedAsExportedPackage(String pkgName) {