mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-18 06:15:16 +00:00
Merge
This commit is contained in:
commit
63d7df960a
1
.hgtags
1
.hgtags
@ -93,3 +93,4 @@ f960f117f1623629f64203e2b09a92a8f6f14ff5 jdk7-b112
|
||||
a4e6aa1f45ad23a6f083ed98d970b5006ea4d292 jdk7-b116
|
||||
228e73f288c543a8c34e2a54227103ae5649e6af jdk7-b117
|
||||
2e876e59938a853934aa738c811b26c452bd9fe8 jdk7-b118
|
||||
4951967a61b4dbbf514828879f57bd1a0d4b420b jdk7-b119
|
||||
|
||||
@ -93,3 +93,4 @@ e8ebdf41b9c01a26642848f4134f5504e8fb3233 jdk7-b115
|
||||
94e9a1bfba8b8d1fe0bfd43b88629b1f27b02a76 jdk7-b116
|
||||
7220e60b097fa027e922f1aeecdd330f3e37409f jdk7-b117
|
||||
a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118
|
||||
661360bef6ccad6c119f067f5829b207de80c936 jdk7-b119
|
||||
|
||||
@ -74,6 +74,7 @@ import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate;
|
||||
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 @@ public final class ClientRequestInfoImpl
|
||||
|
||||
// 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 @@ public final class ClientRequestInfoImpl
|
||||
|
||||
// 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 @@ public final class ClientRequestInfoImpl
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
||||
@ -70,6 +70,7 @@ import com.sun.corba.se.spi.orbutil.closure.ClosureFactory;
|
||||
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 class PIHandlerImpl implements PIHandler
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ public class PIHandlerImpl implements PIHandler
|
||||
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 @@ public class PIHandlerImpl implements PIHandler
|
||||
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 @@ public class PIHandlerImpl implements PIHandler
|
||||
// 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 @@ public class PIHandlerImpl implements PIHandler
|
||||
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();
|
||||
|
||||
@ -107,6 +107,11 @@ public class PINoOpHandlerImpl implements PIHandler
|
||||
return null;
|
||||
}
|
||||
|
||||
public Exception makeCompletedClientRequest(
|
||||
int replyStatus, Exception exception ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void initiateClientPIRequest( boolean diiRequest ) {
|
||||
}
|
||||
|
||||
|
||||
@ -187,7 +187,8 @@ public abstract class RequestInfoImpl
|
||||
startingPointCall = 0;
|
||||
intermediatePointCall = 0;
|
||||
endingPointCall = 0;
|
||||
replyStatus = UNINITIALIZED;
|
||||
// 6763340
|
||||
setReplyStatus( UNINITIALIZED ) ;
|
||||
currentExecutionPoint = EXECUTION_POINT_STARTING;
|
||||
alreadyExecuted = false;
|
||||
connection = null;
|
||||
|
||||
@ -1012,7 +1012,11 @@ public class IIOPInputStream
|
||||
* 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();
|
||||
|
||||
@ -1672,6 +1672,7 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
{
|
||||
StackImpl invocationInfoStack =
|
||||
(StackImpl)clientInvocationInfoStack.get();
|
||||
int entryCount = -1;
|
||||
ClientInvocationInfo clientInvocationInfo = null;
|
||||
if (!invocationInfoStack.empty()) {
|
||||
clientInvocationInfo =
|
||||
@ -1680,8 +1681,12 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -185,6 +185,7 @@ public class CorbaClientRequestDispatcherImpl
|
||||
if(getContactInfoListIterator(orb).hasNext()) {
|
||||
contactInfo = (ContactInfo)
|
||||
getContactInfoListIterator(orb).next();
|
||||
unregisterWaiter(orb);
|
||||
return beginRequest(self, opName,
|
||||
isOneWay, contactInfo);
|
||||
} else {
|
||||
@ -292,10 +293,22 @@ public class CorbaClientRequestDispatcherImpl
|
||||
// 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);
|
||||
|
||||
@ -141,6 +141,27 @@ public interface PIHandler {
|
||||
Exception invokeClientPIEndingPoint(
|
||||
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
|
||||
|
||||
@ -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 ;
|
||||
}
|
||||
} ;
|
||||
|
||||
@ -93,3 +93,4 @@ dc1612e1d3ac08eb8fcad764daff21c9247d33c9 jdk7-b115
|
||||
f8d4e6c6cfce1cda23fcbd144628a9791a9e1a63 jdk7-b116
|
||||
9ee4d96e893436a48607924227dadd2d93b9b00d jdk7-b117
|
||||
b2f6d9c4f12ffd307a5de40455b2b61b31a5cb79 jdk7-b118
|
||||
9ee900f01c5872551c06f33ae909662ffd8463ac jdk7-b119
|
||||
|
||||
@ -93,3 +93,4 @@ d35c94fd22362f478f75b4bfcd2bef6a83cb9b3f jdk7-b113
|
||||
376ac153078dd3b5f6d4a0981feee092c1492c96 jdk7-b116
|
||||
1320fb3bb588298c79716bd2d10b5b4afacb9370 jdk7-b117
|
||||
19a2fab3f91a275f90791c15d1c21a24e820ff2d jdk7-b118
|
||||
41fa02b3663795ddf529690df7aa6714210093ec jdk7-b119
|
||||
|
||||
@ -93,3 +93,4 @@ e250cef36ea05e627e7e6f7d75e5e19f529e2ba3 jdk7-b114
|
||||
1657ed4e1d86c8aa2028ab5a41f9da1ac4a369f8 jdk7-b116
|
||||
3e6726bbf80a4254ecd01051c8ed77ee19325e46 jdk7-b117
|
||||
b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118
|
||||
37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120
|
||||
|
||||
@ -25,8 +25,10 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Adaptive coding.
|
||||
|
||||
@ -25,9 +25,17 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Represents an attribute in a class-file.
|
||||
|
||||
@ -25,12 +25,28 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.Package.Class.Field;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.FilterOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.jar.Pack200;
|
||||
|
||||
/**
|
||||
* Define the structure and ordering of "bands" in a packed file.
|
||||
@ -1629,7 +1645,7 @@ class BandStructure implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
protected void setConstantValueIndex(Class.Field f) {
|
||||
protected void setConstantValueIndex(com.sun.java.util.jar.pack.Package.Class.Field f) {
|
||||
Index ix = null;
|
||||
if (f != null) {
|
||||
byte tag = f.getLiteralTag();
|
||||
|
||||
@ -25,11 +25,19 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.ClassEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.DescriptorEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Reader for a class file that is being incorporated into a package.
|
||||
|
||||
@ -25,11 +25,19 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.NumberEntry;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Writer for a class file that is incorporated into a package.
|
||||
|
||||
@ -25,10 +25,10 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Represents a chunk of bytecodes.
|
||||
|
||||
@ -25,8 +25,10 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Define the conversions between sequences of small integers and raw bytes.
|
||||
|
||||
@ -25,9 +25,17 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
|
||||
/**
|
||||
* Heuristic chooser of basic encodings.
|
||||
|
||||
@ -25,7 +25,9 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Interface for encoding and decoding int arrays using bytewise codes.
|
||||
|
||||
@ -25,7 +25,14 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Representation of constant pool entries and indexes.
|
||||
|
||||
@ -25,7 +25,8 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Shared constants
|
||||
|
||||
@ -25,11 +25,32 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.zip.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Pack200;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
/** Command line interface for Pack200.
|
||||
*/
|
||||
|
||||
@ -25,9 +25,11 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import java.util.AbstractCollection;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* Collection of relocatable constant pool references.
|
||||
|
||||
@ -25,8 +25,10 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Histogram derived from an integer array of events (int[]).
|
||||
|
||||
@ -26,10 +26,18 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.nio.*;
|
||||
import java.io.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Pack200;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
class NativeUnpack {
|
||||
// Pointer to the native unpacker obj
|
||||
|
||||
@ -26,11 +26,32 @@
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import com.sun.java.util.jar.pack.Attribute.Layout;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.ClassEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.DescriptorEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.LiteralEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.SequenceInputStream;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.io.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
/**
|
||||
* Define the main data structure transmitted by pack/unpack.
|
||||
|
||||
@ -25,12 +25,18 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import com.sun.java.util.jar.pack.ConstantPool.ClassEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.DescriptorEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.MemberEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.File;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
|
||||
/**
|
||||
* Reader for a package file.
|
||||
|
||||
@ -25,12 +25,30 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.ClassEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.DescriptorEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Entry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.IndexGroup;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.MemberEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.NumberEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.StringEntry;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.File;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.*;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Writer for a package file.
|
||||
|
||||
@ -26,10 +26,27 @@
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import com.sun.java.util.jar.pack.Attribute.Layout;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.io.*;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TimeZone;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.JarInputStream;
|
||||
import java.util.jar.Pack200;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@ -25,8 +25,12 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Population-based coding.
|
||||
|
||||
@ -25,13 +25,24 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.jar.Pack200;
|
||||
import java.util.zip.*;
|
||||
import java.io.*;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.jar.Pack200;
|
||||
/**
|
||||
* Control block for publishing Pack200 options to the other classes.
|
||||
*/
|
||||
|
||||
@ -25,11 +25,25 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.*;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TimeZone;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarInputStream;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Pack200;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.CheckedOutputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
|
||||
/*
|
||||
* Implementation of the Pack provider.
|
||||
|
||||
@ -25,18 +25,27 @@
|
||||
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import com.sun.java.util.jar.pack.Attribute.Layout;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.ClassEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.DescriptorEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.LiteralEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.MemberEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.*;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilterOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Map;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.JarInputStream;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
class Utils {
|
||||
|
||||
@ -49,6 +49,7 @@ import com.sun.tools.javac.code.Flags;
|
||||
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 class JavacTrees extends Trees {
|
||||
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 @@ public class JavacTrees extends Trees {
|
||||
&& 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;
|
||||
}
|
||||
|
||||
@ -247,6 +247,11 @@ public class Flags {
|
||||
*/
|
||||
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
|
||||
|
||||
@ -212,9 +212,9 @@ public class Lint
|
||||
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);
|
||||
|
||||
@ -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 @@ import java.util.Iterator;
|
||||
/** 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 @@ public class Scope {
|
||||
|
||||
/** 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 class Scope {
|
||||
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 @@ public class Scope {
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 @@ public class Scope {
|
||||
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 @@ public class Scope {
|
||||
|
||||
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 @@ public class Scope {
|
||||
* 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 @@ public class Scope {
|
||||
* 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 @@ public class Scope {
|
||||
* 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 @@ public class Scope {
|
||||
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 @@ public class Scope {
|
||||
}
|
||||
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 @@ public class Scope {
|
||||
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 class Scope {
|
||||
*/
|
||||
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 class Scope {
|
||||
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 @@ public class Scope {
|
||||
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 @@ public class Scope {
|
||||
* 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 @@ public class Scope {
|
||||
// in many cases.
|
||||
return scope;
|
||||
}
|
||||
|
||||
protected boolean isBogus () { return false; }
|
||||
}
|
||||
|
||||
public static class ImportScope extends Scope {
|
||||
@ -470,22 +511,10 @@ public class Scope {
|
||||
}
|
||||
|
||||
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 class Scope {
|
||||
}
|
||||
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; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3151,7 +3151,7 @@ public class Types {
|
||||
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) {
|
||||
|
||||
@ -252,10 +252,12 @@ public class Attr extends JCTree.Visitor {
|
||||
(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 @@ public class Attr extends JCTree.Visitor {
|
||||
memberEnter.memberEnter(tree, env);
|
||||
annotate.flush();
|
||||
}
|
||||
tree.sym.flags_field |= EFFECTIVELY_FINAL;
|
||||
}
|
||||
|
||||
VarSymbol v = tree.sym;
|
||||
@ -1042,11 +1045,11 @@ public class Attr extends JCTree.Visitor {
|
||||
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 @@ public class Attr extends JCTree.Visitor {
|
||||
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 @@ public class Attr extends JCTree.Visitor {
|
||||
// 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 @@ public class Attr extends JCTree.Visitor {
|
||||
* 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 @@ public class Attr extends JCTree.Visitor {
|
||||
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 @@ public class Attr extends JCTree.Visitor {
|
||||
((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
|
||||
|
||||
@ -1510,14 +1510,7 @@ public class Check {
|
||||
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 @@ public class Check {
|
||||
* @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 @@ public class Check {
|
||||
|
||||
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 @@ public class Check {
|
||||
}
|
||||
|
||||
/** 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 @@ public class Check {
|
||||
(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 @@ public class Check {
|
||||
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.
|
||||
|
||||
@ -226,7 +226,7 @@ public class Flow extends TreeScanner {
|
||||
*/
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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 @@ public class Flow extends TreeScanner {
|
||||
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;
|
||||
|
||||
@ -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 @@ public class Lower extends TreeTranslator {
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@ -159,33 +159,45 @@ public class Resolve {
|
||||
* @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 @@ public class Resolve {
|
||||
}
|
||||
|
||||
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 @@ public class Resolve {
|
||||
* @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 @@ public class Resolve {
|
||||
||
|
||||
env.toplevel.packge == sym.packge())
|
||||
&&
|
||||
isAccessible(env, site)
|
||||
isAccessible(env, site, checkInner)
|
||||
&&
|
||||
sym.isInheritedIn(site.tsym, types)
|
||||
&&
|
||||
@ -248,11 +267,11 @@ public class Resolve {
|
||||
// (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
|
||||
|
||||
@ -993,7 +993,9 @@ public class ClassWriter extends ClassFile {
|
||||
/** 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) {
|
||||
|
||||
@ -1304,7 +1304,7 @@ public class Code {
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1712,7 +1712,7 @@ public class JavacParser implements Parser {
|
||||
S.nextToken();
|
||||
List<JCTree> resources = List.<JCTree>nil();
|
||||
if (S.token() == LPAREN) {
|
||||
checkAutomaticResourceManagement();
|
||||
checkTryWithResources();
|
||||
S.nextToken();
|
||||
resources = resources();
|
||||
accept(RPAREN);
|
||||
@ -2970,9 +2970,9 @@ public class JavacParser implements Parser {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,8 +63,6 @@ compiler.err.anon.class.impl.intf.no.typeargs=\
|
||||
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.except.never.thrown.in.try=\
|
||||
|
||||
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.unclosed.type.files=\
|
||||
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.misc.assignment.to.extends-bound=\
|
||||
# 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 @@ compiler.err.unsupported.exotic.id=\
|
||||
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\
|
||||
|
||||
@ -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 class Names {
|
||||
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 @@ public class Names {
|
||||
|
||||
java_lang_AutoCloseable = fromString("java.lang.AutoCloseable");
|
||||
close = fromString("close");
|
||||
addSuppressed = fromString("addSuppressed");
|
||||
}
|
||||
|
||||
protected Name.Table createTable(Options options) {
|
||||
|
||||
45
langtools/test/tools/javac/6996626/Main.java
Normal file
45
langtools/test/tools/javac/6996626/Main.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,18 +21,11 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// key: compiler.err.multicatch.param.must.be.final
|
||||
package pack1;
|
||||
|
||||
class MulticatchMustBeFinal {
|
||||
void e1() throws NullPointerException { }
|
||||
void e2() throws IllegalArgumentException { }
|
||||
|
||||
void m() {
|
||||
try {
|
||||
e1();
|
||||
e2();
|
||||
} catch (NullPointerException | IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
public class Symbol {
|
||||
public static class CompletionFailure extends RuntimeException { }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
* @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
|
||||
* @summary Check that -Xlint:twr warnings are generated as expected
|
||||
* @compile/ref=TwrLint.out -Xlint:try,deprecation -XDrawDiagnostics TwrLint.java
|
||||
*/
|
||||
|
||||
class ArmLint implements AutoCloseable {
|
||||
class TwrLint implements AutoCloseable {
|
||||
private static void test1() {
|
||||
try(ArmLint r1 = new ArmLint();
|
||||
ArmLint r2 = new ArmLint();
|
||||
ArmLint r3 = new ArmLint()) {
|
||||
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
|
||||
@ -18,11 +18,11 @@ class ArmLint implements AutoCloseable {
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("arm")
|
||||
@SuppressWarnings("try")
|
||||
private static void test2() {
|
||||
try(@SuppressWarnings("deprecation") AutoCloseable r4 =
|
||||
new DeprecatedAutoCloseable()) {
|
||||
// r4 not referenced
|
||||
// r4 not referenced - but no warning is generated because of @SuppressWarnings
|
||||
} catch(Exception e) {
|
||||
;
|
||||
}
|
||||
3
langtools/test/tools/javac/TryWithResources/TwrLint.out
Normal file
3
langtools/test/tools/javac/TryWithResources/TwrLint.out
Normal file
@ -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
|
||||
@ -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
|
||||
|
||||
@ -36,7 +36,7 @@ public class TwrSuppression implements AutoCloseable {
|
||||
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);
|
||||
|
||||
@ -90,7 +90,7 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
* 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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
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 @@ public class TwrTests {
|
||||
} 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 @@ public class TwrTests {
|
||||
throw new AssertionError("CloseFailException: got id " + id
|
||||
+ ", expected lg(" + highestCloseFailBit +")");
|
||||
}
|
||||
checkSuppressedExceptions(e.getSuppressedExceptions(), bitMap & ~highestCloseFailBit);
|
||||
checkSuppressedExceptions(e.getSuppressed(), bitMap & ~highestCloseFailBit);
|
||||
}
|
||||
checkClosedList(closedList, 5);
|
||||
}
|
||||
|
||||
71
langtools/test/tools/javac/api/6598108/T6598108.java
Normal file
71
langtools/test/tools/javac/api/6598108/T6598108.java
Normal file
@ -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;}}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 @@ import com.sun.tools.javac.api.*;
|
||||
|
||||
@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 @@ public class T6412669 extends AbstractProcessor {
|
||||
m.printMessage(k, "test [" + start + "," + end + "]", e);
|
||||
}
|
||||
}
|
||||
if (count == 0)
|
||||
m.printMessage(Diagnostic.Kind.NOTE, "no annotations found");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
21
langtools/test/tools/javac/cast/6714835/T6714835.java
Normal file
21
langtools/test/tools/javac/cast/6714835/T6714835.java
Normal file
@ -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
|
||||
}
|
||||
}
|
||||
5
langtools/test/tools/javac/cast/6714835/T6714835.out
Normal file
5
langtools/test/tools/javac/cast/6714835/T6714835.out
Normal file
@ -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
|
||||
@ -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.*;
|
||||
|
||||
|
||||
@ -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.*;
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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.*;
|
||||
|
||||
|
||||
@ -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.*;
|
||||
|
||||
15
langtools/test/tools/javac/generics/6985719/T6985719a.java
Normal file
15
langtools/test/tools/javac/generics/6985719/T6985719a.java
Normal file
@ -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 {}
|
||||
}
|
||||
@ -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
|
||||
15
langtools/test/tools/javac/generics/6985719/T6985719b.java
Normal file
15
langtools/test/tools/javac/generics/6985719/T6985719b.java
Normal file
@ -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 {}
|
||||
}
|
||||
@ -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
|
||||
15
langtools/test/tools/javac/generics/6985719/T6985719c.java
Normal file
15
langtools/test/tools/javac/generics/6985719/T6985719c.java
Normal file
@ -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> {}
|
||||
}
|
||||
@ -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
|
||||
15
langtools/test/tools/javac/generics/6985719/T6985719d.java
Normal file
15
langtools/test/tools/javac/generics/6985719/T6985719d.java
Normal file
@ -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> {}
|
||||
}
|
||||
@ -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
|
||||
14
langtools/test/tools/javac/generics/6985719/T6985719e.java
Normal file
14
langtools/test/tools/javac/generics/6985719/T6985719e.java
Normal file
@ -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); }
|
||||
}
|
||||
@ -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
|
||||
14
langtools/test/tools/javac/generics/6985719/T6985719f.java
Normal file
14
langtools/test/tools/javac/generics/6985719/T6985719f.java
Normal file
@ -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); }
|
||||
}
|
||||
@ -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
|
||||
14
langtools/test/tools/javac/generics/6985719/T6985719g.java
Normal file
14
langtools/test/tools/javac/generics/6985719/T6985719g.java
Normal file
@ -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); }
|
||||
}
|
||||
@ -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
|
||||
14
langtools/test/tools/javac/generics/6985719/T6985719h.java
Normal file
14
langtools/test/tools/javac/generics/6985719/T6985719h.java
Normal file
@ -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); }
|
||||
}
|
||||
@ -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
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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) {};
|
||||
}
|
||||
42
langtools/test/tools/javac/meth/XlintWarn.java
Normal file
42
langtools/test/tools/javac/meth/XlintWarn.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
28
langtools/test/tools/javac/multicatch/Neg01eff_final.java
Normal file
28
langtools/test/tools/javac/multicatch/Neg01eff_final.java
Normal file
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
langtools/test/tools/javac/multicatch/Neg01eff_final.out
Normal file
2
langtools/test/tools/javac/multicatch/Neg01eff_final.out
Normal file
@ -0,0 +1,2 @@
|
||||
Neg01eff_final.java:24:19: compiler.err.except.never.thrown.in.try: Neg01eff_final.B2
|
||||
1 error
|
||||
@ -20,6 +20,8 @@ class Neg02 {
|
||||
else {
|
||||
throw new B();
|
||||
}
|
||||
} catch (A | B ex) { }
|
||||
} catch (final A | B ex) {
|
||||
ex = new B();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
27
langtools/test/tools/javac/multicatch/Neg02eff_final.java
Normal file
27
langtools/test/tools/javac/multicatch/Neg02eff_final.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
langtools/test/tools/javac/multicatch/Neg02eff_final.out
Normal file
2
langtools/test/tools/javac/multicatch/Neg02eff_final.out
Normal file
@ -0,0 +1,2 @@
|
||||
Neg02eff_final.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex
|
||||
1 error
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
31
langtools/test/tools/javac/multicatch/Neg04eff_final.java
Normal file
31
langtools/test/tools/javac/multicatch/Neg04eff_final.java
Normal file
@ -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) {}
|
||||
}
|
||||
}
|
||||
2
langtools/test/tools/javac/multicatch/Neg04eff_final.out
Normal file
2
langtools/test/tools/javac/multicatch/Neg04eff_final.out
Normal file
@ -0,0 +1,2 @@
|
||||
Neg04eff_final.java:27:13: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
|
||||
1 error
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user