RFR: JDK-8193367: Annotated type variable bounds crash javac

B. Blaser bsrbnd at gmail.com
Thu Jan 24 17:48:25 UTC 2019


On Thu, 24 Jan 2019 at 16:56, Maurizio Cimadamore
<maurizio.cimadamore at oracle.com> wrote:
>
> Urgh - I forgot that getUpperBound was side-effecting things.
>
> That said, this side-effect thing really does come from the very first
> type annotation push back in 2013! Back then the compiler was using a
> different architecture for supporting type annotations (there was an
> explicit AnnotatedType) - so I believe this could be a leftover of that era.
>
> Now that you have properly encapsulated access to the bound, I bet that
> this hack can go away, and you should be able to mimic current behavior
> by overriding the 'getUpperBound' in the cloned type variable.

Yes, as here under (only Type.java, the other files are identical to webrev.00).
Issue and tests are OK, seems good?
Bernard

diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java
@@ -896,7 +896,7 @@
             if (moreInfo && bound != null && !isPrintingBound)
                 try {
                     isPrintingBound = true;
-                    s.append("{:").append(bound.bound).append(":}");
+                    s.append("{:").append(bound.getUpperBound()).append(":}");
                 } finally {
                     isPrintingBound = false;
                 }
@@ -1607,7 +1607,7 @@
          *  itself. Furthermore, the erasure_field of the class
          *  points to the first class or interface bound.
          */
-        public Type bound = null;
+        private Type _bound = null;

         /** The lower bound of this type variable.
          *  TypeVars don't normally have a lower bound, so it is normally set
@@ -1620,7 +1620,7 @@
             super(null, TypeMetadata.EMPTY);
             Assert.checkNonNull(lower);
             tsym = new TypeVariableSymbol(0, name, this, owner);
-            this.bound = null;
+            this.setUpperBound(null);
             this.lower = lower;
         }

@@ -1632,15 +1632,20 @@
                        TypeMetadata metadata) {
             super(tsym, metadata);
             Assert.checkNonNull(lower);
-            this.bound = bound;
+            this.setUpperBound(bound);
             this.lower = lower;
         }

         @Override
         public TypeVar cloneWithMetadata(TypeMetadata md) {
-            return new TypeVar(tsym, bound, lower, md) {
+            return new TypeVar(tsym, getUpperBound(), lower, md) {
                 @Override
                 public Type baseType() { return TypeVar.this.baseType(); }
+
+                @Override @DefinedBy(Api.LANGUAGE_MODEL)
+                public Type getUpperBound() { return
TypeVar.this.getUpperBound(); }
+
+                public void setUpperBound(Type bound) {
TypeVar.this.setUpperBound(bound); }
             };
         }

@@ -1655,12 +1660,9 @@
         }

         @Override @DefinedBy(Api.LANGUAGE_MODEL)
-        public Type getUpperBound() {
-            if ((bound == null || bound.hasTag(NONE)) && this != tsym.type) {
-                bound = tsym.type.getUpperBound();
-            }
-            return bound;
-        }
+        public Type getUpperBound() { return _bound; }
+
+        public void setUpperBound(Type bound) { this._bound = bound; }

         int rank_field = -1;

@@ -1709,7 +1711,7 @@
                             WildcardType wildcard) {
             super(name, owner, lower);
             this.lower = Assert.checkNonNull(lower);
-            this.bound = upper;
+            this.setUpperBound(upper);
             this.wildcard = wildcard;
         }

@@ -1725,9 +1727,14 @@

         @Override
         public CapturedType cloneWithMetadata(TypeMetadata md) {
-            return new CapturedType(tsym, bound, bound, lower, wildcard, md) {
+            return new CapturedType(tsym, getUpperBound(),
getUpperBound(), lower, wildcard, md) {
                 @Override
                 public Type baseType() { return CapturedType.this.baseType(); }
+
+                @Override @DefinedBy(Api.LANGUAGE_MODEL)
+                public Type getUpperBound() { return
CapturedType.this.getUpperBound(); }
+
+                public void setUpperBound(Type bound) {
CapturedType.this.setUpperBound(bound); }
             };
         }

@@ -1832,7 +1839,7 @@

         public void complete() {
             for (List<Type> l = tvars; l.nonEmpty(); l = l.tail) {
-                ((TypeVar)l.head).bound.complete();
+                ((TypeVar)l.head).getUpperBound().complete();
             }
             qtype.complete();
         }


More information about the compiler-dev mailing list