mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
Merge
This commit is contained in:
commit
d1e4300765
697 changed files with 20841 additions and 11048 deletions
1
.hgtags
1
.hgtags
|
@ -374,3 +374,4 @@ d53037a90c441cb528dc41c30827985de0e67c62 jdk-9+123
|
||||||
e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129
|
e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129
|
||||||
e613affb88d178dc7c589f1679db113d589bddb4 jdk-9+130
|
e613affb88d178dc7c589f1679db113d589bddb4 jdk-9+130
|
||||||
4d2a15091124488080d65848b704e25599b2aaeb jdk-9+131
|
4d2a15091124488080d65848b704e25599b2aaeb jdk-9+131
|
||||||
|
2e83d21d78cd9c1d52e6cd2599e9c8aa36ea1f52 jdk-9+132
|
||||||
|
|
|
@ -374,3 +374,4 @@ b30ae794d974d7dd3eb4e84203f70021823fa6c6 jdk-9+128
|
||||||
f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129
|
f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129
|
||||||
d94d54a3192fea79234c3ac55cd0b4052d45e954 jdk-9+130
|
d94d54a3192fea79234c3ac55cd0b4052d45e954 jdk-9+130
|
||||||
8728756c2f70a79a90188f4019cfd6b9a275765c jdk-9+131
|
8728756c2f70a79a90188f4019cfd6b9a275765c jdk-9+131
|
||||||
|
a24702d4d5ab0015a5c553ed57f66fce7d85155e jdk-9+132
|
||||||
|
|
|
@ -251,8 +251,6 @@ SUPPORT_HEADLESS:=@SUPPORT_HEADLESS@
|
||||||
# Legacy support
|
# Legacy support
|
||||||
USE_NEW_HOTSPOT_BUILD:=@USE_NEW_HOTSPOT_BUILD@
|
USE_NEW_HOTSPOT_BUILD:=@USE_NEW_HOTSPOT_BUILD@
|
||||||
|
|
||||||
MACOSX_UNIVERSAL=@MACOSX_UNIVERSAL@
|
|
||||||
|
|
||||||
# JDK_OUTPUTDIR specifies where a working jvm is built.
|
# JDK_OUTPUTDIR specifies where a working jvm is built.
|
||||||
# You can run $(JDK_OUTPUTDIR)/bin/java
|
# You can run $(JDK_OUTPUTDIR)/bin/java
|
||||||
# Though the layout of the contents of $(JDK_OUTPUTDIR) is not
|
# Though the layout of the contents of $(JDK_OUTPUTDIR) is not
|
||||||
|
|
|
@ -374,3 +374,4 @@ c7f5ba08fcd4b8416e62c21229f9a07c95498919 jdk-9+126
|
||||||
c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129
|
c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129
|
||||||
77f9692d5976ae155773dd3e07533616bb95bae1 jdk-9+130
|
77f9692d5976ae155773dd3e07533616bb95bae1 jdk-9+130
|
||||||
f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131
|
f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131
|
||||||
|
1ab4b9399c4cba584f66c1c088188f2f565fbf9c jdk-9+132
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API.
|
||||||
|
*/
|
||||||
module java.corba {
|
module java.corba {
|
||||||
requires public java.desktop;
|
requires public java.desktop;
|
||||||
requires public java.rmi;
|
requires public java.rmi;
|
||||||
|
|
|
@ -534,3 +534,4 @@ adc8c84b7cf8c540d920182f78a2bc982366432a jdk-9+126
|
||||||
e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129
|
e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129
|
||||||
7d54c7056328b6a2bf4877458b8f4d8cd870f93b jdk-9+130
|
7d54c7056328b6a2bf4877458b8f4d8cd870f93b jdk-9+130
|
||||||
943bf73b49c33c2d7cbd796f6a4ae3c7a00ae932 jdk-9+131
|
943bf73b49c33c2d7cbd796f6a4ae3c7a00ae932 jdk-9+131
|
||||||
|
713951c08aa26813375175c2ab6cc99ff2a56903 jdk-9+132
|
||||||
|
|
|
@ -374,3 +374,4 @@ bdc3c0b737efbf899709eb3121ce760dcfb51151 jdk-9+127
|
||||||
74241304e87b0d463391a8ecab40979b5af86dc2 jdk-9+129
|
74241304e87b0d463391a8ecab40979b5af86dc2 jdk-9+129
|
||||||
e66cdc2de6b02443911d386fc9217b0d824d0686 jdk-9+130
|
e66cdc2de6b02443911d386fc9217b0d824d0686 jdk-9+130
|
||||||
874082a9b565a7092a40bfa934a6e3e3c3455a60 jdk-9+131
|
874082a9b565a7092a40bfa934a6e3e3c3455a60 jdk-9+131
|
||||||
|
907445d85e680ea410fe2c83c0ec64b5508e4f3e jdk-9+132
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: XSLTErrorResources.java,v 1.2.4.1 2005/09/13 09:55:37 pvedula Exp $
|
|
||||||
*/
|
|
||||||
package com.sun.org.apache.xalan.internal.res;
|
package com.sun.org.apache.xalan.internal.res;
|
||||||
|
|
||||||
import java.util.ListResourceBundle;
|
import java.util.ListResourceBundle;
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: ErrorMessages.java,v 1.2.4.1 2005/09/15 09:59:41 pvedula Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.org.apache.xalan.internal.xsltc.compiler.util;
|
package com.sun.org.apache.xalan.internal.xsltc.compiler.util;
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: ErrorMessages.java,v 1.2.4.1 2005/09/14 05:06:42 pvedula Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.org.apache.xalan.internal.xsltc.runtime;
|
package com.sun.org.apache.xalan.internal.xsltc.runtime;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 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.org.apache.xerces.internal.dom;
|
||||||
|
|
||||||
|
public class AbortException extends RuntimeException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 2608302175475740417L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor AbortException
|
||||||
|
*/
|
||||||
|
public AbortException() { super(null, null, false, false); }
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ import java.util.ArrayList;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xerces.internal.dom.AbortException;
|
||||||
import com.sun.org.apache.xerces.internal.impl.Constants;
|
import com.sun.org.apache.xerces.internal.impl.Constants;
|
||||||
import com.sun.org.apache.xerces.internal.impl.RevalidationHandler;
|
import com.sun.org.apache.xerces.internal.impl.RevalidationHandler;
|
||||||
import com.sun.org.apache.xerces.internal.impl.dtd.DTDGrammar;
|
import com.sun.org.apache.xerces.internal.impl.dtd.DTDGrammar;
|
||||||
|
@ -157,11 +158,6 @@ public class DOMNormalizer implements XMLDocumentHandler {
|
||||||
// attribute value normalization
|
// attribute value normalization
|
||||||
final XMLString fNormalizedValue = new XMLString(new char[16], 0, 0);
|
final XMLString fNormalizedValue = new XMLString(new char[16], 0, 0);
|
||||||
|
|
||||||
/**
|
|
||||||
* If the user stops the process, this exception will be thrown.
|
|
||||||
*/
|
|
||||||
public static final RuntimeException abort = new RuntimeException();
|
|
||||||
|
|
||||||
//DTD validator
|
//DTD validator
|
||||||
private XMLDTDValidator fDTDValidator;
|
private XMLDTDValidator fDTDValidator;
|
||||||
|
|
||||||
|
@ -242,11 +238,8 @@ public class DOMNormalizer implements XMLDocumentHandler {
|
||||||
XMLGrammarDescription.XML_SCHEMA, fValidationHandler);
|
XMLGrammarDescription.XML_SCHEMA, fValidationHandler);
|
||||||
fValidationHandler = null;
|
fValidationHandler = null;
|
||||||
}
|
}
|
||||||
}
|
} catch (AbortException e) {
|
||||||
catch (RuntimeException e) {
|
return;
|
||||||
if( e==abort )
|
|
||||||
return; // processing aborted by the user
|
|
||||||
throw e; // otherwise re-throw.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1371,10 +1364,10 @@ public class DOMNormalizer implements XMLDocumentHandler {
|
||||||
error.fRelatedData = locator.fRelatedNode;
|
error.fRelatedData = locator.fRelatedNode;
|
||||||
|
|
||||||
if(!errorHandler.handleError(error))
|
if(!errorHandler.handleError(error))
|
||||||
throw abort;
|
throw new AbortException();
|
||||||
}
|
}
|
||||||
if( severity==DOMError.SEVERITY_FATAL_ERROR )
|
if( severity==DOMError.SEVERITY_FATAL_ERROR )
|
||||||
throw abort;
|
throw new AbortException();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void updateQName (Node node, QName qname){
|
protected final void updateQName (Node node, QName qname){
|
||||||
|
@ -2043,5 +2036,4 @@ public class DOMNormalizer implements XMLDocumentHandler {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // DOMNormalizer class
|
} // DOMNormalizer class
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
# DOM implementation.
|
# DOM implementation.
|
||||||
#
|
#
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: DOMMessages.properties,v 1.2 2005-08-16 22:51:51 jeffsuttor Exp $
|
|
||||||
|
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
FormatFailed = An internal error occurred while formatting the following message:\n
|
FormatFailed = An internal error occurred while formatting the following message:\n
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
# This file stores localized messages for the Xerces JAXP Datatype API implementation.
|
# This file stores localized messages for the Xerces JAXP Datatype API implementation.
|
||||||
#
|
#
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: DatatypeMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
FormatFailed = An internal error occurred while formatting the following message:\n
|
FormatFailed = An internal error occurred while formatting the following message:\n
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
# This file stores localized messages for the Xerces JAXP Validation API implementation.
|
# This file stores localized messages for the Xerces JAXP Validation API implementation.
|
||||||
#
|
#
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: JAXPValidationMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
# Messages for message reporting
|
# Messages for message reporting
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
# SAX implementation.
|
# SAX implementation.
|
||||||
#
|
#
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: SAXMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
|
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
# This file contains error and warning messages related to XML Schema
|
# This file contains error and warning messages related to XML Schema
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: XMLSchemaMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
FormatFailed = An internal error occurred while formatting the following message:\n
|
FormatFailed = An internal error occurred while formatting the following message:\n
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
#
|
#
|
||||||
# As usual with properties files, the messages are arranged in
|
# As usual with properties files, the messages are arranged in
|
||||||
# key/value tuples.
|
# key/value tuples.
|
||||||
#
|
|
||||||
# @version $Id: XMLSerializerMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
FormatFailed = An internal error occurred while formatting the following message:\n
|
FormatFailed = An internal error occurred while formatting the following message:\n
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
# This file stores localized messages for the Xerces XPointer implementation.
|
# This file stores localized messages for the Xerces XPointer implementation.
|
||||||
#
|
#
|
||||||
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
# The messages are arranged in key and value tuples in a ListResourceBundle.
|
||||||
#
|
|
||||||
# @version $Id: XPointerMessages.properties 3021 2011-03-01 00:12:28Z joehw $
|
|
||||||
|
|
||||||
# Messages for message reporting
|
# Messages for message reporting
|
||||||
BadMessageKey = The error message corresponding to the message key can not be found.
|
BadMessageKey = The error message corresponding to the message key can not be found.
|
||||||
|
@ -24,4 +22,4 @@ InvalidElementSchemeToken = InvalidElementSchemeToken: The element() scheme XPoi
|
||||||
InvalidElementSchemeXPointer = InvalidElementSchemeXPointer: The Element Scheme XPointer expression ''{0}'' is invalid.
|
InvalidElementSchemeXPointer = InvalidElementSchemeXPointer: The Element Scheme XPointer expression ''{0}'' is invalid.
|
||||||
XPointerElementSchemeProcessingError = XPointerElementSchemeProcessingError: An error occurred while processing the XPointer element() Scheme expression.
|
XPointerElementSchemeProcessingError = XPointerElementSchemeProcessingError: An error occurred while processing the XPointer element() Scheme expression.
|
||||||
InvalidNCNameInElementSchemeData = InvalidNCNameInElementSchemeData: The element() Scheme contains a ShortHand Pointer ''{0}'' with an invalid NCName.
|
InvalidNCNameInElementSchemeData = InvalidNCNameInElementSchemeData: The element() Scheme contains a ShortHand Pointer ''{0}'' with an invalid NCName.
|
||||||
InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''.
|
InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''.
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: XMLErrorResources.java,v 1.2.4.1 2005/09/15 07:45:37 suresh_emailid Exp $
|
|
||||||
*/
|
|
||||||
package com.sun.org.apache.xml.internal.res;
|
package com.sun.org.apache.xml.internal.res;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.io.Writer;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xerces.internal.dom.AbortException;
|
||||||
import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl;
|
import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl;
|
||||||
import com.sun.org.apache.xerces.internal.dom.DOMErrorImpl;
|
import com.sun.org.apache.xerces.internal.dom.DOMErrorImpl;
|
||||||
import com.sun.org.apache.xerces.internal.dom.DOMLocatorImpl;
|
import com.sun.org.apache.xerces.internal.dom.DOMLocatorImpl;
|
||||||
|
@ -501,11 +502,9 @@ public class DOMSerializerImpl implements LSSerializer, DOMConfiguration {
|
||||||
} catch (LSException lse) {
|
} catch (LSException lse) {
|
||||||
// Rethrow LSException.
|
// Rethrow LSException.
|
||||||
throw lse;
|
throw lse;
|
||||||
|
} catch (AbortException e) {
|
||||||
|
return null;
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
if (e == DOMNormalizer.abort) {
|
|
||||||
// stopped at user request
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
// REVISIT: A generic IOException doesn't provide enough information
|
// REVISIT: A generic IOException doesn't provide enough information
|
||||||
|
@ -733,11 +732,9 @@ public class DOMSerializerImpl implements LSSerializer, DOMConfiguration {
|
||||||
} catch (LSException lse) {
|
} catch (LSException lse) {
|
||||||
// Rethrow LSException.
|
// Rethrow LSException.
|
||||||
throw lse;
|
throw lse;
|
||||||
|
} catch (AbortException e) {
|
||||||
|
return false;
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
if (e == DOMNormalizer.abort) {
|
|
||||||
// stopped at user request
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (ser.fDOMErrorHandler != null) {
|
if (ser.fDOMErrorHandler != null) {
|
||||||
|
@ -833,11 +830,9 @@ public class DOMSerializerImpl implements LSSerializer, DOMConfiguration {
|
||||||
} catch (LSException lse) {
|
} catch (LSException lse) {
|
||||||
// Rethrow LSException.
|
// Rethrow LSException.
|
||||||
throw lse;
|
throw lse;
|
||||||
|
} catch (AbortException e) {
|
||||||
|
return false;
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
if (e == DOMNormalizer.abort) {
|
|
||||||
// stopped at user request
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (ser.fDOMErrorHandler != null) {
|
if (ser.fDOMErrorHandler != null) {
|
||||||
|
|
|
@ -19,9 +19,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: SerializerMessages.java,v 1.1.4.1 2005/09/08 11:03:11 suresh_emailid Exp $
|
|
||||||
*/
|
|
||||||
package com.sun.org.apache.xml.internal.serializer.utils;
|
package com.sun.org.apache.xml.internal.serializer.utils;
|
||||||
|
|
||||||
import java.util.ListResourceBundle;
|
import java.util.ListResourceBundle;
|
||||||
|
|
|
@ -28,6 +28,7 @@ package com.sun.org.apache.xpath.internal.jaxp;
|
||||||
import com.sun.org.apache.xalan.internal.res.XSLMessages;
|
import com.sun.org.apache.xalan.internal.res.XSLMessages;
|
||||||
import com.sun.org.apache.xalan.internal.utils.FactoryImpl;
|
import com.sun.org.apache.xalan.internal.utils.FactoryImpl;
|
||||||
import com.sun.org.apache.xml.internal.dtm.DTM;
|
import com.sun.org.apache.xml.internal.dtm.DTM;
|
||||||
|
import com.sun.org.apache.xpath.internal.axes.LocPathIterator;
|
||||||
import com.sun.org.apache.xpath.internal.objects.XObject;
|
import com.sun.org.apache.xpath.internal.objects.XObject;
|
||||||
import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
|
import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -73,6 +74,12 @@ class XPathImplUtil {
|
||||||
XObject eval(Object contextItem, com.sun.org.apache.xpath.internal.XPath xpath)
|
XObject eval(Object contextItem, com.sun.org.apache.xpath.internal.XPath xpath)
|
||||||
throws javax.xml.transform.TransformerException {
|
throws javax.xml.transform.TransformerException {
|
||||||
com.sun.org.apache.xpath.internal.XPathContext xpathSupport;
|
com.sun.org.apache.xpath.internal.XPathContext xpathSupport;
|
||||||
|
if (contextItem == null && xpath.getExpression() instanceof LocPathIterator) {
|
||||||
|
// the operation must have no dependency on the context that is null
|
||||||
|
throw new TransformerException(XSLMessages.createXPATHMessage(
|
||||||
|
XPATHErrorResources.ER_CONTEXT_CAN_NOT_BE_NULL,
|
||||||
|
new Object[] {}));
|
||||||
|
}
|
||||||
if (functionResolver != null) {
|
if (functionResolver != null) {
|
||||||
JAXPExtensionsProvider jep = new JAXPExtensionsProvider(
|
JAXPExtensionsProvider jep = new JAXPExtensionsProvider(
|
||||||
functionResolver, featureSecureProcessing, featureManager);
|
functionResolver, featureSecureProcessing, featureManager);
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* $Id: XPATHErrorResources.java,v 1.2.4.1 2005/09/15 01:29:15 jeffsuttor Exp $
|
|
||||||
*/
|
|
||||||
package com.sun.org.apache.xpath.internal.res;
|
package com.sun.org.apache.xpath.internal.res;
|
||||||
|
|
||||||
import java.util.ListResourceBundle;
|
import java.util.ListResourceBundle;
|
||||||
|
@ -93,6 +90,7 @@ public class XPATHErrorResources extends ListResourceBundle
|
||||||
public static final String ER_CURRENT_TAKES_NO_ARGS =
|
public static final String ER_CURRENT_TAKES_NO_ARGS =
|
||||||
"ER_CURRENT_TAKES_NO_ARGS";
|
"ER_CURRENT_TAKES_NO_ARGS";
|
||||||
public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
|
public static final String ER_DOCUMENT_REPLACED = "ER_DOCUMENT_REPLACED";
|
||||||
|
public static final String ER_CONTEXT_CAN_NOT_BE_NULL = "ER_CONTEXT_CAN_NOT_BE_NULL";
|
||||||
public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
|
public static final String ER_CONTEXT_HAS_NO_OWNERDOC =
|
||||||
"ER_CONTEXT_HAS_NO_OWNERDOC";
|
"ER_CONTEXT_HAS_NO_OWNERDOC";
|
||||||
public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
|
public static final String ER_LOCALNAME_HAS_TOO_MANY_ARGS =
|
||||||
|
@ -368,6 +366,9 @@ public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
|
||||||
{ ER_DOCUMENT_REPLACED,
|
{ ER_DOCUMENT_REPLACED,
|
||||||
"document() function implementation has been replaced by com.sun.org.apache.xalan.internal.xslt.FuncDocument!"},
|
"document() function implementation has been replaced by com.sun.org.apache.xalan.internal.xslt.FuncDocument!"},
|
||||||
|
|
||||||
|
{ ER_CONTEXT_CAN_NOT_BE_NULL,
|
||||||
|
"The context can not be null when the operation is context-dependent."},
|
||||||
|
|
||||||
{ ER_CONTEXT_HAS_NO_OWNERDOC,
|
{ ER_CONTEXT_HAS_NO_OWNERDOC,
|
||||||
"context does not have an owner document!"},
|
"context does not have an owner document!"},
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -34,18 +34,20 @@ import org.xml.sax.InputSource;
|
||||||
*
|
*
|
||||||
* <a name="XPath-evaluation"></a>
|
* <a name="XPath-evaluation"></a>
|
||||||
* <table border="1" cellpadding="2">
|
* <table border="1" cellpadding="2">
|
||||||
* <thead>
|
* <thead>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <th colspan="2">Evaluation of XPath Expressions.</th>
|
* <th colspan="2">Evaluation of XPath Expressions.</th>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </thead>
|
* </thead>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>context</td>
|
* <td>context</td>
|
||||||
* <td>
|
* <td>
|
||||||
* If a request is made to evaluate the expression in the absence
|
* The type of the context is implementation-dependent. If the value is
|
||||||
* of a context item, an empty document node will be used for the context.
|
* null, the operation must have no dependency on the context, otherwise
|
||||||
* For the purposes of evaluating XPath expressions, a DocumentFragment
|
* an XPathExpressionException will be thrown.
|
||||||
* is treated like a Document node.
|
*
|
||||||
|
* For the purposes of evaluating XPath expressions, a DocumentFragment
|
||||||
|
* is treated like a Document node.
|
||||||
* </td>
|
* </td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -33,19 +33,20 @@ import org.xml.sax.InputSource;
|
||||||
*
|
*
|
||||||
* <a name="XPathExpression-evaluation"></a>
|
* <a name="XPathExpression-evaluation"></a>
|
||||||
* <table border="1" cellpadding="2">
|
* <table border="1" cellpadding="2">
|
||||||
* <thead>
|
* <thead>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <th colspan="2">Evaluation of XPath Expressions.</th>
|
* <th colspan="2">Evaluation of XPath Expressions.</th>
|
||||||
* </tr>
|
* </tr>
|
||||||
* </thead>
|
* </thead>
|
||||||
* <tbody>
|
* <tr>
|
||||||
* <tr>
|
* <td>context</td>
|
||||||
* <td>context</td>
|
* <td>
|
||||||
* <td>
|
* The type of the context is implementation-dependent. If the value is
|
||||||
* If a request is made to evaluate the expression in the absence
|
* null, the operation must have no dependency on the context, otherwise
|
||||||
* of a context item, an empty document node will be used for the context.
|
* an XPathExpressionException will be thrown.
|
||||||
* For the purposes of evaluating XPath expressions, a DocumentFragment
|
*
|
||||||
* is treated like a Document node.
|
* For the purposes of evaluating XPath expressions, a DocumentFragment
|
||||||
|
* is treated like a Document node.
|
||||||
* </td>
|
* </td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Java API for XML Processing (JAXP), the Streaming API for XML (StAX),
|
||||||
|
* the Simple API for XML (SAX), and the W3C Document Object Model (DOM) API.
|
||||||
|
*/
|
||||||
module java.xml {
|
module java.xml {
|
||||||
exports javax.xml;
|
exports javax.xml;
|
||||||
exports javax.xml.catalog;
|
exports javax.xml.catalog;
|
||||||
|
|
|
@ -24,11 +24,17 @@
|
||||||
package xpath;
|
package xpath;
|
||||||
|
|
||||||
import javax.xml.namespace.NamespaceContext;
|
import javax.xml.namespace.NamespaceContext;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.xpath.XPath;
|
import javax.xml.xpath.XPath;
|
||||||
|
import javax.xml.xpath.XPathConstants;
|
||||||
|
import javax.xml.xpath.XPathExpressionException;
|
||||||
import javax.xml.xpath.XPathFactory;
|
import javax.xml.xpath.XPathFactory;
|
||||||
|
import org.testng.annotations.DataProvider;
|
||||||
import org.testng.annotations.Listeners;
|
import org.testng.annotations.Listeners;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
|
@ -36,19 +42,105 @@ import org.testng.annotations.Test;
|
||||||
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
|
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
|
||||||
* @run testng/othervm -DrunSecMngr=true xpath.XPathTest
|
* @run testng/othervm -DrunSecMngr=true xpath.XPathTest
|
||||||
* @run testng/othervm xpath.XPathTest
|
* @run testng/othervm xpath.XPathTest
|
||||||
* @summary Test XPath.getNamespaceContext() is supported.
|
* @summary Test XPath functions. See details for each test.
|
||||||
*/
|
*/
|
||||||
@Listeners({jaxp.library.BasePolicy.class})
|
@Listeners({jaxp.library.BasePolicy.class})
|
||||||
public class XPathTest {
|
public class XPathTest {
|
||||||
|
|
||||||
|
/*
|
||||||
|
@bug 6211561
|
||||||
|
* Verifies the specification for XPath and XPathExpression:
|
||||||
|
* If a null value is provided for item (the context),
|
||||||
|
* the expression must have no dependency on the context.
|
||||||
|
*/
|
||||||
|
@Test(dataProvider = "noContextDependency")
|
||||||
|
public void testNoContextDependency1(String expression, Object item) throws XPathExpressionException {
|
||||||
|
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||||
|
xPath.evaluate(expression, item, XPathConstants.STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dataProvider = "noContextDependency")
|
||||||
|
public void testNoContextDependency2(String expression, Object item) throws XPathExpressionException {
|
||||||
|
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||||
|
xPath.evaluateExpression(expression, item, String.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@bug 6211561
|
||||||
|
* Verifies the specification for XPath and XPathExpression:
|
||||||
|
* If a null value is provided for item (the context) that the operation
|
||||||
|
* depends on, XPathExpressionException will be thrown
|
||||||
|
*/
|
||||||
|
@Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class)
|
||||||
|
public void testHasContextDependency1(String expression, Object item) throws XPathExpressionException {
|
||||||
|
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||||
|
xPath.evaluate(expression, item, XPathConstants.STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class)
|
||||||
|
public void testHasContextDependency2(String expression, Object item) throws XPathExpressionException {
|
||||||
|
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||||
|
xPath.evaluateExpression(expression, item, String.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@bug 6376058
|
||||||
|
Verifies that XPath.getNamespaceContext() is supported.
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testNamespaceContext() {
|
public void testNamespaceContext() {
|
||||||
|
|
||||||
XPathFactory xPathFactory = XPathFactory.newInstance();
|
XPathFactory xPathFactory = XPathFactory.newInstance();
|
||||||
XPath xPath = xPathFactory.newXPath();
|
XPath xPath = xPathFactory.newXPath();
|
||||||
|
|
||||||
NamespaceContext namespaceContext = xPath.getNamespaceContext();
|
NamespaceContext namespaceContext = xPath.getNamespaceContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DataProvider: the expression has no dependency on the context
|
||||||
|
*/
|
||||||
|
@DataProvider(name = "noContextDependency")
|
||||||
|
public Object[][] getExpressionContext() throws Exception {
|
||||||
|
return new Object[][]{
|
||||||
|
{"1+1", (Node)null},
|
||||||
|
{"5 mod 2", (Node)null},
|
||||||
|
{"8 div 2", (Node)null},
|
||||||
|
{"/node", getEmptyDocument()}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DataProvider: the expression has dependency on the context, but the context
|
||||||
|
* is null.
|
||||||
|
*/
|
||||||
|
@DataProvider(name = "hasContextDependency")
|
||||||
|
public Object[][] getExpressionContext1() throws Exception {
|
||||||
|
return new Object[][]{
|
||||||
|
{"/node", (Node)null},
|
||||||
|
{"//@lang", (Node)null},
|
||||||
|
{"bookstore//book", (Node)null},
|
||||||
|
{"/bookstore/book[last()]", (Node)null},
|
||||||
|
{"//title[@lang='en']", (Node)null},
|
||||||
|
{"/bookstore/book[price>9.99]", (Node)null},
|
||||||
|
{"/bookstore/book[price>8.99 and price<9.99]", (Node)null},
|
||||||
|
{"/bookstore/*", (Node)null},
|
||||||
|
{"//title[@*]", (Node)null},
|
||||||
|
{"//title | //price", (Node)null},
|
||||||
|
{"//book/title | //book/price", (Node)null},
|
||||||
|
{"/bookstore/book/title | //price", (Node)null},
|
||||||
|
{"child::book", (Node)null},
|
||||||
|
{"child::text()", (Node)null},
|
||||||
|
{"child::*/child::price", (Node)null}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an empty {@link org.w3c.dom.Document}.
|
||||||
|
* @return a DOM Document, null in case of Exception
|
||||||
|
*/
|
||||||
|
public Document getEmptyDocument() {
|
||||||
|
try {
|
||||||
|
return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -377,3 +377,4 @@ fe4e11bd2423635dc0f5f5cb9a64eb2f2cce7f4c jdk-9+128
|
||||||
46a02f57218e4a8c334dbccf656fb048f823f163 jdk-9+129
|
46a02f57218e4a8c334dbccf656fb048f823f163 jdk-9+129
|
||||||
39c6293131d91aec7f2f5120395e070a937b8858 jdk-9+130
|
39c6293131d91aec7f2f5120395e070a937b8858 jdk-9+130
|
||||||
783e7e2c587f2c7e1b9998a46d90ec196ab2a195 jdk-9+131
|
783e7e2c587f2c7e1b9998a46d90ec196ab2a195 jdk-9+131
|
||||||
|
9fff2477a4cadf2a9618a76f1f4fe0f20bb5ff3b jdk-9+132
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the JavaBeans Activation Framework (JAF) API.
|
||||||
|
*/
|
||||||
module java.activation {
|
module java.activation {
|
||||||
requires public java.datatransfer;
|
requires public java.datatransfer;
|
||||||
// dependence on java.beans.Beans to be eliminated
|
// dependence on java.beans.Beans to be eliminated
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines a subset of the Common Annotations API to support programs running
|
||||||
|
* on the Java SE Platform.
|
||||||
|
*/
|
||||||
module java.annotations.common {
|
module java.annotations.common {
|
||||||
exports javax.annotation;
|
exports javax.annotation;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Java Architecture for XML Binding (JAXB) API.
|
||||||
|
*/
|
||||||
module java.xml.bind {
|
module java.xml.bind {
|
||||||
requires public java.activation;
|
requires public java.activation;
|
||||||
requires public java.xml;
|
requires public java.xml;
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Java API for XML-Based Web Services (JAX-WS), and
|
||||||
|
* the Web Services Metadata API.
|
||||||
|
*/
|
||||||
module java.xml.ws {
|
module java.xml.ws {
|
||||||
requires public java.activation;
|
requires public java.activation;
|
||||||
requires public java.xml;
|
requires public java.xml;
|
||||||
|
|
|
@ -374,3 +374,4 @@ c40c8739bcdc88892ff58ebee3fd8a3f287be94d jdk-9+123
|
||||||
47699aa2e69ec2702542dc73eb01de3bfb61aea0 jdk-9+129
|
47699aa2e69ec2702542dc73eb01de3bfb61aea0 jdk-9+129
|
||||||
6c827500e34587061af97ad6fef0e859280255c5 jdk-9+130
|
6c827500e34587061af97ad6fef0e859280255c5 jdk-9+130
|
||||||
8c57f4c293bbc5609928308a6d91ba765760b5f9 jdk-9+131
|
8c57f4c293bbc5609928308a6d91ba765760b5f9 jdk-9+131
|
||||||
|
d5c70818cd8a82e76632c8c815bdb4f75f53aeaf jdk-9+132
|
||||||
|
|
|
@ -183,7 +183,7 @@ DEF_POLICY_DST := $(LIB_DST_DIR)/security/default.policy
|
||||||
|
|
||||||
DEF_POLICY_SRC_LIST := $(DEF_POLICY_SRC)
|
DEF_POLICY_SRC_LIST := $(DEF_POLICY_SRC)
|
||||||
|
|
||||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
ifneq ($(filter $(OPENJDK_TARGET_OS), windows solaris), )
|
||||||
DEF_POLICY_SRC_LIST += $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/lib/security/default.policy
|
DEF_POLICY_SRC_LIST += $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/lib/security/default.policy
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -26,6 +26,7 @@
|
||||||
package apple.security;
|
package apple.security;
|
||||||
|
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Apple Security Provider.
|
* The Apple Security Provider.
|
||||||
|
@ -74,7 +75,7 @@ public final class AppleProvider extends Provider {
|
||||||
|
|
||||||
public AppleProvider() {
|
public AppleProvider() {
|
||||||
/* We are the Apple provider */
|
/* We are the Apple provider */
|
||||||
super("Apple", 9.0d, info);
|
super("Apple", PROVIDER_VER, info);
|
||||||
|
|
||||||
final Provider p = this;
|
final Provider p = this;
|
||||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -107,7 +107,12 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey {
|
||||||
throw new InvalidKeySpecException("Key length is negative");
|
throw new InvalidKeySpecException("Key length is negative");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
this.prf = Mac.getInstance(prfAlgo, SunJCE.getInstance());
|
this.prf = Mac.getInstance(prfAlgo);
|
||||||
|
// SunPKCS11 requires a non-empty PBE password
|
||||||
|
if (passwdBytes.length == 0 &&
|
||||||
|
this.prf.getProvider().getName().startsWith("SunPKCS11")) {
|
||||||
|
this.prf = Mac.getInstance(prfAlgo, SunJCE.getInstance());
|
||||||
|
}
|
||||||
} catch (NoSuchAlgorithmException nsae) {
|
} catch (NoSuchAlgorithmException nsae) {
|
||||||
// not gonna happen; re-throw just in case
|
// not gonna happen; re-throw just in case
|
||||||
InvalidKeySpecException ike = new InvalidKeySpecException();
|
InvalidKeySpecException ike = new InvalidKeySpecException();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -28,6 +28,7 @@ package com.sun.crypto.provider;
|
||||||
import java.security.AccessController;
|
import java.security.AccessController;
|
||||||
import java.security.Provider;
|
import java.security.Provider;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,7 +105,7 @@ public final class SunJCE extends Provider {
|
||||||
|
|
||||||
public SunJCE() {
|
public SunJCE() {
|
||||||
/* We are the "SunJCE" provider */
|
/* We are the "SunJCE" provider */
|
||||||
super("SunJCE", 9.0d, info);
|
super("SunJCE", PROVIDER_VER, info);
|
||||||
|
|
||||||
final String BLOCK_MODES = "ECB|CBC|PCBC|CTR|CTS|CFB|OFB" +
|
final String BLOCK_MODES = "ECB|CBC|PCBC|CTR|CTS|CFB|OFB" +
|
||||||
"|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64" +
|
"|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64" +
|
||||||
|
|
|
@ -560,7 +560,7 @@ public class BufferedReader extends Reader {
|
||||||
* @since 1.8
|
* @since 1.8
|
||||||
*/
|
*/
|
||||||
public Stream<String> lines() {
|
public Stream<String> lines() {
|
||||||
Iterator<String> iter = new Iterator<String>() {
|
Iterator<String> iter = new Iterator<>() {
|
||||||
String nextLine = null;
|
String nextLine = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -187,7 +187,7 @@ public class ByteArrayOutputStream extends OutputStream {
|
||||||
* @return the current contents of this output stream, as a byte array.
|
* @return the current contents of this output stream, as a byte array.
|
||||||
* @see java.io.ByteArrayOutputStream#size()
|
* @see java.io.ByteArrayOutputStream#size()
|
||||||
*/
|
*/
|
||||||
public synchronized byte toByteArray()[] {
|
public synchronized byte[] toByteArray() {
|
||||||
return Arrays.copyOf(buf, count);
|
return Arrays.copyOf(buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ class CharArrayWriter extends Writer {
|
||||||
*
|
*
|
||||||
* @param csq
|
* @param csq
|
||||||
* The character sequence to append. If {@code csq} is
|
* The character sequence to append. If {@code csq} is
|
||||||
* {@code null}, then the four characters "{@code null}" are
|
* {@code null}, then the four characters {@code "null"} are
|
||||||
* appended to this writer.
|
* appended to this writer.
|
||||||
*
|
*
|
||||||
* @return This writer
|
* @return This writer
|
||||||
|
@ -173,7 +173,7 @@ class CharArrayWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public CharArrayWriter append(CharSequence csq) {
|
public CharArrayWriter append(CharSequence csq) {
|
||||||
String s = (csq == null ? "null" : csq.toString());
|
String s = String.valueOf(csq);
|
||||||
write(s, 0, s.length());
|
write(s, 0, s.length());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ class CharArrayWriter extends Writer {
|
||||||
* The character sequence from which a subsequence will be
|
* The character sequence from which a subsequence will be
|
||||||
* appended. If {@code csq} is {@code null}, then characters
|
* appended. If {@code csq} is {@code null}, then characters
|
||||||
* will be appended as if {@code csq} contained the four
|
* will be appended as if {@code csq} contained the four
|
||||||
* characters "{@code null}".
|
* characters {@code "null"}.
|
||||||
*
|
*
|
||||||
* @param start
|
* @param start
|
||||||
* The index of the first character in the subsequence
|
* The index of the first character in the subsequence
|
||||||
|
@ -212,9 +212,8 @@ class CharArrayWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public CharArrayWriter append(CharSequence csq, int start, int end) {
|
public CharArrayWriter append(CharSequence csq, int start, int end) {
|
||||||
String s = (csq == null ? "null" : csq).subSequence(start, end).toString();
|
if (csq == null) csq = "null";
|
||||||
write(s, 0, s.length());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -251,7 +250,7 @@ class CharArrayWriter extends Writer {
|
||||||
*
|
*
|
||||||
* @return an array of chars copied from the input data.
|
* @return an array of chars copied from the input data.
|
||||||
*/
|
*/
|
||||||
public char toCharArray()[] {
|
public char[] toCharArray() {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
return Arrays.copyOf(buf, count);
|
return Arrays.copyOf(buf, count);
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,13 +228,8 @@ abstract class FileSystem {
|
||||||
static boolean useCanonPrefixCache = true;
|
static boolean useCanonPrefixCache = true;
|
||||||
|
|
||||||
private static boolean getBooleanProperty(String prop, boolean defaultVal) {
|
private static boolean getBooleanProperty(String prop, boolean defaultVal) {
|
||||||
String val = System.getProperty(prop);
|
return Boolean.parseBoolean(System.getProperty(prop,
|
||||||
if (val == null) return defaultVal;
|
String.valueOf(defaultVal)));
|
||||||
if (val.equalsIgnoreCase("true")) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
|
@ -1265,22 +1265,21 @@ public class ObjectInputStream
|
||||||
WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
|
WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
|
||||||
Boolean result = Caches.subclassAudits.get(key);
|
Boolean result = Caches.subclassAudits.get(key);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
result = Boolean.valueOf(auditSubclass(cl));
|
result = auditSubclass(cl);
|
||||||
Caches.subclassAudits.putIfAbsent(key, result);
|
Caches.subclassAudits.putIfAbsent(key, result);
|
||||||
}
|
}
|
||||||
if (result.booleanValue()) {
|
if (!result) {
|
||||||
return;
|
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
|
||||||
}
|
}
|
||||||
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs reflective checks on given subclass to verify that it doesn't
|
* Performs reflective checks on given subclass to verify that it doesn't
|
||||||
* override security-sensitive non-final methods. Returns true if subclass
|
* override security-sensitive non-final methods. Returns TRUE if subclass
|
||||||
* is "safe", false otherwise.
|
* is "safe", FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
private static boolean auditSubclass(final Class<?> subcl) {
|
private static Boolean auditSubclass(Class<?> subcl) {
|
||||||
Boolean result = AccessController.doPrivileged(
|
return AccessController.doPrivileged(
|
||||||
new PrivilegedAction<>() {
|
new PrivilegedAction<>() {
|
||||||
public Boolean run() {
|
public Boolean run() {
|
||||||
for (Class<?> cl = subcl;
|
for (Class<?> cl = subcl;
|
||||||
|
@ -1303,7 +1302,6 @@ public class ObjectInputStream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
return result.booleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1050,22 +1050,21 @@ public class ObjectOutputStream
|
||||||
WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
|
WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
|
||||||
Boolean result = Caches.subclassAudits.get(key);
|
Boolean result = Caches.subclassAudits.get(key);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
result = Boolean.valueOf(auditSubclass(cl));
|
result = auditSubclass(cl);
|
||||||
Caches.subclassAudits.putIfAbsent(key, result);
|
Caches.subclassAudits.putIfAbsent(key, result);
|
||||||
}
|
}
|
||||||
if (result.booleanValue()) {
|
if (!result) {
|
||||||
return;
|
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
|
||||||
}
|
}
|
||||||
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs reflective checks on given subclass to verify that it doesn't
|
* Performs reflective checks on given subclass to verify that it doesn't
|
||||||
* override security-sensitive non-final methods. Returns true if subclass
|
* override security-sensitive non-final methods. Returns TRUE if subclass
|
||||||
* is "safe", false otherwise.
|
* is "safe", FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
private static boolean auditSubclass(final Class<?> subcl) {
|
private static Boolean auditSubclass(Class<?> subcl) {
|
||||||
Boolean result = AccessController.doPrivileged(
|
return AccessController.doPrivileged(
|
||||||
new PrivilegedAction<>() {
|
new PrivilegedAction<>() {
|
||||||
public Boolean run() {
|
public Boolean run() {
|
||||||
for (Class<?> cl = subcl;
|
for (Class<?> cl = subcl;
|
||||||
|
@ -1088,7 +1087,6 @@ public class ObjectOutputStream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
return result.booleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1509,11 +1509,9 @@ public class ObjectStreamClass implements Serializable {
|
||||||
private static String getPackageName(Class<?> cl) {
|
private static String getPackageName(Class<?> cl) {
|
||||||
String s = cl.getName();
|
String s = cl.getName();
|
||||||
int i = s.lastIndexOf('[');
|
int i = s.lastIndexOf('[');
|
||||||
if (i >= 0) {
|
i = (i < 0) ? 0 : i + 2;
|
||||||
s = s.substring(i + 2);
|
int j = s.lastIndexOf('.');
|
||||||
}
|
return (i < j) ? s.substring(i, j) : "";
|
||||||
i = s.lastIndexOf('.');
|
|
||||||
return (i >= 0) ? s.substring(0, i) : "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1535,14 +1533,14 @@ public class ObjectStreamClass implements Serializable {
|
||||||
private static String getMethodSignature(Class<?>[] paramTypes,
|
private static String getMethodSignature(Class<?>[] paramTypes,
|
||||||
Class<?> retType)
|
Class<?> retType)
|
||||||
{
|
{
|
||||||
StringBuilder sbuf = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sbuf.append('(');
|
sb.append('(');
|
||||||
for (int i = 0; i < paramTypes.length; i++) {
|
for (int i = 0; i < paramTypes.length; i++) {
|
||||||
appendClassSignature(sbuf, paramTypes[i]);
|
appendClassSignature(sb, paramTypes[i]);
|
||||||
}
|
}
|
||||||
sbuf.append(')');
|
sb.append(')');
|
||||||
appendClassSignature(sbuf, retType);
|
appendClassSignature(sb, retType);
|
||||||
return sbuf.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -233,22 +233,16 @@ public class OutputStreamWriter extends Writer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Writer append(CharSequence csq, int start, int end) throws IOException {
|
public Writer append(CharSequence csq, int start, int end) throws IOException {
|
||||||
if (csq == null) {
|
if (csq == null) csq = "null";
|
||||||
write("null".subSequence(start, end).toString());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
} else {
|
|
||||||
return append(csq.subSequence(start, end));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Writer append(CharSequence csq) throws IOException {
|
public Writer append(CharSequence csq) throws IOException {
|
||||||
if (csq == null) {
|
if (csq instanceof CharBuffer) {
|
||||||
se.write("null");
|
|
||||||
} else if (csq instanceof CharBuffer) {
|
|
||||||
se.write((CharBuffer) csq);
|
se.write((CharBuffer) csq);
|
||||||
} else {
|
} else {
|
||||||
se.write(csq.toString());
|
se.write(String.valueOf(csq));
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -568,7 +568,7 @@ public class PrintStream extends FilterOutputStream
|
||||||
* @param b The {@code boolean} to be printed
|
* @param b The {@code boolean} to be printed
|
||||||
*/
|
*/
|
||||||
public void print(boolean b) {
|
public void print(boolean b) {
|
||||||
write(b ? "true" : "false");
|
write(String.valueOf(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -663,10 +663,7 @@ public class PrintStream extends FilterOutputStream
|
||||||
* @param s The {@code String} to be printed
|
* @param s The {@code String} to be printed
|
||||||
*/
|
*/
|
||||||
public void print(String s) {
|
public void print(String s) {
|
||||||
if (s == null) {
|
write(String.valueOf(s));
|
||||||
s = "null";
|
|
||||||
}
|
|
||||||
write(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1068,10 +1065,7 @@ public class PrintStream extends FilterOutputStream
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public PrintStream append(CharSequence csq) {
|
public PrintStream append(CharSequence csq) {
|
||||||
if (csq == null)
|
print(String.valueOf(csq));
|
||||||
print("null");
|
|
||||||
else
|
|
||||||
print(csq.toString());
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1111,9 +1105,8 @@ public class PrintStream extends FilterOutputStream
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public PrintStream append(CharSequence csq, int start, int end) {
|
public PrintStream append(CharSequence csq, int start, int end) {
|
||||||
CharSequence cs = (csq == null ? "null" : csq);
|
if (csq == null) csq = "null";
|
||||||
write(cs.subSequence(start, end).toString());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -504,7 +504,7 @@ public class PrintWriter extends Writer {
|
||||||
* @param b The {@code boolean} to be printed
|
* @param b The {@code boolean} to be printed
|
||||||
*/
|
*/
|
||||||
public void print(boolean b) {
|
public void print(boolean b) {
|
||||||
write(b ? "true" : "false");
|
write(String.valueOf(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -599,10 +599,7 @@ public class PrintWriter extends Writer {
|
||||||
* @param s The {@code String} to be printed
|
* @param s The {@code String} to be printed
|
||||||
*/
|
*/
|
||||||
public void print(String s) {
|
public void print(String s) {
|
||||||
if (s == null) {
|
write(String.valueOf(s));
|
||||||
s = "null";
|
|
||||||
}
|
|
||||||
write(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1005,10 +1002,7 @@ public class PrintWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public PrintWriter append(CharSequence csq) {
|
public PrintWriter append(CharSequence csq) {
|
||||||
if (csq == null)
|
write(String.valueOf(csq));
|
||||||
write("null");
|
|
||||||
else
|
|
||||||
write(csq.toString());
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1047,9 +1041,8 @@ public class PrintWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public PrintWriter append(CharSequence csq, int start, int end) {
|
public PrintWriter append(CharSequence csq, int start, int end) {
|
||||||
CharSequence cs = (csq == null ? "null" : csq);
|
if (csq == null) csq = "null";
|
||||||
write(cs.subSequence(start, end).toString());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -65,12 +65,7 @@ class SequenceInputStream extends InputStream {
|
||||||
*/
|
*/
|
||||||
public SequenceInputStream(Enumeration<? extends InputStream> e) {
|
public SequenceInputStream(Enumeration<? extends InputStream> e) {
|
||||||
this.e = e;
|
this.e = e;
|
||||||
try {
|
peekNextStream();
|
||||||
nextStream();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
// This should never happen
|
|
||||||
throw new Error("panic");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,16 +81,10 @@ class SequenceInputStream extends InputStream {
|
||||||
*/
|
*/
|
||||||
public SequenceInputStream(InputStream s1, InputStream s2) {
|
public SequenceInputStream(InputStream s1, InputStream s2) {
|
||||||
Vector<InputStream> v = new Vector<>(2);
|
Vector<InputStream> v = new Vector<>(2);
|
||||||
|
|
||||||
v.addElement(s1);
|
v.addElement(s1);
|
||||||
v.addElement(s2);
|
v.addElement(s2);
|
||||||
e = v.elements();
|
e = v.elements();
|
||||||
try {
|
peekNextStream();
|
||||||
nextStream();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
// This should never happen
|
|
||||||
throw new Error("panic");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,14 +94,17 @@ class SequenceInputStream extends InputStream {
|
||||||
if (in != null) {
|
if (in != null) {
|
||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
|
peekNextStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void peekNextStream() {
|
||||||
if (e.hasMoreElements()) {
|
if (e.hasMoreElements()) {
|
||||||
in = (InputStream) e.nextElement();
|
in = (InputStream) e.nextElement();
|
||||||
if (in == null)
|
if (in == null)
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
|
} else {
|
||||||
|
in = null;
|
||||||
}
|
}
|
||||||
else in = null;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -108,6 +108,7 @@ class StringBufferInputStream extends InputStream {
|
||||||
* <code>-1</code> if there is no more data because the end of
|
* <code>-1</code> if there is no more data because the end of
|
||||||
* the stream has been reached.
|
* the stream has been reached.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public synchronized int read(byte b[], int off, int len) {
|
public synchronized int read(byte b[], int off, int len) {
|
||||||
if (b == null) {
|
if (b == null) {
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
|
@ -126,12 +127,8 @@ class StringBufferInputStream extends InputStream {
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
String s = buffer;
|
buffer.getBytes(pos, pos + len, b, off);
|
||||||
int cnt = len;
|
pos += len;
|
||||||
while (--cnt >= 0) {
|
|
||||||
b[off++] = (byte)s.charAt(pos++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,8 +142,8 @@ public class StringReader extends Reader {
|
||||||
*/
|
*/
|
||||||
public boolean ready() throws IOException {
|
public boolean ready() throws IOException {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
ensureOpen();
|
ensureOpen();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ public class StringWriter extends Writer {
|
||||||
*
|
*
|
||||||
* @param csq
|
* @param csq
|
||||||
* The character sequence to append. If {@code csq} is
|
* The character sequence to append. If {@code csq} is
|
||||||
* {@code null}, then the four characters "{@code null}" are
|
* {@code null}, then the four characters {@code "null"} are
|
||||||
* appended to this writer.
|
* appended to this writer.
|
||||||
*
|
*
|
||||||
* @return This writer
|
* @return This writer
|
||||||
|
@ -147,10 +147,7 @@ public class StringWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public StringWriter append(CharSequence csq) {
|
public StringWriter append(CharSequence csq) {
|
||||||
if (csq == null)
|
write(String.valueOf(csq));
|
||||||
write("null");
|
|
||||||
else
|
|
||||||
write(csq.toString());
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +167,7 @@ public class StringWriter extends Writer {
|
||||||
* The character sequence from which a subsequence will be
|
* The character sequence from which a subsequence will be
|
||||||
* appended. If {@code csq} is {@code null}, then characters
|
* appended. If {@code csq} is {@code null}, then characters
|
||||||
* will be appended as if {@code csq} contained the four
|
* will be appended as if {@code csq} contained the four
|
||||||
* characters "{@code null}".
|
* characters {@code "null"}.
|
||||||
*
|
*
|
||||||
* @param start
|
* @param start
|
||||||
* The index of the first character in the subsequence
|
* The index of the first character in the subsequence
|
||||||
|
@ -189,9 +186,8 @@ public class StringWriter extends Writer {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public StringWriter append(CharSequence csq, int start, int end) {
|
public StringWriter append(CharSequence csq, int start, int end) {
|
||||||
CharSequence cs = (csq == null ? "null" : csq);
|
if (csq == null) csq = "null";
|
||||||
write(cs.subSequence(start, end).toString());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -221,7 +221,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable {
|
||||||
*
|
*
|
||||||
* @param csq
|
* @param csq
|
||||||
* The character sequence to append. If {@code csq} is
|
* The character sequence to append. If {@code csq} is
|
||||||
* {@code null}, then the four characters "{@code null}" are
|
* {@code null}, then the four characters {@code "null"} are
|
||||||
* appended to this writer.
|
* appended to this writer.
|
||||||
*
|
*
|
||||||
* @return This writer
|
* @return This writer
|
||||||
|
@ -232,10 +232,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Writer append(CharSequence csq) throws IOException {
|
public Writer append(CharSequence csq) throws IOException {
|
||||||
if (csq == null)
|
write(String.valueOf(csq));
|
||||||
write("null");
|
|
||||||
else
|
|
||||||
write(csq.toString());
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +253,7 @@ public abstract class Writer implements Appendable, Closeable, Flushable {
|
||||||
* The character sequence from which a subsequence will be
|
* The character sequence from which a subsequence will be
|
||||||
* appended. If {@code csq} is {@code null}, then characters
|
* appended. If {@code csq} is {@code null}, then characters
|
||||||
* will be appended as if {@code csq} contained the four
|
* will be appended as if {@code csq} contained the four
|
||||||
* characters "{@code null}".
|
* characters {@code "null"}.
|
||||||
*
|
*
|
||||||
* @param start
|
* @param start
|
||||||
* The index of the first character in the subsequence
|
* The index of the first character in the subsequence
|
||||||
|
@ -278,9 +275,8 @@ public abstract class Writer implements Appendable, Closeable, Flushable {
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Writer append(CharSequence csq, int start, int end) throws IOException {
|
public Writer append(CharSequence csq, int start, int end) throws IOException {
|
||||||
CharSequence cs = (csq == null ? "null" : csq);
|
if (csq == null) csq = "null";
|
||||||
write(cs.subSequence(start, end).toString());
|
return append(csq.subSequence(start, end));
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -36,7 +36,6 @@ import sun.invoke.util.Wrapper;
|
||||||
import java.lang.invoke.LambdaForm.NamedFunction;
|
import java.lang.invoke.LambdaForm.NamedFunction;
|
||||||
import java.lang.invoke.MethodHandles.Lookup;
|
import java.lang.invoke.MethodHandles.Lookup;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -308,7 +307,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||||
/*non-public*/ char fieldTypeChar(int i) {
|
/*non-public*/ char fieldTypeChar(int i) {
|
||||||
return typeChars.charAt(i);
|
return typeChars.charAt(i);
|
||||||
}
|
}
|
||||||
Object fieldSignature() {
|
String fieldSignature() {
|
||||||
return typeChars;
|
return typeChars;
|
||||||
}
|
}
|
||||||
public Class<? extends BoundMethodHandle> fieldHolder() {
|
public Class<? extends BoundMethodHandle> fieldHolder() {
|
||||||
|
|
|
@ -27,6 +27,7 @@ package java.lang.invoke;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import static java.lang.invoke.LambdaForm.*;
|
import static java.lang.invoke.LambdaForm.*;
|
||||||
|
import static java.lang.invoke.LambdaForm.Kind.*;
|
||||||
import static java.lang.invoke.MethodHandleStatics.*;
|
import static java.lang.invoke.MethodHandleStatics.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -96,14 +97,8 @@ abstract class DelegatingMethodHandle extends MethodHandle {
|
||||||
int whichCache,
|
int whichCache,
|
||||||
Object constraint,
|
Object constraint,
|
||||||
NamedFunction getTargetFn) {
|
NamedFunction getTargetFn) {
|
||||||
String debugString;
|
|
||||||
switch(whichCache) {
|
|
||||||
case MethodTypeForm.LF_REBIND: debugString = "BMH.reinvoke"; break;
|
|
||||||
case MethodTypeForm.LF_DELEGATE: debugString = "MH.delegate"; break;
|
|
||||||
default: debugString = "MH.reinvoke"; break;
|
|
||||||
}
|
|
||||||
// No pre-action needed.
|
// No pre-action needed.
|
||||||
return makeReinvokerForm(target, whichCache, constraint, debugString, true, getTargetFn, null);
|
return makeReinvokerForm(target, whichCache, constraint, null, true, getTargetFn, null);
|
||||||
}
|
}
|
||||||
/** Create a LF which simply reinvokes a target of the given basic type. */
|
/** Create a LF which simply reinvokes a target of the given basic type. */
|
||||||
static LambdaForm makeReinvokerForm(MethodHandle target,
|
static LambdaForm makeReinvokerForm(MethodHandle target,
|
||||||
|
@ -114,6 +109,10 @@ abstract class DelegatingMethodHandle extends MethodHandle {
|
||||||
NamedFunction getTargetFn,
|
NamedFunction getTargetFn,
|
||||||
NamedFunction preActionFn) {
|
NamedFunction preActionFn) {
|
||||||
MethodType mtype = target.type().basicType();
|
MethodType mtype = target.type().basicType();
|
||||||
|
Kind kind = whichKind(whichCache);
|
||||||
|
if (debugString == null) {
|
||||||
|
debugString = kind.defaultLambdaName;
|
||||||
|
}
|
||||||
boolean customized = (whichCache < 0 ||
|
boolean customized = (whichCache < 0 ||
|
||||||
mtype.parameterSlotCount() > MethodType.MAX_MH_INVOKER_ARITY);
|
mtype.parameterSlotCount() > MethodType.MAX_MH_INVOKER_ARITY);
|
||||||
boolean hasPreAction = (preActionFn != null);
|
boolean hasPreAction = (preActionFn != null);
|
||||||
|
@ -145,13 +144,21 @@ abstract class DelegatingMethodHandle extends MethodHandle {
|
||||||
targetArgs[0] = names[NEXT_MH]; // overwrite this MH with next MH
|
targetArgs[0] = names[NEXT_MH]; // overwrite this MH with next MH
|
||||||
names[REINVOKE] = new LambdaForm.Name(mtype, targetArgs);
|
names[REINVOKE] = new LambdaForm.Name(mtype, targetArgs);
|
||||||
}
|
}
|
||||||
form = new LambdaForm(debugString, ARG_LIMIT, names, forceInline);
|
form = new LambdaForm(debugString, ARG_LIMIT, names, forceInline, kind);
|
||||||
if (!customized) {
|
if (!customized) {
|
||||||
form = mtype.form().setCachedLambdaForm(whichCache, form);
|
form = mtype.form().setCachedLambdaForm(whichCache, form);
|
||||||
}
|
}
|
||||||
return form;
|
return form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Kind whichKind(int whichCache) {
|
||||||
|
switch(whichCache) {
|
||||||
|
case MethodTypeForm.LF_REBIND: return BOUND_REINVOKER;
|
||||||
|
case MethodTypeForm.LF_DELEGATE: return DELEGATE;
|
||||||
|
default: return REINVOKER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static final NamedFunction NF_getTarget;
|
static final NamedFunction NF_getTarget;
|
||||||
static {
|
static {
|
||||||
try {
|
try {
|
||||||
|
@ -160,5 +167,13 @@ abstract class DelegatingMethodHandle extends MethodHandle {
|
||||||
} catch (ReflectiveOperationException ex) {
|
} catch (ReflectiveOperationException ex) {
|
||||||
throw newInternalError(ex);
|
throw newInternalError(ex);
|
||||||
}
|
}
|
||||||
|
// The Holder class will contain pre-generated DelegatingMethodHandles resolved
|
||||||
|
// speculatively using MemberName.getFactory().resolveOrNull. However, that
|
||||||
|
// doesn't initialize the class, which subtly breaks inlining etc. By forcing
|
||||||
|
// initialization of the Holder class we avoid these issues.
|
||||||
|
UNSAFE.ensureClassInitialized(Holder.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Placeholder class for DelegatingMethodHandles generated ahead of time */
|
||||||
|
final class Holder {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static java.lang.invoke.LambdaForm.*;
|
import static java.lang.invoke.LambdaForm.*;
|
||||||
|
import static java.lang.invoke.LambdaForm.Kind.*;
|
||||||
import static java.lang.invoke.MethodHandleNatives.Constants.*;
|
import static java.lang.invoke.MethodHandleNatives.Constants.*;
|
||||||
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
|
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
|
||||||
import static java.lang.invoke.MethodHandleStatics.newInternalError;
|
import static java.lang.invoke.MethodHandleStatics.newInternalError;
|
||||||
|
@ -189,14 +190,15 @@ class DirectMethodHandle extends MethodHandle {
|
||||||
static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) {
|
static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) {
|
||||||
boolean needsInit = (which == LF_INVSTATIC_INIT);
|
boolean needsInit = (which == LF_INVSTATIC_INIT);
|
||||||
boolean doesAlloc = (which == LF_NEWINVSPECIAL);
|
boolean doesAlloc = (which == LF_NEWINVSPECIAL);
|
||||||
String linkerName, lambdaName;
|
String linkerName;
|
||||||
|
LambdaForm.Kind kind;
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case LF_INVVIRTUAL: linkerName = "linkToVirtual"; lambdaName = "DMH.invokeVirtual"; break;
|
case LF_INVVIRTUAL: linkerName = "linkToVirtual"; kind = DIRECT_INVOKE_VIRTUAL; break;
|
||||||
case LF_INVSTATIC: linkerName = "linkToStatic"; lambdaName = "DMH.invokeStatic"; break;
|
case LF_INVSTATIC: linkerName = "linkToStatic"; kind = DIRECT_INVOKE_STATIC; break;
|
||||||
case LF_INVSTATIC_INIT:linkerName = "linkToStatic"; lambdaName = "DMH.invokeStaticInit"; break;
|
case LF_INVSTATIC_INIT:linkerName = "linkToStatic"; kind = DIRECT_INVOKE_STATIC_INIT; break;
|
||||||
case LF_INVSPECIAL: linkerName = "linkToSpecial"; lambdaName = "DMH.invokeSpecial"; break;
|
case LF_INVSPECIAL: linkerName = "linkToSpecial"; kind = DIRECT_INVOKE_SPECIAL; break;
|
||||||
case LF_INVINTERFACE: linkerName = "linkToInterface"; lambdaName = "DMH.invokeInterface"; break;
|
case LF_INVINTERFACE: linkerName = "linkToInterface"; kind = DIRECT_INVOKE_INTERFACE; break;
|
||||||
case LF_NEWINVSPECIAL: linkerName = "linkToSpecial"; lambdaName = "DMH.newInvokeSpecial"; break;
|
case LF_NEWINVSPECIAL: linkerName = "linkToSpecial"; kind = DIRECT_NEW_INVOKE_SPECIAL; break;
|
||||||
default: throw new InternalError("which="+which);
|
default: throw new InternalError("which="+which);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,11 +242,11 @@ class DirectMethodHandle extends MethodHandle {
|
||||||
result = NEW_OBJ;
|
result = NEW_OBJ;
|
||||||
}
|
}
|
||||||
names[LINKER_CALL] = new Name(linker, outArgs);
|
names[LINKER_CALL] = new Name(linker, outArgs);
|
||||||
lambdaName += "_" + shortenSignature(basicTypeSignature(mtype));
|
String lambdaName = kind.defaultLambdaName + "_" + shortenSignature(basicTypeSignature(mtype));
|
||||||
LambdaForm lform = new LambdaForm(lambdaName, ARG_LIMIT, names, result);
|
LambdaForm lform = new LambdaForm(lambdaName, ARG_LIMIT, names, result, kind);
|
||||||
|
|
||||||
// This is a tricky bit of code. Don't send it through the LF interpreter.
|
// This is a tricky bit of code. Don't send it through the LF interpreter.
|
||||||
lform.compileToBytecode(Holder.class);
|
lform.compileToBytecode();
|
||||||
return lform;
|
return lform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -705,7 +707,7 @@ class DirectMethodHandle extends MethodHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// The DMH class will contain pre-generated DirectMethodHandles resolved
|
// The Holder class will contain pre-generated DirectMethodHandles resolved
|
||||||
// speculatively using MemberName.getFactory().resolveOrNull. However, that
|
// speculatively using MemberName.getFactory().resolveOrNull. However, that
|
||||||
// doesn't initialize the class, which subtly breaks inlining etc. By forcing
|
// doesn't initialize the class, which subtly breaks inlining etc. By forcing
|
||||||
// initialization of the Holder class we avoid these issues.
|
// initialization of the Holder class we avoid these issues.
|
||||||
|
@ -713,5 +715,5 @@ class DirectMethodHandle extends MethodHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Placeholder class for DirectMethodHandles generated ahead of time */
|
/* Placeholder class for DirectMethodHandles generated ahead of time */
|
||||||
private final class Holder {}
|
final class Holder {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,21 +29,82 @@ import java.util.Map;
|
||||||
import jdk.internal.org.objectweb.asm.ClassWriter;
|
import jdk.internal.org.objectweb.asm.ClassWriter;
|
||||||
import jdk.internal.org.objectweb.asm.Opcodes;
|
import jdk.internal.org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class to assist the GenerateJLIClassesPlugin to get access to
|
* Helper class to assist the GenerateJLIClassesPlugin to get access to
|
||||||
* generate classes ahead of time.
|
* generate classes ahead of time.
|
||||||
*/
|
*/
|
||||||
class GenerateJLIClassesHelper {
|
class GenerateJLIClassesHelper {
|
||||||
|
|
||||||
static byte[] generateDMHClassBytes(String className,
|
static byte[] generateBasicFormsClassBytes(String className) {
|
||||||
|
ArrayList<LambdaForm> forms = new ArrayList<>();
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
HashSet<String> dedupSet = new HashSet<>();
|
||||||
|
for (LambdaForm.BasicType type : LambdaForm.BasicType.values()) {
|
||||||
|
LambdaForm zero = LambdaForm.zeroForm(type);
|
||||||
|
String name = zero.kind.defaultLambdaName
|
||||||
|
+ "_" + zero.returnType().basicTypeChar();
|
||||||
|
if (dedupSet.add(name)) {
|
||||||
|
names.add(name);
|
||||||
|
forms.add(zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
LambdaForm identity = LambdaForm.identityForm(type);
|
||||||
|
name = identity.kind.defaultLambdaName
|
||||||
|
+ "_" + identity.returnType().basicTypeChar();
|
||||||
|
if (dedupSet.add(name)) {
|
||||||
|
names.add(name);
|
||||||
|
forms.add(identity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return generateCodeBytesForLFs(className,
|
||||||
|
names.toArray(new String[0]),
|
||||||
|
forms.toArray(new LambdaForm[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
static byte[] generateDirectMethodHandleHolderClassBytes(String className,
|
||||||
MethodType[] methodTypes, int[] types) {
|
MethodType[] methodTypes, int[] types) {
|
||||||
LambdaForm[] forms = new LambdaForm[methodTypes.length];
|
LambdaForm[] forms = new LambdaForm[methodTypes.length];
|
||||||
|
String[] names = new String[methodTypes.length];
|
||||||
for (int i = 0; i < forms.length; i++) {
|
for (int i = 0; i < forms.length; i++) {
|
||||||
forms[i] = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i],
|
forms[i] = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i],
|
||||||
types[i]);
|
types[i]);
|
||||||
methodTypes[i] = forms[i].methodType();
|
names[i] = forms[i].kind.defaultLambdaName;
|
||||||
}
|
}
|
||||||
return generateCodeBytesForLFs(className, forms, methodTypes);
|
return generateCodeBytesForLFs(className, names, forms);
|
||||||
|
}
|
||||||
|
|
||||||
|
static byte[] generateDelegatingMethodHandleHolderClassBytes(String className,
|
||||||
|
MethodType[] methodTypes) {
|
||||||
|
|
||||||
|
HashSet<MethodType> dedupSet = new HashSet<>();
|
||||||
|
ArrayList<LambdaForm> forms = new ArrayList<>();
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
for (int i = 0; i < methodTypes.length; i++) {
|
||||||
|
// generate methods representing the DelegatingMethodHandle
|
||||||
|
if (dedupSet.add(methodTypes[i])) {
|
||||||
|
// reinvokers are variant with the associated SpeciesData
|
||||||
|
// and shape of the target LF, but we can easily pregenerate
|
||||||
|
// the basic reinvokers associated with Species_L. Ultimately we
|
||||||
|
// may want to consider pregenerating more of these, which will
|
||||||
|
// require an even more complex naming scheme
|
||||||
|
LambdaForm reinvoker = makeReinvokerFor(methodTypes[i]);
|
||||||
|
forms.add(reinvoker);
|
||||||
|
String speciesSig = BoundMethodHandle
|
||||||
|
.speciesData(reinvoker).fieldSignature();
|
||||||
|
assert(speciesSig.equals("L"));
|
||||||
|
names.add(reinvoker.kind.defaultLambdaName + "_" + speciesSig);
|
||||||
|
|
||||||
|
LambdaForm delegate = makeDelegateFor(methodTypes[i]);
|
||||||
|
forms.add(delegate);
|
||||||
|
names.add(delegate.kind.defaultLambdaName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return generateCodeBytesForLFs(className,
|
||||||
|
names.toArray(new String[0]),
|
||||||
|
forms.toArray(new LambdaForm[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -51,22 +112,45 @@ class GenerateJLIClassesHelper {
|
||||||
* a class with a specified name.
|
* a class with a specified name.
|
||||||
*/
|
*/
|
||||||
private static byte[] generateCodeBytesForLFs(String className,
|
private static byte[] generateCodeBytesForLFs(String className,
|
||||||
LambdaForm[] forms, MethodType[] types) {
|
String[] names, LambdaForm[] forms) {
|
||||||
assert(forms.length == types.length);
|
|
||||||
|
|
||||||
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
||||||
cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
||||||
className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
|
className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
|
||||||
cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
|
cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
|
||||||
|
|
||||||
for (int i = 0; i < forms.length; i++) {
|
for (int i = 0; i < forms.length; i++) {
|
||||||
InvokerBytecodeGenerator g
|
addMethod(className, names[i], forms[i],
|
||||||
= new InvokerBytecodeGenerator(className, forms[i], types[i]);
|
forms[i].methodType(), cw);
|
||||||
g.setClassWriter(cw);
|
|
||||||
g.addMethod();
|
|
||||||
}
|
}
|
||||||
return cw.toByteArray();
|
return cw.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void addMethod(String className, String methodName, LambdaForm form,
|
||||||
|
MethodType type, ClassWriter cw) {
|
||||||
|
InvokerBytecodeGenerator g
|
||||||
|
= new InvokerBytecodeGenerator(className, methodName, form, type);
|
||||||
|
g.setClassWriter(cw);
|
||||||
|
g.addMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LambdaForm makeReinvokerFor(MethodType type) {
|
||||||
|
MethodHandle emptyHandle = MethodHandles.empty(type);
|
||||||
|
return DelegatingMethodHandle.makeReinvokerForm(emptyHandle,
|
||||||
|
MethodTypeForm.LF_REBIND,
|
||||||
|
BoundMethodHandle.speciesData_L(),
|
||||||
|
BoundMethodHandle.speciesData_L().getterFunction(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LambdaForm makeDelegateFor(MethodType type) {
|
||||||
|
MethodHandle handle = MethodHandles.empty(type);
|
||||||
|
return DelegatingMethodHandle.makeReinvokerForm(
|
||||||
|
handle,
|
||||||
|
MethodTypeForm.LF_DELEGATE,
|
||||||
|
DelegatingMethodHandle.class,
|
||||||
|
DelegatingMethodHandle.NF_getTarget);
|
||||||
|
}
|
||||||
|
|
||||||
static Map.Entry<String, byte[]> generateConcreteBMHClassBytes(
|
static Map.Entry<String, byte[]> generateConcreteBMHClassBytes(
|
||||||
final String types) {
|
final String types) {
|
||||||
for (char c : types.toCharArray()) {
|
for (char c : types.toCharArray()) {
|
||||||
|
|
|
@ -46,6 +46,7 @@ import java.util.stream.Stream;
|
||||||
|
|
||||||
import static java.lang.invoke.LambdaForm.*;
|
import static java.lang.invoke.LambdaForm.*;
|
||||||
import static java.lang.invoke.LambdaForm.BasicType.*;
|
import static java.lang.invoke.LambdaForm.BasicType.*;
|
||||||
|
import static java.lang.invoke.LambdaForm.Kind.*;
|
||||||
import static java.lang.invoke.MethodHandleNatives.Constants.*;
|
import static java.lang.invoke.MethodHandleNatives.Constants.*;
|
||||||
import static java.lang.invoke.MethodHandleStatics.*;
|
import static java.lang.invoke.MethodHandleStatics.*;
|
||||||
|
|
||||||
|
@ -125,9 +126,15 @@ class InvokerBytecodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** For generating customized code for a single LambdaForm. */
|
/** For generating customized code for a single LambdaForm. */
|
||||||
InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) {
|
private InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) {
|
||||||
|
this(className, form.debugName, form, invokerType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** For generating customized code for a single LambdaForm. */
|
||||||
|
InvokerBytecodeGenerator(String className, String invokerName,
|
||||||
|
LambdaForm form, MethodType invokerType) {
|
||||||
this(form, form.names.length,
|
this(form, form.names.length,
|
||||||
className, form.debugName, invokerType);
|
className, invokerName, invokerType);
|
||||||
// Create an array to map name indexes to locals indexes.
|
// Create an array to map name indexes to locals indexes.
|
||||||
Name[] names = form.names;
|
Name[] names = form.names;
|
||||||
for (int i = 0, index = 0; i < localsMap.length; i++) {
|
for (int i = 0, index = 0; i < localsMap.length; i++) {
|
||||||
|
@ -597,10 +604,47 @@ class InvokerBytecodeGenerator {
|
||||||
return c.getName().replace('.', '/');
|
return c.getName().replace('.', '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static MemberName resolveFrom(String name, MethodType type, Class<?> holder) {
|
||||||
|
MemberName member = new MemberName(holder, name, type, REF_invokeStatic);
|
||||||
|
MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, holder);
|
||||||
|
|
||||||
|
return resolvedMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MemberName lookupPregenerated(LambdaForm form) {
|
||||||
|
if (form.customized != null) {
|
||||||
|
// No pre-generated version for customized LF
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MethodType invokerType = form.methodType();
|
||||||
|
String name = form.kind.methodName;
|
||||||
|
switch (form.kind) {
|
||||||
|
case BOUND_REINVOKER: {
|
||||||
|
name = name + "_" + BoundMethodHandle.speciesData(form).fieldSignature();
|
||||||
|
return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
|
||||||
|
}
|
||||||
|
case DELEGATE: return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
|
||||||
|
case ZERO: // fall-through
|
||||||
|
case IDENTITY: {
|
||||||
|
name = name + "_" + form.returnType().basicTypeChar();
|
||||||
|
return resolveFrom(name, invokerType, LambdaForm.Holder.class);
|
||||||
|
}
|
||||||
|
case DIRECT_INVOKE_INTERFACE: // fall-through
|
||||||
|
case DIRECT_INVOKE_SPECIAL: // fall-through
|
||||||
|
case DIRECT_INVOKE_STATIC: // fall-through
|
||||||
|
case DIRECT_INVOKE_STATIC_INIT: // fall-through
|
||||||
|
case DIRECT_INVOKE_VIRTUAL: return resolveFrom(name, invokerType, DirectMethodHandle.Holder.class);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate customized bytecode for a given LambdaForm.
|
* Generate customized bytecode for a given LambdaForm.
|
||||||
*/
|
*/
|
||||||
static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) {
|
static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) {
|
||||||
|
MemberName pregenerated = lookupPregenerated(form);
|
||||||
|
if (pregenerated != null) return pregenerated; // pre-generated bytecode
|
||||||
|
|
||||||
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
|
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
|
||||||
return g.loadMethod(g.generateCustomizedCodeBytes());
|
return g.loadMethod(g.generateCustomizedCodeBytes());
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ import java.util.HashMap;
|
||||||
import static java.lang.invoke.LambdaForm.BasicType.*;
|
import static java.lang.invoke.LambdaForm.BasicType.*;
|
||||||
import static java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic;
|
import static java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic;
|
||||||
import static java.lang.invoke.MethodHandleStatics.*;
|
import static java.lang.invoke.MethodHandleStatics.*;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The symbolic, non-executable form of a method handle's invocation semantics.
|
* The symbolic, non-executable form of a method handle's invocation semantics.
|
||||||
|
@ -127,6 +128,7 @@ class LambdaForm {
|
||||||
final MethodHandle customized;
|
final MethodHandle customized;
|
||||||
@Stable final Name[] names;
|
@Stable final Name[] names;
|
||||||
final String debugName;
|
final String debugName;
|
||||||
|
final Kind kind;
|
||||||
MemberName vmentry; // low-level behavior, or null if not yet prepared
|
MemberName vmentry; // low-level behavior, or null if not yet prepared
|
||||||
private boolean isCompiled;
|
private boolean isCompiled;
|
||||||
|
|
||||||
|
@ -266,12 +268,48 @@ class LambdaForm {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Kind {
|
||||||
|
GENERIC(""),
|
||||||
|
ZERO("zero"),
|
||||||
|
IDENTITY("identity"),
|
||||||
|
BOUND_REINVOKER("BMH.reinvoke"),
|
||||||
|
REINVOKER("MH.reinvoke"),
|
||||||
|
DELEGATE("MH.delegate"),
|
||||||
|
DIRECT_INVOKE_VIRTUAL("DMH.invokeVirtual"),
|
||||||
|
DIRECT_INVOKE_SPECIAL("DMH.invokeSpecial"),
|
||||||
|
DIRECT_INVOKE_STATIC("DMH.invokeStatic"),
|
||||||
|
DIRECT_NEW_INVOKE_SPECIAL("DMH.newInvokeSpecial"),
|
||||||
|
DIRECT_INVOKE_INTERFACE("DMH.invokeInterface"),
|
||||||
|
DIRECT_INVOKE_STATIC_INIT("DMH.invokeStaticInit");
|
||||||
|
|
||||||
|
final String defaultLambdaName;
|
||||||
|
final String methodName;
|
||||||
|
|
||||||
|
private Kind(String defaultLambdaName) {
|
||||||
|
this.defaultLambdaName = defaultLambdaName;
|
||||||
|
int p = defaultLambdaName.indexOf('.');
|
||||||
|
if (p > -1) {
|
||||||
|
this.methodName = defaultLambdaName.substring(p + 1);
|
||||||
|
} else {
|
||||||
|
this.methodName = defaultLambdaName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LambdaForm(String debugName,
|
LambdaForm(String debugName,
|
||||||
int arity, Name[] names, int result) {
|
int arity, Name[] names, int result) {
|
||||||
this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null);
|
this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null, Kind.GENERIC);
|
||||||
|
}
|
||||||
|
LambdaForm(String debugName,
|
||||||
|
int arity, Name[] names, int result, Kind kind) {
|
||||||
|
this(debugName, arity, names, result, /*forceInline=*/true, /*customized=*/null, kind);
|
||||||
}
|
}
|
||||||
LambdaForm(String debugName,
|
LambdaForm(String debugName,
|
||||||
int arity, Name[] names, int result, boolean forceInline, MethodHandle customized) {
|
int arity, Name[] names, int result, boolean forceInline, MethodHandle customized) {
|
||||||
|
this(debugName, arity, names, result, forceInline, customized, Kind.GENERIC);
|
||||||
|
}
|
||||||
|
LambdaForm(String debugName,
|
||||||
|
int arity, Name[] names, int result, boolean forceInline, MethodHandle customized, Kind kind) {
|
||||||
assert(namesOK(arity, names));
|
assert(namesOK(arity, names));
|
||||||
this.arity = arity;
|
this.arity = arity;
|
||||||
this.result = fixResult(result, names);
|
this.result = fixResult(result, names);
|
||||||
|
@ -279,6 +317,7 @@ class LambdaForm {
|
||||||
this.debugName = fixDebugName(debugName);
|
this.debugName = fixDebugName(debugName);
|
||||||
this.forceInline = forceInline;
|
this.forceInline = forceInline;
|
||||||
this.customized = customized;
|
this.customized = customized;
|
||||||
|
this.kind = kind;
|
||||||
int maxOutArity = normalize();
|
int maxOutArity = normalize();
|
||||||
if (maxOutArity > MethodType.MAX_MH_INVOKER_ARITY) {
|
if (maxOutArity > MethodType.MAX_MH_INVOKER_ARITY) {
|
||||||
// Cannot use LF interpreter on very high arity expressions.
|
// Cannot use LF interpreter on very high arity expressions.
|
||||||
|
@ -288,11 +327,15 @@ class LambdaForm {
|
||||||
}
|
}
|
||||||
LambdaForm(String debugName,
|
LambdaForm(String debugName,
|
||||||
int arity, Name[] names) {
|
int arity, Name[] names) {
|
||||||
this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null);
|
this(debugName, arity, names, LAST_RESULT, /*forceInline=*/true, /*customized=*/null, Kind.GENERIC);
|
||||||
}
|
}
|
||||||
LambdaForm(String debugName,
|
LambdaForm(String debugName,
|
||||||
int arity, Name[] names, boolean forceInline) {
|
int arity, Name[] names, boolean forceInline) {
|
||||||
this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null);
|
this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null, Kind.GENERIC);
|
||||||
|
}
|
||||||
|
LambdaForm(String debugName,
|
||||||
|
int arity, Name[] names, boolean forceInline, Kind kind) {
|
||||||
|
this(debugName, arity, names, LAST_RESULT, forceInline, /*customized=*/null, kind);
|
||||||
}
|
}
|
||||||
LambdaForm(String debugName,
|
LambdaForm(String debugName,
|
||||||
Name[] formals, Name[] temps, Name result) {
|
Name[] formals, Name[] temps, Name result) {
|
||||||
|
@ -325,6 +368,7 @@ class LambdaForm {
|
||||||
this.debugName = "LF.zero";
|
this.debugName = "LF.zero";
|
||||||
this.forceInline = true;
|
this.forceInline = true;
|
||||||
this.customized = null;
|
this.customized = null;
|
||||||
|
this.kind = Kind.GENERIC;
|
||||||
assert(nameRefsAreLegal());
|
assert(nameRefsAreLegal());
|
||||||
assert(isEmpty());
|
assert(isEmpty());
|
||||||
String sig = null;
|
String sig = null;
|
||||||
|
@ -395,7 +439,7 @@ class LambdaForm {
|
||||||
|
|
||||||
/** Customize LambdaForm for a particular MethodHandle */
|
/** Customize LambdaForm for a particular MethodHandle */
|
||||||
LambdaForm customize(MethodHandle mh) {
|
LambdaForm customize(MethodHandle mh) {
|
||||||
LambdaForm customForm = new LambdaForm(debugName, arity, names, result, forceInline, mh);
|
LambdaForm customForm = new LambdaForm(debugName, arity, names, result, forceInline, mh, kind);
|
||||||
if (COMPILE_THRESHOLD >= 0 && isCompiled) {
|
if (COMPILE_THRESHOLD >= 0 && isCompiled) {
|
||||||
// If shared LambdaForm has been compiled, compile customized version as well.
|
// If shared LambdaForm has been compiled, compile customized version as well.
|
||||||
customForm.compileToBytecode();
|
customForm.compileToBytecode();
|
||||||
|
@ -773,28 +817,6 @@ class LambdaForm {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate optimizable bytecode for this form after first looking for a
|
|
||||||
* pregenerated version in a specified class.
|
|
||||||
*/
|
|
||||||
void compileToBytecode(Class<?> lookupClass) {
|
|
||||||
if (vmentry != null && isCompiled) {
|
|
||||||
return; // already compiled somehow
|
|
||||||
}
|
|
||||||
MethodType invokerType = methodType();
|
|
||||||
assert(vmentry == null || vmentry.getMethodType().basicType().equals(invokerType));
|
|
||||||
int dot = debugName.indexOf('.');
|
|
||||||
String methodName = (dot > 0) ? debugName.substring(dot + 1) : debugName;
|
|
||||||
MemberName member = new MemberName(lookupClass, methodName, invokerType, REF_invokeStatic);
|
|
||||||
MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, lookupClass);
|
|
||||||
if (resolvedMember != null) {
|
|
||||||
vmentry = resolvedMember;
|
|
||||||
isCompiled = true;
|
|
||||||
} else {
|
|
||||||
compileToBytecode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void computeInitialPreparedForms() {
|
private static void computeInitialPreparedForms() {
|
||||||
// Find all predefined invokers and associate them with canonical empty lambda forms.
|
// Find all predefined invokers and associate them with canonical empty lambda forms.
|
||||||
for (MemberName m : MemberName.getFactory().getMethods(LambdaForm.class, false, null, null, null)) {
|
for (MemberName m : MemberName.getFactory().getMethods(LambdaForm.class, false, null, null, null)) {
|
||||||
|
@ -1828,7 +1850,7 @@ class LambdaForm {
|
||||||
// bootstrap dependency on this method in case we're interpreting LFs
|
// bootstrap dependency on this method in case we're interpreting LFs
|
||||||
if (isVoid) {
|
if (isVoid) {
|
||||||
Name[] idNames = new Name[] { argument(0, L_TYPE) };
|
Name[] idNames = new Name[] { argument(0, L_TYPE) };
|
||||||
idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT);
|
idForm = new LambdaForm(idMem.getName(), 1, idNames, VOID_RESULT, Kind.IDENTITY);
|
||||||
idForm.compileToBytecode();
|
idForm.compileToBytecode();
|
||||||
idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm));
|
idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm));
|
||||||
|
|
||||||
|
@ -1836,15 +1858,17 @@ class LambdaForm {
|
||||||
zeFun = idFun;
|
zeFun = idFun;
|
||||||
} else {
|
} else {
|
||||||
Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) };
|
Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) };
|
||||||
idForm = new LambdaForm(idMem.getName(), 2, idNames, 1);
|
idForm = new LambdaForm(idMem.getName(), 2, idNames, 1, Kind.IDENTITY);
|
||||||
idForm.compileToBytecode();
|
idForm.compileToBytecode();
|
||||||
idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm));
|
idFun = new NamedFunction(idMem, MethodHandleImpl.makeIntrinsic(
|
||||||
|
idMem.getInvocationType(), idForm, MethodHandleImpl.Intrinsic.IDENTITY));
|
||||||
|
|
||||||
Object zeValue = Wrapper.forBasicType(btChar).zero();
|
Object zeValue = Wrapper.forBasicType(btChar).zero();
|
||||||
Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) };
|
Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) };
|
||||||
zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1);
|
zeForm = new LambdaForm(zeMem.getName(), 1, zeNames, 1, Kind.ZERO);
|
||||||
zeForm.compileToBytecode();
|
zeForm.compileToBytecode();
|
||||||
zeFun = new NamedFunction(zeMem, SimpleMethodHandle.make(zeMem.getInvocationType(), zeForm));
|
zeFun = new NamedFunction(zeMem, MethodHandleImpl.makeIntrinsic(
|
||||||
|
zeMem.getInvocationType(), zeForm, MethodHandleImpl.Intrinsic.ZERO));
|
||||||
}
|
}
|
||||||
|
|
||||||
LF_zero[ord] = zeForm;
|
LF_zero[ord] = zeForm;
|
||||||
|
@ -1901,8 +1925,17 @@ class LambdaForm {
|
||||||
if (USE_PREDEFINED_INTERPRET_METHODS)
|
if (USE_PREDEFINED_INTERPRET_METHODS)
|
||||||
computeInitialPreparedForms();
|
computeInitialPreparedForms();
|
||||||
NamedFunction.initializeInvokers();
|
NamedFunction.initializeInvokers();
|
||||||
|
|
||||||
|
// The Holder class will contain pre-generated forms resolved
|
||||||
|
// using MemberName.getFactory(). However, that doesn't initialize the
|
||||||
|
// class, which subtly breaks inlining etc. By forcing
|
||||||
|
// initialization of the Holder class we avoid these issues.
|
||||||
|
UNSAFE.ensureClassInitialized(Holder.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Placeholder class for zero and identity forms generated ahead of time */
|
||||||
|
final class Holder {}
|
||||||
|
|
||||||
// The following hack is necessary in order to suppress TRACE_INTERPRETER
|
// The following hack is necessary in order to suppress TRACE_INTERPRETER
|
||||||
// during execution of the static initializes of this class.
|
// during execution of the static initializes of this class.
|
||||||
// Turning on TRACE_INTERPRETER too early will cause
|
// Turning on TRACE_INTERPRETER too early will cause
|
||||||
|
|
|
@ -1718,10 +1718,19 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] generateDMHClassBytes(String className,
|
public byte[] generateDirectMethodHandleHolderClassBytes(
|
||||||
MethodType[] methodTypes, int[] types) {
|
String className, MethodType[] methodTypes, int[] types) {
|
||||||
return GenerateJLIClassesHelper
|
return GenerateJLIClassesHelper
|
||||||
.generateDMHClassBytes(className, methodTypes, types);
|
.generateDirectMethodHandleHolderClassBytes(
|
||||||
|
className, methodTypes, types);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] generateDelegatingMethodHandleHolderClassBytes(
|
||||||
|
String className, MethodType[] methodTypes) {
|
||||||
|
return GenerateJLIClassesHelper
|
||||||
|
.generateDelegatingMethodHandleHolderClassBytes(
|
||||||
|
className, methodTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1730,6 +1739,12 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||||
return GenerateJLIClassesHelper
|
return GenerateJLIClassesHelper
|
||||||
.generateConcreteBMHClassBytes(types);
|
.generateConcreteBMHClassBytes(types);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] generateBasicFormsClassBytes(final String className) {
|
||||||
|
return GenerateJLIClassesHelper
|
||||||
|
.generateBasicFormsClassBytes(className);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1925,7 +1940,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||||
* @return whether the counter has reached the limit.
|
* @return whether the counter has reached the limit.
|
||||||
*/
|
*/
|
||||||
static boolean countedLoopPredicate(int counter, int limit) {
|
static boolean countedLoopPredicate(int counter, int limit) {
|
||||||
return counter <= limit;
|
return counter < limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4583,7 +4583,8 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
|
||||||
* // assume MH_decrement is a handle to x-1 of type int
|
* // assume MH_decrement is a handle to x-1 of type int
|
||||||
* MethodHandle[]
|
* MethodHandle[]
|
||||||
* indexVar = {start, MH_increment}, // i = start; i = i+1
|
* indexVar = {start, MH_increment}, // i = start; i = i+1
|
||||||
* loopLimit = {end, null, MH_lessThan, returnVar }, // i<end
|
* loopLimit = {end, null,
|
||||||
|
* filterArgument(MH_lessThan, 0, MH_decrement), returnVar}, // i-1<end
|
||||||
* bodyClause = {init,
|
* bodyClause = {init,
|
||||||
* filterArgument(dropArguments(body, 1, int.class), 0, MH_decrement}; // v = body(i-1, v)
|
* filterArgument(dropArguments(body, 1, int.class), 0, MH_decrement}; // v = body(i-1, v)
|
||||||
* return loop(indexVar, loopLimit, bodyClause);
|
* return loop(indexVar, loopLimit, bodyClause);
|
||||||
|
@ -4619,12 +4620,12 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
|
||||||
MethodHandle actualBody = body == null ? dropArguments(defaultResultHandle, 0, int.class) : body;
|
MethodHandle actualBody = body == null ? dropArguments(defaultResultHandle, 0, int.class) : body;
|
||||||
MethodHandle returnVar = dropArguments(defaultResultHandle, 0, int.class, int.class);
|
MethodHandle returnVar = dropArguments(defaultResultHandle, 0, int.class, int.class);
|
||||||
MethodHandle actualEnd = end == null ? constant(int.class, 0) : end;
|
MethodHandle actualEnd = end == null ? constant(int.class, 0) : end;
|
||||||
|
MethodHandle decr = MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter);
|
||||||
MethodHandle[] indexVar = {start, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopStep)};
|
MethodHandle[] indexVar = {start, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopStep)};
|
||||||
MethodHandle[] loopLimit = {actualEnd, null,
|
MethodHandle[] loopLimit = {actualEnd, null,
|
||||||
MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), returnVar};
|
filterArgument(MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), 0, decr),
|
||||||
MethodHandle[] bodyClause = {actualInit,
|
returnVar};
|
||||||
filterArgument(dropArguments(actualBody, 1, int.class), 0,
|
MethodHandle[] bodyClause = {actualInit, filterArgument(dropArguments(actualBody, 1, int.class), 0, decr)};
|
||||||
MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter))};
|
|
||||||
return loop(indexVar, loopLimit, bodyClause);
|
return loop(indexVar, loopLimit, bodyClause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,9 @@ import java.security.AccessController;
|
||||||
import java.security.PrivilegedAction;
|
import java.security.PrivilegedAction;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Deque;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -49,6 +47,7 @@ import jdk.internal.misc.Unsafe;
|
||||||
import jdk.internal.misc.VM;
|
import jdk.internal.misc.VM;
|
||||||
import jdk.internal.reflect.CallerSensitive;
|
import jdk.internal.reflect.CallerSensitive;
|
||||||
import jdk.internal.reflect.Reflection;
|
import jdk.internal.reflect.Reflection;
|
||||||
|
import jdk.internal.loader.ClassLoaderValue;
|
||||||
import sun.reflect.misc.ReflectUtil;
|
import sun.reflect.misc.ReflectUtil;
|
||||||
import sun.security.action.GetPropertyAction;
|
import sun.security.action.GetPropertyAction;
|
||||||
import sun.security.util.SecurityConstants;
|
import sun.security.util.SecurityConstants;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -50,9 +50,24 @@ public abstract class AuthProvider extends Provider {
|
||||||
* @param name the provider name.
|
* @param name the provider name.
|
||||||
* @param version the provider version number.
|
* @param version the provider version number.
|
||||||
* @param info a description of the provider and its services.
|
* @param info a description of the provider and its services.
|
||||||
|
* @deprecated use {@link #AuthProvider(String, String, String)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since="9")
|
||||||
protected AuthProvider(String name, double version, String info) {
|
protected AuthProvider(String name, double version, String info) {
|
||||||
super(name, version, info);
|
super(name, Double.toString(version), info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a provider with the specified name, version string,
|
||||||
|
* and information.
|
||||||
|
*
|
||||||
|
* @param name the provider name.
|
||||||
|
* @param versionStr the provider version string.
|
||||||
|
* @param info a description of the provider and its services.
|
||||||
|
* @since 9
|
||||||
|
*/
|
||||||
|
protected AuthProvider(String name, String versionStr, String info) {
|
||||||
|
super(name, versionStr, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -67,14 +67,14 @@ import java.util.function.Function;
|
||||||
* <tr><td>{@code Provider.id name}</td>
|
* <tr><td>{@code Provider.id name}</td>
|
||||||
* <td>{@code String.valueOf(provider.getName())}</td>
|
* <td>{@code String.valueOf(provider.getName())}</td>
|
||||||
* <tr><td>{@code Provider.id version}</td>
|
* <tr><td>{@code Provider.id version}</td>
|
||||||
* <td>{@code String.valueOf(provider.getVersion())}</td>
|
* <td>{@code String.valueOf(provider.getVersionStr())}</td>
|
||||||
* <tr><td>{@code Provider.id info}</td>
|
* <tr><td>{@code Provider.id info}</td>
|
||||||
<td>{@code String.valueOf(provider.getInfo())}</td>
|
<td>{@code String.valueOf(provider.getInfo())}</td>
|
||||||
* <tr><td>{@code Provider.id className}</td>
|
* <tr><td>{@code Provider.id className}</td>
|
||||||
* <td>{@code provider.getClass().getName()}</td>
|
* <td>{@code provider.getClass().getName()}</td>
|
||||||
* </table>
|
* </table>
|
||||||
*
|
*
|
||||||
* <p>Each provider has a name and a version number. A provider normally
|
* <p>Each provider has a name and a version string. A provider normally
|
||||||
* identifies itself with a file named {@code java.security.Provider}
|
* identifies itself with a file named {@code java.security.Provider}
|
||||||
* in the resource directory {@code META-INF/services}.
|
* in the resource directory {@code META-INF/services}.
|
||||||
* Security providers are looked up via the {@link ServiceLoader} mechanism
|
* Security providers are looked up via the {@link ServiceLoader} mechanism
|
||||||
|
@ -102,11 +102,10 @@ import java.util.function.Function;
|
||||||
public abstract class Provider extends Properties {
|
public abstract class Provider extends Properties {
|
||||||
|
|
||||||
// Declare serialVersionUID to be compatible with JDK1.1
|
// Declare serialVersionUID to be compatible with JDK1.1
|
||||||
static final long serialVersionUID = -4298000515446427739L;
|
private static final long serialVersionUID = -4298000515446427739L;
|
||||||
|
|
||||||
private static final sun.security.util.Debug debug =
|
private static final sun.security.util.Debug debug =
|
||||||
sun.security.util.Debug.getInstance
|
sun.security.util.Debug.getInstance("provider", "Provider");
|
||||||
("provider", "Provider");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The provider name.
|
* The provider name.
|
||||||
|
@ -129,6 +128,12 @@ public abstract class Provider extends Properties {
|
||||||
*/
|
*/
|
||||||
private double version;
|
private double version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The provider version string.
|
||||||
|
*
|
||||||
|
* @serial
|
||||||
|
*/
|
||||||
|
private String versionStr;
|
||||||
|
|
||||||
private transient Set<Map.Entry<Object,Object>> entrySet = null;
|
private transient Set<Map.Entry<Object,Object>> entrySet = null;
|
||||||
private transient int entrySetCallCount = 0;
|
private transient int entrySetCallCount = 0;
|
||||||
|
@ -174,19 +179,83 @@ public abstract class Provider extends Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static double parseVersionStr(String s) {
|
||||||
|
try {
|
||||||
|
int firstDotIdx = s.indexOf('.');
|
||||||
|
int nextDotIdx = s.indexOf('.', firstDotIdx + 1);
|
||||||
|
if (nextDotIdx != -1) {
|
||||||
|
s = s.substring(0, nextDotIdx);
|
||||||
|
}
|
||||||
|
int endIdx = s.indexOf('-');
|
||||||
|
if (endIdx > 0) {
|
||||||
|
s = s.substring(0, endIdx);
|
||||||
|
}
|
||||||
|
endIdx = s.indexOf('+');
|
||||||
|
if (endIdx > 0) {
|
||||||
|
s = s.substring(0, endIdx);
|
||||||
|
}
|
||||||
|
return Double.parseDouble(s);
|
||||||
|
} catch (NullPointerException | NumberFormatException e) {
|
||||||
|
return 0d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a provider with the specified name, version number,
|
* Constructs a provider with the specified name, version number,
|
||||||
* and information.
|
* and information. Calling this constructor is equivalent to call the
|
||||||
|
* {@link #Provider(String, String, String)} with {@code name}
|
||||||
|
* name, {@code Double.toString(version)}, and {@code info}.
|
||||||
*
|
*
|
||||||
* @param name the provider name.
|
* @param name the provider name.
|
||||||
*
|
*
|
||||||
* @param version the provider version number.
|
* @param version the provider version number.
|
||||||
*
|
*
|
||||||
* @param info a description of the provider and its services.
|
* @param info a description of the provider and its services.
|
||||||
|
*
|
||||||
|
* @deprecated use {@link #Provider(String, String, String)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since="9")
|
||||||
protected Provider(String name, double version, String info) {
|
protected Provider(String name, double version, String info) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
|
this.versionStr = Double.toString(version);
|
||||||
|
this.info = info;
|
||||||
|
putId();
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a provider with the specified name, version string,
|
||||||
|
* and information.
|
||||||
|
*
|
||||||
|
* <p>The version string contains a version number optionally followed
|
||||||
|
* by other information separated by one of the characters of '+', '-'.
|
||||||
|
*
|
||||||
|
* The format for the version number is:
|
||||||
|
*
|
||||||
|
* <blockquote><pre>
|
||||||
|
* ^[0-9]+(\.[0-9]+)*
|
||||||
|
* </pre></blockquote>
|
||||||
|
*
|
||||||
|
* <p>In order to return the version number in a double, when there are
|
||||||
|
* more than two components (separated by '.' as defined above), only
|
||||||
|
* the first two components are retained. The resulting string is then
|
||||||
|
* passed to {@link Double#valueOf(String)} to generate version number,
|
||||||
|
* i.e. {@link #getVersion}.
|
||||||
|
* <p>If the conversion failed, value 0 will be used.
|
||||||
|
*
|
||||||
|
* @param name the provider name.
|
||||||
|
*
|
||||||
|
* @param versionStr the provider version string.
|
||||||
|
*
|
||||||
|
* @param info a description of the provider and its services.
|
||||||
|
*
|
||||||
|
* @since 9
|
||||||
|
*/
|
||||||
|
protected Provider(String name, String versionStr, String info) {
|
||||||
|
this.name = name;
|
||||||
|
this.versionStr = versionStr;
|
||||||
|
this.version = parseVersionStr(versionStr);
|
||||||
this.info = info;
|
this.info = info;
|
||||||
putId();
|
putId();
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
@ -250,11 +319,25 @@ public abstract class Provider extends Properties {
|
||||||
* Returns the version number for this provider.
|
* Returns the version number for this provider.
|
||||||
*
|
*
|
||||||
* @return the version number for this provider.
|
* @return the version number for this provider.
|
||||||
|
*
|
||||||
|
* @deprecated use {@link #getVersionStr} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since="9")
|
||||||
public double getVersion() {
|
public double getVersion() {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the version string for this provider.
|
||||||
|
*
|
||||||
|
* @return the version string for this provider.
|
||||||
|
*
|
||||||
|
* @since 9
|
||||||
|
*/
|
||||||
|
public String getVersionStr() {
|
||||||
|
return versionStr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a human-readable description of the provider and its
|
* Returns a human-readable description of the provider and its
|
||||||
* services. This may return an HTML page, with relevant links.
|
* services. This may return an HTML page, with relevant links.
|
||||||
|
@ -266,14 +349,14 @@ public abstract class Provider extends Properties {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a string with the name and the version number
|
* Returns a string with the name and the version string
|
||||||
* of this provider.
|
* of this provider.
|
||||||
*
|
*
|
||||||
* @return the string with the name and the version number
|
* @return the string with the name and the version string
|
||||||
* for this provider.
|
* for this provider.
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return name + " version " + version;
|
return name + " version " + versionStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -601,7 +684,7 @@ public abstract class Provider extends Properties {
|
||||||
public synchronized Object compute(Object key, BiFunction<? super Object,
|
public synchronized Object compute(Object key, BiFunction<? super Object,
|
||||||
? super Object, ? extends Object> remappingFunction) {
|
? super Object, ? extends Object> remappingFunction) {
|
||||||
check("putProviderProperty." + name);
|
check("putProviderProperty." + name);
|
||||||
check("removeProviderProperty" + name);
|
check("removeProviderProperty." + name);
|
||||||
|
|
||||||
if (debug != null) {
|
if (debug != null) {
|
||||||
debug.println("Compute " + name + " provider property " + key);
|
debug.println("Compute " + name + " provider property " + key);
|
||||||
|
@ -632,7 +715,7 @@ public abstract class Provider extends Properties {
|
||||||
public synchronized Object computeIfAbsent(Object key, Function<? super Object,
|
public synchronized Object computeIfAbsent(Object key, Function<? super Object,
|
||||||
? extends Object> mappingFunction) {
|
? extends Object> mappingFunction) {
|
||||||
check("putProviderProperty." + name);
|
check("putProviderProperty." + name);
|
||||||
check("removeProviderProperty" + name);
|
check("removeProviderProperty." + name);
|
||||||
|
|
||||||
if (debug != null) {
|
if (debug != null) {
|
||||||
debug.println("ComputeIfAbsent " + name + " provider property " +
|
debug.println("ComputeIfAbsent " + name + " provider property " +
|
||||||
|
@ -662,7 +745,7 @@ public abstract class Provider extends Properties {
|
||||||
public synchronized Object computeIfPresent(Object key, BiFunction<? super Object,
|
public synchronized Object computeIfPresent(Object key, BiFunction<? super Object,
|
||||||
? super Object, ? extends Object> remappingFunction) {
|
? super Object, ? extends Object> remappingFunction) {
|
||||||
check("putProviderProperty." + name);
|
check("putProviderProperty." + name);
|
||||||
check("removeProviderProperty" + name);
|
check("removeProviderProperty." + name);
|
||||||
|
|
||||||
if (debug != null) {
|
if (debug != null) {
|
||||||
debug.println("ComputeIfPresent " + name + " provider property " +
|
debug.println("ComputeIfPresent " + name + " provider property " +
|
||||||
|
@ -695,7 +778,7 @@ public abstract class Provider extends Properties {
|
||||||
public synchronized Object merge(Object key, Object value, BiFunction<? super Object,
|
public synchronized Object merge(Object key, Object value, BiFunction<? super Object,
|
||||||
? super Object, ? extends Object> remappingFunction) {
|
? super Object, ? extends Object> remappingFunction) {
|
||||||
check("putProviderProperty." + name);
|
check("putProviderProperty." + name);
|
||||||
check("removeProviderProperty" + name);
|
check("removeProviderProperty." + name);
|
||||||
|
|
||||||
if (debug != null) {
|
if (debug != null) {
|
||||||
debug.println("Merge " + name + " provider property " + key);
|
debug.println("Merge " + name + " provider property " + key);
|
||||||
|
@ -787,11 +870,21 @@ public abstract class Provider extends Properties {
|
||||||
private void putId() {
|
private void putId() {
|
||||||
// note: name and info may be null
|
// note: name and info may be null
|
||||||
super.put("Provider.id name", String.valueOf(name));
|
super.put("Provider.id name", String.valueOf(name));
|
||||||
super.put("Provider.id version", String.valueOf(version));
|
super.put("Provider.id version", String.valueOf(versionStr));
|
||||||
super.put("Provider.id info", String.valueOf(info));
|
super.put("Provider.id info", String.valueOf(info));
|
||||||
super.put("Provider.id className", this.getClass().getName());
|
super.put("Provider.id className", this.getClass().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads the {@code ObjectInputStream} for the default serializable fields.
|
||||||
|
* If the serialized field {@code versionStr} is found in the STREAM FIELDS,
|
||||||
|
* its String value will be used to populate both the version string and
|
||||||
|
* version number. If {@code versionStr} is not found, but {@code version}
|
||||||
|
* is, then its double value will be used to populate both fields.
|
||||||
|
*
|
||||||
|
* @param in the {@code ObjectInputStream} to read
|
||||||
|
* @serial
|
||||||
|
*/
|
||||||
private void readObject(ObjectInputStream in)
|
private void readObject(ObjectInputStream in)
|
||||||
throws IOException, ClassNotFoundException {
|
throws IOException, ClassNotFoundException {
|
||||||
Map<Object,Object> copy = new HashMap<>();
|
Map<Object,Object> copy = new HashMap<>();
|
||||||
|
@ -800,6 +893,13 @@ public abstract class Provider extends Properties {
|
||||||
}
|
}
|
||||||
defaults = null;
|
defaults = null;
|
||||||
in.defaultReadObject();
|
in.defaultReadObject();
|
||||||
|
if (this.versionStr == null) {
|
||||||
|
// set versionStr based on version when not found in serialized bytes
|
||||||
|
this.versionStr = Double.toString(this.version);
|
||||||
|
} else {
|
||||||
|
// otherwise, set version based on versionStr
|
||||||
|
this.version = parseVersionStr(this.versionStr);
|
||||||
|
}
|
||||||
implClear();
|
implClear();
|
||||||
initialized = true;
|
initialized = true;
|
||||||
putAll(copy);
|
putAll(copy);
|
||||||
|
@ -904,8 +1004,8 @@ public abstract class Provider extends Properties {
|
||||||
if (!checkLegacy(key)) {
|
if (!checkLegacy(key)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
legacyStrings.computeIfAbsent((String) key,
|
legacyStrings.compute((String) key,
|
||||||
(Function<? super String, ? extends String>) remappingFunction);
|
(BiFunction<? super String,? super String, ? extends String>) remappingFunction);
|
||||||
}
|
}
|
||||||
return super.compute(key, remappingFunction);
|
return super.compute(key, remappingFunction);
|
||||||
}
|
}
|
||||||
|
@ -1913,7 +2013,5 @@ public abstract class Provider extends Properties {
|
||||||
return provider.getName() + ": " + type + "." + algorithm
|
return provider.getName() + ": " + type + "." + algorithm
|
||||||
+ " -> " + className + aString + attrs + "\r\n";
|
+ " -> " + className + aString + attrs + "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -399,7 +399,10 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
* Calendar Elements in the Unicode Locale Data Markup Language
|
* Calendar Elements in the Unicode Locale Data Markup Language
|
||||||
* (LDML) specification</a> for more details.
|
* (LDML) specification</a> for more details.
|
||||||
*
|
*
|
||||||
* @return the month strings.
|
* @return the month strings. Use
|
||||||
|
* {@link java.util.Calendar#JANUARY Calendar.JANUARY},
|
||||||
|
* {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY},
|
||||||
|
* etc. to index the result array.
|
||||||
*/
|
*/
|
||||||
public String[] getMonths() {
|
public String[] getMonths() {
|
||||||
return Arrays.copyOf(months, months.length);
|
return Arrays.copyOf(months, months.length);
|
||||||
|
@ -407,7 +410,9 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets month strings. For example: "January", "February", etc.
|
* Sets month strings. For example: "January", "February", etc.
|
||||||
* @param newMonths the new month strings.
|
* @param newMonths the new month strings. The array should
|
||||||
|
* be indexed by {@link java.util.Calendar#JANUARY Calendar.JANUARY},
|
||||||
|
* {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, etc.
|
||||||
*/
|
*/
|
||||||
public void setMonths(String[] newMonths) {
|
public void setMonths(String[] newMonths) {
|
||||||
months = Arrays.copyOf(newMonths, newMonths.length);
|
months = Arrays.copyOf(newMonths, newMonths.length);
|
||||||
|
@ -427,7 +432,10 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
* Calendar Elements in the Unicode Locale Data Markup Language
|
* Calendar Elements in the Unicode Locale Data Markup Language
|
||||||
* (LDML) specification</a> for more details.
|
* (LDML) specification</a> for more details.
|
||||||
*
|
*
|
||||||
* @return the short month strings.
|
* @return the short month strings. Use
|
||||||
|
* {@link java.util.Calendar#JANUARY Calendar.JANUARY},
|
||||||
|
* {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY},
|
||||||
|
* etc. to index the result array.
|
||||||
*/
|
*/
|
||||||
public String[] getShortMonths() {
|
public String[] getShortMonths() {
|
||||||
return Arrays.copyOf(shortMonths, shortMonths.length);
|
return Arrays.copyOf(shortMonths, shortMonths.length);
|
||||||
|
@ -435,7 +443,9 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets short month strings. For example: "Jan", "Feb", etc.
|
* Sets short month strings. For example: "Jan", "Feb", etc.
|
||||||
* @param newShortMonths the new short month strings.
|
* @param newShortMonths the new short month strings. The array should
|
||||||
|
* be indexed by {@link java.util.Calendar#JANUARY Calendar.JANUARY},
|
||||||
|
* {@link java.util.Calendar#FEBRUARY Calendar.FEBRUARY}, etc.
|
||||||
*/
|
*/
|
||||||
public void setShortMonths(String[] newShortMonths) {
|
public void setShortMonths(String[] newShortMonths) {
|
||||||
shortMonths = Arrays.copyOf(newShortMonths, newShortMonths.length);
|
shortMonths = Arrays.copyOf(newShortMonths, newShortMonths.length);
|
||||||
|
@ -444,8 +454,10 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets weekday strings. For example: "Sunday", "Monday", etc.
|
* Gets weekday strings. For example: "Sunday", "Monday", etc.
|
||||||
* @return the weekday strings. Use <code>Calendar.SUNDAY</code>,
|
* @return the weekday strings. Use
|
||||||
* <code>Calendar.MONDAY</code>, etc. to index the result array.
|
* {@link java.util.Calendar#SUNDAY Calendar.SUNDAY},
|
||||||
|
* {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. to index
|
||||||
|
* the result array.
|
||||||
*/
|
*/
|
||||||
public String[] getWeekdays() {
|
public String[] getWeekdays() {
|
||||||
return Arrays.copyOf(weekdays, weekdays.length);
|
return Arrays.copyOf(weekdays, weekdays.length);
|
||||||
|
@ -454,8 +466,8 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
/**
|
/**
|
||||||
* Sets weekday strings. For example: "Sunday", "Monday", etc.
|
* Sets weekday strings. For example: "Sunday", "Monday", etc.
|
||||||
* @param newWeekdays the new weekday strings. The array should
|
* @param newWeekdays the new weekday strings. The array should
|
||||||
* be indexed by <code>Calendar.SUNDAY</code>,
|
* be indexed by {@link java.util.Calendar#SUNDAY Calendar.SUNDAY},
|
||||||
* <code>Calendar.MONDAY</code>, etc.
|
* {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc.
|
||||||
*/
|
*/
|
||||||
public void setWeekdays(String[] newWeekdays) {
|
public void setWeekdays(String[] newWeekdays) {
|
||||||
weekdays = Arrays.copyOf(newWeekdays, newWeekdays.length);
|
weekdays = Arrays.copyOf(newWeekdays, newWeekdays.length);
|
||||||
|
@ -464,8 +476,10 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets short weekday strings. For example: "Sun", "Mon", etc.
|
* Gets short weekday strings. For example: "Sun", "Mon", etc.
|
||||||
* @return the short weekday strings. Use <code>Calendar.SUNDAY</code>,
|
* @return the short weekday strings. Use
|
||||||
* <code>Calendar.MONDAY</code>, etc. to index the result array.
|
* {@link java.util.Calendar#SUNDAY Calendar.SUNDAY},
|
||||||
|
* {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc. to index
|
||||||
|
* the result array.
|
||||||
*/
|
*/
|
||||||
public String[] getShortWeekdays() {
|
public String[] getShortWeekdays() {
|
||||||
return Arrays.copyOf(shortWeekdays, shortWeekdays.length);
|
return Arrays.copyOf(shortWeekdays, shortWeekdays.length);
|
||||||
|
@ -474,8 +488,8 @@ public class DateFormatSymbols implements Serializable, Cloneable {
|
||||||
/**
|
/**
|
||||||
* Sets short weekday strings. For example: "Sun", "Mon", etc.
|
* Sets short weekday strings. For example: "Sun", "Mon", etc.
|
||||||
* @param newShortWeekdays the new short weekday strings. The array should
|
* @param newShortWeekdays the new short weekday strings. The array should
|
||||||
* be indexed by <code>Calendar.SUNDAY</code>,
|
* be indexed by {@link java.util.Calendar#SUNDAY Calendar.SUNDAY},
|
||||||
* <code>Calendar.MONDAY</code>, etc.
|
* {@link java.util.Calendar#MONDAY Calendar.MONDAY}, etc.
|
||||||
*/
|
*/
|
||||||
public void setShortWeekdays(String[] newShortWeekdays) {
|
public void setShortWeekdays(String[] newShortWeekdays) {
|
||||||
shortWeekdays = Arrays.copyOf(newShortWeekdays, newShortWeekdays.length);
|
shortWeekdays = Arrays.copyOf(newShortWeekdays, newShortWeekdays.length);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -952,6 +952,9 @@ public class Date
|
||||||
* without affecting its internal state.
|
* without affecting its internal state.
|
||||||
*/
|
*/
|
||||||
static final long getMillisOf(Date date) {
|
static final long getMillisOf(Date date) {
|
||||||
|
if (date.getClass() != Date.class) {
|
||||||
|
return date.getTime();
|
||||||
|
}
|
||||||
if (date.cdate == null || date.cdate.isNormalized()) {
|
if (date.cdate == null || date.cdate.isNormalized()) {
|
||||||
return date.fastTime;
|
return date.fastTime;
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,7 +295,13 @@ public final class Collectors {
|
||||||
public static <T>
|
public static <T>
|
||||||
Collector<T, ?, Set<T>> toSet() {
|
Collector<T, ?, Set<T>> toSet() {
|
||||||
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
|
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
|
||||||
(left, right) -> { left.addAll(right); return left; },
|
(left, right) -> {
|
||||||
|
if (left.size() < right.size()) {
|
||||||
|
right.addAll(left); return right;
|
||||||
|
} else {
|
||||||
|
left.addAll(right); return left;
|
||||||
|
}
|
||||||
|
},
|
||||||
CH_UNORDERED_ID);
|
CH_UNORDERED_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -861,6 +861,13 @@ public abstract class SSLEngine {
|
||||||
* be enabled by default, since this list may include cipher suites which
|
* be enabled by default, since this list may include cipher suites which
|
||||||
* do not meet quality of service requirements for those defaults. Such
|
* do not meet quality of service requirements for those defaults. Such
|
||||||
* cipher suites might be useful in specialized applications.
|
* cipher suites might be useful in specialized applications.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getEnabledCipherSuites()
|
* @see #getEnabledCipherSuites()
|
||||||
|
@ -880,6 +887,13 @@ public abstract class SSLEngine {
|
||||||
* or the requisite certificates (and private keys) for the suite are
|
* or the requisite certificates (and private keys) for the suite are
|
||||||
* not available, or an anonymous suite is enabled but authentication
|
* not available, or an anonymous suite is enabled but authentication
|
||||||
* is required.
|
* is required.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getSupportedCipherSuites()
|
* @see #getSupportedCipherSuites()
|
||||||
|
@ -896,6 +910,14 @@ public abstract class SSLEngine {
|
||||||
* fail. Following a successful call to this method, only suites
|
* fail. Following a successful call to this method, only suites
|
||||||
* listed in the {@code suites} parameter are enabled for use.
|
* listed in the {@code suites} parameter are enabled for use.
|
||||||
* <P>
|
* <P>
|
||||||
|
* Note that the standard list of cipher suite names may be found in the
|
||||||
|
* <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list or might not
|
||||||
|
* use the recommended name for a certain cipher suite.
|
||||||
|
* <P>
|
||||||
* See {@link #getEnabledCipherSuites()} for more information
|
* See {@link #getEnabledCipherSuites()} for more information
|
||||||
* on why a specific cipher suite may never be used on a engine.
|
* on why a specific cipher suite may never be used on a engine.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -108,7 +108,12 @@ public class SSLParameters {
|
||||||
* <p>
|
* <p>
|
||||||
* Calling this constructor is equivalent to calling the no-args
|
* Calling this constructor is equivalent to calling the no-args
|
||||||
* constructor followed by
|
* constructor followed by
|
||||||
* {@code setCipherSuites(cipherSuites);}.
|
* {@code setCipherSuites(cipherSuites);}. Note that the
|
||||||
|
* standard list of cipher suite names may be found in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list.
|
||||||
*
|
*
|
||||||
* @param cipherSuites the array of ciphersuites (or null)
|
* @param cipherSuites the array of ciphersuites (or null)
|
||||||
*/
|
*/
|
||||||
|
@ -123,6 +128,12 @@ public class SSLParameters {
|
||||||
* Calling this constructor is equivalent to calling the no-args
|
* Calling this constructor is equivalent to calling the no-args
|
||||||
* constructor followed by
|
* constructor followed by
|
||||||
* {@code setCipherSuites(cipherSuites); setProtocols(protocols);}.
|
* {@code setCipherSuites(cipherSuites); setProtocols(protocols);}.
|
||||||
|
* Note that the standard list of cipher suite names may be found in the
|
||||||
|
* <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list.
|
||||||
*
|
*
|
||||||
* @param cipherSuites the array of ciphersuites (or null)
|
* @param cipherSuites the array of ciphersuites (or null)
|
||||||
* @param protocols the array of protocols (or null)
|
* @param protocols the array of protocols (or null)
|
||||||
|
@ -139,6 +150,13 @@ public class SSLParameters {
|
||||||
/**
|
/**
|
||||||
* Returns a copy of the array of ciphersuites or null if none
|
* Returns a copy of the array of ciphersuites or null if none
|
||||||
* have been set.
|
* have been set.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return a copy of the array of ciphersuites or null if none
|
* @return a copy of the array of ciphersuites or null if none
|
||||||
* have been set.
|
* have been set.
|
||||||
|
@ -150,7 +168,13 @@ public class SSLParameters {
|
||||||
/**
|
/**
|
||||||
* Sets the array of ciphersuites.
|
* Sets the array of ciphersuites.
|
||||||
*
|
*
|
||||||
* @param cipherSuites the array of ciphersuites (or null)
|
* @param cipherSuites the array of ciphersuites (or null). Note that the
|
||||||
|
* standard list of cipher suite names may be found in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list or might not
|
||||||
|
* use the recommended name for a certain cipher suite.
|
||||||
*/
|
*/
|
||||||
public void setCipherSuites(String[] cipherSuites) {
|
public void setCipherSuites(String[] cipherSuites) {
|
||||||
this.cipherSuites = clone(cipherSuites);
|
this.cipherSuites = clone(cipherSuites);
|
||||||
|
|
|
@ -195,6 +195,13 @@ public abstract class SSLServerSocket extends ServerSocket {
|
||||||
* or the requisite certificates (and private keys) for the suite are
|
* or the requisite certificates (and private keys) for the suite are
|
||||||
* not available, or an anonymous suite is enabled but authentication
|
* not available, or an anonymous suite is enabled but authentication
|
||||||
* is required.
|
* is required.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suites enabled
|
* @return an array of cipher suites enabled
|
||||||
* @see #getSupportedCipherSuites()
|
* @see #getSupportedCipherSuites()
|
||||||
|
@ -215,6 +222,14 @@ public abstract class SSLServerSocket extends ServerSocket {
|
||||||
* in this ServerSocket's authentication context will not be used
|
* in this ServerSocket's authentication context will not be used
|
||||||
* in any case, even if they are enabled.
|
* in any case, even if they are enabled.
|
||||||
* <P>
|
* <P>
|
||||||
|
* Note that the standard list of cipher suite names may be found in the
|
||||||
|
* <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list or might not
|
||||||
|
* use the recommended name for a certain cipher suite.
|
||||||
|
* <P>
|
||||||
* <code>SSLSocket</code>s returned from <code>accept()</code>
|
* <code>SSLSocket</code>s returned from <code>accept()</code>
|
||||||
* inherit this setting.
|
* inherit this setting.
|
||||||
*
|
*
|
||||||
|
@ -236,6 +251,13 @@ public abstract class SSLServerSocket extends ServerSocket {
|
||||||
* be enabled by default, since this list may include cipher suites which
|
* be enabled by default, since this list may include cipher suites which
|
||||||
* do not meet quality of service requirements for those defaults. Such
|
* do not meet quality of service requirements for those defaults. Such
|
||||||
* cipher suites are useful in specialized applications.
|
* cipher suites are useful in specialized applications.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getEnabledCipherSuites()
|
* @see #getEnabledCipherSuites()
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -123,6 +123,13 @@ public abstract class SSLServerSocketFactory extends ServerSocketFactory
|
||||||
* will use one of these cipher suites. The minimum quality of service
|
* will use one of these cipher suites. The minimum quality of service
|
||||||
* for these defaults requires confidentiality protection and server
|
* for these defaults requires confidentiality protection and server
|
||||||
* authentication (that is, no anonymous cipher suites).
|
* authentication (that is, no anonymous cipher suites).
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @see #getSupportedCipherSuites()
|
* @see #getSupportedCipherSuites()
|
||||||
* @return array of the cipher suites enabled by default
|
* @return array of the cipher suites enabled by default
|
||||||
|
@ -137,6 +144,13 @@ public abstract class SSLServerSocketFactory extends ServerSocketFactory
|
||||||
* be enabled by default, since this list may include cipher suites which
|
* be enabled by default, since this list may include cipher suites which
|
||||||
* do not meet quality of service requirements for those defaults. Such
|
* do not meet quality of service requirements for those defaults. Such
|
||||||
* cipher suites are useful in specialized applications.
|
* cipher suites are useful in specialized applications.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getDefaultCipherSuites()
|
* @see #getDefaultCipherSuites()
|
||||||
|
|
|
@ -265,6 +265,13 @@ public abstract class SSLSocket extends Socket
|
||||||
* be enabled by default, since this list may include cipher suites which
|
* be enabled by default, since this list may include cipher suites which
|
||||||
* do not meet quality of service requirements for those defaults. Such
|
* do not meet quality of service requirements for those defaults. Such
|
||||||
* cipher suites might be useful in specialized applications.
|
* cipher suites might be useful in specialized applications.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getEnabledCipherSuites()
|
* @see #getEnabledCipherSuites()
|
||||||
|
@ -284,6 +291,13 @@ public abstract class SSLSocket extends Socket
|
||||||
* or the requisite certificates (and private keys) for the suite are
|
* or the requisite certificates (and private keys) for the suite are
|
||||||
* not available, or an anonymous suite is enabled but authentication
|
* not available, or an anonymous suite is enabled but authentication
|
||||||
* is required.
|
* is required.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
* @see #getSupportedCipherSuites()
|
* @see #getSupportedCipherSuites()
|
||||||
|
@ -300,6 +314,14 @@ public abstract class SSLSocket extends Socket
|
||||||
* fail. Following a successful call to this method, only suites
|
* fail. Following a successful call to this method, only suites
|
||||||
* listed in the <code>suites</code> parameter are enabled for use.
|
* listed in the <code>suites</code> parameter are enabled for use.
|
||||||
* <P>
|
* <P>
|
||||||
|
* Note that the standard list of cipher suite names may be found in the
|
||||||
|
* <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation. Providers
|
||||||
|
* may support cipher suite names not found in this list or might not
|
||||||
|
* use the recommended name for a certain cipher suite.
|
||||||
|
* <P>
|
||||||
* See {@link #getEnabledCipherSuites()} for more information
|
* See {@link #getEnabledCipherSuites()} for more information
|
||||||
* on why a specific ciphersuite may never be used on a connection.
|
* on why a specific ciphersuite may never be used on a connection.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -148,6 +148,13 @@ public abstract class SSLSocketFactory extends SocketFactory
|
||||||
* will use one of these cipher suites. The minimum quality of service
|
* will use one of these cipher suites. The minimum quality of service
|
||||||
* for these defaults requires confidentiality protection and server
|
* for these defaults requires confidentiality protection and server
|
||||||
* authentication (that is, no anonymous cipher suites).
|
* authentication (that is, no anonymous cipher suites).
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @see #getSupportedCipherSuites()
|
* @see #getSupportedCipherSuites()
|
||||||
* @return array of the cipher suites enabled by default
|
* @return array of the cipher suites enabled by default
|
||||||
|
@ -160,6 +167,13 @@ public abstract class SSLSocketFactory extends SocketFactory
|
||||||
* be enabled by default, since this list may include cipher suites which
|
* be enabled by default, since this list may include cipher suites which
|
||||||
* do not meet quality of service requirements for those defaults. Such
|
* do not meet quality of service requirements for those defaults. Such
|
||||||
* cipher suites are useful in specialized applications.
|
* cipher suites are useful in specialized applications.
|
||||||
|
* <P>
|
||||||
|
* The returned array includes cipher suites from the list of standard
|
||||||
|
* cipher suite names in the <a href=
|
||||||
|
* "{@docRoot}/../technotes/guides/security/StandardNames.html#ciphersuites">
|
||||||
|
* JSSE Cipher Suite Names</a> section of the Java Cryptography
|
||||||
|
* Architecture Standard Algorithm Name Documentation, and may also
|
||||||
|
* include other cipher suites that the provider supports.
|
||||||
*
|
*
|
||||||
* @see #getDefaultCipherSuites()
|
* @see #getDefaultCipherSuites()
|
||||||
* @return an array of cipher suite names
|
* @return an array of cipher suite names
|
||||||
|
|
|
@ -53,6 +53,7 @@ var FileSystems = Java.type("java.nio.file.FileSystems");
|
||||||
var Files = Java.type("java.nio.file.Files");
|
var Files = Java.type("java.nio.file.Files");
|
||||||
var System = Java.type("java.lang.System");
|
var System = Java.type("java.lang.System");
|
||||||
var URI = Java.type("java.net.URI");
|
var URI = Java.type("java.net.URI");
|
||||||
|
var Collections = Java.type("java.util.Collections");
|
||||||
|
|
||||||
// JavaFX classes used
|
// JavaFX classes used
|
||||||
var StackPane = Java.type("javafx.scene.layout.StackPane");
|
var StackPane = Java.type("javafx.scene.layout.StackPane");
|
||||||
|
@ -100,7 +101,7 @@ function getJrtFileSystem() {
|
||||||
print("did you miss specifying jrt-fs.jar with -cp option?");
|
print("did you miss specifying jrt-fs.jar with -cp option?");
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
return FileSystems.newFileSystem(uri, null, cls.classLoader);
|
return FileSystems.newFileSystem(uri, Collections.emptyMap(), cls.classLoader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
* but also compiled and delivered as part of the jrtfs.jar to support access
|
* but also compiled and delivered as part of the jrtfs.jar to support access
|
||||||
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
|
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
|
||||||
*/
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
// classes used
|
// classes used
|
||||||
var Files = Java.type("java.nio.file.Files");
|
var Files = Java.type("java.nio.file.Files");
|
||||||
|
|
|
@ -21,12 +21,12 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package java.lang.reflect;
|
package jdk.internal.loader;
|
||||||
|
|
||||||
import jdk.internal.loader.BootLoader;
|
|
||||||
import jdk.internal.misc.JavaLangAccess;
|
import jdk.internal.misc.JavaLangAccess;
|
||||||
import jdk.internal.misc.SharedSecrets;
|
import jdk.internal.misc.SharedSecrets;
|
||||||
|
|
||||||
|
import java.lang.reflect.UndeclaredThrowableException;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
@ -40,7 +40,7 @@ import java.util.function.Supplier;
|
||||||
* @param <CLV> the type of concrete ClassLoaderValue (this type)
|
* @param <CLV> the type of concrete ClassLoaderValue (this type)
|
||||||
* @param <V> the type of values associated with ClassLoaderValue
|
* @param <V> the type of values associated with ClassLoaderValue
|
||||||
*/
|
*/
|
||||||
abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
|
public abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV, V>, V> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sole constructor.
|
* Sole constructor.
|
||||||
|
@ -377,7 +377,7 @@ abstract class AbstractClassLoaderValue<CLV extends AbstractClassLoaderValue<CLV
|
||||||
* @param <K> the type of {@link #key()} component contained in the
|
* @param <K> the type of {@link #key()} component contained in the
|
||||||
* sub-ClassLoaderValue.
|
* sub-ClassLoaderValue.
|
||||||
*/
|
*/
|
||||||
final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
|
public final class Sub<K> extends AbstractClassLoaderValue<Sub<K>, V> {
|
||||||
|
|
||||||
private final K key;
|
private final K key;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package java.lang.reflect;
|
package jdk.internal.loader;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
|
@ -74,7 +74,7 @@ import java.util.function.BiFunction;
|
||||||
* @author Peter Levart
|
* @author Peter Levart
|
||||||
* @since 9
|
* @since 9
|
||||||
*/
|
*/
|
||||||
final class ClassLoaderValue<V>
|
public final class ClassLoaderValue<V>
|
||||||
extends AbstractClassLoaderValue<ClassLoaderValue<V>, V> {
|
extends AbstractClassLoaderValue<ClassLoaderValue<V>, V> {
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -51,8 +51,17 @@ public interface JavaLangInvokeAccess {
|
||||||
* an {@code int} representing method type. Used by
|
* an {@code int} representing method type. Used by
|
||||||
* GenerateJLIClassesPlugin to generate such a class during the jlink phase.
|
* GenerateJLIClassesPlugin to generate such a class during the jlink phase.
|
||||||
*/
|
*/
|
||||||
byte[] generateDMHClassBytes(String className, MethodType[] methodTypes,
|
byte[] generateDirectMethodHandleHolderClassBytes(String className,
|
||||||
int[] types);
|
MethodType[] methodTypes, int[] types);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@code byte[]} containing the bytecode for a class implementing
|
||||||
|
* DelegatingMethodHandles of each {@code MethodType} kind in the
|
||||||
|
* {@code methodTypes} argument. Used by GenerateJLIClassesPlugin to
|
||||||
|
* generate such a class during the jlink phase.
|
||||||
|
*/
|
||||||
|
byte[] generateDelegatingMethodHandleHolderClassBytes(String className,
|
||||||
|
MethodType[] methodTypes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a {@code byte[]} containing the bytecode for a BoundMethodHandle
|
* Returns a {@code byte[]} containing the bytecode for a BoundMethodHandle
|
||||||
|
@ -63,4 +72,10 @@ public interface JavaLangInvokeAccess {
|
||||||
*/
|
*/
|
||||||
Map.Entry<String, byte[]> generateConcreteBMHClassBytes(
|
Map.Entry<String, byte[]> generateConcreteBMHClassBytes(
|
||||||
final String types);
|
final String types);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@code byte[]} containing the bytecode for a class implementing
|
||||||
|
* the zero and identity forms of all {@code LambdaForm.BasicType}s.
|
||||||
|
*/
|
||||||
|
byte[] generateBasicFormsClassBytes(final String className);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* java.base defines and exports the core APIs of the Java SE platform.
|
* Defines the foundational APIs of the Java SE Platform.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module java.base {
|
module java.base {
|
||||||
|
|
||||||
exports java.io;
|
exports java.io;
|
||||||
|
|
|
@ -76,7 +76,7 @@ public final class ProviderList {
|
||||||
// dummy provider object to use during initialization
|
// dummy provider object to use during initialization
|
||||||
// used to avoid explicit null checks in various places
|
// used to avoid explicit null checks in various places
|
||||||
private static final Provider EMPTY_PROVIDER =
|
private static final Provider EMPTY_PROVIDER =
|
||||||
new Provider("##Empty##", 1.0d, "initialization in progress") {
|
new Provider("##Empty##", "1.0", "initialization in progress") {
|
||||||
private static final long serialVersionUID = 1151354171352296389L;
|
private static final long serialVersionUID = 1151354171352296389L;
|
||||||
// override getService() to return null slightly faster
|
// override getService() to return null slightly faster
|
||||||
public Service getService(String type, String algorithm) {
|
public Service getService(String type, String algorithm) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -28,6 +28,7 @@ package sun.security.provider;
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
|
|
||||||
import static sun.security.provider.ByteArrayAccess.*;
|
import static sun.security.provider.ByteArrayAccess.*;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The MD4 class is used to compute an MD4 message digest over a given
|
* The MD4 class is used to compute an MD4 message digest over a given
|
||||||
|
@ -65,7 +66,8 @@ public final class MD4 extends DigestBase {
|
||||||
private static final Provider md4Provider;
|
private static final Provider md4Provider;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
md4Provider = new Provider("MD4Provider", 9.0d, "MD4 MessageDigest") {
|
md4Provider = new Provider("MD4Provider", PROVIDER_VER,
|
||||||
|
"MD4 MessageDigest") {
|
||||||
private static final long serialVersionUID = -8850464997518327965L;
|
private static final long serialVersionUID = -8850464997518327965L;
|
||||||
};
|
};
|
||||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -29,6 +29,8 @@ import java.util.*;
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
|
|
||||||
import sun.security.action.PutAllAction;
|
import sun.security.action.PutAllAction;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The SUN Security Provider.
|
* The SUN Security Provider.
|
||||||
|
@ -47,7 +49,7 @@ public final class Sun extends Provider {
|
||||||
|
|
||||||
public Sun() {
|
public Sun() {
|
||||||
/* We are the SUN provider */
|
/* We are the SUN provider */
|
||||||
super("SUN", 9.0d, INFO);
|
super("SUN", PROVIDER_VER, INFO);
|
||||||
|
|
||||||
// if there is no security manager installed, put directly into
|
// if there is no security manager installed, put directly into
|
||||||
// the provider. Otherwise, create a temporary map and use a
|
// the provider. Otherwise, create a temporary map and use a
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -31,6 +31,8 @@ import java.security.*;
|
||||||
import sun.security.action.PutAllAction;
|
import sun.security.action.PutAllAction;
|
||||||
|
|
||||||
import sun.security.rsa.SunRsaSignEntries;
|
import sun.security.rsa.SunRsaSignEntries;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provider used for verification of signed JAR files *if* the Sun and
|
* Provider used for verification of signed JAR files *if* the Sun and
|
||||||
|
@ -61,7 +63,7 @@ public final class VerificationProvider extends Provider {
|
||||||
}
|
}
|
||||||
|
|
||||||
public VerificationProvider() {
|
public VerificationProvider() {
|
||||||
super("SunJarVerification", 9.0d, "Jar Verification Provider");
|
super("SunJarVerification", PROVIDER_VER, "Jar Verification Provider");
|
||||||
// register all algorithms normally registered by the Sun and SunRsaSign
|
// register all algorithms normally registered by the Sun and SunRsaSign
|
||||||
// providers, but only if they are missing
|
// providers, but only if they are missing
|
||||||
if (ACTIVE == false) {
|
if (ACTIVE == false) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -30,6 +30,7 @@ import java.util.*;
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
|
|
||||||
import sun.security.action.PutAllAction;
|
import sun.security.action.PutAllAction;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provider class for the RSA signature provider. Supports RSA keyfactory,
|
* Provider class for the RSA signature provider. Supports RSA keyfactory,
|
||||||
|
@ -43,7 +44,7 @@ public final class SunRsaSign extends Provider {
|
||||||
private static final long serialVersionUID = 866040293550393045L;
|
private static final long serialVersionUID = 866040293550393045L;
|
||||||
|
|
||||||
public SunRsaSign() {
|
public SunRsaSign() {
|
||||||
super("SunRsaSign", 9.0d, "Sun RSA signature provider");
|
super("SunRsaSign", PROVIDER_VER, "Sun RSA signature provider");
|
||||||
|
|
||||||
// if there is no security manager installed, put directly into
|
// if there is no security manager installed, put directly into
|
||||||
// the provider. Otherwise, create a temporary map and use a
|
// the provider. Otherwise, create a temporary map and use a
|
||||||
|
|
|
@ -44,6 +44,7 @@ import sun.security.jca.ProviderList;
|
||||||
import sun.security.util.ECUtil;
|
import sun.security.util.ECUtil;
|
||||||
|
|
||||||
import static sun.security.ssl.SunJSSE.cryptoProvider;
|
import static sun.security.ssl.SunJSSE.cryptoProvider;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains a few static methods for interaction with the JCA/JCE
|
* This class contains a few static methods for interaction with the JCA/JCE
|
||||||
|
@ -90,7 +91,7 @@ final class JsseJce {
|
||||||
private static final long serialVersionUID = -3284138292032213752L;
|
private static final long serialVersionUID = -3284138292032213752L;
|
||||||
|
|
||||||
SunCertificates(final Provider p) {
|
SunCertificates(final Provider p) {
|
||||||
super("SunCertificates", 9.0d, "SunJSSE internal");
|
super("SunCertificates", PROVIDER_VER, "SunJSSE internal");
|
||||||
AccessController.doPrivileged(new PrivilegedAction<Object>() {
|
AccessController.doPrivileged(new PrivilegedAction<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public Object run() {
|
public Object run() {
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
package sun.security.ssl;
|
package sun.security.ssl;
|
||||||
|
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
|
import static sun.security.util.SecurityConstants.PROVIDER_VER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The JSSE provider.
|
* The JSSE provider.
|
||||||
|
@ -104,7 +105,7 @@ public abstract class SunJSSE extends java.security.Provider {
|
||||||
|
|
||||||
// standard constructor
|
// standard constructor
|
||||||
protected SunJSSE() {
|
protected SunJSSE() {
|
||||||
super("SunJSSE", 9.0d, info);
|
super("SunJSSE", PROVIDER_VER, info);
|
||||||
subclassCheck();
|
subclassCheck();
|
||||||
if (Boolean.TRUE.equals(fips)) {
|
if (Boolean.TRUE.equals(fips)) {
|
||||||
throw new ProviderException
|
throw new ProviderException
|
||||||
|
@ -132,7 +133,7 @@ public abstract class SunJSSE extends java.security.Provider {
|
||||||
|
|
||||||
private SunJSSE(java.security.Provider cryptoProvider,
|
private SunJSSE(java.security.Provider cryptoProvider,
|
||||||
String providerName) {
|
String providerName) {
|
||||||
super("SunJSSE", 9.0d, fipsInfo + providerName + ")");
|
super("SunJSSE", PROVIDER_VER, fipsInfo + providerName + ")");
|
||||||
subclassCheck();
|
subclassCheck();
|
||||||
if (cryptoProvider == null) {
|
if (cryptoProvider == null) {
|
||||||
// Calling Security.getProvider() will cause other providers to be
|
// Calling Security.getProvider() will cause other providers to be
|
||||||
|
|
|
@ -3631,8 +3631,8 @@ public final class Main {
|
||||||
if (time != null) {
|
if (time != null) {
|
||||||
if (time.matches("\\d\\d:\\d\\d:\\d\\d")) {
|
if (time.matches("\\d\\d:\\d\\d:\\d\\d")) {
|
||||||
c.set(Calendar.HOUR_OF_DAY, Integer.valueOf(time.substring(0, 2)));
|
c.set(Calendar.HOUR_OF_DAY, Integer.valueOf(time.substring(0, 2)));
|
||||||
c.set(Calendar.MINUTE, Integer.valueOf(time.substring(0, 2)));
|
c.set(Calendar.MINUTE, Integer.valueOf(time.substring(3, 5)));
|
||||||
c.set(Calendar.SECOND, Integer.valueOf(time.substring(0, 2)));
|
c.set(Calendar.SECOND, Integer.valueOf(time.substring(6, 8)));
|
||||||
c.set(Calendar.MILLISECOND, 0);
|
c.set(Calendar.MILLISECOND, 0);
|
||||||
} else {
|
} else {
|
||||||
throw ioe;
|
throw ioe;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -33,6 +33,7 @@ import java.security.Permission;
|
||||||
import java.security.BasicPermission;
|
import java.security.BasicPermission;
|
||||||
import java.security.SecurityPermission;
|
import java.security.SecurityPermission;
|
||||||
import java.security.AllPermission;
|
import java.security.AllPermission;
|
||||||
|
import sun.security.action.GetPropertyAction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permission constants and string constants used to create permissions
|
* Permission constants and string constants used to create permissions
|
||||||
|
@ -145,4 +146,7 @@ public final class SecurityConstants {
|
||||||
// java.lang.SecurityManager
|
// java.lang.SecurityManager
|
||||||
public static final SocketPermission LOCAL_LISTEN_PERMISSION =
|
public static final SocketPermission LOCAL_LISTEN_PERMISSION =
|
||||||
new SocketPermission("localhost:0", SOCKET_LISTEN_ACTION);
|
new SocketPermission("localhost:0", SOCKET_LISTEN_ACTION);
|
||||||
|
|
||||||
|
public static final String PROVIDER_VER =
|
||||||
|
GetPropertyAction.privilegedGetProperty("java.specification.version");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -143,8 +143,8 @@ public abstract class LocaleProviderAdapter {
|
||||||
defaultLocaleProviderAdapter = Type.CLDR;
|
defaultLocaleProviderAdapter = Type.CLDR;
|
||||||
if (!typeList.isEmpty()) {
|
if (!typeList.isEmpty()) {
|
||||||
// bona fide preference exists
|
// bona fide preference exists
|
||||||
if (!typeList.contains(Type.CLDR)) {
|
if (!(typeList.contains(Type.CLDR) || (typeList.contains(Type.JRE)))) {
|
||||||
// Append FALLBACK as the last resort.
|
// Append FALLBACK as the last resort when no ResourceBundleBasedAdapter is available.
|
||||||
typeList.add(Type.FALLBACK);
|
typeList.add(Type.FALLBACK);
|
||||||
defaultLocaleProviderAdapter = Type.FALLBACK;
|
defaultLocaleProviderAdapter = Type.FALLBACK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aggregates {@code java.base}, {@code java.logging}, and {@code java.scripting}.
|
||||||
|
*/
|
||||||
module java.compact1 {
|
module java.compact1 {
|
||||||
requires public java.logging;
|
requires public java.logging;
|
||||||
requires public java.scripting;
|
requires public java.scripting;
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supplements {@code java.compact1} with JDBC, JAXP, and RMI.
|
||||||
|
*/
|
||||||
module java.compact2 {
|
module java.compact2 {
|
||||||
requires public java.compact1;
|
requires public java.compact1;
|
||||||
requires public java.rmi;
|
requires public java.rmi;
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supplements {@code java.compact2} with JDBC RowSet, JMX, JNDI, Compiler,
|
||||||
|
* Instrumentation, Preferences, Security, and XML cryptography APIs.
|
||||||
|
*/
|
||||||
module java.compact3 {
|
module java.compact3 {
|
||||||
requires public java.compact2;
|
requires public java.compact2;
|
||||||
requires public java.compiler;
|
requires public java.compiler;
|
||||||
|
|
|
@ -24,10 +24,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides interfaces and classes for transferring data between and
|
* Defines an API for transferring data between and within applications.
|
||||||
* within applications.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module java.datatransfer {
|
module java.datatransfer {
|
||||||
exports java.awt.datatransfer;
|
exports java.awt.datatransfer;
|
||||||
exports sun.datatransfer to java.desktop;
|
exports sun.datatransfer to java.desktop;
|
||||||
|
|
|
@ -124,7 +124,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener,
|
||||||
if (!progressBar.isIndeterminate()) return;
|
if (!progressBar.isIndeterminate()) return;
|
||||||
stopAnimationTimer();
|
stopAnimationTimer();
|
||||||
// start the animation thread
|
// start the animation thread
|
||||||
startAnimationTimer();
|
if (progressBar.isDisplayable()) {
|
||||||
|
startAnimationTimer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("JProgressBar.style".equals(prop)) {
|
if ("JProgressBar.style".equals(prop)) {
|
||||||
|
@ -141,7 +143,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener,
|
||||||
|
|
||||||
public void ancestorAdded(final AncestorEvent e) {
|
public void ancestorAdded(final AncestorEvent e) {
|
||||||
if (!progressBar.isIndeterminate()) return;
|
if (!progressBar.isIndeterminate()) return;
|
||||||
startAnimationTimer();
|
if (progressBar.isDisplayable()) {
|
||||||
|
startAnimationTimer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ancestorMoved(final AncestorEvent e) { }
|
public void ancestorMoved(final AncestorEvent e) { }
|
||||||
|
|
|
@ -807,6 +807,18 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||||
|
|
||||||
- (void)sendEvent:(NSEvent *)event {
|
- (void)sendEvent:(NSEvent *)event {
|
||||||
if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) {
|
if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) {
|
||||||
|
// Move parent windows to front and make sure that a child window is displayed
|
||||||
|
// in front of its nearest parent.
|
||||||
|
if (self.ownerWindow != nil) {
|
||||||
|
JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
|
||||||
|
jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
|
||||||
|
if (platformWindow != NULL) {
|
||||||
|
static JNF_MEMBER_CACHE(jm_orderAboveSiblings, jc_CPlatformWindow, "orderAboveSiblings", "()V");
|
||||||
|
JNFCallVoidMethod(env,platformWindow, jm_orderAboveSiblings);
|
||||||
|
(*env)->DeleteLocalRef(env, platformWindow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[self orderChildWindows:YES];
|
||||||
|
|
||||||
NSPoint p = [NSEvent mouseLocation];
|
NSPoint p = [NSEvent mouseLocation];
|
||||||
NSRect frame = [self.nsWindow frame];
|
NSRect frame = [self.nsWindow frame];
|
||||||
|
@ -1159,6 +1171,16 @@ JNF_COCOA_ENTER(env);
|
||||||
NSWindow *nsWindow = OBJC(windowPtr);
|
NSWindow *nsWindow = OBJC(windowPtr);
|
||||||
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
|
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
|
||||||
[nsWindow orderBack:nil];
|
[nsWindow orderBack:nil];
|
||||||
|
// Order parent windows
|
||||||
|
AWTWindow *awtWindow = (AWTWindow*)[nsWindow delegate];
|
||||||
|
while (awtWindow.ownerWindow != nil) {
|
||||||
|
awtWindow = awtWindow.ownerWindow;
|
||||||
|
if ([AWTWindow isJavaPlatformWindowVisible:awtWindow.nsWindow]) {
|
||||||
|
[awtWindow.nsWindow orderBack:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Order child windows
|
||||||
|
[(AWTWindow*)[nsWindow delegate] orderChildWindows:NO];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
|
|
|
@ -47,7 +47,7 @@ public abstract class TIFFColorConverter {
|
||||||
* @throws NullPointerException if {@code result} is
|
* @throws NullPointerException if {@code result} is
|
||||||
* {@code null}.
|
* {@code null}.
|
||||||
* @throws ArrayIndexOutOfBoundsException if
|
* @throws ArrayIndexOutOfBoundsException if
|
||||||
* {@code result.length < 3}.
|
* {@code result.length < 3}.
|
||||||
*/
|
*/
|
||||||
public abstract void fromRGB(float r, float g, float b, float[] result);
|
public abstract void fromRGB(float r, float g, float b, float[] result);
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public abstract class TIFFColorConverter {
|
||||||
* @throws NullPointerException if {@code rgb} is
|
* @throws NullPointerException if {@code rgb} is
|
||||||
* {@code null}.
|
* {@code null}.
|
||||||
* @throws ArrayIndexOutOfBoundsException if
|
* @throws ArrayIndexOutOfBoundsException if
|
||||||
* {@code rgb.length < 3}.
|
* {@code rgb.length < 3}.
|
||||||
*/
|
*/
|
||||||
public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
|
public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,7 +353,7 @@ public abstract class TIFFDecompressor {
|
||||||
* <p> The pixels in the source region to be copied are
|
* <p> The pixels in the source region to be copied are
|
||||||
* those with X coordinates of the form {@code activeSrcMinX +
|
* those with X coordinates of the form {@code activeSrcMinX +
|
||||||
* k*subsampleX}, where {@code k} is an integer such
|
* k*subsampleX}, where {@code k} is an integer such
|
||||||
* that {@code 0 ≤ k < dstWidth}.
|
* that {@code 0 <= k < dstWidth}.
|
||||||
*/
|
*/
|
||||||
protected int activeSrcMinX;
|
protected int activeSrcMinX;
|
||||||
|
|
||||||
|
@ -365,7 +365,7 @@ public abstract class TIFFDecompressor {
|
||||||
* <p> The pixels in the source region to be copied are
|
* <p> The pixels in the source region to be copied are
|
||||||
* those with Y coordinates of the form {@code activeSrcMinY +
|
* those with Y coordinates of the form {@code activeSrcMinY +
|
||||||
* k*subsampleY}, where {@code k} is an integer such
|
* k*subsampleY}, where {@code k} is an integer such
|
||||||
* that {@code 0 ≤ k < dstHeight}.
|
* that {@code 0 <= k < dstHeight}.
|
||||||
*/
|
*/
|
||||||
protected int activeSrcMinY;
|
protected int activeSrcMinY;
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,45 @@ public class TIFFIFD extends TIFFDirectory {
|
||||||
private long stripOrTileOffsetsPosition = -1;
|
private long stripOrTileOffsetsPosition = -1;
|
||||||
private long lastPosition = -1;
|
private long lastPosition = -1;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
|
||||||
|
*/
|
||||||
|
public static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
|
||||||
|
if(dir instanceof TIFFIFD) {
|
||||||
|
return (TIFFIFD)dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
|
||||||
|
dir.getParentTag());
|
||||||
|
TIFFField[] fields = dir.getTIFFFields();
|
||||||
|
int numFields = fields.length;
|
||||||
|
for(int i = 0; i < numFields; i++) {
|
||||||
|
TIFFField f = fields[i];
|
||||||
|
TIFFTag tag = f.getTag();
|
||||||
|
if(tag.isIFDPointer()) {
|
||||||
|
TIFFDirectory subDir = null;
|
||||||
|
if (f.hasDirectory()) {
|
||||||
|
subDir = f.getDirectory();
|
||||||
|
} else if (f.getData() instanceof TIFFDirectory) {
|
||||||
|
subDir = (TIFFDirectory)f.getData();
|
||||||
|
}
|
||||||
|
if (subDir != null) {
|
||||||
|
TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
|
||||||
|
f = new TIFFField(tag, f.getType(), (long)f.getCount(),
|
||||||
|
subIFD);
|
||||||
|
} else {
|
||||||
|
f = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (f != null) {
|
||||||
|
ifd.addTIFFField(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ifd;
|
||||||
|
}
|
||||||
|
|
||||||
public static TIFFTag getTag(int tagNumber, List<TIFFTagSet> tagSets) {
|
public static TIFFTag getTag(int tagNumber, List<TIFFTagSet> tagSets) {
|
||||||
Iterator<TIFFTagSet> iter = tagSets.iterator();
|
Iterator<TIFFTagSet> iter = tagSets.iterator();
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
|
@ -704,7 +743,7 @@ public class TIFFIFD extends TIFFDirectory {
|
||||||
pos = nextSpace;
|
pos = nextSpace;
|
||||||
|
|
||||||
if (tag.isIFDPointer() && f.hasDirectory()) {
|
if (tag.isIFDPointer() && f.hasDirectory()) {
|
||||||
TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
|
TIFFIFD subIFD = getDirectoryAsIFD(f.getDirectory());
|
||||||
subIFD.writeToStream(stream);
|
subIFD.writeToStream(stream);
|
||||||
nextSpace = subIFD.lastPosition;
|
nextSpace = subIFD.lastPosition;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -132,7 +132,7 @@ public class TIFFImageMetadata extends IIOMetadata {
|
||||||
if (tag == null) {
|
if (tag == null) {
|
||||||
node = f.getAsNativeNode();
|
node = f.getAsNativeNode();
|
||||||
} else if (tag.isIFDPointer() && f.hasDirectory()) {
|
} else if (tag.isIFDPointer() && f.hasDirectory()) {
|
||||||
TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
|
TIFFIFD subIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
|
||||||
|
|
||||||
// Recurse
|
// Recurse
|
||||||
node = getIFDAsTree(subIFD, tag.getName(), tag.getNumber());
|
node = getIFDAsTree(subIFD, tag.getName(), tag.getNumber());
|
||||||
|
@ -1465,8 +1465,14 @@ public class TIFFImageMetadata extends IIOMetadata {
|
||||||
String className = st.nextToken();
|
String className = st.nextToken();
|
||||||
|
|
||||||
Object o = null;
|
Object o = null;
|
||||||
|
Class<?> setClass = null;
|
||||||
try {
|
try {
|
||||||
Class<?> setClass = Class.forName(className);
|
ClassLoader cl = TIFFImageMetadata.class.getClassLoader();
|
||||||
|
setClass = Class.forName(className, false, cl);
|
||||||
|
if (!TIFFTagSet.class.isAssignableFrom(setClass)) {
|
||||||
|
fatal(node, "TagSets in IFD must be subset of"
|
||||||
|
+ " TIFFTagSet class");
|
||||||
|
}
|
||||||
Method getInstanceMethod =
|
Method getInstanceMethod =
|
||||||
setClass.getMethod("getInstance", (Class[])null);
|
setClass.getMethod("getInstance", (Class[])null);
|
||||||
o = getInstanceMethod.invoke(null, (Object[])null);
|
o = getInstanceMethod.invoke(null, (Object[])null);
|
||||||
|
|
|
@ -35,6 +35,7 @@ import java.awt.image.ComponentColorModel;
|
||||||
import java.awt.image.Raster;
|
import java.awt.image.Raster;
|
||||||
import java.awt.image.RenderedImage;
|
import java.awt.image.RenderedImage;
|
||||||
import java.awt.image.SampleModel;
|
import java.awt.image.SampleModel;
|
||||||
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -189,8 +190,8 @@ public class TIFFImageReader extends ImageReader {
|
||||||
|
|
||||||
// Seek to start of first IFD
|
// Seek to start of first IFD
|
||||||
long offset = stream.readUnsignedInt();
|
long offset = stream.readUnsignedInt();
|
||||||
imageStartPosition.add(Long.valueOf(offset));
|
|
||||||
stream.seek(offset);
|
stream.seek(offset);
|
||||||
|
imageStartPosition.add(Long.valueOf(offset));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new IIOException("I/O error reading header!", e);
|
throw new IIOException("I/O error reading header!", e);
|
||||||
}
|
}
|
||||||
|
@ -201,10 +202,10 @@ public class TIFFImageReader extends ImageReader {
|
||||||
private int locateImage(int imageIndex) throws IIOException {
|
private int locateImage(int imageIndex) throws IIOException {
|
||||||
readHeader();
|
readHeader();
|
||||||
|
|
||||||
try {
|
// Find closest known index
|
||||||
// Find closest known index
|
int index = Math.min(imageIndex, imageStartPosition.size() - 1);
|
||||||
int index = Math.min(imageIndex, imageStartPosition.size() - 1);
|
|
||||||
|
|
||||||
|
try {
|
||||||
// Seek to that position
|
// Seek to that position
|
||||||
Long l = imageStartPosition.get(index);
|
Long l = imageStartPosition.get(index);
|
||||||
stream.seek(l.longValue());
|
stream.seek(l.longValue());
|
||||||
|
@ -212,6 +213,11 @@ public class TIFFImageReader extends ImageReader {
|
||||||
// Skip IFDs until at desired index or last image found
|
// Skip IFDs until at desired index or last image found
|
||||||
while (index < imageIndex) {
|
while (index < imageIndex) {
|
||||||
int count = stream.readUnsignedShort();
|
int count = stream.readUnsignedShort();
|
||||||
|
// If zero-entry IFD, decrement the index and exit the loop
|
||||||
|
if (count == 0) {
|
||||||
|
imageIndex = index > 0 ? index - 1 : 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
stream.skipBytes(12 * count);
|
stream.skipBytes(12 * count);
|
||||||
|
|
||||||
long offset = stream.readUnsignedInt();
|
long offset = stream.readUnsignedInt();
|
||||||
|
@ -219,12 +225,17 @@ public class TIFFImageReader extends ImageReader {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
imageStartPosition.add(Long.valueOf(offset));
|
|
||||||
stream.seek(offset);
|
stream.seek(offset);
|
||||||
|
imageStartPosition.add(Long.valueOf(offset));
|
||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (EOFException eofe) {
|
||||||
throw new IIOException("Couldn't seek!", e);
|
forwardWarningMessage("Ignored " + eofe);
|
||||||
|
|
||||||
|
// Ran off the end of stream: decrement index
|
||||||
|
imageIndex = index > 0 ? index - 1 : 0;
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
throw new IIOException("Couldn't seek!", ioe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currIndex != imageIndex) {
|
if (currIndex != imageIndex) {
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue