This commit is contained in:
John R Rose 2010-12-03 11:23:34 -08:00
commit 63d7df960a
110 changed files with 1890 additions and 375 deletions

View File

@ -93,3 +93,4 @@ f960f117f1623629f64203e2b09a92a8f6f14ff5 jdk7-b112
a4e6aa1f45ad23a6f083ed98d970b5006ea4d292 jdk7-b116
228e73f288c543a8c34e2a54227103ae5649e6af jdk7-b117
2e876e59938a853934aa738c811b26c452bd9fe8 jdk7-b118
4951967a61b4dbbf514828879f57bd1a0d4b420b jdk7-b119

View File

@ -93,3 +93,4 @@ e8ebdf41b9c01a26642848f4134f5504e8fb3233 jdk7-b115
94e9a1bfba8b8d1fe0bfd43b88629b1f27b02a76 jdk7-b116
7220e60b097fa027e922f1aeecdd330f3e37409f jdk7-b117
a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118
661360bef6ccad6c119f067f5829b207de80c936 jdk7-b119

View File

@ -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;
}

View File

@ -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();

View File

@ -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 ) {
}

View File

@ -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;

View File

@ -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();

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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

View File

@ -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 ;
}
} ;

View File

@ -93,3 +93,4 @@ dc1612e1d3ac08eb8fcad764daff21c9247d33c9 jdk7-b115
f8d4e6c6cfce1cda23fcbd144628a9791a9e1a63 jdk7-b116
9ee4d96e893436a48607924227dadd2d93b9b00d jdk7-b117
b2f6d9c4f12ffd307a5de40455b2b61b31a5cb79 jdk7-b118
9ee900f01c5872551c06f33ae909662ffd8463ac jdk7-b119

View File

@ -93,3 +93,4 @@ d35c94fd22362f478f75b4bfcd2bef6a83cb9b3f jdk7-b113
376ac153078dd3b5f6d4a0981feee092c1492c96 jdk7-b116
1320fb3bb588298c79716bd2d10b5b4afacb9370 jdk7-b117
19a2fab3f91a275f90791c15d1c21a24e820ff2d jdk7-b118
41fa02b3663795ddf529690df7aa6714210093ec jdk7-b119

View File

@ -93,3 +93,4 @@ e250cef36ea05e627e7e6f7d75e5e19f529e2ba3 jdk7-b114
1657ed4e1d86c8aa2028ab5a41f9da1ac4a369f8 jdk7-b116
3e6726bbf80a4254ecd01051c8ed77ee19325e46 jdk7-b117
b357910aa04aead2a16b6d6ff395a8df4b51d1dd jdk7-b118
37d74e29687cf07c2bf9411af58c7e42440855c3 jdk7-b120

View File

@ -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.

View File

@ -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.

View 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();

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -25,7 +25,8 @@
package com.sun.java.util.jar.pack;
import java.util.*;
import java.util.Arrays;
import java.util.List;
/**
* Shared constants

View File

@ -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.
*/

View File

@ -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.

View File

@ -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[]).

View File

@ -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

View File

@ -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.

View File

@ -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.

View 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.

View 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;
/*

View File

@ -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.

View File

@ -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.
*/

View File

@ -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.

View File

@ -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 {

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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; }
}
}

View File

@ -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) {

View File

@ -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

View File

@ -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.

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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) {

View File

@ -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]);
}
}

View File

@ -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;
}
}

View File

@ -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\

View File

@ -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) {

View 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();
}
}

View File

@ -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 { }
}

View File

@ -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

View File

@ -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

View File

@ -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) {
;
}

View 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

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View 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;}}";
}
}
}

View File

@ -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;
}

View File

@ -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

View 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
}
}

View 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

View File

@ -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.*;

View File

@ -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.*;

View File

@ -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 {

View File

@ -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.*;

View File

@ -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.*;

View 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 {}
}

View File

@ -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

View 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 {}
}

View File

@ -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

View 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> {}
}

View File

@ -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

View 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> {}
}

View File

@ -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

View 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); }
}

View File

@ -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

View 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); }
}

View File

@ -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

View 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); }
}

View File

@ -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

View 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); }
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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) {};
}

View 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();
}
}

View 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
}
}
}
}

View File

@ -0,0 +1,2 @@
Neg01eff_final.java:24:19: compiler.err.except.never.thrown.in.try: Neg01eff_final.B2
1 error

View File

@ -20,6 +20,8 @@ class Neg02 {
else {
throw new B();
}
} catch (A | B ex) { }
} catch (final A | B ex) {
ex = new B();
}
}
}

View File

@ -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

View 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();
}
}
}

View File

@ -0,0 +1,2 @@
Neg02eff_final.java:24:13: compiler.err.multicatch.parameter.may.not.be.assigned: ex
1 error

View File

@ -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;
}
}
}

View File

@ -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

View 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) {}
}
}

View 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