--- a/.hgtags Thu Dec 02 23:44:01 2010 -0800
+++ b/.hgtags Sun Dec 05 15:26:16 2010 -0800
@@ -93,3 +93,4 @@
a4e6aa1f45ad23a6f083ed98d970b5006ea4d292 jdk7-b116
228e73f288c543a8c34e2a54227103ae5649e6af jdk7-b117
2e876e59938a853934aa738c811b26c452bd9fe8 jdk7-b118
+4951967a61b4dbbf514828879f57bd1a0d4b420b jdk7-b119
--- a/.hgtags-top-repo Thu Dec 02 23:44:01 2010 -0800
+++ b/.hgtags-top-repo Sun Dec 05 15:26:16 2010 -0800
@@ -93,3 +93,4 @@
94e9a1bfba8b8d1fe0bfd43b88629b1f27b02a76 jdk7-b116
7220e60b097fa027e922f1aeecdd330f3e37409f jdk7-b117
a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118
+661360bef6ccad6c119f067f5829b207de80c936 jdk7-b119
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -74,6 +74,7 @@
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
+import com.sun.corba.se.spi.protocol.RetryType;
import com.sun.corba.se.spi.transport.CorbaContactInfo;
import com.sun.corba.se.spi.transport.CorbaContactInfoList;
import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator;
@@ -110,7 +111,7 @@
// The current retry request status. True if this request is being
// retried and this info object is to be reused, or false otherwise.
- private boolean retryRequest;
+ private RetryType retryRequest;
// The number of times this info object has been (re)used. This is
// incremented every time a request is retried, and decremented every
@@ -163,7 +164,8 @@
// Please keep these in the same order that they're declared above.
- retryRequest = false;
+ // 6763340
+ retryRequest = RetryType.NONE;
// Do not reset entryCount because we need to know when to pop this
// from the stack.
@@ -824,14 +826,15 @@
/**
* Set or reset the retry request flag.
*/
- void setRetryRequest( boolean retryRequest ) {
+ void setRetryRequest( RetryType retryRequest ) {
this.retryRequest = retryRequest;
}
/**
* Retrieve the current retry request status.
*/
- boolean getRetryRequest() {
+ RetryType getRetryRequest() {
+ // 6763340
return this.retryRequest;
}
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PIHandlerImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PIHandlerImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -70,6 +70,7 @@
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
import com.sun.corba.se.spi.protocol.ForwardException;
import com.sun.corba.se.spi.protocol.PIHandler;
+import com.sun.corba.se.spi.protocol.RetryType;
import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.impl.logging.InterceptorsSystemException;
@@ -372,9 +373,24 @@
}
}
- public Exception invokeClientPIEndingPoint(
- int replyStatus, Exception exception )
- {
+ // Needed when an error forces a retry AFTER initiateClientPIRequest
+ // but BEFORE invokeClientPIStartingPoint.
+ public Exception makeCompletedClientRequest( int replyStatus,
+ Exception exception ) {
+
+ // 6763340
+ return handleClientPIEndingPoint( replyStatus, exception, false ) ;
+ }
+
+ public Exception invokeClientPIEndingPoint( int replyStatus,
+ Exception exception ) {
+
+ // 6763340
+ return handleClientPIEndingPoint( replyStatus, exception, true ) ;
+ }
+
+ public Exception handleClientPIEndingPoint(
+ int replyStatus, Exception exception, boolean invokeEndingPoint ) {
if( !hasClientInterceptors ) return exception;
if( !isClientPIEnabledForThisThread() ) return exception;
@@ -388,24 +404,31 @@
ClientRequestInfoImpl info = peekClientRequestInfoImplStack();
info.setReplyStatus( piReplyStatus );
info.setException( exception );
- interceptorInvoker.invokeClientInterceptorEndingPoint( info );
- piReplyStatus = info.getReplyStatus();
+
+ if (invokeEndingPoint) {
+ // 6763340
+ interceptorInvoker.invokeClientInterceptorEndingPoint( info );
+ piReplyStatus = info.getReplyStatus();
+ }
// Check reply status:
if( (piReplyStatus == LOCATION_FORWARD.value) ||
- (piReplyStatus == TRANSPORT_RETRY.value) )
- {
+ (piReplyStatus == TRANSPORT_RETRY.value) ) {
// If this is a forward or a retry, reset and reuse
// info object:
info.reset();
- info.setRetryRequest( true );
+
+ // fix for 6763340:
+ if (invokeEndingPoint) {
+ info.setRetryRequest( RetryType.AFTER_RESPONSE ) ;
+ } else {
+ info.setRetryRequest( RetryType.BEFORE_RESPONSE ) ;
+ }
// ... and return a RemarshalException so the orb internals know
exception = new RemarshalException();
- }
- else if( (piReplyStatus == SYSTEM_EXCEPTION.value) ||
- (piReplyStatus == USER_EXCEPTION.value) )
- {
+ } else if( (piReplyStatus == SYSTEM_EXCEPTION.value) ||
+ (piReplyStatus == USER_EXCEPTION.value) ) {
exception = info.getException();
}
@@ -421,18 +444,21 @@
RequestInfoStack infoStack =
(RequestInfoStack)threadLocalClientRequestInfoStack.get();
ClientRequestInfoImpl info = null;
- if( !infoStack.empty() ) info =
- (ClientRequestInfoImpl)infoStack.peek();
- if( !diiRequest && (info != null) && info.isDIIInitiate() ) {
+ if (!infoStack.empty() ) {
+ info = (ClientRequestInfoImpl)infoStack.peek();
+ }
+
+ if (!diiRequest && (info != null) && info.isDIIInitiate() ) {
// In RequestImpl.doInvocation we already called
// initiateClientPIRequest( true ), so ignore this initiate.
info.setDIIInitiate( false );
- }
- else {
+ } else {
// If there is no info object or if we are not retrying a request,
// push a new ClientRequestInfoImpl on the stack:
- if( (info == null) || !info.getRetryRequest() ) {
+
+ // 6763340: don't push unless this is not a retry
+ if( (info == null) || !info.getRetryRequest().isRetry() ) {
info = new ClientRequestInfoImpl( orb );
infoStack.push( info );
printPush();
@@ -442,9 +468,15 @@
// Reset the retry request flag so that recursive calls will
// push a new info object, and bump up entry count so we know
// when to pop this info object:
- info.setRetryRequest( false );
+ info.setRetryRequest( RetryType.NONE );
info.incrementEntryCount();
+ // KMC 6763340: I don't know why this wasn't set earlier,
+ // but we do not want a retry to pick up the previous
+ // reply status, so clear it here. Most likely a new
+ // info was pushed before, so that this was not a problem.
+ info.setReplyStatus( RequestInfoImpl.UNINITIALIZED ) ;
+
// If this is a DII request, make sure we ignore the next initiate.
if( diiRequest ) {
info.setDIIInitiate( true );
@@ -457,25 +489,34 @@
if( !isClientPIEnabledForThisThread() ) return;
ClientRequestInfoImpl info = peekClientRequestInfoImplStack();
+ RetryType rt = info.getRetryRequest() ;
- // If the replyStatus has not yet been set, this is an indication
- // that the ORB threw an exception before we had a chance to
- // invoke the client interceptor ending points.
- //
- // _REVISIT_ We cannot handle any exceptions or ForwardRequests
- // flagged by the ending points here because there is no way
- // to gracefully handle this in any of the calling code.
- // This is a rare corner case, so we will ignore this for now.
- short replyStatus = info.getReplyStatus();
- if( replyStatus == info.UNINITIALIZED ) {
- invokeClientPIEndingPoint( ReplyMessage.SYSTEM_EXCEPTION,
- wrapper.unknownRequestInvoke(
- CompletionStatus.COMPLETED_MAYBE ) ) ;
+ // fix for 6763340
+ if (!rt.equals( RetryType.BEFORE_RESPONSE )) {
+
+ // If the replyStatus has not yet been set, this is an indication
+ // that the ORB threw an exception before we had a chance to
+ // invoke the client interceptor ending points.
+ //
+ // _REVISIT_ We cannot handle any exceptions or ForwardRequests
+ // flagged by the ending points here because there is no way
+ // to gracefully handle this in any of the calling code.
+ // This is a rare corner case, so we will ignore this for now.
+ short replyStatus = info.getReplyStatus();
+ if (replyStatus == info.UNINITIALIZED ) {
+ invokeClientPIEndingPoint( ReplyMessage.SYSTEM_EXCEPTION,
+ wrapper.unknownRequestInvoke(
+ CompletionStatus.COMPLETED_MAYBE ) ) ;
+ }
}
// Decrement entry count, and if it is zero, pop it from the stack.
info.decrementEntryCount();
- if( info.getEntryCount() == 0 ) {
+
+ // fix for 6763340, and probably other cases (non-recursive retry)
+ if (info.getEntryCount() == 0 && !info.getRetryRequest().isRetry()) {
+ // RequestInfoStack<ClientRequestInfoImpl> infoStack =
+ // threadLocalClientRequestInfoStack.get();
RequestInfoStack infoStack =
(RequestInfoStack)threadLocalClientRequestInfoStack.get();
infoStack.pop();
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -107,6 +107,11 @@
return null;
}
+ public Exception makeCompletedClientRequest(
+ int replyStatus, Exception exception ) {
+ return null;
+ }
+
public void initiateClientPIRequest( boolean diiRequest ) {
}
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/RequestInfoImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/interceptors/RequestInfoImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -187,7 +187,8 @@
startingPointCall = 0;
intermediatePointCall = 0;
endingPointCall = 0;
- replyStatus = UNINITIALIZED;
+ // 6763340
+ setReplyStatus( UNINITIALIZED ) ;
currentExecutionPoint = EXECUTION_POINT_STARTING;
alreadyExecuted = false;
connection = null;
--- a/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Sun Dec 05 15:26:16 2010 -0800
@@ -1012,7 +1012,11 @@
* else,
* Handle it as a serializable class.
*/
- if (currentClassDesc.isExternalizable()) {
+ if (Enum.class.isAssignableFrom( clz )) {
+ int ordinal = orbStream.read_long() ;
+ String value = (String)orbStream.read_value( String.class ) ;
+ return Enum.valueOf( clz, value ) ;
+ } else if (currentClassDesc.isExternalizable()) {
try {
currentObject = (currentClass == null) ?
null : currentClassDesc.newInstance();
--- a/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -1672,6 +1672,7 @@
{
StackImpl invocationInfoStack =
(StackImpl)clientInvocationInfoStack.get();
+ int entryCount = -1;
ClientInvocationInfo clientInvocationInfo = null;
if (!invocationInfoStack.empty()) {
clientInvocationInfo =
@@ -1680,8 +1681,12 @@
throw wrapper.invocationInfoStackEmpty() ;
}
clientInvocationInfo.decrementEntryCount();
+ entryCount = clientInvocationInfo.getEntryCount();
if (clientInvocationInfo.getEntryCount() == 0) {
- invocationInfoStack.pop();
+ // 6763340: don't pop if this is a retry!
+ if (!clientInvocationInfo.isRetryInvocation()) {
+ invocationInfoStack.pop();
+ }
finishedDispatch();
}
}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java Sun Dec 05 15:26:16 2010 -0800
@@ -185,6 +185,7 @@
if(getContactInfoListIterator(orb).hasNext()) {
contactInfo = (ContactInfo)
getContactInfoListIterator(orb).next();
+ unregisterWaiter(orb);
return beginRequest(self, opName,
isOneWay, contactInfo);
} else {
@@ -292,10 +293,22 @@
// ContactInfoList outside of subcontract.
// Want to move that update to here.
if (getContactInfoListIterator(orb).hasNext()) {
- contactInfo = (ContactInfo)
- getContactInfoListIterator(orb).next();
+ contactInfo = (ContactInfo)getContactInfoListIterator(orb).next();
+ if (orb.subcontractDebugFlag) {
+ dprint( "RemarshalException: hasNext true\ncontact info " + contactInfo );
+ }
+
+ // Fix for 6763340: Complete the first attempt before starting another.
+ orb.getPIHandler().makeCompletedClientRequest(
+ ReplyMessage.LOCATION_FORWARD, null ) ;
+ unregisterWaiter(orb);
+ orb.getPIHandler().cleanupClientPIRequest() ;
+
return beginRequest(self, opName, isOneWay, contactInfo);
} else {
+ if (orb.subcontractDebugFlag) {
+ dprint( "RemarshalException: hasNext false" );
+ }
ORBUtilSystemException wrapper =
ORBUtilSystemException.get(orb,
CORBALogDomains.RPC_PROTOCOL);
--- a/corba/src/share/classes/com/sun/corba/se/spi/protocol/PIHandler.java Thu Dec 02 23:44:01 2010 -0800
+++ b/corba/src/share/classes/com/sun/corba/se/spi/protocol/PIHandler.java Sun Dec 05 15:26:16 2010 -0800
@@ -142,6 +142,27 @@
int replyStatus, Exception exception ) ;
/**
+ * Called when a retry is needed after initiateClientPIRequest but
+ * before invokeClientPIRequest. In this case, we need to properly
+ * balance initiateClientPIRequest/cleanupClientPIRequest calls,
+ * but WITHOUT extraneous calls to invokeClientPIEndingPoint
+ * (see bug 6763340).
+ *
+ * @param replyStatus One of the constants in iiop.messages.ReplyMessage
+ * indicating which reply status to set.
+ * @param exception The exception before ending interception points have
+ * been invoked, or null if no exception at the moment.
+ * @return The exception to be thrown, after having gone through
+ * all ending points, or null if there is no exception to be
+ * thrown. Note that this exception can be either the same or
+ * different from the exception set using setClientPIException.
+ * There are four possible return types: null (no exception),
+ * SystemException, UserException, or RemarshalException.
+ */
+ Exception makeCompletedClientRequest(
+ int replyStatus, Exception exception ) ;
+
+ /**
* Invoked when a request is about to be created. Must be called before
* any of the setClientPI* methods so that a new info object can be
* prepared for information collection.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/share/classes/com/sun/corba/se/spi/protocol/RetryType.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.corba.se.spi.protocol ;
+
+// Introduce more information about WHY we are re-trying a request
+// so we can properly handle the two cases:
+// - BEFORE_RESPONSE means that the retry is caused by
+// something that happened BEFORE the message was sent: either
+// an exception from the SocketFactory, or one from the
+// Client side send_request interceptor point.
+// - AFTER_RESPONSE means that the retry is a result either of the
+// request sent to the server (from the response), or from the
+// Client side receive_xxx interceptor point.
+public enum RetryType {
+ NONE( false ),
+ BEFORE_RESPONSE( true ),
+ AFTER_RESPONSE( true ) ;
+
+ private final boolean isRetry ;
+
+ RetryType( boolean isRetry ) {
+ this.isRetry = isRetry ;
+ }
+
+ public boolean isRetry() {
+ return this.isRetry ;
+ }
+} ;
+
--- a/jaxp/.hgtags Thu Dec 02 23:44:01 2010 -0800
+++ b/jaxp/.hgtags Sun Dec 05 15:26:16 2010 -0800
@@ -93,3 +93,4 @@
f8d4e6c6cfce1cda23fcbd144628a9791a9e1a63 jdk7-b116
9ee4d96e893436a48607924227dadd2d93b9b00d jdk7-b117
b2f6d9c4f12ffd307a5de40455b2b61b31a5cb79 jdk7-b118
+9ee900f01c5872551c06f33ae909662ffd8463ac jdk7-b119
--- a/jaxws/.hgtags Thu Dec 02 23:44:01 2010 -0800
+++ b/jaxws/.hgtags Sun Dec 05 15:26:16 2010 -0800
@@ -93,3 +93,4 @@
376ac153078dd3b5f6d4a0981feee092c1492c96 jdk7-b116
1320fb3bb588298c79716bd2d10b5b4afacb9370 jdk7-b117
19a2fab3f91a275f90791c15d1c21a24e820ff2d jdk7-b118
+41fa02b3663795ddf529690df7aa6714210093ec jdk7-b119
--- a/jdk/.hgtags Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/.hgtags Sun Dec 05 15:26:16 2010 -0800
@@ -93,3 +93,5 @@
1657ed4e1d86c8aa2028ab5a41f9da1ac4a369f8 jdk7-b116
3e6726bbf80a4254ecd01051c8ed77ee19325e46 jdk7-b117
b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118
+ecab7eefb8f2326fd90fb632f47f1b6f81e928f8 jdk7-b119
+37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120
--- a/jdk/make/sun/xawt/mapfile-vers Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/make/sun/xawt/mapfile-vers Sun Dec 05 15:26:16 2010 -0800
@@ -429,6 +429,7 @@
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
+ Java_sun_awt_X11_GtkFileDialogPeer_initIDs;
Java_sun_awt_X11_GtkFileDialogPeer_run;
Java_sun_awt_X11_GtkFileDialogPeer_quit;
--- a/jdk/src/share/classes/java/awt/Component.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/java/awt/Component.java Sun Dec 05 15:26:16 2010 -0800
@@ -2154,6 +2154,7 @@
*
* @param d the dimension specifying the new size
* of this component
+ * @throws NullPointerException if {@code d} is {@code null}
* @see #setSize
* @see #setBounds
* @see #invalidate
@@ -2351,6 +2352,7 @@
* invalidates the component hierarchy.
*
* @param r the new bounding rectangle for this component
+ * @throws NullPointerException if {@code r} is {@code null}
* @see #getBounds
* @see #setLocation(int, int)
* @see #setLocation(Point)
@@ -4545,6 +4547,7 @@
* where the point's <i>x</i> and <i>y</i> coordinates are defined
* to be relative to the coordinate system of this component.
* @param p the point
+ * @throws NullPointerException if {@code p} is {@code null}
* @see #getComponentAt(Point)
* @since JDK1.1
*/
@@ -5879,7 +5882,7 @@
* @exception ClassCastException if <code>listenerType</code>
* doesn't specify a class or interface that implements
* <code>java.util.EventListener</code>
- *
+ * @throws NullPointerException if {@code listenerType} is {@code null}
* @see #getComponentListeners
* @see #getFocusListeners
* @see #getHierarchyListeners
@@ -8038,6 +8041,7 @@
* Prints a listing of this component to the specified output
* stream.
* @param out a print stream
+ * @throws NullPointerException if {@code out} is {@code null}
* @since JDK1.0
*/
public void list(PrintStream out) {
@@ -8050,6 +8054,7 @@
* @param out a print stream
* @param indent number of spaces to indent
* @see java.io.PrintStream#println(java.lang.Object)
+ * @throws NullPointerException if {@code out} is {@code null}
* @since JDK1.0
*/
public void list(PrintStream out, int indent) {
@@ -8062,6 +8067,7 @@
/**
* Prints a listing to the specified print writer.
* @param out the print writer to print to
+ * @throws NullPointerException if {@code out} is {@code null}
* @since JDK1.1
*/
public void list(PrintWriter out) {
@@ -8073,6 +8079,7 @@
* the specified print writer.
* @param out the print writer to print to
* @param indent the number of spaces to indent
+ * @throws NullPointerException if {@code out} is {@code null}
* @see java.io.PrintStream#println(java.lang.Object)
* @since JDK1.1
*/
--- a/jdk/src/share/classes/java/awt/Container.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/java/awt/Container.java Sun Dec 05 15:26:16 2010 -0800
@@ -1231,6 +1231,7 @@
* reflect the changes.
*
* @param comp the component to be removed
+ * @throws NullPointerException if {@code comp} is {@code null}
* @see #add
* @see #invalidate
* @see #validate
@@ -2154,6 +2155,7 @@
* @exception ClassCastException if <code>listenerType</code>
* doesn't specify a class or interface that implements
* <code>java.util.EventListener</code>
+ * @exception NullPointerException if {@code listenerType} is {@code null}
*
* @see #getContainerListeners
*
@@ -2705,6 +2707,7 @@
* If there is no child component at the requested point and the
* point is within the bounds of the container the container itself
* is returned.
+ * @throws NullPointerException if {@code p} is {@code null}
* @see Component#contains
* @see #getComponentAt
* @since 1.2
@@ -2969,6 +2972,7 @@
*
* @param out a print stream
* @param indent the number of spaces to indent
+ * @throws NullPointerException if {@code out} is {@code null}
* @see Component#list(java.io.PrintStream, int)
* @since JDK1.0
*/
@@ -2995,6 +2999,7 @@
*
* @param out a print writer
* @param indent the number of spaces to indent
+ * @throws NullPointerException if {@code out} is {@code null}
* @see Component#list(java.io.PrintWriter, int)
* @since JDK1.1
*/
--- a/jdk/src/share/classes/java/awt/ScrollPane.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/java/awt/ScrollPane.java Sun Dec 05 15:26:16 2010 -0800
@@ -377,6 +377,7 @@
* This is a convenience method which interfaces with the Adjustable
* objects which represent the state of the scrollbars.
* @param p the Point representing the position to scroll to
+ * @throws NullPointerException if {@code p} is {@code null}
*/
public void setScrollPosition(Point p) {
setScrollPosition(p.x, p.y);
--- a/jdk/src/share/classes/java/awt/Window.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/java/awt/Window.java Sun Dec 05 15:26:16 2010 -0800
@@ -1888,6 +1888,7 @@
* @exception ClassCastException if <code>listenerType</code>
* doesn't specify a class or interface that implements
* <code>java.util.EventListener</code>
+ * @exception NullPointerException if {@code listenerType} is {@code null}
*
* @see #getWindowListeners
* @since 1.3
--- a/jdk/src/share/classes/javax/swing/GroupLayout.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/javax/swing/GroupLayout.java Sun Dec 05 15:26:16 2010 -0800
@@ -653,6 +653,10 @@
*/
public ParallelGroup createParallelGroup(Alignment alignment,
boolean resizable){
+ if (alignment == null) {
+ throw new IllegalArgumentException("alignment must be non null");
+ }
+
if (alignment == Alignment.BASELINE) {
return new BaselineGroup(resizable);
}
--- a/jdk/src/share/classes/javax/swing/JComponent.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/javax/swing/JComponent.java Sun Dec 05 15:26:16 2010 -0800
@@ -4734,6 +4734,8 @@
* Notifies this component that it now has a parent component.
* When this method is invoked, the chain of parent components is
* set up with <code>KeyboardAction</code> event listeners.
+ * This method is called by the toolkit internally and should
+ * not be called directly by programs.
*
* @see #registerKeyboardAction
*/
@@ -4750,6 +4752,8 @@
* Notifies this component that it no longer has a parent component.
* When this method is invoked, any <code>KeyboardAction</code>s
* set up in the the chain of parent components are removed.
+ * This method is called by the toolkit internally and should
+ * not be called directly by programs.
*
* @see #registerKeyboardAction
*/
--- a/jdk/src/share/classes/javax/swing/Popup.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/javax/swing/Popup.java Sun Dec 05 15:26:16 2010 -0800
@@ -156,7 +156,8 @@
component.setLocation(ownerX, ownerY);
component.getContentPane().add(contents, BorderLayout.CENTER);
- contents.invalidate();
+ component.invalidate();
+ component.validate();
if(component.isVisible()) {
// Do not call pack() if window is not visible to
// avoid early native peer creation
--- a/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Sun Dec 05 15:26:16 2010 -0800
@@ -113,6 +113,14 @@
* @exception BadLocationException if the specified location is invalid
*/
public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter p) throws BadLocationException {
+ if (p0 < 0) {
+ throw new BadLocationException("Invalid start offset", p0);
+ }
+
+ if (p1 < p0) {
+ throw new BadLocationException("Invalid end offset", p1);
+ }
+
Document doc = component.getDocument();
HighlightInfo i = (getDrawsLayeredHighlights() &&
(p instanceof LayeredHighlighter.LayerPainter)) ?
@@ -217,6 +225,14 @@
* @exception BadLocationException if the specified location is invalid
*/
public void changeHighlight(Object tag, int p0, int p1) throws BadLocationException {
+ if (p0 < 0) {
+ throw new BadLocationException("Invalid beginning of the range", p0);
+ }
+
+ if (p1 < p0) {
+ throw new BadLocationException("Invalid end of the range", p1);
+ }
+
Document doc = component.getDocument();
if (tag instanceof LayeredHighlightInfo) {
LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
--- a/jdk/src/share/classes/sun/awt/UngrabEvent.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/share/classes/sun/awt/UngrabEvent.java Sun Dec 05 15:26:16 2010 -0800
@@ -40,8 +40,10 @@
* <p>To listen for this event, install AWTEventListener with {@value sun.awt.SunToolkit#GRAB_EVENT_MASK}
*/
public class UngrabEvent extends AWTEvent {
+ private final static int UNGRAB_EVENT_ID = 1998;
+
public UngrabEvent(Component source) {
- super(source, 0xffff);
+ super(source, UNGRAB_EVENT_ID);
}
public String toString() {
--- a/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Sun Dec 05 15:26:16 2010 -0800
@@ -42,11 +42,19 @@
private FileDialog fd;
+ // A pointer to the native GTK FileChooser widget
+ private volatile long widget = 0L;
+
public GtkFileDialogPeer(FileDialog fd) {
super((Dialog) fd);
this.fd = fd;
}
+ private static native void initIDs();
+ static {
+ initIDs();
+ }
+
private native void run(String title, int mode, String dir, String file,
FilenameFilter filter, boolean isMultipleMode);
--- a/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Sun Dec 05 15:26:16 2010 -0800
@@ -2773,11 +2773,6 @@
}
}
- /*
- scrollBugWorkAround =
- (strcmp(XServerVendor(awt_display), "Sun Microsystems, Inc.") == 0
- && XVendorRelease(awt_display) == 3400);
- */
scrollBugWorkAround = TRUE;
/*
--- a/jdk/src/solaris/native/sun/awt/fontpath.c Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/native/sun/awt/fontpath.c Sun Dec 05 15:26:16 2010 -0800
@@ -557,7 +557,8 @@
#ifndef HEADLESS
static int isSunXServer() {
#ifdef __solaris__
- return (strcmp("Sun Microsystems, Inc.", ServerVendor(awt_display)) == 0 &&
+ return ((strncmp(ServerVendor(awt_display), "Sun Microsystems, Inc.", 22) == 0) ||
+ (strncmp(ServerVendor(awt_display), "Oracle Corporation", 18) == 0) &&
VendorRelease(awt_display) >= 6410);
#else
return 0;
--- a/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Sun Dec 05 15:26:16 2010 -0800
@@ -4,13 +4,29 @@
#include <string.h>
#include "gtk2_interface.h"
#include "sun_awt_X11_GtkFileDialogPeer.h"
+#include "debug_assert.h"
static JavaVM *jvm;
-static GtkWidget *dialog = NULL;
/* To cache some method IDs */
static jmethodID filenameFilterCallbackMethodID = NULL;
static jmethodID setFileInternalMethodID = NULL;
+static jfieldID widgetFieldID = NULL;
+
+JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
+(JNIEnv *env, jclass cx)
+{
+ filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx,
+ "filenameFilterCallback", "(Ljava/lang/String;)Z");
+ DASSERT(filenameFilterCallbackMethodID != NULL);
+
+ setFileInternalMethodID = (*env)->GetMethodID(env, cx,
+ "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V");
+ DASSERT(setFileInternalMethodID != NULL);
+
+ widgetFieldID = (*env)->GetFieldID(env, cx, "widget", "J");
+ DASSERT(widgetFieldID != NULL);
+}
static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj)
{
@@ -20,30 +36,17 @@
env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
- if (filenameFilterCallbackMethodID == NULL) {
- cx = (*env)->GetObjectClass(env, (jobject) obj);
- if (cx == NULL) {
- JNU_ThrowInternalError(env, "Could not get file filter class");
- return 0;
- }
-
- filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx,
- "filenameFilterCallback", "(Ljava/lang/String;)Z");
- if (filenameFilterCallbackMethodID == NULL) {
- JNU_ThrowInternalError(env,
- "Could not get filenameFilterCallback method id");
- return 0;
- }
- }
-
filename = (*env)->NewStringUTF(env, filter_info->filename);
return (*env)->CallBooleanMethod(env, obj, filenameFilterCallbackMethodID,
filename);
}
-static void quit(gboolean isSignalHandler)
+static void quit(JNIEnv * env, jobject jpeer, gboolean isSignalHandler)
{
+ GtkWidget * dialog = (GtkWidget*)jlong_to_ptr(
+ (*env)->GetLongField(env, jpeer, widgetFieldID));
+
if (dialog != NULL)
{
// Callbacks from GTK signals are made within the GTK lock
@@ -57,7 +60,8 @@
fp_gtk_widget_destroy (dialog);
fp_gtk_main_quit ();
- dialog = NULL;
+
+ (*env)->SetLongField(env, jpeer, widgetFieldID, 0);
if (!isSignalHandler) {
fp_gdk_threads_leave();
@@ -73,7 +77,7 @@
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit
(JNIEnv * env, jobject jpeer)
{
- quit(FALSE);
+ quit(env, jpeer, FALSE);
}
/**
@@ -132,24 +136,8 @@
if (responseId == GTK_RESPONSE_ACCEPT) {
current_folder = fp_gtk_file_chooser_get_current_folder(
- GTK_FILE_CHOOSER(dialog));
- filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
- }
-
- if (setFileInternalMethodID == NULL) {
- cx = (*env)->GetObjectClass(env, (jobject) obj);
- if (cx == NULL) {
- JNU_ThrowInternalError(env, "Could not get GTK peer class");
- return;
- }
-
- setFileInternalMethodID = (*env)->GetMethodID(env, cx,
- "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V");
- if (setFileInternalMethodID == NULL) {
- JNU_ThrowInternalError(env,
- "Could not get setFileInternalMethodID method id");
- return;
- }
+ GTK_FILE_CHOOSER(aDialog));
+ filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog));
}
jcurrent_folder = (*env)->NewStringUTF(env, current_folder);
@@ -159,7 +147,7 @@
jfilenames);
fp_g_free(current_folder);
- quit(TRUE);
+ quit(env, (jobject)obj, TRUE);
}
/*
@@ -172,6 +160,7 @@
jstring jtitle, jint mode, jstring jdir, jstring jfile,
jobject jfilter, jboolean multiple)
{
+ GtkWidget *dialog = NULL;
GtkFileFilter *filter;
if (jvm == NULL) {
@@ -233,8 +222,12 @@
fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
handle_response), jpeer);
+
+ (*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog));
+
fp_gtk_widget_show(dialog);
fp_gtk_main();
fp_gdk_threads_leave();
}
+
--- a/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Sun Dec 05 15:26:16 2010 -0800
@@ -11,6 +11,14 @@
/*
* Class: sun_awt_X11_GtkFileDialogPeer
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
+(JNIEnv *, jclass);
+
+/*
+ * Class: sun_awt_X11_GtkFileDialogPeer
* Method: run
* Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;Z;)V
*/
--- a/jdk/src/solaris/native/sun/xawt/XWindow.c Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/solaris/native/sun/xawt/XWindow.c Sun Dec 05 15:26:16 2010 -0800
@@ -766,7 +766,9 @@
static Boolean
isXsunServer(XEvent *event) {
if( awt_ServerDetected ) return awt_IsXsun;
- if( strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 32) ) {
+ if( (strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 22) != 0) &&
+ (strncmp( ServerVendor( event->xkey.display ), "Oracle Corporation", 18) != 0) )
+ {
awt_ServerDetected = True;
awt_IsXsun = False;
return False;
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Sun Dec 05 15:26:16 2010 -0800
@@ -6084,63 +6084,67 @@
void AwtComponent::_SetRectangularShape(void *param)
{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
- SetRectangularShapeStruct *data = (SetRectangularShapeStruct *)param;
- jobject self = data->component;
- jint x1 = data->x1;
- jint x2 = data->x2;
- jint y1 = data->y1;
- jint y2 = data->y2;
- jobject region = data->region;
-
- AwtComponent *c = NULL;
-
- PDATA pData;
- JNI_CHECK_PEER_GOTO(self, ret);
-
- c = (AwtComponent *)pData;
- if (::IsWindow(c->GetHWnd())) {
- HRGN hRgn = NULL;
- if (region || x1 || x2 || y1 || y2) {
- // If all the params are zeros, the shape must be simply reset.
- // Otherwise, convert it into a region.
- RGNDATA *pRgnData = NULL;
- RGNDATAHEADER *pRgnHdr;
-
- /* reserving memory for the worst case */
- size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1));
- pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) +
- sizeof(RECT_T) * worstBufferSize);
- pRgnHdr = (RGNDATAHEADER *) pRgnData;
-
- pRgnHdr->dwSize = sizeof(RGNDATAHEADER);
- pRgnHdr->iType = RDH_RECTANGLES;
- pRgnHdr->nRgnSize = 0;
- pRgnHdr->rcBound.top = 0;
- pRgnHdr->rcBound.left = 0;
- pRgnHdr->rcBound.bottom = LONG(y2 - y1);
- pRgnHdr->rcBound.right = LONG(x2 - x1);
-
- RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER));
- pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize);
-
- hRgn = ::ExtCreateRegion(NULL,
- sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData);
-
- free(pRgnData);
+ if (!AwtToolkit::IsMainThread()) {
+ AwtToolkit::GetInstance().InvokeFunction(AwtComponent::_SetRectangularShape, param);
+ } else {
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ SetRectangularShapeStruct *data = (SetRectangularShapeStruct *)param;
+ jobject self = data->component;
+ jint x1 = data->x1;
+ jint x2 = data->x2;
+ jint y1 = data->y1;
+ jint y2 = data->y2;
+ jobject region = data->region;
+
+ AwtComponent *c = NULL;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+
+ c = (AwtComponent *)pData;
+ if (::IsWindow(c->GetHWnd())) {
+ HRGN hRgn = NULL;
+ if (region || x1 || x2 || y1 || y2) {
+ // If all the params are zeros, the shape must be simply reset.
+ // Otherwise, convert it into a region.
+ RGNDATA *pRgnData = NULL;
+ RGNDATAHEADER *pRgnHdr;
+
+ /* reserving memory for the worst case */
+ size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1));
+ pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) +
+ sizeof(RECT_T) * worstBufferSize);
+ pRgnHdr = (RGNDATAHEADER *) pRgnData;
+
+ pRgnHdr->dwSize = sizeof(RGNDATAHEADER);
+ pRgnHdr->iType = RDH_RECTANGLES;
+ pRgnHdr->nRgnSize = 0;
+ pRgnHdr->rcBound.top = 0;
+ pRgnHdr->rcBound.left = 0;
+ pRgnHdr->rcBound.bottom = LONG(y2 - y1);
+ pRgnHdr->rcBound.right = LONG(x2 - x1);
+
+ RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER));
+ pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize);
+
+ hRgn = ::ExtCreateRegion(NULL,
+ sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData);
+
+ free(pRgnData);
+ }
+
+ ::SetWindowRgn(c->GetHWnd(), hRgn, TRUE);
}
- ::SetWindowRgn(c->GetHWnd(), hRgn, TRUE);
- }
-
ret:
- env->DeleteGlobalRef(self);
- if (region) {
- env->DeleteGlobalRef(region);
- }
-
- delete data;
+ env->DeleteGlobalRef(self);
+ if (region) {
+ env->DeleteGlobalRef(region);
+ }
+
+ delete data;
+ }
}
void AwtComponent::_SetZOrder(void *param) {
--- a/jdk/src/windows/native/sun/windows/awt_Robot.cpp Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/src/windows/native/sun/windows/awt_Robot.cpp Sun Dec 05 15:26:16 2010 -0800
@@ -194,9 +194,9 @@
jint AwtRobot::GetRGBPixel( jint x, jint y)
{
- HDC hdc = GetDC(NULL);
+ HDC hdc = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
COLORREF ref = ::GetPixel( hdc, x, y );
- ReleaseDC(NULL,hdc);
+ ::DeleteDC(hdc);
jint value = WinToJavaPixel(GetRValue(ref), GetGValue(ref), GetBValue(ref));
return value;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Frame/ShapeNotSetSometimes/ShapeNotSetSometimes.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ @test
+ @bug 6988428
+ @summary Tests whether shape is always set
+ @author anthony.petrov@oracle.com: area=awt.toplevel
+ @run main ShapeNotSetSometimes
+*/
+
+
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.awt.geom.*;
+
+
+public class ShapeNotSetSometimes {
+
+ private Frame backgroundFrame;
+ private Frame window;
+ private static final Color BACKGROUND_COLOR = Color.BLUE;
+ private Shape shape;
+ private int[][] pointsToCheck;
+
+ private static Robot robot;
+
+ public ShapeNotSetSometimes() throws Exception {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ initializeGUI();
+ }
+ });
+ }
+
+ private void initializeGUI() {
+ backgroundFrame = new BackgroundFrame();
+ backgroundFrame.setUndecorated(true);
+ backgroundFrame.setSize(300, 300);
+ backgroundFrame.setLocation(20, 400);
+ backgroundFrame.setVisible(true);
+
+ shape = null;
+ String shape_name = null;
+ Area a;
+ GeneralPath gp;
+ shape_name = "Rounded-corners";
+ a = new Area();
+ a.add(new Area(new Rectangle2D.Float(50, 0, 100, 150)));
+ a.add(new Area(new Rectangle2D.Float(0, 50, 200, 50)));
+ a.add(new Area(new Ellipse2D.Float(0, 0, 100, 100)));
+ a.add(new Area(new Ellipse2D.Float(0, 50, 100, 100)));
+ a.add(new Area(new Ellipse2D.Float(100, 0, 100, 100)));
+ a.add(new Area(new Ellipse2D.Float(100, 50, 100, 100)));
+ shape = a;
+ pointsToCheck = new int[][] {
+ // inside shape
+ {106, 86}, {96, 38}, {76, 107}, {180, 25}, {24, 105},
+ {196, 77}, {165, 50}, {14, 113}, {89, 132}, {167, 117},
+ // outside shape
+ {165, 196}, {191, 163}, {146, 185}, {61, 170}, {148, 171},
+ {82, 172}, {186, 11}, {199, 141}, {13, 173}, {187, 3}
+ };
+
+ window = new TestFrame();
+ window.setUndecorated(true);
+ window.setSize(200, 200);
+ window.setLocation(70, 450);
+ window.setShape(shape);
+ window.setVisible(true);
+
+ System.out.println("Checking " + window.getClass().getSuperclass().getName() + " with " + shape_name + " shape (" + window.getShape() + ")...");
+ }
+
+ class BackgroundFrame extends Frame {
+
+ @Override
+ public void paint(Graphics g) {
+
+ g.setColor(BACKGROUND_COLOR);
+ g.fillRect(0, 0, 300, 300);
+
+ super.paint(g);
+ }
+ }
+
+ class TestFrame extends Frame {
+
+ @Override
+ public void paint(Graphics g) {
+
+ g.setColor(Color.WHITE);
+ g.fillRect(0, 0, 200, 200);
+
+ super.paint(g);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ robot = new Robot();
+
+ for(int i = 0; i < 100; i++) {
+ System.out.println("Attempt " + i);
+ new ShapeNotSetSometimes().doTest();
+ }
+ }
+
+ private void doTest() throws Exception {
+ Point wls = backgroundFrame.getLocationOnScreen();
+
+ robot.mouseMove(wls.x + 5, wls.y + 5);
+ robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+ robot.delay(10);
+ robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+ robot.delay(500);
+
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ window.requestFocus();
+ }
+ });
+
+ robot.waitForIdle();
+ try {
+ Thread.sleep(300);
+ } catch (InterruptedException e) {
+ // ignore this one
+ }
+
+ // check transparency
+ final int COUNT_TARGET = 10;
+
+ // checking outside points only
+ for(int i = COUNT_TARGET; i < COUNT_TARGET * 2; i++) {
+ int x = pointsToCheck[i][0];
+ int y = pointsToCheck[i][1];
+ boolean inside = i < COUNT_TARGET;
+ Color c = robot.getPixelColor(window.getX() + x, window.getY() + y);
+ System.out.println("checking " + x + ", " + y + ", color = " + c);
+ if (inside && BACKGROUND_COLOR.equals(c) || !inside && !BACKGROUND_COLOR.equals(c)) {
+ System.out.println("window.getX() = " + window.getX() + ", window.getY() = " + window.getY());
+ System.err.println("Checking for transparency failed: point: " +
+ (window.getX() + x) + ", " + (window.getY() + y) +
+ ", color = " + c + (inside ? " is of un" : " is not of ") +
+ "expected background color " + BACKGROUND_COLOR);
+ throw new RuntimeException("Test failed. The shape has not been applied.");
+ }
+ }
+
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ backgroundFrame.dispose();
+ window.dispose();
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/OtherEvents/UngrabID/UngrabID.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ @test
+ @bug 6960516
+ @summary check if the ungrab event has the ID < AWTEvent.RESERVED_ID_MAX
+ @author Andrei Dmitriev : area=awt.event
+ @run main UngrabID
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+public class UngrabID {
+ public static void main(String[] args){
+ Frame f = new Frame("Dummy");
+ sun.awt.UngrabEvent event = new sun.awt.UngrabEvent(f);
+ if (event.getID() > AWTEvent.RESERVED_ID_MAX) {
+ System.out.println( " Event ID : "+event.getID() + " " + event.toString());
+ throw new RuntimeException(" Ungrab Event ID should be less than AWTEvent.RESERVED_ID_MAX ("+AWTEvent.RESERVED_ID_MAX+"). Actual value : "+event.getID() + " Event:" + event.toString());
+ }
+ System.out.println("Test passed. ");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/GroupLayout/6613904/bug6613904.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6613904
+ * @summary javax.swing.GroupLayout.createParallelGroup(..) doesn't throw IllegalArgumentException for null arg
+ * @author Pavel Porvatov
+ */
+
+import javax.swing.*;
+
+public class bug6613904 {
+ public static void main(String[] args) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ GroupLayout groupLayout = new GroupLayout(new JPanel());
+
+ try {
+ groupLayout.createParallelGroup(null);
+
+ throw new RuntimeException("groupLayout.createParallelGroup(null) doesn't throw IAE");
+ } catch (IllegalArgumentException e) {
+ // Ok
+ }
+
+ try {
+ groupLayout.createParallelGroup(null, true);
+
+ throw new RuntimeException("groupLayout.createParallelGroup(null, true) doesn't throw IAE");
+ } catch (IllegalArgumentException e) {
+ // Ok
+ }
+
+ try {
+ groupLayout.createParallelGroup(null, false);
+
+ throw new RuntimeException("groupLayout.createParallelGroup(null, false) doesn't throw IAE");
+ } catch (IllegalArgumentException e) {
+ // Ok
+ }
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JPopupMenu/6987844/bug6987844.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6987844
+ * @summary Incorrect width of JComboBox drop down
+ * @author Alexander Potochkin
+ * @run main bug6987844
+ */
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.InputEvent;
+
+public class bug6987844 {
+ static JMenu menu1;
+ static JMenu menu2;
+
+ public static void main(String... args) throws Exception {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(200);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ JFrame frame = new JFrame();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ JMenuBar bar = new JMenuBar();
+ menu1 = new JMenu("Menu1");
+ menu1.add(new JMenuItem("item"));
+ bar.add(menu1);
+ menu2 = new JMenu("Menu2");
+ menu2.add(new JMenuItem("item"));
+ menu2.add(new JMenuItem("item"));
+ bar.add(menu2);
+
+ frame.setJMenuBar(bar);
+ frame.pack();
+
+ frame.setVisible(true);
+ }
+ });
+ toolkit.realSync();
+ Point point1 = menu1.getLocationOnScreen();
+ Point point2 = menu2.getLocationOnScreen();
+
+ robot.mouseMove(point1.x + 1, point1.y + 1);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+ robot.mouseMove(point2.x + 1, point2.y + 1);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+ robot.mouseMove(point1.x + 1, point1.y + 1);
+ toolkit.realSync();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ Dimension popupSize1 = menu1.getPopupMenu().getSize();
+ Dimension popupSize2 = menu2.getPopupMenu().getSize();
+ if (popupSize1.equals(popupSize2)) {
+ throw new RuntimeException("First popup unexpedetly changed its size");
+ }
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/DefaultHighlighter/6771184/bug6771184.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6771184
+ * @summary Some methods in text package don't throw BadLocationException when expected
+ * @author Pavel Porvatov
+ */
+
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Highlighter;
+import javax.swing.text.JTextComponent;
+import java.awt.*;
+
+public class bug6771184 {
+ public static void main(String[] args) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ JTextArea textArea = new JTextArea("Tested string");
+
+ Highlighter highlighter = textArea.getHighlighter();
+ Highlighter.HighlightPainter myPainter = new Highlighter.HighlightPainter() {
+ public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
+ }
+ };
+
+ int negativeTestedData[][] = {{50, 0},
+ {-1, 1},
+ {-5, -4},
+ {Integer.MAX_VALUE, Integer.MIN_VALUE},
+ {Integer.MIN_VALUE, Integer.MAX_VALUE},
+ {Integer.MIN_VALUE, Integer.MIN_VALUE}};
+
+ for (int[] data : negativeTestedData) {
+ try {
+ highlighter.addHighlight(data[0], data[1], myPainter);
+
+ throw new RuntimeException("Method addHighlight() does not throw BadLocationException for (" +
+ data[0] + ", " + data[1] + ") ");
+ } catch (BadLocationException e) {
+ // Ok
+ }
+
+ Object objRef;
+
+ try {
+ objRef = highlighter.addHighlight(0, 1, myPainter);
+ } catch (BadLocationException e) {
+ throw new RuntimeException("highlighter.addHighlight(0, 1, myPainter) throws exception", e);
+ }
+
+ try {
+ highlighter.changeHighlight(objRef, data[0], data[1]);
+
+ throw new RuntimeException("Method changeHighlight() does not throw BadLocationException for (" +
+ data[0] + ", " + data[1] + ") ");
+ } catch (BadLocationException e) {
+ // Ok
+ }
+ }
+ }
+ });
+ }
+}
--- a/jdk/test/sun/java2d/GdiRendering/InsetClipping.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/test/sun/java2d/GdiRendering/InsetClipping.java Sun Dec 05 15:26:16 2010 -0800
@@ -85,6 +85,9 @@
} catch (Exception e) {}
}
try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {}
+ try {
Robot robot = new Robot();
Point clientLoc = clipTest.getLocationOnScreen();
Insets insets = clipTest.getInsets();
--- a/jdk/test/sun/java2d/SunGraphics2D/DrawImageBilinear.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/test/sun/java2d/SunGraphics2D/DrawImageBilinear.java Sun Dec 05 15:26:16 2010 -0800
@@ -56,6 +56,9 @@
private VolatileImage vimg;
private static volatile BufferedImage capture;
private static void doCapture(Component test) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {}
// Grab the screen region
try {
Robot robot = new Robot();
--- a/jdk/test/sun/java2d/SunGraphics2D/SourceClippingBlitTest/SourceClippingBlitTest.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/test/sun/java2d/SunGraphics2D/SourceClippingBlitTest/SourceClippingBlitTest.java Sun Dec 05 15:26:16 2010 -0800
@@ -204,6 +204,9 @@
int w = getWidth();
int h = getHeight();
Toolkit.getDefaultToolkit().sync();
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {}
Point p = getLocationOnScreen();
grabbedBI = robot.createScreenCapture(new Rectangle(p.x, p.y, w, h));
--- a/jdk/test/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.java Thu Dec 02 23:44:01 2010 -0800
+++ b/jdk/test/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.java Sun Dec 05 15:26:16 2010 -0800
@@ -120,6 +120,9 @@
}
private boolean testRendering() throws RuntimeException {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {}
Robot r = null;
try {
r = new Robot();
--- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Sun Dec 05 15:26:16 2010 -0800
@@ -49,6 +49,7 @@
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.TypeSymbol;
import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.comp.Attr;
import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Enter;
@@ -230,7 +231,7 @@
public boolean isAccessible(Scope scope, TypeElement type) {
if (scope instanceof JavacScope && type instanceof ClassSymbol) {
Env<AttrContext> env = ((JavacScope) scope).env;
- return resolve.isAccessible(env, (ClassSymbol)type);
+ return resolve.isAccessible(env, (ClassSymbol)type, true);
} else
return false;
}
@@ -240,7 +241,7 @@
&& member instanceof Symbol
&& type instanceof com.sun.tools.javac.code.Type) {
Env<AttrContext> env = ((JavacScope) scope).env;
- return resolve.isAccessible(env, (com.sun.tools.javac.code.Type)type, (Symbol)member);
+ return resolve.isAccessible(env, (com.sun.tools.javac.code.Type)type, (Symbol)member, true);
} else
return false;
}
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Sun Dec 05 15:26:16 2010 -0800
@@ -247,6 +247,11 @@
*/
public static final long OVERRIDE_BRIDGE = 1L<<41;
+ /**
+ * Flag that marks an 'effectively final' local variable
+ */
+ public static final long EFFECTIVELY_FINAL = 1L<<42;
+
/** Modifier masks.
*/
public static final int
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Sun Dec 05 15:26:16 2010 -0800
@@ -212,9 +212,9 @@
VARARGS("varargs"),
/**
- * Warn about arm resources
+ * Warn about issues relating to use of try blocks (i.e. try-with-resources)
*/
- ARM("arm");
+ TRY("try");
LintCategory(String option) {
this(option, false);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java Sun Dec 05 15:26:16 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,8 @@
/** A scope represents an area of visibility in a Java program. The
* Scope class is a container for symbols which provides
* efficient access to symbols given their names. Scopes are implemented
- * as hash tables. Scopes can be nested; the next field of a scope points
+ * as hash tables with "open addressing" and "double hashing".
+ * Scopes can be nested; the next field of a scope points
* to its next outer scope. Nested scopes can share their hash tables.
*
* <p><b>This is NOT part of any supported API.
@@ -55,7 +56,7 @@
/** A hash table for the scope's entries.
*/
- public Entry[] table;
+ Entry[] table;
/** Mask for hash codes, always equal to (table.length - 1).
*/
@@ -67,8 +68,9 @@
public Entry elems;
/** The number of elements in this scope.
+ * This includes deleted elements, whose value is the sentinel.
*/
- public int nelems = 0;
+ int nelems = 0;
/** A timestamp - useful to quickly check whether a scope has changed or not
*/
@@ -109,7 +111,8 @@
}
}
- /** Every hash bucket is a list of Entry's which ends in sentinel.
+ /** Use as a "not-found" result for lookup.
+ * Also used to mark deleted entries in the table.
*/
private static final Entry sentinel = new Entry(null, null, null, null);
@@ -130,12 +133,15 @@
this.owner = owner;
this.table = table;
this.hashMask = table.length - 1;
- this.elems = null;
- this.nelems = 0;
- this.shared = 0;
this.scopeCounter = scopeCounter;
}
+ /** Convenience constructor used for dup and dupUnshared. */
+ private Scope(Scope next, Symbol owner, Entry[] table) {
+ this(next, owner, table, next.scopeCounter);
+ this.nelems = next.nelems;
+ }
+
/** Construct a new scope, within scope next, with given owner,
* using a fresh table of length INITIAL_SIZE.
*/
@@ -145,7 +151,6 @@
protected Scope(Symbol owner, ScopeCounter scopeCounter) {
this(null, owner, new Entry[INITIAL_SIZE], scopeCounter);
- for (int i = 0; i < INITIAL_SIZE; i++) table[i] = sentinel;
}
/** Construct a fresh scope within this scope, with same owner,
@@ -154,11 +159,7 @@
* of fresh tables.
*/
public Scope dup() {
- Scope result = new Scope(this, this.owner, this.table, scopeCounter);
- shared++;
- // System.out.println("====> duping scope " + this.hashCode() + " owned by " + this.owner + " to " + result.hashCode());
- // new Error().printStackTrace(System.out);
- return result;
+ return dup(this.owner);
}
/** Construct a fresh scope within this scope, with new owner,
@@ -167,7 +168,7 @@
* of fresh tables.
*/
public Scope dup(Symbol newOwner) {
- Scope result = new Scope(this, newOwner, this.table, scopeCounter);
+ Scope result = new Scope(this, newOwner, this.table);
shared++;
// System.out.println("====> duping scope " + this.hashCode() + " owned by " + newOwner + " to " + result.hashCode());
// new Error().printStackTrace(System.out);
@@ -179,7 +180,7 @@
* the table of its outer scope.
*/
public Scope dupUnshared() {
- return new Scope(this, this.owner, this.table.clone(), scopeCounter);
+ return new Scope(this, this.owner, this.table.clone());
}
/** Remove all entries of this scope from its table, if shared
@@ -189,7 +190,7 @@
assert shared == 0;
if (table != next.table) return next;
while (elems != null) {
- int hash = elems.sym.name.hashCode() & hashMask;
+ int hash = getIndex(elems.sym.name);
Entry e = table[hash];
assert e == elems : elems.sym;
table[hash] = elems.shadowed;
@@ -197,6 +198,7 @@
}
assert next.shared > 0;
next.shared--;
+ next.nelems = nelems;
// System.out.println("====> leaving scope " + this.hashCode() + " owned by " + this.owner + " to " + next.hashCode());
// new Error().printStackTrace(System.out);
return next;
@@ -215,19 +217,17 @@
s.hashMask = newtable.length - 1;
}
}
- for (int i = 0; i < newtable.length; i++) newtable[i] = sentinel;
- for (int i = 0; i < oldtable.length; i++) copy(oldtable[i]);
- }
-
- /** Copy the given entry and all entries shadowed by it to table
- */
- private void copy(Entry e) {
- if (e.sym != null) {
- copy(e.shadowed);
- int hash = e.sym.name.hashCode() & hashMask;
- e.shadowed = table[hash];
- table[hash] = e;
+ int n = 0;
+ for (int i = oldtable.length; --i >= 0; ) {
+ Entry e = oldtable[i];
+ if (e != null && e != sentinel && ! e.isBogus()) {
+ table[getIndex(e.sym.name)] = e;
+ n++;
+ }
}
+ // We don't need to update nelems for shared inherited scopes,
+ // since that gets handled by leave().
+ nelems = n;
}
/** Enter symbol sym in this scope.
@@ -248,13 +248,17 @@
*/
public void enter(Symbol sym, Scope s, Scope origin) {
assert shared == 0;
- // Temporarily disabled (bug 6460352):
- // if (nelems * 3 >= hashMask * 2) dble();
- int hash = sym.name.hashCode() & hashMask;
- Entry e = makeEntry(sym, table[hash], elems, s, origin);
+ if (nelems * 3 >= hashMask * 2)
+ dble();
+ int hash = getIndex(sym.name);
+ Entry old = table[hash];
+ if (old == null) {
+ old = sentinel;
+ nelems++;
+ }
+ Entry e = makeEntry(sym, old, elems, s, origin);
table[hash] = e;
elems = e;
- nelems++;
scopeCounter.inc();
}
@@ -268,15 +272,15 @@
public void remove(Symbol sym) {
assert shared == 0;
Entry e = lookup(sym.name);
- while (e.scope == this && e.sym != sym) e = e.next();
if (e.scope == null) return;
scopeCounter.inc();
// remove e from table and shadowed list;
- Entry te = table[sym.name.hashCode() & hashMask];
+ int i = getIndex(sym.name);
+ Entry te = table[i];
if (te == e)
- table[sym.name.hashCode() & hashMask] = e.shadowed;
+ table[i] = e.shadowed;
else while (true) {
if (te.shadowed == e) {
te.shadowed = e.shadowed;
@@ -335,12 +339,50 @@
return lookup(name, noFilter);
}
public Entry lookup(Name name, Filter<Symbol> sf) {
- Entry e = table[name.hashCode() & hashMask];
+ Entry e = table[getIndex(name)];
+ if (e == null || e == sentinel)
+ return sentinel;
while (e.scope != null && (e.sym.name != name || !sf.accepts(e.sym)))
e = e.shadowed;
return e;
}
+ /*void dump (java.io.PrintStream out) {
+ out.println(this);
+ for (int l=0; l < table.length; l++) {
+ Entry le = table[l];
+ out.print("#"+l+": ");
+ if (le==sentinel) out.println("sentinel");
+ else if(le == null) out.println("null");
+ else out.println(""+le+" s:"+le.sym);
+ }
+ }*/
+
+ /** Look for slot in the table.
+ * We use open addressing with double hashing.
+ */
+ int getIndex (Name name) {
+ int h = name.hashCode();
+ int i = h & hashMask;
+ // The expression below is always odd, so it is guaranteed
+ // be be mutually prime with table.length, a power of 2.
+ int x = hashMask - ((h + (h >> 16)) << 1);
+ int d = -1; // Index of a deleted item.
+ for (;;) {
+ Entry e = table[i];
+ if (e == null)
+ return d >= 0 ? d : i;
+ if (e == sentinel) {
+ // We have to keep searching even if we see a deleted item.
+ // However, remember the index in case we fail to find the name.
+ if (d < 0)
+ d = i;
+ } else if (e.sym.name == name)
+ return i;
+ i = (i + x) & hashMask;
+ }
+ }
+
public Iterable<Symbol> getElements() {
return getElements(noFilter);
}
@@ -441,10 +483,7 @@
* outwards if not found in this scope.
*/
public Entry next() {
- Entry e = shadowed;
- while (e.scope != null && e.sym.name != sym.name)
- e = e.shadowed;
- return e;
+ return shadowed;
}
public Scope getOrigin() {
@@ -456,6 +495,8 @@
// in many cases.
return scope;
}
+
+ protected boolean isBogus () { return false; }
}
public static class ImportScope extends Scope {
@@ -470,22 +511,10 @@
}
public Entry lookup(Name name) {
- Entry e = table[name.hashCode() & hashMask];
- while (e.scope != null &&
- (e.sym.name != name ||
- /* Since an inner class will show up in package and
- * import scopes until its inner class attribute has
- * been processed, we have to weed it out here. This
- * is done by comparing the owners of the entry's
- * scope and symbol fields. The scope field's owner
- * points to where the class originally was imported
- * from. The symbol field's owner points to where the
- * class is situated now. This can change when an
- * inner class is read (see ClassReader.enterClass).
- * By comparing the two fields we make sure that we do
- * not accidentally import an inner class that started
- * life as a flat class in a package. */
- e.sym.owner != e.scope.owner))
+ Entry e = table[getIndex(name)];
+ if (e == null)
+ return sentinel;
+ while (e.isBogus())
e = e.shadowed;
return e;
}
@@ -499,15 +528,33 @@
}
public Entry next() {
Entry e = super.shadowed;
- while (e.scope != null &&
- (e.sym.name != sym.name ||
- e.sym.owner != e.scope.owner)) // see lookup()
+ while (isBogus())
e = e.shadowed;
return e;
}
@Override
public Scope getOrigin() { return origin; }
+
+ /**
+ * Is this a bogus inner-class import?
+ * An inner class {@code Outer$Inner.class} read from a class file
+ * starts out in a package scope under the name {@code Outer$Inner},
+ * which (if star-imported) gets copied to the import scope.
+ * When the InnerClasses attribute is processed, the ClassSymbol
+ * is renamed in place (to {@code Inner}), and the owner changed
+ * to the {@code Outer} class. The ImportScope still has the old
+ * Entry that was created and hashed as {@code "Outer$Inner"},
+ * but whose name was changed to {@code "Inner"}. This violates
+ * the invariants for the Scope hash table, and so is pretty bogus.
+ * When the symbol was renamed, it should have been removed from
+ * the import scope (and not just the package scope); however,
+ * doing so is difficult. A better fix would be to change
+ * import scopes to indirectly reference package symbols, rather
+ * than copy from them.
+ * Until then, we detect and skip the bogus entries using this test.
+ */
+ protected boolean isBogus () { return sym.owner != scope.owner; }
}
}
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Sun Dec 05 15:26:16 2010 -0800
@@ -3151,7 +3151,7 @@
return to.isParameterized() &&
(!(isUnbounded(to) ||
isSubtype(from, to) ||
- ((subFrom != null) && isSameType(subFrom, to))));
+ ((subFrom != null) && containsType(to.allparams(), subFrom.allparams()))));
}
private List<Type> superClosure(Type t, Type s) {
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Sun Dec 05 15:26:16 2010 -0800
@@ -252,10 +252,12 @@
(base.getTag() == JCTree.IDENT && TreeInfo.name(base) == names._this)) &&
isAssignableAsBlankFinal(v, env)))) {
if (v.isResourceVariable()) { //TWR resource
- log.error(pos, "twr.resource.may.not.be.assigned", v);
+ log.error(pos, "try.resource.may.not.be.assigned", v);
} else {
log.error(pos, "cant.assign.val.to.final.var", v);
}
+ } else if ((v.flags() & EFFECTIVELY_FINAL) != 0) {
+ v.flags_field &= ~EFFECTIVELY_FINAL;
}
}
@@ -799,6 +801,7 @@
memberEnter.memberEnter(tree, env);
annotate.flush();
}
+ tree.sym.flags_field |= EFFECTIVELY_FINAL;
}
VarSymbol v = tree.sym;
@@ -1042,11 +1045,11 @@
for (JCTree resource : tree.resources) {
if (resource.getTag() == JCTree.VARDEF) {
attribStat(resource, tryEnv);
- chk.checkType(resource, resource.type, syms.autoCloseableType, "twr.not.applicable.to.type");
+ chk.checkType(resource, resource.type, syms.autoCloseableType, "try.not.applicable.to.type");
VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource);
var.setData(ElementKind.RESOURCE_VARIABLE);
} else {
- attribExpr(resource, tryEnv, syms.autoCloseableType, "twr.not.applicable.to.type");
+ attribExpr(resource, tryEnv, syms.autoCloseableType, "try.not.applicable.to.type");
}
}
// Attribute body
@@ -1061,11 +1064,8 @@
localEnv.dup(c, localEnv.info.dup(localEnv.info.scope.dup()));
Type ctype = attribStat(c.param, catchEnv);
if (TreeInfo.isMultiCatch(c)) {
- //check that multi-catch parameter is marked as final
- if ((c.param.sym.flags() & FINAL) == 0) {
- log.error(c.param.pos(), "multicatch.param.must.be.final", c.param.sym);
- }
- c.param.sym.flags_field = c.param.sym.flags() | DISJUNCTION;
+ //multi-catch parameter is implicitly marked as final
+ c.param.sym.flags_field |= FINAL | DISJUNCTION;
}
if (c.param.sym.kind == Kinds.VAR) {
c.param.sym.setData(ElementKind.EXCEPTION_PARAMETER);
@@ -1552,7 +1552,7 @@
// Attribute clazz expression and store
// symbol + type back into the attributed tree.
Type clazztype = attribType(clazz, env);
- Pair<Scope,Scope> mapping = getSyntheticScopeMapping(clazztype);
+ Pair<Scope,Scope> mapping = getSyntheticScopeMapping(clazztype, cdef != null);
if (!TreeInfo.isDiamond(tree)) {
clazztype = chk.checkClassType(
tree.clazz.pos(), clazztype, true);
@@ -1849,7 +1849,7 @@
* inference. The inferred return type of the synthetic constructor IS
* the inferred type for the diamond operator.
*/
- private Pair<Scope, Scope> getSyntheticScopeMapping(Type ctype) {
+ private Pair<Scope, Scope> getSyntheticScopeMapping(Type ctype, boolean overrideProtectedAccess) {
if (ctype.tag != CLASS) {
return erroneousMapping;
}
@@ -1860,6 +1860,12 @@
e.scope != null;
e = e.next()) {
MethodSymbol newConstr = (MethodSymbol) e.sym.clone(ctype.tsym);
+ if (overrideProtectedAccess && (newConstr.flags() & PROTECTED) != 0) {
+ //make protected constructor public (this is required for
+ //anonymous inner class creation expressions using diamond)
+ newConstr.flags_field |= PUBLIC;
+ newConstr.flags_field &= ~PROTECTED;
+ }
newConstr.name = names.init;
List<Type> oldTypeargs = List.nil();
if (newConstr.type.tag == FORALL) {
@@ -2252,8 +2258,8 @@
((VarSymbol)sitesym).isResourceVariable() &&
sym.kind == MTH &&
sym.overrides(syms.autoCloseableClose, sitesym.type.tsym, types, true) &&
- env.info.lint.isEnabled(Lint.LintCategory.ARM)) {
- log.warning(tree, "twr.explicit.close.call");
+ env.info.lint.isEnabled(Lint.LintCategory.TRY)) {
+ log.warning(Lint.LintCategory.TRY, tree, "try.explicit.close.call");
}
// Disallow selecting a type from an expression
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Sun Dec 05 15:26:16 2010 -0800
@@ -1510,14 +1510,7 @@
Type t1,
Type t2,
Type site) {
- Symbol sym = firstIncompatibility(t1, t2, site);
- if (sym != null) {
- log.error(pos, "types.incompatible.diff.ret",
- t1, t2, sym.name +
- "(" + types.memberType(t2, sym).getParameterTypes() + ")");
- return false;
- }
- return true;
+ return firstIncompatibility(pos, t1, t2, site) == null;
}
/** Return the first method which is defined with same args
@@ -1528,7 +1521,7 @@
* @param site The most derived type.
* @returns symbol from t2 that conflicts with one in t1.
*/
- private Symbol firstIncompatibility(Type t1, Type t2, Type site) {
+ private Symbol firstIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) {
Map<TypeSymbol,Type> interfaces1 = new HashMap<TypeSymbol,Type>();
closure(t1, interfaces1);
Map<TypeSymbol,Type> interfaces2;
@@ -1539,7 +1532,7 @@
for (Type t3 : interfaces1.values()) {
for (Type t4 : interfaces2.values()) {
- Symbol s = firstDirectIncompatibility(t3, t4, site);
+ Symbol s = firstDirectIncompatibility(pos, t3, t4, site);
if (s != null) return s;
}
}
@@ -1568,7 +1561,7 @@
}
/** Return the first method in t2 that conflicts with a method from t1. */
- private Symbol firstDirectIncompatibility(Type t1, Type t2, Type site) {
+ private Symbol firstDirectIncompatibility(DiagnosticPosition pos, Type t1, Type t2, Type site) {
for (Scope.Entry e1 = t1.tsym.members().elems; e1 != null; e1 = e1.sibling) {
Symbol s1 = e1.sym;
Type st1 = null;
@@ -1592,7 +1585,18 @@
(types.covariantReturnType(rt1, rt2, Warner.noWarnings) ||
types.covariantReturnType(rt2, rt1, Warner.noWarnings)) ||
checkCommonOverriderIn(s1,s2,site);
- if (!compat) return s2;
+ if (!compat) {
+ log.error(pos, "types.incompatible.diff.ret",
+ t1, t2, s2.name +
+ "(" + types.memberType(t2, s2).getParameterTypes() + ")");
+ return s2;
+ }
+ } else if (!checkNameClash((ClassSymbol)site.tsym, s1, s2)) {
+ log.error(pos,
+ "name.clash.same.erasure.no.override",
+ s1, s1.location(),
+ s2, s2.location());
+ return s2;
}
}
}
@@ -1644,32 +1648,52 @@
log.error(tree.pos(), "enum.no.finalize");
return;
}
- for (Type t = types.supertype(origin.type); t.tag == CLASS;
+ for (Type t = origin.type; t.tag == CLASS;
t = types.supertype(t)) {
- TypeSymbol c = t.tsym;
- Scope.Entry e = c.members().lookup(m.name);
- while (e.scope != null) {
- if (m.overrides(e.sym, origin, types, false))
- checkOverride(tree, m, (MethodSymbol)e.sym, origin);
- else if (e.sym.kind == MTH &&
- e.sym.isInheritedIn(origin, types) &&
- (e.sym.flags() & SYNTHETIC) == 0 &&
- !m.isConstructor()) {
- Type er1 = m.erasure(types);
- Type er2 = e.sym.erasure(types);
- if (types.isSameTypes(er1.getParameterTypes(),
- er2.getParameterTypes())) {
- log.error(TreeInfo.diagnosticPositionFor(m, tree),
- "name.clash.same.erasure.no.override",
- m, m.location(),
- e.sym, e.sym.location());
- }
- }
- e = e.next();
+ if (t != origin.type) {
+ checkOverride(tree, t, origin, m);
+ }
+ for (Type t2 : types.interfaces(t)) {
+ checkOverride(tree, t2, origin, m);
}
}
}
+ void checkOverride(JCTree tree, Type site, ClassSymbol origin, MethodSymbol m) {
+ TypeSymbol c = site.tsym;
+ Scope.Entry e = c.members().lookup(m.name);
+ while (e.scope != null) {
+ if (m.overrides(e.sym, origin, types, false)) {
+ if ((e.sym.flags() & ABSTRACT) == 0) {
+ checkOverride(tree, m, (MethodSymbol)e.sym, origin);
+ }
+ }
+ else if (!checkNameClash(origin, e.sym, m)) {
+ log.error(tree,
+ "name.clash.same.erasure.no.override",
+ m, m.location(),
+ e.sym, e.sym.location());
+ }
+ e = e.next();
+ }
+ }
+
+ private boolean checkNameClash(ClassSymbol origin, Symbol s1, Symbol s2) {
+ if (s1.kind == MTH &&
+ s1.isInheritedIn(origin, types) &&
+ (s1.flags() & SYNTHETIC) == 0 &&
+ !s2.isConstructor()) {
+ Type er1 = s2.erasure(types);
+ Type er2 = s1.erasure(types);
+ if (types.isSameTypes(er1.getParameterTypes(),
+ er2.getParameterTypes())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
/** Check that all abstract members of given class have definitions.
* @param pos Position to be used for error reporting.
* @param c The class.
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Sun Dec 05 15:26:16 2010 -0800
@@ -226,7 +226,7 @@
*/
Bits uninits;
- HashMap<Symbol, List<Type>> multicatchTypes;
+ HashMap<Symbol, List<Type>> preciseRethrowTypes;
/** The set of variables that are definitely unassigned everywhere
* in current try block. This variable is maintained lazily; it is
@@ -332,7 +332,7 @@
if (!chk.isUnchecked(tree.pos(), exc)) {
if (!chk.isHandled(exc, caught))
pendingExits.append(new PendingExit(tree, exc));
- thrown = chk.incl(exc, thrown);
+ thrown = chk.incl(exc, thrown);
}
}
@@ -1037,10 +1037,10 @@
int nextadrCatch = nextadr;
if (!unrefdResources.isEmpty() &&
- lint.isEnabled(Lint.LintCategory.ARM)) {
+ lint.isEnabled(Lint.LintCategory.TRY)) {
for (Map.Entry<VarSymbol, JCVariableDecl> e : unrefdResources.entrySet()) {
- log.warning(e.getValue().pos(),
- "automatic.resource.not.referenced", e.getKey());
+ log.warning(Lint.LintCategory.TRY, e.getValue().pos(),
+ "try.resource.not.referenced", e.getKey());
}
}
@@ -1077,12 +1077,12 @@
scan(param);
inits.incl(param.sym.adr);
uninits.excl(param.sym.adr);
- multicatchTypes.put(param.sym, chk.intersect(ctypes, rethrownTypes));
+ preciseRethrowTypes.put(param.sym, chk.intersect(ctypes, rethrownTypes));
scanStat(l.head.body);
initsEnd.andSet(inits);
uninitsEnd.andSet(uninits);
nextadr = nextadrCatch;
- multicatchTypes.remove(param.sym);
+ preciseRethrowTypes.remove(param.sym);
aliveEnd |= alive;
}
if (tree.finalizer != null) {
@@ -1215,10 +1215,10 @@
Symbol sym = TreeInfo.symbol(tree.expr);
if (sym != null &&
sym.kind == VAR &&
- (sym.flags() & FINAL) != 0 &&
- multicatchTypes.get(sym) != null &&
+ (sym.flags() & (FINAL | EFFECTIVELY_FINAL)) != 0 &&
+ preciseRethrowTypes.get(sym) != null &&
allowRethrowAnalysis) {
- for (Type t : multicatchTypes.get(sym)) {
+ for (Type t : preciseRethrowTypes.get(sym)) {
markThrown(tree, t);
}
}
@@ -1371,11 +1371,24 @@
if (!tree.type.isErroneous()
&& lint.isEnabled(Lint.LintCategory.CAST)
&& types.isSameType(tree.expr.type, tree.clazz.type)
- && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz))) {
+ && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz))
+ && !is292targetTypeCast(tree)) {
log.warning(Lint.LintCategory.CAST,
tree.pos(), "redundant.cast", tree.expr.type);
}
}
+ //where
+ private boolean is292targetTypeCast(JCTypeCast tree) {
+ boolean is292targetTypeCast = false;
+ if (tree.expr.getTag() == JCTree.APPLY) {
+ JCMethodInvocation apply = (JCMethodInvocation)tree.expr;
+ Symbol sym = TreeInfo.symbol(apply.meth);
+ is292targetTypeCast = sym != null &&
+ sym.kind == MTH &&
+ (sym.flags() & POLYMORPHIC_SIGNATURE) != 0;
+ }
+ return is292targetTypeCast;
+ }
public void visitTopLevel(JCCompilationUnit tree) {
// Do nothing for TopLevel since each class is visited individually
@@ -1422,7 +1435,7 @@
firstadr = 0;
nextadr = 0;
pendingExits = new ListBuffer<PendingExit>();
- multicatchTypes = new HashMap<Symbol, List<Type>>();
+ preciseRethrowTypes = new HashMap<Symbol, List<Type>>();
alive = true;
this.thrown = this.caught = null;
this.classDef = null;
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Sun Dec 05 15:26:16 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1509,17 +1509,17 @@
}
private JCBlock makeArmFinallyClause(Symbol primaryException, JCExpression resource) {
- // primaryException.addSuppressedException(catchException);
+ // primaryException.addSuppressed(catchException);
VarSymbol catchException =
new VarSymbol(0, make.paramName(2),
syms.throwableType,
currentMethodSym);
JCStatement addSuppressionStatement =
make.Exec(makeCall(make.Ident(primaryException),
- names.fromString("addSuppressedException"),
+ names.addSuppressed,
List.<JCExpression>of(make.Ident(catchException))));
- // try { resource.close(); } catch (e) { primaryException.addSuppressedException(e); }
+ // try { resource.close(); } catch (e) { primaryException.addSuppressed(e); }
JCBlock tryBlock =
make.Block(0L, List.<JCStatement>of(makeResourceCloseInvocation(resource)));
JCVariableDecl catchExceptionDecl = make.VarDef(catchException, null);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Sun Dec 05 15:26:16 2010 -0800
@@ -159,33 +159,45 @@
* @param c The class whose accessibility is checked.
*/
public boolean isAccessible(Env<AttrContext> env, TypeSymbol c) {
+ return isAccessible(env, c, false);
+ }
+
+ public boolean isAccessible(Env<AttrContext> env, TypeSymbol c, boolean checkInner) {
+ boolean isAccessible = false;
switch ((short)(c.flags() & AccessFlags)) {
- case PRIVATE:
- return
- env.enclClass.sym.outermostClass() ==
- c.owner.outermostClass();
- case 0:
- return
- env.toplevel.packge == c.owner // fast special case
- ||
- env.toplevel.packge == c.packge()
- ||
- // Hack: this case is added since synthesized default constructors
- // of anonymous classes should be allowed to access
- // classes which would be inaccessible otherwise.
- env.enclMethod != null &&
- (env.enclMethod.mods.flags & ANONCONSTR) != 0;
- default: // error recovery
- case PUBLIC:
- return true;
- case PROTECTED:
- return
- env.toplevel.packge == c.owner // fast special case
- ||
- env.toplevel.packge == c.packge()
- ||
- isInnerSubClass(env.enclClass.sym, c.owner);
+ case PRIVATE:
+ isAccessible =
+ env.enclClass.sym.outermostClass() ==
+ c.owner.outermostClass();
+ break;
+ case 0:
+ isAccessible =
+ env.toplevel.packge == c.owner // fast special case
+ ||
+ env.toplevel.packge == c.packge()
+ ||
+ // Hack: this case is added since synthesized default constructors
+ // of anonymous classes should be allowed to access
+ // classes which would be inaccessible otherwise.
+ env.enclMethod != null &&
+ (env.enclMethod.mods.flags & ANONCONSTR) != 0;
+ break;
+ default: // error recovery
+ case PUBLIC:
+ isAccessible = true;
+ break;
+ case PROTECTED:
+ isAccessible =
+ env.toplevel.packge == c.owner // fast special case
+ ||
+ env.toplevel.packge == c.packge()
+ ||
+ isInnerSubClass(env.enclClass.sym, c.owner);
+ break;
}
+ return (checkInner == false || c.type.getEnclosingType() == Type.noType) ?
+ isAccessible :
+ isAccessible & isAccessible(env, c.type.getEnclosingType(), checkInner);
}
//where
/** Is given class a subclass of given base class, or an inner class
@@ -202,9 +214,13 @@
}
boolean isAccessible(Env<AttrContext> env, Type t) {
+ return isAccessible(env, t, false);
+ }
+
+ boolean isAccessible(Env<AttrContext> env, Type t, boolean checkInner) {
return (t.tag == ARRAY)
? isAccessible(env, types.elemtype(t))
- : isAccessible(env, t.tsym);
+ : isAccessible(env, t.tsym, checkInner);
}
/** Is symbol accessible as a member of given type in given evironment?
@@ -214,6 +230,9 @@
* @param sym The symbol.
*/
public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym) {
+ return isAccessible(env, site, sym, false);
+ }
+ public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym, boolean checkInner) {
if (sym.name == names.init && sym.owner != site.tsym) return false;
ClassSymbol sub;
switch ((short)(sym.flags() & AccessFlags)) {
@@ -231,7 +250,7 @@
||
env.toplevel.packge == sym.packge())
&&
- isAccessible(env, site)
+ isAccessible(env, site, checkInner)
&&
sym.isInheritedIn(site.tsym, types)
&&
@@ -248,11 +267,11 @@
// (but type names should be disallowed elsewhere!)
env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP)
&&
- isAccessible(env, site)
+ isAccessible(env, site, checkInner)
&&
notOverriddenIn(site, sym);
default: // this case includes erroneous combinations as well
- return isAccessible(env, site) && notOverriddenIn(site, sym);
+ return isAccessible(env, site, checkInner) && notOverriddenIn(site, sym);
}
}
//where
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Sun Dec 05 15:26:16 2010 -0800
@@ -993,7 +993,9 @@
/** Enter an inner class into the `innerClasses' set/queue.
*/
void enterInner(ClassSymbol c) {
- assert !c.type.isCompound();
+ if (c.type.isCompound()) {
+ throw new AssertionError("Unexpected intersection type: " + c.type);
+ }
try {
c.complete();
} catch (CompletionFailure ex) {
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Sun Dec 05 15:26:16 2010 -0800
@@ -1304,7 +1304,7 @@
stackCount = 0;
for (int i=0; i<state.stacksize; i++) {
if (state.stack[i] != null) {
- frame.stack[stackCount++] = state.stack[i];
+ frame.stack[stackCount++] = types.erasure(state.stack[i]);
}
}
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Sun Dec 05 15:26:16 2010 -0800
@@ -1712,7 +1712,7 @@
S.nextToken();
List<JCTree> resources = List.<JCTree>nil();
if (S.token() == LPAREN) {
- checkAutomaticResourceManagement();
+ checkTryWithResources();
S.nextToken();
resources = resources();
accept(RPAREN);
@@ -2970,9 +2970,9 @@
allowMulticatch = true;
}
}
- void checkAutomaticResourceManagement() {
+ void checkTryWithResources() {
if (!allowTWR) {
- error(S.pos(), "automatic.resource.management.not.supported.in.source", source.name);
+ error(S.pos(), "try.with.resources.not.supported.in.source", source.name);
allowTWR = true;
}
}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Sun Dec 05 15:26:16 2010 -0800
@@ -63,8 +63,6 @@
anonymous class implements interface; cannot have type arguments
compiler.err.anon.class.impl.intf.no.qual.for.new=\
anonymous class implements interface; cannot have qualifier for new
-compiler.misc.twr.not.applicable.to.type=\
- automatic resource management not applicable to variable type
compiler.err.array.and.varargs=\
cannot declare both {0} and {1} in {2}
compiler.err.array.dimension.missing=\
@@ -183,12 +181,10 @@
compiler.err.final.parameter.may.not.be.assigned=\
final parameter {0} may not be assigned
-compiler.err.twr.resource.may.not.be.assigned=\
- automatic resource {0} may not be assigned
+compiler.err.try.resource.may.not.be.assigned=\
+ auto-closeable resource {0} may not be assigned
compiler.err.multicatch.parameter.may.not.be.assigned=\
multi-catch parameter {0} may not be assigned
-compiler.err.multicatch.param.must.be.final=\
- multi-catch parameter {0} must be final
compiler.err.finally.without.try=\
''finally'' without ''try''
compiler.err.foreach.not.applicable.to.type=\
@@ -825,10 +821,10 @@
compiler.warn.proc.unmatched.processor.options=\
The following options were not recognized by any processor: ''{0}''
-compiler.warn.twr.explicit.close.call=\
- [arm] explicit call to close() on an automatic resource
-compiler.warn.automatic.resource.not.referenced=\
- [arm] automatic resource {0} is never referenced in body of corresponding try statement
+compiler.warn.try.explicit.close.call=\
+ explicit call to close() on an auto-closeable resource
+compiler.warn.try.resource.not.referenced=\
+ auto-closeable resource {0} is never referenced in body of corresponding try statement
compiler.warn.unchecked.assign=\
unchecked assignment: {0} to {1}
compiler.warn.unchecked.assign.to.var=\
@@ -1052,6 +1048,9 @@
# compiler.err.no.elem.type=\
# \[\*\] cannot have a type
+compiler.misc.try.not.applicable.to.type=\
+ try-with-resources not applicable to variable type
+
#####
compiler.err.type.found.req=\
@@ -1274,9 +1273,9 @@
exotic identifiers #"___" are not supported in -source {0}\n\
(use -source 7 or higher to enable exotic identifiers)
-compiler.err.automatic.resource.management.not.supported.in.source=\
- automatic resource management is not supported in -source {0}\n\
-(use -source 7 or higher to enable automatic resource management)
+compiler.err.try.with.resources.not.supported.in.source=\
+ try-with-resources is not supported in -source {0}\n\
+(use -source 7 or higher to enable try-with-resources)
compiler.warn.enum.as.identifier=\
as of release 5, ''enum'' is a keyword, and may not be used as an identifier\n\
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java Sun Dec 05 15:26:16 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -150,6 +150,7 @@
public final Name finalize;
public final Name java_lang_AutoCloseable;
public final Name close;
+ public final Name addSuppressed;
public final Name.Table table;
@@ -268,6 +269,7 @@
java_lang_AutoCloseable = fromString("java.lang.AutoCloseable");
close = fromString("close");
+ addSuppressed = fromString("addSuppressed");
}
protected Name.Table createTable(Options options) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/6996626/Main.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 6996626
+ * @summary Scope fix issues for ImportScope
+ * @compile pack1/Symbol.java
+ * @compile Main.java
+ */
+
+import pack1.*;
+import pack1.Symbol.*;
+
+// The following imports are just to trigger re-hashing (in
+// com.sun.tools.javac.code.Scope.dble()) of the star-import scope.
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+public class Main {
+ public void main (String[] args) {
+ throw new CompletionFailure();
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/6996626/pack1/Symbol.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package pack1;
+
+public class Symbol {
+ public static class CompletionFailure extends RuntimeException { }
+}
+
+
+
--- a/langtools/test/tools/javac/TryWithResources/ArmLint.java Thu Dec 02 23:44:01 2010 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * @test /nodynamiccopyright/
- * @bug 6911256 6964740 6965277 6967065
- * @author Joseph D. Darcy
- * @summary Check that -Xlint:arm warnings are generated as expected
- * @compile/ref=ArmLint.out -Xlint:arm,deprecation -XDrawDiagnostics ArmLint.java
- */
-
-class ArmLint implements AutoCloseable {
- private static void test1() {
- try(ArmLint r1 = new ArmLint();
- ArmLint r2 = new ArmLint();
- ArmLint r3 = new ArmLint()) {
- r1.close(); // The resource's close
- r2.close(42); // *Not* the resource's close
- // r3 not referenced
- }
-
- }
-
- @SuppressWarnings("arm")
- private static void test2() {
- try(@SuppressWarnings("deprecation") AutoCloseable r4 =
- new DeprecatedAutoCloseable()) {
- // r4 not referenced
- } catch(Exception e) {
- ;
- }
- }
-
- /**
- * The AutoCloseable method of a resource.
- */
- @Override
- public void close () {
- return;
- }
-
- /**
- * <em>Not</em> the AutoCloseable method of a resource.
- */
- public void close (int arg) {
- return;
- }
-}
-
-@Deprecated
-class DeprecatedAutoCloseable implements AutoCloseable {
- public DeprecatedAutoCloseable(){super();}
-
- @Override
- public void close () {
- return;
- }
-}
--- a/langtools/test/tools/javac/TryWithResources/ArmLint.out Thu Dec 02 23:44:01 2010 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-ArmLint.java:14:15: compiler.warn.twr.explicit.close.call
-ArmLint.java:13:13: compiler.warn.automatic.resource.not.referenced: r3
-2 warnings
--- a/langtools/test/tools/javac/TryWithResources/ImplicitFinal.out Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/TryWithResources/ImplicitFinal.out Sun Dec 05 15:26:16 2010 -0800
@@ -1,2 +1,2 @@
-ImplicitFinal.java:14:13: compiler.err.twr.resource.may.not.be.assigned: r
+ImplicitFinal.java:14:13: compiler.err.try.resource.may.not.be.assigned: r
1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/TwrLint.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,55 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6911256 6964740 6965277 6967065
+ * @author Joseph D. Darcy
+ * @summary Check that -Xlint:twr warnings are generated as expected
+ * @compile/ref=TwrLint.out -Xlint:try,deprecation -XDrawDiagnostics TwrLint.java
+ */
+
+class TwrLint implements AutoCloseable {
+ private static void test1() {
+ try(TwrLint r1 = new TwrLint();
+ TwrLint r2 = new TwrLint();
+ TwrLint r3 = new TwrLint()) {
+ r1.close(); // The resource's close
+ r2.close(42); // *Not* the resource's close
+ // r3 not referenced
+ }
+
+ }
+
+ @SuppressWarnings("try")
+ private static void test2() {
+ try(@SuppressWarnings("deprecation") AutoCloseable r4 =
+ new DeprecatedAutoCloseable()) {
+ // r4 not referenced - but no warning is generated because of @SuppressWarnings
+ } catch(Exception e) {
+ ;
+ }
+ }
+
+ /**
+ * The AutoCloseable method of a resource.
+ */
+ @Override
+ public void close () {
+ return;
+ }
+
+ /**
+ * <em>Not</em> the AutoCloseable method of a resource.
+ */
+ public void close (int arg) {
+ return;
+ }
+}
+
+@Deprecated
+class DeprecatedAutoCloseable implements AutoCloseable {
+ public DeprecatedAutoCloseable(){super();}
+
+ @Override
+ public void close () {
+ return;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/TwrLint.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,3 @@
+TwrLint.java:14:15: compiler.warn.try.explicit.close.call
+TwrLint.java:13:13: compiler.warn.try.resource.not.referenced: r3
+2 warnings
--- a/langtools/test/tools/javac/TryWithResources/TwrOnNonResource.out Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/TryWithResources/TwrOnNonResource.out Sun Dec 05 15:26:16 2010 -0800
@@ -1,7 +1,7 @@
-TwrOnNonResource.java:12:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
-TwrOnNonResource.java:15:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
-TwrOnNonResource.java:18:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
-TwrOnNonResource.java:24:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
-TwrOnNonResource.java:27:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
-TwrOnNonResource.java:30:13: compiler.err.prob.found.req: (compiler.misc.twr.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:12:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:15:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:18:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:24:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:27:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
+TwrOnNonResource.java:30:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
6 errors
--- a/langtools/test/tools/javac/TryWithResources/TwrSuppression.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/TryWithResources/TwrSuppression.java Sun Dec 05 15:26:16 2010 -0800
@@ -36,7 +36,7 @@
throw new RuntimeException();
}
} catch(RuntimeException e) {
- Throwable[] suppressedExceptions = e.getSuppressedExceptions();
+ Throwable[] suppressedExceptions = e.getSuppressed();
int length = suppressedExceptions.length;
if (length != 2)
throw new RuntimeException("Unexpected length " + length);
--- a/langtools/test/tools/javac/TryWithResources/TwrTests.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/TryWithResources/TwrTests.java Sun Dec 05 15:26:16 2010 -0800
@@ -90,7 +90,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed");
}
@@ -112,7 +112,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed");
}
@@ -134,7 +134,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -158,7 +158,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -181,7 +181,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -207,7 +207,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -231,7 +231,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -259,7 +259,7 @@
} catch (Resource.CreateFailException e) {
creationFailuresDetected++;
checkCreateFailureId(e.resourceId(), createFailureId);
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
throw new AssertionError("Secondary exception suppression failed:" + e);
}
@@ -310,7 +310,7 @@
* Check for proper suppressed exceptions in proper order.
*
* @param suppressedExceptions the suppressed exceptions array returned by
- * getSuppressedExceptions()
+ * getSuppressed()
* @bitmap a bitmap indicating which suppressed exceptions are expected.
* Bit i is set iff id should throw a CloseFailException.
*/
@@ -376,7 +376,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -388,7 +388,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 1);
}
@@ -409,7 +409,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -421,7 +421,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 2);
}
@@ -443,7 +443,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -455,7 +455,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 2);
}
@@ -477,7 +477,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -489,7 +489,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 3);
}
@@ -513,7 +513,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -525,7 +525,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 3);
}
@@ -548,7 +548,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -560,7 +560,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 4);
}
@@ -586,7 +586,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -598,7 +598,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 4);
}
@@ -621,7 +621,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -633,7 +633,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 5);
}
@@ -660,7 +660,7 @@
} catch (MyKindOfException e) {
if (failure == 0)
throw new AssertionError("Unexpected MyKindOfException");
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap);
} catch (Resource.CloseFailException e) {
if (failure == 1)
throw new AssertionError("Secondary exception suppression failed");
@@ -672,7 +672,7 @@
throw new AssertionError("CloseFailException: got id " + id
+ ", expected lg(" + highestCloseFailBit +")");
}
- checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
+ checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
}
checkClosedList(closedList, 5);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/api/6598108/T6598108.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6598108
+ * @summary com.sun.source.util.Trees.isAccessible incorrect
+ * @author Jan Lahoda
+ */
+
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.Scope;
+import com.sun.source.util.JavacTask;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.Trees;
+import java.net.URI;
+import java.util.Arrays;
+import javax.lang.model.element.TypeElement;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+
+public class T6598108 {
+ public static void main(String[] args) throws Exception {
+ final String bootPath = System.getProperty("sun.boot.class.path"); //NOI18N
+ final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
+ assert tool != null;
+ final JavacTask ct = (JavacTask)tool.getTask(null, null, null, Arrays.asList("-bootclasspath", bootPath), null, Arrays.asList(new MyFileObject()));
+
+ CompilationUnitTree cut = ct.parse().iterator().next();
+ TreePath tp = new TreePath(new TreePath(cut), cut.getTypeDecls().get(0));
+ Scope s = Trees.instance(ct).getScope(tp);
+ TypeElement type = ct.getElements().getTypeElement("com.sun.java.util.jar.pack.Package.File");
+
+ if (Trees.instance(ct).isAccessible(s, type)) {
+ //com.sun.java.util.jar.pack.Package.File is a public innerclass inside a non-accessible class, so
+ //"false" would be expected here.
+ throw new IllegalStateException("");
+ }
+ }
+
+ static class MyFileObject extends SimpleJavaFileObject {
+ public MyFileObject() {
+ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+ }
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return "public class Test<TTT> { public void test() {TTT ttt;}}";
+ }
+ }
+}
--- a/langtools/test/tools/javac/api/T6412669.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/api/T6412669.java Sun Dec 05 15:26:16 2010 -0800
@@ -23,11 +23,12 @@
/*
* @test
- * @bug 6412669
+ * @bug 6412669 6997958
* @summary Should be able to get SourcePositions from 269 world
*/
import java.io.*;
+import java.net.*;
import java.util.*;
import javax.annotation.*;
import javax.annotation.processing.*;
@@ -39,28 +40,59 @@
@SupportedAnnotationTypes("*")
public class T6412669 extends AbstractProcessor {
- public static void main(String... args) throws IOException {
- String testSrc = System.getProperty("test.src", ".");
- String testClasses = System.getProperty("test.classes", ".");
+ public static void main(String... args) throws Exception {
+ File testSrc = new File(System.getProperty("test.src", "."));
+ File testClasses = new File(System.getProperty("test.classes", "."));
+
+ // Determine location of necessary tools classes. Assume all in one place.
+ // Likely candidates are typically tools.jar (when testing JDK build)
+ // or build/classes or dist/javac.jar (when testing langtools, using -Xbootclasspath/p:)
+ File toolsClasses;
+ URL u = T6412669.class.getClassLoader().getResource("com/sun/source/util/JavacTask.class");
+ switch (u.getProtocol()) {
+ case "file":
+ toolsClasses = new File(u.toURI());
+ break;
+ case "jar":
+ String s = u.getFile(); // will be file:path!/entry
+ int sep = s.indexOf("!");
+ toolsClasses = new File(new URI(s.substring(0, sep)));
+ break;
+ default:
+ throw new AssertionError("Cannot locate tools classes");
+ }
+ //System.err.println("toolsClasses: " + toolsClasses);
JavacTool tool = JavacTool.create();
StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
- fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(testClasses)));
+ fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses, toolsClasses));
Iterable<? extends JavaFileObject> files =
fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java")));
- String[] opts = { "-proc:only", "-processor", T6412669.class.getName(),
- "-classpath", new File(testClasses).getPath() };
- JavacTask task = tool.getTask(null, fm, null, Arrays.asList(opts), null, files);
- if (!task.call())
- throw new AssertionError("test failed");
+ String[] opts = { "-proc:only", "-processor", T6412669.class.getName()};
+ StringWriter sw = new StringWriter();
+ JavacTask task = tool.getTask(sw, fm, null, Arrays.asList(opts), null, files);
+ boolean ok = task.call();
+ String out = sw.toString();
+ if (!out.isEmpty())
+ System.err.println(out);
+ if (!ok)
+ throw new AssertionError("compilation of test program failed");
+ // verify we found an annotated element to exercise the SourcePositions API
+ if (!out.contains("processing element"))
+ throw new AssertionError("expected text not found in compilation output");
}
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Trees trees = Trees.instance(processingEnv);
SourcePositions sp = trees.getSourcePositions();
Messager m = processingEnv.getMessager();
+ m.printMessage(Diagnostic.Kind.NOTE, "processing annotations");
+ int count = 0;
for (TypeElement anno: annotations) {
+ count++;
+ m.printMessage(Diagnostic.Kind.NOTE, " processing annotation " + anno);
for (Element e: roundEnv.getElementsAnnotatedWith(anno)) {
+ m.printMessage(Diagnostic.Kind.NOTE, " processing element " + e);
TreePath p = trees.getPath(e);
long start = sp.getStartPosition(p.getCompilationUnit(), p.getLeaf());
long end = sp.getEndPosition(p.getCompilationUnit(), p.getLeaf());
@@ -69,6 +101,8 @@
m.printMessage(k, "test [" + start + "," + end + "]", e);
}
}
+ if (count == 0)
+ m.printMessage(Diagnostic.Kind.NOTE, "no annotations found");
return true;
}
--- a/langtools/test/tools/javac/cast/6467183/T6467183a.out Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/cast/6467183/T6467183a.out Sun Dec 05 15:26:16 2010 -0800
@@ -1,6 +1,4 @@
T6467183a.java:16:26: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.B, T6467183a<T>.A<T>
-T6467183a.java:24:41: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.A<java.lang.Integer>, T6467183a<T>.C<? extends java.lang.Number>
-T6467183a.java:28:42: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), T6467183a<T>.A<java.lang.Integer>, T6467183a<T>.C<? extends java.lang.Integer>
- compiler.err.warnings.and.werror
1 error
-3 warnings
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6714835/T6714835.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,21 @@
+/*
+ * @test /nodynamiccopyright/
+ * @author mcimadamore
+ * @bug 6714835
+ * @summary Safe cast is rejected (with warning) by javac
+ * @compile/fail/ref=T6714835.out -Xlint:unchecked -Werror -XDrawDiagnostics T6714835.java
+ */
+
+import java.util.*;
+
+class T6714835 {
+ void cast1(Iterable<? extends Integer> x) {
+ Collection<? extends Number> x1 = (Collection<? extends Number>)x; //ok
+ Collection<? super Integer> x2 = (Collection<? super Integer>)x; //warn
+ }
+
+ void cast2(Iterable<? super Number> x) {
+ Collection<? super Integer> x1 = (Collection<? super Integer>)x; //ok
+ Collection<? extends Number> x2 = (Collection<? extends Number>)x; //warn
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6714835/T6714835.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,5 @@
+T6714835.java:14:71: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Iterable<compiler.misc.type.captureof: 1, ? extends java.lang.Integer>, java.util.Collection<? super java.lang.Integer>
+T6714835.java:19:73: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Iterable<compiler.misc.type.captureof: 1, ? super java.lang.Number>, java.util.Collection<? extends java.lang.Number>
+- compiler.err.warnings.and.werror
+1 error
+2 warnings
--- a/langtools/test/tools/javac/diags/examples/MulticatchMustBeFinal.java Thu Dec 02 23:44:01 2010 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-// key: compiler.err.multicatch.param.must.be.final
-
-class MulticatchMustBeFinal {
- void e1() throws NullPointerException { }
- void e2() throws IllegalArgumentException { }
-
- void m() {
- try {
- e1();
- e2();
- } catch (NullPointerException | IllegalArgumentException e) {
- e.printStackTrace();
- }
- }
-}
--- a/langtools/test/tools/javac/diags/examples/ResourceClosed.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/diags/examples/ResourceClosed.java Sun Dec 05 15:26:16 2010 -0800
@@ -21,8 +21,8 @@
* questions.
*/
-// key: compiler.warn.twr.explicit.close.call
-// options: -Xlint:arm
+// key: compiler.warn.try.explicit.close.call
+// options: -Xlint:try
import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/ResourceMayNotBeAssigned.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/diags/examples/ResourceMayNotBeAssigned.java Sun Dec 05 15:26:16 2010 -0800
@@ -21,7 +21,7 @@
* questions.
*/
-// key: compiler.err.twr.resource.may.not.be.assigned
+// key: compiler.err.try.resource.may.not.be.assigned
import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/ResourceNotApplicableToType.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/diags/examples/ResourceNotApplicableToType.java Sun Dec 05 15:26:16 2010 -0800
@@ -21,7 +21,7 @@
* questions.
*/
-// key: compiler.misc.twr.not.applicable.to.type
+// key: compiler.misc.try.not.applicable.to.type
// key: compiler.err.prob.found.req
class ResourceNotApplicableToType {
--- a/langtools/test/tools/javac/diags/examples/ResourceNotReferenced.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/diags/examples/ResourceNotReferenced.java Sun Dec 05 15:26:16 2010 -0800
@@ -21,8 +21,8 @@
* questions.
*/
-// key: compiler.warn.automatic.resource.not.referenced
-// options: -Xlint:arm
+// key: compiler.warn.try.resource.not.referenced
+// options: -Xlint:try
import java.io.*;
--- a/langtools/test/tools/javac/diags/examples/TryResourceNotSupported.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/diags/examples/TryResourceNotSupported.java Sun Dec 05 15:26:16 2010 -0800
@@ -21,7 +21,7 @@
* questions.
*/
-// key: compiler.err.automatic.resource.management.not.supported.in.source
+// key: compiler.err.try.with.resources.not.supported.in.source
// options: -source 1.6
import java.io.*;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719a.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719a.out -XDrawDiagnostics T6985719a.java
+ */
+
+import java.util.List;
+
+class T6985719a {
+ interface A { void f(List<String> ls); }
+ interface B { void f(List<Integer> ls); }
+ interface C extends A,B {}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719a.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719a.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719a.B, f(java.util.List<java.lang.String>), T6985719a.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719b.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719b.out -XDrawDiagnostics T6985719b.java
+ */
+
+import java.util.List;
+
+class T6985719b {
+ abstract class A { abstract void f(List<String> ls); }
+ interface B { void f(List<Integer> ls); }
+ abstract class C extends A implements B {}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719b.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719b.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719b.B, f(java.util.List<java.lang.String>), T6985719b.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719c.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719c.out -XDrawDiagnostics T6985719c.java
+ */
+
+import java.util.List;
+
+class T6985719c {
+ interface A { void f(List<String> ls); }
+ interface B<X> { void f(List<X> ls); }
+ interface C extends A,B<Integer> {}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719c.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719c.java:14:5: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719c.B, f(java.util.List<java.lang.String>), T6985719c.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719d.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719d.out -XDrawDiagnostics T6985719d.java
+ */
+
+import java.util.List;
+
+class T6985719d {
+ abstract class A { abstract void f(List<String> ls); }
+ interface B<X> { void f(List<X> ls); }
+ abstract class C extends A implements B<Integer> {}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719d.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719d.java:14:14: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<X>), T6985719d.B, f(java.util.List<java.lang.String>), T6985719d.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719e.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719e.out -XDrawDiagnostics T6985719e.java
+ */
+
+import java.util.List;
+
+class T6985719e {
+ interface A { void f(List<String> ls); }
+ interface B extends A { void f(List<Integer> ls); }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719e.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719e.java:13:34: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719e.B, f(java.util.List<java.lang.String>), T6985719e.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719f.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719f.out -XDrawDiagnostics T6985719f.java
+ */
+
+import java.util.List;
+
+class T6985719f {
+ abstract class A { abstract void f(List<String> ls); }
+ abstract class B extends A { void f(List<Integer> ls); }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719f.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719f.java:13:39: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719f.B, f(java.util.List<java.lang.String>), T6985719f.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719g.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719g.out -XDrawDiagnostics T6985719g.java
+ */
+
+import java.util.List;
+
+class T6985719g {
+ interface A<X> { void f(List<X> ls); }
+ interface B extends A<String> { void f(List<Integer> ls); }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719g.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719g.java:13:42: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719g.B, f(java.util.List<X>), T6985719g.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719h.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6985719
+ * @summary Alike methods in interfaces (Inheritance and Overriding)
+ * @author mcimadamore
+ * @compile/fail/ref=T6985719h.out -XDrawDiagnostics T6985719h.java
+ */
+
+import java.util.List;
+
+class T6985719h {
+ abstract class A<X> { abstract void f(List<X> ls); }
+ abstract class B extends A<String> { abstract void f(List<Integer> ls); }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6985719/T6985719h.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+T6985719h.java:13:56: compiler.err.name.clash.same.erasure.no.override: f(java.util.List<java.lang.Integer>), T6985719h.B, f(java.util.List<X>), T6985719h.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914a.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6996914
+ * @summary Diamond inference: problem when accessing protected constructor
+ * @run main T6996914a
+ */
+
+import com.sun.source.util.JavacTask;
+import java.net.URI;
+import java.util.Arrays;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticListener;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+
+public class T6996914a {
+
+ enum PackageKind {
+ DEFAULT("", ""),
+ A("package a;", "import a.*;");
+
+ String pkgDecl;
+ String importDecl;
+
+ PackageKind(String pkgDecl, String importDecl) {
+ this.pkgDecl = pkgDecl;
+ this.importDecl = importDecl;
+ }
+ }
+
+ enum DiamondKind {
+ STANDARD("new Foo<>();"),
+ ANON("new Foo<>() {};");
+
+ String expr;
+
+ DiamondKind(String expr) {
+ this.expr = expr;
+ }
+ }
+
+ enum ConstructorKind {
+ PACKAGE(""),
+ PROTECTED("protected"),
+ PRIVATE("private"),
+ PUBLIC("public");
+
+ String mod;
+
+ ConstructorKind(String mod) {
+ this.mod = mod;
+ }
+ }
+
+ static class FooClass extends SimpleJavaFileObject {
+
+ final static String sourceStub =
+ "#P\n" +
+ "public class Foo<X> {\n" +
+ " #M Foo() {}\n" +
+ "}\n";
+
+ String source;
+
+ public FooClass(PackageKind pk, ConstructorKind ck) {
+ super(URI.create("myfo:/" + (pk != PackageKind.DEFAULT ? "a/Foo.java" : "Foo.java")),
+ JavaFileObject.Kind.SOURCE);
+ source = sourceStub.replace("#P", pk.pkgDecl).replace("#M", ck.mod);
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return source;
+ }
+ }
+
+ static class ClientClass extends SimpleJavaFileObject {
+
+ final static String sourceStub =
+ "#I\n" +
+ "class Test {\n" +
+ " Foo<String> fs = #D\n" +
+ "}\n";
+
+ String source;
+
+ public ClientClass(PackageKind pk, DiamondKind dk) {
+ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+ source = sourceStub.replace("#I", pk.importDecl).replace("#D", dk.expr);
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return source;
+ }
+ }
+
+ public static void main(String... args) throws Exception {
+ for (PackageKind pk : PackageKind.values()) {
+ for (ConstructorKind ck : ConstructorKind.values()) {
+ for (DiamondKind dk : DiamondKind.values()) {
+ compileAndCheck(pk, ck, dk);
+ }
+ }
+ }
+ }
+
+ static void compileAndCheck(PackageKind pk, ConstructorKind ck, DiamondKind dk) throws Exception {
+ FooClass foo = new FooClass(pk, ck);
+ ClientClass client = new ClientClass(pk, dk);
+ final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
+ ErrorListener el = new ErrorListener();
+ JavacTask ct = (JavacTask)tool.getTask(null, null, el,
+ null, null, Arrays.asList(foo, client));
+ ct.analyze();
+ if (el.errors > 0 == check(pk, ck, dk)) {
+ String msg = el.errors > 0 ?
+ "Error compiling files" :
+ "No error when compiling files";
+ throw new AssertionError(msg + ": \n" + foo.source + "\n" + client.source);
+ }
+ }
+
+ static boolean check(PackageKind pk, ConstructorKind ck, DiamondKind dk) {
+ switch (pk) {
+ case A: return ck == ConstructorKind.PUBLIC ||
+ (ck == ConstructorKind.PROTECTED && dk == DiamondKind.ANON);
+ case DEFAULT: return ck != ConstructorKind.PRIVATE;
+ default: throw new AssertionError("Unknown package kind");
+ }
+ }
+
+ /**
+ * DiagnosticListener to count any errors that occur
+ */
+ private static class ErrorListener implements DiagnosticListener<JavaFileObject> {
+
+ public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
+ switch (diagnostic.getKind()) {
+ case ERROR:
+ errors++;
+ }
+ }
+ int errors;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914b.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6996914
+ * @summary Diamond inference: problem when accessing protected constructor
+ * @compile T6996914b.java
+ */
+
+class Super<X,Y> {
+ private Super(Integer i, Y y, X x) {}
+ public Super(Number n, X x, Y y) {}
+}
+
+class Test {
+ Super<String,Integer> ssi1 = new Super<>(1, "", 2);
+ Super<String,Integer> ssi2 = new Super<>(1, "", 2) {};
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/meth/XlintWarn.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6999067
+ * @summary cast for invokeExact call gets redundant cast to <type> warnings
+ * @author mcimadamore
+ *
+ * @compile -Werror -Xlint:cast XlintWarn.java
+ */
+
+import java.dyn.*;
+
+class XlintWarn {
+ void test(MethodHandle mh) throws Throwable {
+ int i1 = (int)mh.invoke();
+ int i2 = (int)mh.invokeExact();
+ int i3 = (int)mh.invokeVarargs();
+ int i4 = (int)InvokeDynamic.test();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg01eff_final.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,28 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6943289
+ *
+ * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
+ * @author darcy
+ * @compile/fail/ref=Neg01eff_final.out -XDrawDiagnostics Neg01eff_final.java
+ * @compile -source 6 -XDrawDiagnostics Neg01eff_final.java
+ *
+ */
+
+class Neg01eff_final {
+ static class A extends Exception {}
+ static class B1 extends A {}
+ static class B2 extends A {}
+
+ class Test {
+ void m() throws A {
+ try {
+ throw new B1();
+ } catch (A ex1) {
+ try {
+ throw ex1; // used to throw A, now throws B1!
+ } catch (B2 ex2) { }//unreachable
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg01eff_final.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+Neg01eff_final.java:24:19: compiler.err.except.never.thrown.in.try: Neg01eff_final.B2
+1 error
--- a/langtools/test/tools/javac/multicatch/Neg02.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/multicatch/Neg02.java Sun Dec 05 15:26:16 2010 -0800
@@ -20,6 +20,8 @@
else {
throw new B();
}
- } catch (A | B ex) { }
+ } catch (final A | B ex) {
+ ex = new B();
+ }
}
}
--- a/langtools/test/tools/javac/multicatch/Neg02.out Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/multicatch/Neg02.out Sun Dec 05 15:26:16 2010 -0800
@@ -1,2 +1,2 @@
-Neg02.java:23:24: compiler.err.multicatch.param.must.be.final: ex
+Neg02.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex
1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg02eff_final.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,27 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6943289 6993963
+ *
+ * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
+ * @author mcimadamore
+ * @compile/fail/ref=Neg02eff_final.out -XDrawDiagnostics Neg02eff_final.java
+ *
+ */
+
+class Neg02eff_final {
+ static class A extends Exception {}
+ static class B extends Exception {}
+
+ void m() {
+ try {
+ if (true) {
+ throw new A();
+ }
+ else {
+ throw new B();
+ }
+ } catch (A | B ex) {
+ ex = new B();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg02eff_final.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+Neg02eff_final.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex
+1 error
--- a/langtools/test/tools/javac/multicatch/Neg03.java Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/multicatch/Neg03.java Sun Dec 05 15:26:16 2010 -0800
@@ -9,19 +9,22 @@
*/
class Neg03 {
- static class A extends Exception {}
- static class B extends Exception {}
- void m() {
+ static class A extends Exception { public void m() {}; public Object f;}
+ static class B1 extends A {}
+ static class B2 extends A {}
+
+ void m() throws B1, B2 {
try {
if (true) {
- throw new A();
+ throw new B1();
}
else {
- throw new B();
+ throw new B2();
}
- } catch (final A | B ex) {
- ex = new B();
+ } catch (Exception ex) {
+ ex = new B2(); //effectively final analysis disabled!
+ throw ex;
}
}
}
--- a/langtools/test/tools/javac/multicatch/Neg03.out Thu Dec 02 23:44:01 2010 -0800
+++ b/langtools/test/tools/javac/multicatch/Neg03.out Sun Dec 05 15:26:16 2010 -0800
@@ -1,2 +1,2 @@
-Neg03.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex
+Neg03.java:27:13: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg04eff_final.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,31 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6943289
+ *
+ * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
+ * @author mcimadamore
+ * @compile/fail/ref=Neg04eff_final.out -XDrawDiagnostics Neg04eff_final.java
+ *
+ */
+
+class Neg04eff_final {
+ static class A extends Exception {}
+ static class B extends Exception {}
+
+ void test() throws B {
+ try {
+ if (true) {
+ throw new A();
+ } else if (false) {
+ throw new B();
+ } else {
+ throw (Throwable)new Exception();
+ }
+ }
+ catch (A e) {}
+ catch (Exception e) {
+ throw e;
+ }
+ catch (Throwable t) {}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg04eff_final.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+Neg04eff_final.java:27:13: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg05.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,33 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6943289
+ *
+ * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
+ * @author mcimadamore
+ * @compile/fail/ref=Neg05.out -XDrawDiagnostics Neg05.java
+ *
+ */
+
+class Neg02 {
+
+ static class Foo<X> {
+ Foo(X x) {}
+ }
+
+ static interface Base<X> {}
+ static class A extends Exception implements Base<String> {}
+ static class B extends Exception implements Base<Integer> {}
+
+ void m() {
+ try {
+ if (true) {
+ throw new A();
+ }
+ else {
+ throw new B();
+ }
+ } catch (A | B ex) {
+ Foo<?> f = new Foo<>(ex);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Neg05.out Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,2 @@
+Neg05.java:30:31: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg02.Foo), (compiler.misc.diamond.invalid.arg: java.lang.Exception&Neg02.Base<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, (compiler.misc.diamond: Neg02.Foo))
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Pos06.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,27 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6993963
+ *
+ * @summary Project Coin: Use precise exception analysis for effectively final catch parameters
+ * @author mcimadamore
+ * @compile Pos06.java
+ *
+ */
+
+class Pos06 {
+ static class A extends Exception {}
+ static class B extends Exception {}
+
+ void m() {
+ try {
+ if (true) {
+ throw new A();
+ }
+ else {
+ throw new B();
+ }
+ } catch (A | B ex) {
+ System.out.println(ex);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Pos07.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6993963
+ * @summary Project Coin: Use precise exception analysis for effectively final catch parameters
+ * @compile Pos07.java
+ */
+
+class Pos07 {
+
+ static class A extends Exception { public void m() {}; public Object f;}
+ static class B1 extends A {}
+ static class B2 extends A {}
+
+ void m() throws B1, B2 {
+ try {
+ if (true) {
+ throw new B1();
+ }
+ else {
+ throw new B2();
+ }
+ } catch (Exception ex) { //effectively final analysis
+ throw ex;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Pos08.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6993963
+ * @summary Multicatch: crash while compiling simple code with a multicatch parameter
+ * @compile Pos08.java
+ */
+
+class Pos08 {
+
+ interface Foo {}
+ static class X1 extends Exception implements Foo {}
+ static class X2 extends Exception implements Foo {}
+
+ void m(boolean cond) {
+ try {
+ if (cond)
+ throw new X1();
+ else
+ throw new X2();
+ }
+ catch (final X1 | X2 ex) {}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Pos08eff_final.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6993963
+ * @summary Multicatch: crash while compiling simple code with a multicatch parameter
+ * @compile Pos08eff_final.java
+ */
+
+class Pos08eff_final {
+
+ interface Foo {}
+ static class X1 extends Exception implements Foo {}
+ static class X2 extends Exception implements Foo {}
+
+ void m(boolean cond) {
+ try {
+ if (cond)
+ throw new X1();
+ else
+ throw new X2();
+ }
+ catch (X1 | X2 ex) {}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/model/Check.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Annotation used by ModelChecker to mark the class whose model is to be checked
+ */
+@interface Check {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/model/Member.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.lang.model.element.ElementKind;
+
+/**
+ * Annotation used by ModelChecker to mark a member that is to be checked
+ */
+@interface Member {
+ ElementKind value();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/model/Model01.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.lang.model.element.ElementKind;
+
+@Check
+class Test {
+
+ class A extends Exception {
+ @Member(ElementKind.METHOD)
+ public void m() {};
+ @Member(ElementKind.FIELD)
+ public Object f;
+ }
+
+ class B1 extends A {}
+ class B2 extends A {}
+
+ void test(){
+ try {
+ if (true)
+ throw new B1();
+ else
+ throw new B2();
+ }
+ catch(B1 | B2 ex) { }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/model/ModelChecker.java Sun Dec 05 15:26:16 2010 -0800
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6993963
+ * @summary Project Coin: Use precise exception analysis for effectively final catch parameters
+ * @library ../../lib
+ * @build JavacTestingAbstractProcessor ModelChecker
+ * @compile -processor ModelChecker Model01.java
+ */
+
+import com.sun.source.tree.VariableTree;
+import com.sun.source.util.TreePathScanner;
+import com.sun.source.util.Trees;
+import com.sun.source.util.TreePath;
+
+import java.util.Set;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.TypeElement;
+
+@SupportedAnnotationTypes("Check")
+public class ModelChecker extends JavacTestingAbstractProcessor {
+
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ if (roundEnv.processingOver())
+ return true;
+
+ Trees trees = Trees.instance(processingEnv);
+
+ TypeElement testAnno = elements.getTypeElement("Check");
+ for (Element elem: roundEnv.getElementsAnnotatedWith(testAnno)) {
+ TreePath p = trees.getPath(elem);
+ new MulticatchParamTester(trees).scan(p, null);
+ }
+ return true;
+ }
+
+ class MulticatchParamTester extends TreePathScanner<Void, Void> {
+ Trees trees;
+
+ public MulticatchParamTester(Trees trees) {
+ super();
+ this.trees = trees;
+ }
+
+ @Override
+ public Void visitVariable(VariableTree node, Void p) {
+ Element ex = trees.getElement(getCurrentPath());
+ if (ex.getSimpleName().contentEquals("ex")) {
+ assertTrue(ex.getKind() == ElementKind.EXCEPTION_PARAMETER, "Expected EXCEPTION_PARAMETER - found " + ex.getKind());
+ for (Element e : types.asElement(ex.asType()).getEnclosedElements()) {
+ Member m = e.getAnnotation(Member.class);
+ if (m != null) {
+ assertTrue(e.getKind() == m.value(), "Expected " + m.value() + " - found " + e.getKind());
+ }
+ }
+ assertTrue(assertionCount == 3, "Expected 3 assertions - found " + assertionCount);
+ }
+ return super.visitVariable(node, p);
+ }
+ }
+
+ private static void assertTrue(boolean cond, String msg) {
+ assertionCount++;
+ if (!cond)
+ throw new AssertionError(msg);
+ }
+
+ static int assertionCount = 0;
+}