# HG changeset patch # User amurillo # Date 1442328464 25200 # Node ID 351e2f1e9f17571f4e41e3de4059f0ee01afe4a7 # Parent 8a1504b43ad8b8ac574df0cdd27886d2a8c95a29# Parent 6521875cb63e1d0121b30af56ebbc36db078c4c6 Merge diff -r 8a1504b43ad8 -r 351e2f1e9f17 .hgtags --- a/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ c8753d0be1778944dc512ec86a459941ea1ad2c3 jdk9-b78 3966bd3b8167419aa05c6718a4af1cf54b1e3c58 jdk9-b79 3c9f5bd909ae7187f24622ee4b69f8a5756a9271 jdk9-b80 +2050b3a0aadcb0e024bf798197421d58e54ec8bf jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 .hgtags-top-repo --- a/.hgtags-top-repo Thu Sep 10 14:55:18 2015 -0700 +++ b/.hgtags-top-repo Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ 8c40d4143ee13bdf8170c68cc384c36ab1e9fadb jdk9-b78 ba08a9f79b9849716bae1f39f71333d47f604012 jdk9-b79 f7c5ae2933c0b8510a420d1713a955e4ffc7ad0b jdk9-b80 +b8afcf91331d78626a583ec1b63164468d6f4181 jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Thu Sep 10 14:55:18 2015 -0700 +++ b/common/autoconf/generated-configure.sh Tue Sep 15 07:47:44 2015 -0700 @@ -4359,7 +4359,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1439979411 +DATE_WHEN_GENERATED=1441958217 ############################################################################### # @@ -38286,6 +38286,48 @@ fi fi + if test "x$OPENJDK_BUILD_OS" = xsolaris; then + # objcopy prior to 2.21.1 on solaris is broken and is not usable. + # Rewrite objcopy version output to VALID_VERSION or BAD_VERSION. + # - version number is last blank separate word on first line + # - version number formats that have been seen: + # - . + # - .. + OBJCOPY_VERSION=`$OBJCOPY --version | $HEAD -n 1` + # The outer [ ] is to prevent m4 from eating the [] in the sed expression. + OBJCOPY_VERSION_CHECK=`$ECHO $OBJCOPY_VERSION | $SED -n \ + -e 's/.* //' \ + -e '/^[01]\./b bad' \ + -e '/^2\./{' \ + -e ' s/^2\.//' \ + -e ' /^[0-9]$/b bad' \ + -e ' /^[0-9]\./b bad' \ + -e ' /^1[0-9]$/b bad' \ + -e ' /^1[0-9]\./b bad' \ + -e ' /^20\./b bad' \ + -e ' /^21\.0$/b bad' \ + -e ' /^21\.0\./b bad' \ + -e '}' \ + -e ':good' \ + -e 's/.*/VALID_VERSION/p' \ + -e 'q' \ + -e ':bad' \ + -e 's/.*/BAD_VERSION/p' \ + -e 'q'` + if test "x$OBJCOPY_VERSION_CHECK" = xBAD_VERSION; then + OBJCOPY= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated." >&5 +$as_echo "$as_me: WARNING: Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: objcopy reports version $OBJCOPY_VERSION" >&5 +$as_echo "$as_me: objcopy reports version $OBJCOPY_VERSION" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version" >&5 +$as_echo "$as_me: Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version" >&5 +$as_echo "$as_me: Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Note: Solaris 11 Update 1 contains the correct version" >&5 +$as_echo "$as_me: Note: Solaris 11 Update 1 contains the correct version" >&6;} + fi + fi fi fi diff -r 8a1504b43ad8 -r 351e2f1e9f17 common/autoconf/toolchain.m4 --- a/common/autoconf/toolchain.m4 Thu Sep 10 14:55:18 2015 -0700 +++ b/common/autoconf/toolchain.m4 Tue Sep 15 07:47:44 2015 -0700 @@ -586,6 +586,43 @@ # Only call fixup if objcopy was found. if test -n "$OBJCOPY"; then BASIC_FIXUP_EXECUTABLE(OBJCOPY) + if test "x$OPENJDK_BUILD_OS" = xsolaris; then + # objcopy prior to 2.21.1 on solaris is broken and is not usable. + # Rewrite objcopy version output to VALID_VERSION or BAD_VERSION. + # - version number is last blank separate word on first line + # - version number formats that have been seen: + # - . + # - .. + OBJCOPY_VERSION=`$OBJCOPY --version | $HEAD -n 1` + # The outer [ ] is to prevent m4 from eating the [] in the sed expression. + [ OBJCOPY_VERSION_CHECK=`$ECHO $OBJCOPY_VERSION | $SED -n \ + -e 's/.* //' \ + -e '/^[01]\./b bad' \ + -e '/^2\./{' \ + -e ' s/^2\.//' \ + -e ' /^[0-9]$/b bad' \ + -e ' /^[0-9]\./b bad' \ + -e ' /^1[0-9]$/b bad' \ + -e ' /^1[0-9]\./b bad' \ + -e ' /^20\./b bad' \ + -e ' /^21\.0$/b bad' \ + -e ' /^21\.0\./b bad' \ + -e '}' \ + -e ':good' \ + -e 's/.*/VALID_VERSION/p' \ + -e 'q' \ + -e ':bad' \ + -e 's/.*/BAD_VERSION/p' \ + -e 'q'` ] + if test "x$OBJCOPY_VERSION_CHECK" = xBAD_VERSION; then + OBJCOPY= + AC_MSG_WARN([Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated.]) + AC_MSG_NOTICE([objcopy reports version $OBJCOPY_VERSION]) + AC_MSG_NOTICE([Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version]) + AC_MSG_NOTICE([Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version]) + AC_MSG_NOTICE([Note: Solaris 11 Update 1 contains the correct version]) + fi + fi fi fi diff -r 8a1504b43ad8 -r 351e2f1e9f17 corba/.hgtags --- a/corba/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/corba/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ 182bb7accc5253bcfefd8edc1d4997ec8f9f8694 jdk9-b78 4ab250b8fac66ef8cd15ee78c40f0c651c96e16a jdk9-b79 821a0373ef2d1642a9824facb938b901ad010413 jdk9-b80 +45c35b7f5b40d5af0085e4a7b3a4d6e3e0347c35 jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/.hgtags --- a/hotspot/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -483,3 +483,4 @@ 20dc06b04fe5ec373879414d60ef82ac70faef98 jdk9-b78 e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79 8e8377739c06b99b9011c003c77e0bef84c91e09 jdk9-b80 +4142c190cd5ca4fb70ec367b4f97ef936272d8ef jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/code/codeCache.cpp --- a/hotspot/src/share/vm/code/codeCache.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/code/codeCache.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -745,13 +745,12 @@ void CodeCache::gc_epilogue() { assert_locked_or_safepoint(CodeCache_lock); - NMethodIterator iter; - while(iter.next()) { - nmethod* nm = iter.method(); - if (!nm->is_zombie()) { - if (needs_cache_clean()) { - // Clean ICs of unloaded nmethods as well because they may reference other - // unloaded nmethods that may be flushed earlier in the sweeper cycle. + NOT_DEBUG(if (needs_cache_clean())) { + NMethodIterator iter; + while(iter.next_alive()) { + nmethod* nm = iter.method(); + assert(!nm->is_unloaded(), "Tautology"); + DEBUG_ONLY(if (needs_cache_clean())) { nm->cleanup_inline_caches(); } DEBUG_ONLY(nm->verify()); diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/code/compiledIC.cpp --- a/hotspot/src/share/vm/code/compiledIC.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/code/compiledIC.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -287,6 +287,7 @@ assert( is_c1_method || !is_monomorphic || is_optimized() || + !caller->is_alive() || (cached_metadata() != NULL && cached_metadata()->is_klass()), "sanity check"); #endif // ASSERT return is_monomorphic; @@ -321,7 +322,7 @@ } -void CompiledIC::set_to_clean() { +void CompiledIC::set_to_clean(bool in_use) { assert(SafepointSynchronize::is_at_safepoint() || CompiledIC_lock->is_locked() , "MT-unsafe call"); if (TraceInlineCacheClearing || TraceICs) { tty->print_cr("IC@" INTPTR_FORMAT ": set to clean", p2i(instruction_address())); @@ -337,7 +338,7 @@ // A zombie transition will always be safe, since the metadata has already been set to NULL, so // we only need to patch the destination - bool safe_transition = is_optimized() || SafepointSynchronize::is_at_safepoint(); + bool safe_transition = !in_use || is_optimized() || SafepointSynchronize::is_at_safepoint(); if (safe_transition) { // Kill any leftover stub we might have too diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/code/compiledIC.hpp --- a/hotspot/src/share/vm/code/compiledIC.hpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/code/compiledIC.hpp Tue Sep 15 07:47:44 2015 -0700 @@ -214,7 +214,7 @@ // // They all takes a TRAP argument, since they can cause a GC if the inline-cache buffer is full. // - void set_to_clean(); + void set_to_clean(bool in_use = true); void set_to_monomorphic(CompiledICInfo& info); void clear_ic_stub(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/code/nmethod.cpp --- a/hotspot/src/share/vm/code/nmethod.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/code/nmethod.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -1050,7 +1050,7 @@ if( cb != NULL && cb->is_nmethod() ) { nmethod* nm = (nmethod*)cb; // Clean inline caches pointing to zombie, non-entrant and unloaded methods - if (!nm->is_in_use() || (nm->method()->code() != nm)) ic->set_to_clean(); + if (!nm->is_in_use() || (nm->method()->code() != nm)) ic->set_to_clean(is_alive()); } break; } @@ -1150,7 +1150,7 @@ // Tell if a non-entrant method can be converted to a zombie (i.e., // there are no activations on the stack, not in use by the VM, // and not in use by the ServiceThread) -bool nmethod::can_not_entrant_be_converted() { +bool nmethod::can_convert_to_zombie() { assert(is_not_entrant(), "must be a non-entrant method"); // Since the nmethod sweeper only does partial sweep the sweeper's traversal diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/code/nmethod.hpp --- a/hotspot/src/share/vm/code/nmethod.hpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/code/nmethod.hpp Tue Sep 15 07:47:44 2015 -0700 @@ -577,7 +577,7 @@ // See comment at definition of _last_seen_on_stack void mark_as_seen_on_stack(); - bool can_not_entrant_be_converted(); + bool can_convert_to_zombie(); // Evolution support. We make old (discarded) compiled methods point to new Method*s. void set_method(Method* method) { _method = method; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/opto/loopopts.cpp --- a/hotspot/src/share/vm/opto/loopopts.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/opto/loopopts.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -673,8 +673,7 @@ Node* PhaseIdealLoop::try_move_store_before_loop(Node* n, Node *n_ctrl) { // Store has to be first in the loop body IdealLoopTree *n_loop = get_loop(n_ctrl); - if (n->is_Store() && n_loop != _ltree_root && n_loop->is_loop()) { - assert(n->in(0), "store should have control set"); + if (n->is_Store() && n_loop != _ltree_root && n_loop->is_loop() && n->in(0) != NULL) { Node* address = n->in(MemNode::Address); Node* value = n->in(MemNode::ValueIn); Node* mem = n->in(MemNode::Memory); @@ -748,8 +747,7 @@ // Try moving a store out of a loop, right after the loop void PhaseIdealLoop::try_move_store_after_loop(Node* n) { - if (n->is_Store()) { - assert(n->in(0), "store should have control set"); + if (n->is_Store() && n->in(0) != NULL) { Node *n_ctrl = get_ctrl(n); IdealLoopTree *n_loop = get_loop(n_ctrl); // Store must be in a loop diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/opto/stringopts.cpp --- a/hotspot/src/share/vm/opto/stringopts.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/opto/stringopts.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -1576,51 +1576,58 @@ Node* result; if (!kit.stopped()) { + Node* char_array = NULL; + if (sc->num_arguments() == 1 && + (sc->mode(0) == StringConcat::StringMode || + sc->mode(0) == StringConcat::StringNullCheckMode)) { + // Handle the case when there is only a single String argument. + // In this case, we can just pull the value from the String itself. + char_array = kit.load_String_value(kit.control(), sc->argument(0)); + } else { + // length now contains the number of characters needed for the + // char[] so create a new AllocateArray for the char[] + { + PreserveReexecuteState preexecs(&kit); + // The original jvms is for an allocation of either a String or + // StringBuffer so no stack adjustment is necessary for proper + // reexecution. If we deoptimize in the slow path the bytecode + // will be reexecuted and the char[] allocation will be thrown away. + kit.jvms()->set_should_reexecute(true); + char_array = kit.new_array(__ makecon(TypeKlassPtr::make(ciTypeArrayKlass::make(T_CHAR))), + length, 1); + } - // length now contains the number of characters needed for the - // char[] so create a new AllocateArray for the char[] - Node* char_array = NULL; - { - PreserveReexecuteState preexecs(&kit); - // The original jvms is for an allocation of either a String or - // StringBuffer so no stack adjustment is necessary for proper - // reexecution. If we deoptimize in the slow path the bytecode - // will be reexecuted and the char[] allocation will be thrown away. - kit.jvms()->set_should_reexecute(true); - char_array = kit.new_array(__ makecon(TypeKlassPtr::make(ciTypeArrayKlass::make(T_CHAR))), - length, 1); - } - - // Mark the allocation so that zeroing is skipped since the code - // below will overwrite the entire array - AllocateArrayNode* char_alloc = AllocateArrayNode::Ideal_array_allocation(char_array, _gvn); - char_alloc->maybe_set_complete(_gvn); + // Mark the allocation so that zeroing is skipped since the code + // below will overwrite the entire array + AllocateArrayNode* char_alloc = AllocateArrayNode::Ideal_array_allocation(char_array, _gvn); + char_alloc->maybe_set_complete(_gvn); - // Now copy the string representations into the final char[] - Node* start = __ intcon(0); - for (int argi = 0; argi < sc->num_arguments(); argi++) { - Node* arg = sc->argument(argi); - switch (sc->mode(argi)) { - case StringConcat::IntMode: { - Node* end = __ AddI(start, string_sizes->in(argi)); - // getChars words backwards so pass the ending point as well as the start - int_getChars(kit, arg, char_array, start, end); - start = end; - break; + // Now copy the string representations into the final char[] + Node* start = __ intcon(0); + for (int argi = 0; argi < sc->num_arguments(); argi++) { + Node* arg = sc->argument(argi); + switch (sc->mode(argi)) { + case StringConcat::IntMode: { + Node* end = __ AddI(start, string_sizes->in(argi)); + // getChars words backwards so pass the ending point as well as the start + int_getChars(kit, arg, char_array, start, end); + start = end; + break; + } + case StringConcat::StringNullCheckMode: + case StringConcat::StringMode: { + start = copy_string(kit, arg, char_array, start); + break; + } + case StringConcat::CharMode: { + __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), + arg, T_CHAR, char_adr_idx, MemNode::unordered); + start = __ AddI(start, __ intcon(1)); + break; + } + default: + ShouldNotReachHere(); } - case StringConcat::StringNullCheckMode: - case StringConcat::StringMode: { - start = copy_string(kit, arg, char_array, start); - break; - } - case StringConcat::CharMode: { - __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), - arg, T_CHAR, char_adr_idx, MemNode::unordered); - start = __ AddI(start, __ intcon(1)); - break; - } - default: - ShouldNotReachHere(); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/src/share/vm/runtime/sweeper.cpp --- a/hotspot/src/share/vm/runtime/sweeper.cpp Thu Sep 10 14:55:18 2015 -0700 +++ b/hotspot/src/share/vm/runtime/sweeper.cpp Tue Sep 15 07:47:44 2015 -0700 @@ -611,7 +611,7 @@ } else if (nm->is_not_entrant()) { // If there are no current activations of this method on the // stack we can safely convert it to a zombie method - if (nm->can_not_entrant_be_converted()) { + if (nm->can_convert_to_zombie()) { // Clear ICStubs to prevent back patching stubs of zombie or unloaded // nmethods during the next safepoint (see ICStub::finalize). { @@ -645,6 +645,12 @@ assert(result == None, "sanity"); result = Flushed; } else { + { + // Clean ICs of unloaded nmethods as well because they may reference other + // unloaded nmethods that may be flushed earlier in the sweeper cycle. + MutexLocker cl(CompiledIC_lock); + nm->cleanup_inline_caches(); + } // Code cache state change is tracked in make_zombie() nm->make_zombie(); SWEEP(nm); diff -r 8a1504b43ad8 -r 351e2f1e9f17 hotspot/test/compiler/TestMoveStoresOutOfLoopsStoreNoCtrl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/TestMoveStoresOutOfLoopsStoreNoCtrl.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8134288 + * @summary Store nodes may not have a control if used to update profiling + * @run main/othervm -XX:-ProfileInterpreter -XX:-TieredCompilation -XX:-BackgroundCompilation TestMoveStoresOutOfLoopsStoreNoCtrl + * + */ + +public class TestMoveStoresOutOfLoopsStoreNoCtrl { + + static void test(boolean flag) { + for (int i = 0; i < 20000; i++) { + if (flag) { + int j = 0; + do { + j++; + } while(j < 10); + } + } + } + + static public void main(String[] args) { + test(false); + } + +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jaxp/.hgtags --- a/jaxp/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/jaxp/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ 5b1899c9822db4a80a29cac82af492afea9f8f41 jdk9-b78 cf809edc840ff7546677d38b13ebd8b3cae2bbda jdk9-b79 f464f9b2fb1178f6a957e5730b4b5252c6149ed9 jdk9-b80 +6a418934997fc4b56664b88f8417e2f0fe658091 jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 jaxws/.hgtags --- a/jaxws/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/jaxws/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -326,3 +326,4 @@ ac1748bab0743137574be3451307b6a6361719eb jdk9-b78 42ae657e0e104fa7877996b8095f2e3ab1596118 jdk9-b79 e9940bf1c8ddaa6f1f5f1813846b080f0ccaf50b jdk9-b80 +139338618c77d793ab8b550f06819ddb8381316f jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/.hgtags --- a/jdk/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ 0940ce86c614458f5bdd72278b190abbf36b7b45 jdk9-b78 d99c2ffdd0f15753e69126583688f2f075a0a5e8 jdk9-b79 4947810137ae53abba3028cc366af953d90fa81a jdk9-b80 +fdc13a2d32867ca3c57b7fa2620c6b59c83168cb jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/Tools.gmk --- a/jdk/make/Tools.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/Tools.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -38,7 +38,9 @@ $(eval $(call SetupJavaCompilation,BUILD_TOOLS_JDK, \ SETUP := GENERATE_OLDBYTECODE, \ - ADD_JAVAC_FLAGS := "-Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes$(PATH_SEP)$(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes", \ + ADD_JAVAC_FLAGS := -Xbootclasspath/p:$(call PathList, \ + $(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes \ + $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes), \ SRC := $(JDK_TOPDIR)/make/src/classes $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes, \ BIN := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes, \ COPY := boot.modules ext.modules)) @@ -126,11 +128,11 @@ build.tools.cldrconverter.CLDRConverter TOOL_GENMODULESXML = $(JAVA_SMALL) -Xbootclasspath/p:$(INTERIM_LANGTOOLS_JAR) \ - -cp "$(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes$(PATH_SEP)$(JDK_OUTPUTDIR)" \ + -cp $(call PathList, $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes $(JDK_OUTPUTDIR)) \ build.tools.module.GenJdepsModulesXml TOOL_IMAGEBUILDER = $(JAVA_SMALL) -Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes \ - -cp "$(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes$(PATH_SEP)$(JDK_OUTPUTDIR)" \ + -cp $(call PathList, $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes $(JDK_OUTPUTDIR)) \ build.tools.module.ImageBuilder ########################################################################################## @@ -157,28 +159,6 @@ ########################################################################################## -# Tools needed on solaris because OBJCOPY is broken. - -ifeq ($(OPENJDK_TARGET_OS), solaris) - $(eval $(call SetupNativeCompilation,ADD_GNU_DEBUGLINK, \ - SRC := $(JDK_TOPDIR)/make/src/native/add_gnu_debuglink, \ - TOOLCHAIN := TOOLCHAIN_BUILD, \ - LDFLAGS := -lelf, \ - OBJECT_DIR := $(BUILDTOOLS_OUTPUTDIR)/objs/add_gnu_debuglink, \ - OUTPUT_DIR := $(BUILDTOOLS_OUTPUTDIR)/bin, \ - PROGRAM := add_gnu_debuglink)) - - $(eval $(call SetupNativeCompilation,FIX_EMPTY_SEC_HDR_FLAGS, \ - SRC := $(JDK_TOPDIR)/make/src/native/fix_empty_sec_hdr_flags, \ - TOOLCHAIN := TOOLCHAIN_BUILD, \ - LDFLAGS := -lelf, \ - OBJECT_DIR := $(BUILDTOOLS_OUTPUTDIR)/objs/fix_empty_sec_hdr_flags, \ - OUTPUT_DIR := $(BUILDTOOLS_OUTPUTDIR)/bin, \ - PROGRAM := fix_empty_sec_hdr_flags)) - - BUILD_TOOLS_JDK += $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) -endif - $(BUILD_TOOLS_JDK): $(BUILD_INTERIM_JIMAGE) $(COPY_JIMAGE_SERVICE_PROVIDER) java-tools: $(BUILD_TOOLS_JDK) diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/gensrc/GensrcSwing.gmk --- a/jdk/make/gensrc/GensrcSwing.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/gensrc/GensrcSwing.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -77,9 +77,9 @@ $(ECHO) Generating beaninfo $(MKDIR) -p $(BEANINFO_OUTPUTDIR)/javax/swing $(JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) \ - -sourcepath "$(subst $(SPACE),$(PATH_SEP),\ + -sourcepath $(call PathList,\ $(wildcard $(JDK_TOPDIR)/src/*/*/classes) \ - $(SUPPORT_OUTPUTDIR)/gensrc/java.base)" \ + $(SUPPORT_OUTPUTDIR)/gensrc/java.base) \ -doclet build.tools.swingbeaninfo.GenDocletBeanInfo \ -x $(SWINGBEAN_DEBUG_FLAG) -d $(BEANINFO_OUTPUTDIR)/javax/swing \ -t $(DOCLET_DATA_DIR)/SwingBeanInfo.template \ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/launcher/LauncherCommon.gmk --- a/jdk/make/launcher/LauncherCommon.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/launcher/LauncherCommon.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -28,9 +28,6 @@ # Prepare the find cache. $(eval $(call FillCacheFind, $(JDK_TOPDIR)/src/java.base/share/native/launcher)) -# Build tools -include Tools.gmk - # When building a legacy overlay image (on solaris 64 bit), the launchers # need to be built with a different rpath and a different output dir. ifeq ($(OVERLAY_IMAGES), true) diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/lib/LibCommon.gmk --- a/jdk/make/lib/LibCommon.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/lib/LibCommon.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -27,9 +27,6 @@ include MakeBase.gmk include NativeCompilation.gmk -# Build tools -include Tools.gmk - GLOBAL_VERSION_INFO_RESOURCE := $(JDK_TOPDIR)/src/java.base/windows/native/common/version.rc # Absolute paths to lib files on windows for use in LDFLAGS. Should figure out a more diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/mapfiles/libj2ucrypto/mapfile-vers --- a/jdk/make/mapfiles/libj2ucrypto/mapfile-vers Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/mapfiles/libj2ucrypto/mapfile-vers Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2015, 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 @@ -39,6 +39,7 @@ Java_com_oracle_security_ucrypto_NativeCipher_nativeUpdate; Java_com_oracle_security_ucrypto_NativeCipher_nativeFinal; Java_com_oracle_security_ucrypto_NativeKey_nativeFree; + Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit; Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivateCrt_nativeInit; Java_com_oracle_security_ucrypto_NativeKey_00024RSAPublic_nativeInit; Java_com_oracle_security_ucrypto_NativeRSASignature_nativeInit; @@ -56,6 +57,7 @@ JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeUpdate; JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeFinal; JavaCritical_com_oracle_security_ucrypto_NativeKey_nativeFree; + JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit; JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivateCrt_nativeInit; JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPublic_nativeInit; JavaCritical_com_oracle_security_ucrypto_NativeRSASignature_nativeInit; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/mapfiles/libnet/mapfile-vers --- a/jdk/make/mapfiles/libnet/mapfile-vers Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/mapfiles/libnet/mapfile-vers Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2015, 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 @@ -28,8 +28,7 @@ SUNWprivate_1.1 { global: JNI_OnLoad; - Java_java_net_AbstractPlainDatagramSocketImpl_init; - Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable; + Java_java_net_PlainDatagramSocketImpl_dataAvailable; Java_java_net_PlainSocketImpl_socketListen; Java_java_net_PlainDatagramSocketImpl_getTTL; Java_java_net_PlainDatagramSocketImpl_init; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/rmic/RmicCommon.gmk --- a/jdk/make/rmic/RmicCommon.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/rmic/RmicCommon.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -31,8 +31,9 @@ ########################################################################################## -BTRMIC_CP := $(INTERIM_CORBA_JAR)$(PATH_SEP)$(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes$(PATH_SEP)$(INTERIM_LANGTOOLS_JAR) -BTRMIC_ARGS := "-Xbootclasspath/p:$(BTRMIC_CP)" -cp "$(BTRMIC_CP)" +BTRMIC_CP := $(call PathList, $(INTERIM_CORBA_JAR) \ + $(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes $(INTERIM_LANGTOOLS_JAR)) +BTRMIC_ARGS := -Xbootclasspath/p:$(BTRMIC_CP) -cp $(BTRMIC_CP) RMIC := $(JAVA) $(BTRMIC_ARGS) sun.rmi.rmic.Main CLASSES_DIR := $(JDK_OUTPUTDIR)/modules diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/src/classes/build/tools/cldrconverter/Bundle.java --- a/jdk/make/src/classes/build/tools/cldrconverter/Bundle.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/src/classes/build/tools/cldrconverter/Bundle.java Tue Sep 15 07:47:44 2015 -0700 @@ -27,15 +27,12 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Enumeration; import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.ResourceBundle; class Bundle { static enum Type { @@ -117,6 +114,7 @@ private final String cldrPath; private final EnumSet bundleTypes; private final String currencies; + private Map targetMap; static Bundle getBundle(String id) { return bundles.get(id); @@ -176,6 +174,10 @@ * visible for the bundle's locale */ Map getTargetMap() throws Exception { + if (targetMap != null) { + return targetMap; + } + String[] cldrBundles = getCLDRPath().split(","); // myMap contains resources for id. @@ -398,6 +400,7 @@ } } + targetMap = myMap; return myMap; } @@ -632,7 +635,7 @@ return null; } - static Object[][] jreTimeZoneNames = TimeZoneNames.getContents(); + static List jreTimeZoneNames = Arrays.asList(TimeZoneNames.getContents()); private void fillInJREs(String key, Map map) { String tzid = null; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java --- a/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,6 +25,7 @@ package build.tools.cldrconverter; +import static build.tools.cldrconverter.Bundle.jreTimeZoneNames; import build.tools.cldrconverter.BundleGenerator.BundleType; import java.io.File; import java.nio.file.DirectoryStream; @@ -564,6 +565,44 @@ private static Map extractZoneNames(Map map, String id) { Map names = new HashMap<>(); + + // Copy over missing time zone ids from JRE for English locale + if (id.equals("en")) { + Map jreMetaMap = new HashMap<>(); + jreTimeZoneNames.stream().forEach(e -> { + String tzid = (String)e[0]; + String[] data = (String[])e[1]; + + if (map.get(TIMEZONE_ID_PREFIX + tzid) == null && + handlerMetaZones.get(tzid) == null) { + // First, check the CLDR meta key + Optional> cldrMeta = + handlerMetaZones.getData().entrySet().stream() + .filter(me -> + Arrays.deepEquals(data, + (String[])map.get(METAZONE_ID_PREFIX + me.getValue()))) + .findAny(); + if (cldrMeta.isPresent()) { + names.put(tzid, cldrMeta.get().getValue()); + } else { + // check the JRE meta key, add if there is not. + Optional> jreMeta = + jreMetaMap.entrySet().stream() + .filter(jm -> Arrays.deepEquals(data, jm.getKey())) + .findAny(); + if (jreMeta.isPresent()) { + names.put(tzid, jreMeta.get().getValue()); + } else { + String metaName = "JRE_" + tzid.replaceAll("[/-]", "_"); + names.put(METAZONE_ID_PREFIX + metaName, data); + names.put(tzid, metaName); + jreMetaMap.put(data, metaName); + } + } + } + }); + } + for (String tzid : handlerMetaZones.keySet()) { String tzKey = TIMEZONE_ID_PREFIX + tzid; Object data = map.get(tzKey); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java --- a/jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java Tue Sep 15 07:47:44 2015 -0700 @@ -266,22 +266,47 @@ out.println((CLDRConverter.isBaseModule ? "package sun.util.cldr;\n\n" : "package sun.util.resources.cldr.provider;\n\n") + "import java.util.HashMap;\n" + + "import java.util.Locale;\n" + "import java.util.Map;\n" - + "import java.util.ListResourceBundle;\n" + "import sun.util.locale.provider.LocaleProviderAdapter;\n" + "import sun.util.locale.provider.LocaleDataMetaInfo;\n"); - out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", className); - out.println(" @Override\n" + - " protected final Object[][] getContents() {\n" + - " final Object[][] data = new Object[][] {"); + out.printf("public class %s implements LocaleDataMetaInfo {\n", className); + out.println(" private static final Map resourceNameToLocales = new HashMap<>();\n" + + (CLDRConverter.isBaseModule ? + " private static final Map parentLocalesMap = new HashMap<>();\n\n" : "\n") + + " static {\n"); + for (String key : metaInfo.keySet()) { - out.printf(" { \"%s\",\n", key); - out.printf(" \"%s\" },\n", + if (key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX)) { + String parentTag = key.substring(CLDRConverter.PARENT_LOCALE_PREFIX.length()); + if ("root".equals(parentTag)) { + out.printf(" parentLocalesMap.put(Locale.ROOT,\n"); + } else { + out.printf(" parentLocalesMap.put(Locale.forLanguageTag(\"%s\"),\n", + parentTag); + } + String[] childlen = toLocaleList(metaInfo.get(key), true).split(" "); + out.printf(" new String[] {\n" + + " "); + int count = 0; + for (int i = 0; i < childlen.length; i++) { + String child = childlen[i]; + out.printf("\"%s\", ", child); + count += child.length() + 4; + if (i != childlen.length - 1 && count > 64) { + out.printf("\n "); + count = 0; + } + } + out.printf("\n });\n"); + } else { + out.printf(" resourceNameToLocales.put(\"%s\",\n", key); + out.printf(" \"%s\");\n", toLocaleList(key.equals("FormatData") ? metaInfo.get("AvailableLocales") : - metaInfo.get(key), - key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX))); + metaInfo.get(key), false)); + } } - out.println(" };\n return data;\n }\n\n"); + out.println(" }\n\n"); out.println(" @Override\n" + " public LocaleProviderAdapter.Type getType() {\n" + @@ -290,19 +315,13 @@ out.println(" @Override\n" + " public String availableLanguageTags(String category) {\n" + - " return getString(category);\n" + - " };\n\n"); + " return resourceNameToLocales.getOrDefault(category, \"\");\n" + + " }\n\n"); if (CLDRConverter.isBaseModule) { - out.printf(" public Map parentLocales() {\n" + - " Map ret = new HashMap<>();\n" + - " keySet().stream()\n" + - " .filter(key -> key.startsWith(\"%s\"))\n" + - " .forEach(key -> ret.put(key.substring(%d), getString(key)));\n" + - " return ret.isEmpty() ? null : ret;\n" + - " };\n}", - CLDRConverter.PARENT_LOCALE_PREFIX, - CLDRConverter.PARENT_LOCALE_PREFIX.length()); + out.printf(" public Map parentLocales() {\n" + + " return parentLocalesMap;\n" + + " }\n}"); } else { out.println("}"); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/src/native/add_gnu_debuglink/add_gnu_debuglink.c --- a/jdk/make/src/native/add_gnu_debuglink/add_gnu_debuglink.c Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * Name: add_gnu_debuglink.c - * - * Description: Add a ".gnu_debuglink" section that refers to the specified - * debug_info_path to the specified ELF object. - * - * This program is adapted from the example program shown on the - * elf(3elf) man page and from code from the Solaris compiler - * driver. - */ - -/* - * needed to define SHF_EXCLUDE - */ -#define ELF_TARGET_ALL - -#include -#include -#include -#include -#include -#include - -static void failure(void); -static unsigned int gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, - size_t len); - -void -main(int argc, char ** argv) { - /* new ELF section name */ - static char SEC_NAME[] = ".gnu_debuglink"; - - unsigned char buffer[8 * 1024]; /* I/O buffer */ - int buffer_len; /* buffer length */ - char * debug_info_path; /* debug info path */ - void * ehdr; /* ELF header */ - Elf * elf; /* ELF descriptor */ - char * elf_ident; /* ELF identity string */ - char * elf_obj; /* elf_obj file */ - int fd; /* descriptor for files */ - unsigned int file_crc = 0; /* CRC for debug info file */ - int is_elfclass64; /* is an ELFCLASS64 file? */ - Elf_Data * link_dat; /* ELF data for new debug info link */ - Elf_Data * name_dat; /* ELF data for new section name */ - Elf_Scn * new_scn; /* new ELF section descriptor */ - void * new_shdr; /* new ELF section header */ - Elf_Scn * scn; /* ELF section descriptor */ - void * shdr; /* ELF section header */ - - if (argc != 3) { - (void) fprintf(stderr, "Usage: %s debug_info_path elf_obj\n", argv[0]); - exit(2); - } - - debug_info_path = argv[1]; /* save for later */ - if ((fd = open(debug_info_path, O_RDONLY)) == -1) { - (void) fprintf(stderr, "%s: cannot open file.\n", debug_info_path); - exit(3); - } - - (void) printf("Computing CRC for '%s'\n", debug_info_path); - (void) fflush(stdout); - /* compute CRC for the debug info file */ - for (;;) { - int len = read(fd, buffer, sizeof buffer); - if (len <= 0) { - break; - } - file_crc = gnu_debuglink_crc32(file_crc, buffer, len); - } - (void) close(fd); - - /* open the elf_obj */ - elf_obj = argv[2]; - if ((fd = open(elf_obj, O_RDWR)) == -1) { - (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj); - exit(4); - } - - (void) printf("Opening '%s' for update\n", elf_obj); - (void) fflush(stdout); - (void) elf_version(EV_CURRENT); /* coordinate ELF versions */ - - /* obtain the ELF descriptors from the input file */ - if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) { - failure(); - } - - /* determine if ELFCLASS64 or not? */ - elf_ident = elf_getident(elf, NULL); - is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64); - - /* get the ELF header */ - if (is_elfclass64) { - ehdr = elf64_getehdr(elf); - } else { - ehdr = elf32_getehdr(elf); - } - if (ehdr == NULL) { - failure(); - } - - /* get the ELF section descriptor */ - if (is_elfclass64) { - scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx); - } else { - scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx); - } - if (scn == NULL) { - failure(); - } - - /* get the section header */ - if (is_elfclass64) { - shdr = elf64_getshdr(scn); - } else { - shdr = elf32_getshdr(scn); - } - if (shdr == NULL) { - failure(); - } - - (void) printf("Adding ELF data for new section name\n"); - (void) fflush(stdout); - name_dat = elf_newdata(scn); - name_dat->d_buf = (void *) SEC_NAME; - if (is_elfclass64) { - name_dat->d_off = ((Elf64_Shdr *) shdr)->sh_size + 1; - } else { - name_dat->d_off = ((Elf32_Shdr *) shdr)->sh_size + 1; - } - name_dat->d_align = 1; - name_dat->d_size = strlen(SEC_NAME) + 1; - - new_scn = elf_newscn(elf); - - if (is_elfclass64) { - new_shdr = elf64_getshdr(new_scn); - ((Elf64_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE; - ((Elf64_Shdr *) new_shdr)->sh_type = SHT_PROGBITS; - ((Elf64_Shdr *) new_shdr)->sh_name = ((Elf64_Shdr *) shdr)->sh_size; - ((Elf64_Shdr *) new_shdr)->sh_addralign = 1; - ((Elf64_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1); - } else { - new_shdr = elf32_getshdr(new_scn); - ((Elf32_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE; - ((Elf32_Shdr *) new_shdr)->sh_type = SHT_PROGBITS; - ((Elf32_Shdr *) new_shdr)->sh_name = ((Elf32_Shdr *) shdr)->sh_size; - ((Elf32_Shdr *) new_shdr)->sh_addralign = 1; - ((Elf32_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1); - } - - (void) printf("Adding ELF data for debug_info_path value\n"); - (void) fflush(stdout); - (void) memset(buffer, 0, sizeof buffer); - buffer_len = strlen(debug_info_path) + 1; /* +1 for NUL */ - (void) strncpy((char *) buffer, debug_info_path, buffer_len); - if (buffer_len % 4 != 0) { - /* not on a 4 byte boundary so pad to the next one */ - buffer_len += (4 - buffer_len % 4); - } - /* save the CRC */ - (void) memcpy(&buffer[buffer_len], &file_crc, sizeof file_crc); - buffer_len += sizeof file_crc; - - link_dat = elf_newdata(new_scn); - link_dat->d_type = ELF_T_BYTE; - link_dat->d_size = buffer_len; - link_dat->d_buf = buffer; - link_dat->d_align = 1; - - (void) printf("Saving updates to '%s'\n", elf_obj); - (void) fflush(stdout); - (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */ - (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */ - (void) elf_end(elf); /* done with ELF obj */ - (void) close(fd); - - (void) printf("Done updating '%s'\n", elf_obj); - (void) fflush(stdout); - exit(0); -} /* end main */ - - -static void -failure() { - (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno())); - exit(5); -} - - -/* - * The CRC used in gnu_debuglink, retrieved from - * http://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html#Separate-Debug-Files. - */ - -static unsigned int -gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, size_t len) { - static const unsigned int crc32_table[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d - }; - - unsigned char *end; - - crc = ~crc & 0xffffffff; - for (end = buf + len; buf < end; ++buf) { - crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8); - } - return ~crc & 0xffffffff; -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/make/src/native/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c --- a/jdk/make/src/native/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * Name: fix_empty_sec_hdr_flags.c - * - * Description: Remove the SHF_ALLOC flag from "empty" section headers. - * An "empty" section header has sh_addr == 0 and sh_size == 0. - * - * This program is adapted from the example program shown on the - * elf(3elf) man page and from code from the Solaris compiler - * driver. - */ - -#include -#include -#include -#include -#include -#include - -static void failure(void); - -void -main(int argc, char ** argv) { - void * ehdr; /* ELF header */ - unsigned int i; /* section counter */ - int fd; /* descriptor for file */ - Elf * elf; /* ELF descriptor */ - char * elf_ident; /* ELF identity string */ - char * elf_obj; /* elf_obj file */ - int fix_count; /* number of flags fixed */ - int is_elfclass64; /* is an ELFCLASS64 file? */ - Elf_Scn * scn; /* ELF section descriptor */ - void * shdr; /* ELF section header */ - Elf_Data * shstrtab; /* ELF section header string table */ - - if (argc != 2) { - (void) fprintf(stderr, "Usage: %s elf_obj\n", argv[0]); - exit(2); - } - - /* open the elf_obj */ - elf_obj = argv[1]; - if ((fd = open(elf_obj, O_RDWR)) == -1) { - (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj); - exit(3); - } - - (void) printf("Opening '%s' for update\n", elf_obj); - (void) fflush(stdout); - (void) elf_version(EV_CURRENT); /* coordinate ELF versions */ - - /* obtain the ELF descriptors from the input file */ - if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) { - failure(); - } - - /* determine if ELFCLASS64 or not? */ - elf_ident = elf_getident(elf, NULL); - is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64); - - /* get the ELF header */ - if (is_elfclass64) { - ehdr = elf64_getehdr(elf); - } else { - ehdr = elf32_getehdr(elf); - } - if (ehdr == NULL) { - failure(); - } - - /* get the ELF section descriptor */ - if (is_elfclass64) { - scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx); - } else { - scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx); - } - if (scn == NULL) { - failure(); - } - - /* get the section header string table */ - shstrtab = elf_getdata(scn, NULL); - if (shstrtab == NULL) { - failure(); - } - - fix_count = 0; - - /* traverse the sections of the input file */ - for (i = 1, scn = NULL; scn = elf_nextscn(elf, scn); i++) { - int has_flag_set; /* is SHF_ALLOC flag set? */ - int is_empty; /* is section empty? */ - char * name; /* short hand pointer */ - - /* get the section header */ - if (is_elfclass64) { - shdr = elf64_getshdr(scn); - } else { - shdr = elf32_getshdr(scn); - } - if (shdr == NULL) { - failure(); - } - - if (is_elfclass64) { - name = (char *)shstrtab->d_buf + ((Elf64_Shdr *) shdr)->sh_name; - } else { - name = (char *)shstrtab->d_buf + ((Elf32_Shdr *) shdr)->sh_name; - } - - if (is_elfclass64) { - has_flag_set = ((Elf64_Shdr *) shdr)->sh_flags & SHF_ALLOC; - is_empty = ((Elf64_Shdr *) shdr)->sh_addr == 0 && - ((Elf64_Shdr *) shdr)->sh_size == 0; - } else { - has_flag_set = ((Elf32_Shdr *) shdr)->sh_flags & SHF_ALLOC; - is_empty = ((Elf32_Shdr *) shdr)->sh_addr == 0 && - ((Elf32_Shdr *) shdr)->sh_size == 0; - } - - if (is_empty && has_flag_set) { - (void) printf("section[%u] '%s' is empty, " - "but SHF_ALLOC flag is set.\n", i, name); - (void) printf("Clearing the SHF_ALLOC flag.\n"); - - if (is_elfclass64) { - ((Elf64_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC; - } else { - ((Elf32_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC; - } - fix_count++; - } - } /* end for each ELF section */ - - if (fix_count > 0) { - (void) printf("Saving %d updates to '%s'\n", fix_count, elf_obj); - (void) fflush(stdout); - (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */ - (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */ - } else { - (void) printf("No SHF_ALLOC flags needed to be cleared.\n"); - } - - (void) elf_end(elf); /* done with ELF obj */ - (void) close(fd); - - (void) printf("Done %s '%s'\n", - (fix_count > 0) ? "updating" : "with", elf_obj); - (void) fflush(stdout); - exit(0); -} /* end main */ - - -static void -failure() { - (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno())); - exit(6); -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c --- a/jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c Tue Sep 15 07:47:44 2015 -0700 @@ -141,17 +141,21 @@ struct stat stat_buf; /* + * Stat /proc/ to get the user id + */ + snprintf(fn, sizeof fn, "/proc/%d", pid); + if (stat(fn, &stat_buf) == 0) { + unix_getUserInfo(env, jinfo, stat_buf.st_uid); + } + + /* * Try to open /proc//cmdline */ - snprintf(fn, sizeof fn, "/proc/%d/cmdline", pid); + strncat(fn, "/cmdline", sizeof fn - strnlen(fn, sizeof fn) - 1); if ((fd = open(fn, O_RDONLY)) < 0) { return; } - if (fstat(fd, &stat_buf) == 0) { - unix_getUserInfo(env, jinfo, stat_buf.st_uid); - } - do { // Block to break out of on errors int i, truncated = 0; int count; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java --- a/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, 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 @@ -68,7 +68,6 @@ return null; } }); - init(); } /** @@ -364,6 +363,5 @@ return connectDisabled; } - native int dataAvailable(); - private static native void init(); + abstract int dataAvailable(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java --- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Tue Sep 15 07:47:44 2015 -0700 @@ -233,8 +233,7 @@ } CertStore ucs = null; try { - ucs = URICertStore.getInstance - (new URICertStore.URICertStoreParameters(uri)); + ucs = URICertStore.getInstance(new URICertStoreParameters(uri)); } catch (InvalidAlgorithmParameterException | NoSuchAlgorithmException e) { if (debug != null) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPNonceExtension.java --- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPNonceExtension.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPNonceExtension.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,15 +26,13 @@ package sun.security.provider.certpath; import java.io.IOException; -import java.io.OutputStream; -import java.util.Enumeration; +import java.util.Objects; import java.security.SecureRandom; -import sun.security.x509.AttributeNameEnumeration; -import sun.security.x509.CertAttrSet; import sun.security.x509.Extension; import sun.security.x509.PKIXExtensions; -import sun.security.util.*; +import sun.security.util.Debug; +import sun.security.util.DerValue; /** * Represent the OCSP Nonce Extension. @@ -43,252 +41,139 @@ * and help to prevent replay attacks (see RFC 6960, section 4.4.1). * * @see Extension - * @see CertAttrSet */ -public class OCSPNonceExtension extends Extension -implements CertAttrSet { +public final class OCSPNonceExtension extends Extension { /** * Attribute name. */ - public static final String NAME = "OCSPNonce"; - public static final String NONCE = "nonce"; - + private static final String EXTENSION_NAME = "OCSPNonce"; private byte[] nonceData = null; - private String extensionName; - - /** - * Encode this extension value to DER and assign it to the - * {@code extensionName} data member. - * - * @throws IOException if any errors occur during DER encoding - */ - private void encodeInternal() throws IOException { - if (nonceData == null) { - this.extensionValue = null; - return; - } - DerOutputStream os = new DerOutputStream(); - os.putOctetString(this.nonceData); - this.extensionValue = os.toByteArray(); - } /** * Create a {@code OCSPNonceExtension} by providing the nonce length. - * The criticality is set to false. The random bytes will be generated - * using the SUN provider. + * The criticality is set to false, and the OID for the extension will + * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960. * * @param length the number of random bytes composing the nonce * * @throws IOException if any errors happen during encoding of the * extension. + * @throws IllegalArgumentException if length is not a positive integer. */ public OCSPNonceExtension(int length) throws IOException { - this(PKIXExtensions.OCSPNonce_Id, false, length, NAME); - } - - /** - * Creates the extension (also called by the subclass). - * - * @param extensionId the {@code ObjectIdentifier} for the OCSP Nonce - * extension - * @param isCritical a boolean flag indicating if the criticality bit - * is to be set for this extension - * @param length the length of the nonce in bytes - * @param extensionName the name of the extension - * - * @throws IOException if any errors happen during encoding of the - * extension. - */ - protected OCSPNonceExtension(ObjectIdentifier extensionId, - boolean isCritical, int length, String extensionName) - throws IOException { - SecureRandom rng = new SecureRandom(); - this.nonceData = new byte[length]; - rng.nextBytes(nonceData); - this.extensionId = extensionId; - this.critical = isCritical; - this.extensionName = extensionName; - encodeInternal(); - } - - /** - * Create the extension using the provided criticality bit setting and - * DER encoding. - * - * @param critical true if the extension is to be treated as critical. - * @param value an array of DER encoded bytes of the extnValue for the - * extension. It must not include the encapsulating OCTET STRING - * tag and length. For an {@code OCSPNonceExtension} the data value - * should be a simple OCTET STRING containing random bytes - * (see RFC 6960, section 4.4.1). - * - * @throws ClassCastException if value is not an array of bytes - * @throws IOException if any errors happen during encoding of the - * extension - */ - public OCSPNonceExtension(Boolean critical, Object value) - throws IOException { - this(PKIXExtensions.OCSPNonce_Id, critical, value, NAME); + this(false, length); } /** - * Creates the extension (also called by the subclass). - * - * @param extensionId the {@code ObjectIdentifier} for the OCSP Nonce - * extension - * @param critical a boolean flag indicating if the criticality bit - * is to be set for this extension - * @param value an array of DER encoded bytes of the extnValue for the - * extension. It must not include the encapsulating OCTET STRING - * tag and length. For an {@code OCSPNonceExtension} the data value - * should be a simple OCTET STRING containing random bytes - * (see RFC 6960, section 4.4.1). - * @param extensionName the name of the extension + * Create a {@code OCSPNonceExtension} by providing the nonce length and + * criticality setting. The OID for the extension will + * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960. * - * @throws ClassCastException if value is not an array of bytes - * @throws IOException if any errors happen during encoding of the - * extension - */ - protected OCSPNonceExtension(ObjectIdentifier extensionId, - Boolean critical, Object value, String extensionName) - throws IOException { - this.extensionId = extensionId; - this.critical = critical; - this.extensionValue = (byte[]) value; - DerValue val = new DerValue(this.extensionValue); - this.nonceData = val.getOctetString(); - this.extensionName = extensionName; - } - - /** - * Set the attribute value. - * - * @param name the name of the attribute. - * @param obj an array of nonce bytes for the extension. It must not - * contain any DER tags or length. + * @param isCritical a boolean flag indicating whether the criticality bit + * is set for this extension + * @param length the number of random bytes composing the nonce * - * @throws IOException if an unsupported name is provided or the supplied - * {@code obj} is not a byte array + * @throws IOException if any errors happen during encoding of the + * extension. + * @throws IllegalArgumentException if length is not a positive integer. */ - @Override - public void set(String name, Object obj) throws IOException { - if (name.equalsIgnoreCase(NONCE)) { - if (!(obj instanceof byte[])) { - throw new IOException("Attribute must be of type byte[]."); - } - nonceData = (byte[])obj; - } else { - throw new IOException("Attribute name not recognized by" - + " CertAttrSet:" + extensionName + "."); - } - encodeInternal(); - } + public OCSPNonceExtension(boolean isCritical, int length) + throws IOException { + this.extensionId = PKIXExtensions.OCSPNonce_Id; + this.critical = isCritical; - /** - * Get the attribute value. - * - * @param name the name of the attribute to retrieve. Only "OCSPNonce" - * is currently supported. - * - * @return an array of bytes that are the nonce data. It will not contain - * any DER tags or length, only the random nonce bytes. - * - * @throws IOException if an unsupported name is provided. - */ - @Override - public Object get(String name) throws IOException { - if (name.equalsIgnoreCase(NONCE)) { - return nonceData; + if (length > 0) { + SecureRandom rng = new SecureRandom(); + this.nonceData = new byte[length]; + rng.nextBytes(nonceData); + this.extensionValue = new DerValue(DerValue.tag_OctetString, + nonceData).toByteArray(); } else { - throw new IOException("Attribute name not recognized by" - + " CertAttrSet:" + extensionName + "."); + throw new IllegalArgumentException( + "Length must be a positive integer"); } } /** - * Delete the attribute value. + * Create a {@code OCSPNonceExtension} by providing a nonce value. + * The criticality is set to false, and the OID for the extension will + * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960. * - * @param name the name of the attribute to retrieve. Only "OCSPNonce" - * is currently supported. + * @param incomingNonce The nonce data to be set for the extension. This + * must be a non-null array of at least one byte long. * - * @throws IOException if an unsupported name is provided or an error - * occurs during re-encoding of the extension. + * @throws IOException if any errors happen during encoding of the + * extension. + * @throws IllegalArgumentException if the incomingNonce length is not a + * positive integer. + * @throws NullPointerException if the incomingNonce is null. */ - @Override - public void delete(String name) throws IOException { - if (name.equalsIgnoreCase(NONCE)) { - nonceData = null; + public OCSPNonceExtension(byte[] incomingNonce) throws IOException { + this(false, incomingNonce); + } + + /** + * Create a {@code OCSPNonceExtension} by providing a nonce value and + * criticality setting. The OID for the extension will + * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960. + * + * @param isCritical a boolean flag indicating whether the criticality bit + * is set for this extension + * @param incomingNonce The nonce data to be set for the extension. This + * must be a non-null array of at least one byte long. + * + * @throws IOException if any errors happen during encoding of the + * extension. + * @throws IllegalArgumentException if the incomingNonce length is not a + * positive integer. + * @throws NullPointerException if the incomingNonce is null. + */ + public OCSPNonceExtension(boolean isCritical, byte[] incomingNonce) + throws IOException { + this.extensionId = PKIXExtensions.OCSPNonce_Id; + this.critical = isCritical; + + Objects.requireNonNull(incomingNonce, "Nonce data must be non-null"); + if (incomingNonce.length > 0) { + this.nonceData = incomingNonce.clone(); + this.extensionValue = new DerValue(DerValue.tag_OctetString, + nonceData).toByteArray(); } else { - throw new IOException("Attribute name not recognized by" - + " CertAttrSet:" + extensionName + "."); + throw new IllegalArgumentException( + "Nonce data must be at least 1 byte in length"); } - encodeInternal(); + } + + /** + * Return the nonce bytes themselves, without any DER encoding. + * + * @return A copy of the underlying nonce bytes + */ + public byte[] getNonceValue() { + return nonceData.clone(); } /** * Returns a printable representation of the {@code OCSPNonceExtension}. + * + * @return a string representation of the extension. */ @Override public String toString() { - String s = super.toString() + extensionName + ": " + - ((nonceData == null) ? "" : Debug.toString(nonceData)) - + "\n"; - return (s); - } - - /** - * Write the extension to an {@code OutputStream} - * - * @param out the {@code OutputStream} to write the extension to. - * - * @throws IOException on encoding errors. - */ - @Override - public void encode(OutputStream out) throws IOException { - encode(out, PKIXExtensions.OCSPNonce_Id, this.critical); + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(EXTENSION_NAME).append(": "); + sb.append((nonceData == null) ? "" : Debug.toString(nonceData)); + sb.append("\n"); + return sb.toString(); } /** - * Write the extension to the DerOutputStream. + * Return the name of the extension as a {@code String} * - * @param out the {@code OutputStream} to write the extension to. - * @param extensionId the {@code ObjectIdentifier} used for this extension - * @param isCritical a flag indicating if the criticality bit is set for - * this extension. - * - * @throws IOException on encoding errors. + * @return the name of the extension */ - protected void encode(OutputStream out, ObjectIdentifier extensionId, - boolean isCritical) throws IOException { - - DerOutputStream tmp = new DerOutputStream(); - - if (this.extensionValue == null) { - this.extensionId = extensionId; - this.critical = isCritical; - encodeInternal(); - } - super.encode(tmp); - out.write(tmp.toByteArray()); - } - - /** - * Return an enumeration of names of attributes existing within this - * attribute. - */ - @Override - public Enumeration getElements() { - AttributeNameEnumeration elements = new AttributeNameEnumeration(); - elements.addElement(NONCE); - return (elements.elements()); - } - - /** - * Return the name of this attribute. - */ - @Override public String getName() { - return (extensionName); + return EXTENSION_NAME; } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java --- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Tue Sep 15 07:47:44 2015 -0700 @@ -44,9 +44,7 @@ import java.security.cert.CRLSelector; import java.security.cert.URICertStoreParameters; import java.security.cert.X509Certificate; -import java.security.cert.X509CertSelector; import java.security.cert.X509CRL; -import java.security.cert.X509CRLSelector; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -160,12 +158,11 @@ throw new InvalidAlgorithmParameterException ("params must be instanceof URICertStoreParameters"); } - this.uri = ((URICertStoreParameters) params).uri; + this.uri = ((URICertStoreParameters) params).getURI(); // if ldap URI, use an LDAPCertStore to fetch certs and CRLs if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals("ldap")) { ldap = true; - URICertStoreParameters lparams = new URICertStoreParameters(uri); - ldapCertStore = CertStore.getInstance("LDAP", lparams); + ldapCertStore = CertStore.getInstance("LDAP", params); } try { factory = CertificateFactory.getInstance("X.509"); @@ -183,7 +180,7 @@ static synchronized CertStore getInstance(URICertStoreParameters params) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException { if (debug != null) { - debug.println("CertStore URI:" + params.uri); + debug.println("CertStore URI:" + params.getURI()); } CertStore ucs = certStoreCache.get(params); if (ucs == null) { @@ -212,8 +209,7 @@ } URI uri = ((URIName) gn).getURI(); try { - return URICertStore.getInstance - (new URICertStore.URICertStoreParameters(uri)); + return URICertStore.getInstance(new URICertStoreParameters(uri)); } catch (Exception ex) { if (debug != null) { debug.println("exception creating CertStore: " + ex); @@ -421,40 +417,6 @@ } /** - * CertStoreParameters for the URICertStore. - */ - static class URICertStoreParameters implements CertStoreParameters { - private final URI uri; - private volatile int hashCode = 0; - URICertStoreParameters(URI uri) { - this.uri = uri; - } - @Override public boolean equals(Object obj) { - if (!(obj instanceof URICertStoreParameters)) { - return false; - } - URICertStoreParameters params = (URICertStoreParameters) obj; - return uri.equals(params.uri); - } - @Override public int hashCode() { - if (hashCode == 0) { - int result = 17; - result = 37*result + uri.hashCode(); - hashCode = result; - } - return hashCode; - } - @Override public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - /* Cannot happen */ - throw new InternalError(e.toString(), e); - } - } - } - - /** * This class allows the URICertStore to be accessed as a CertStore. */ private static class UCS extends CertStore { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java --- a/jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Tue Sep 15 07:47:44 2015 -0700 @@ -41,6 +41,7 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.StringTokenizer; +import java.util.stream.Stream; import sun.util.locale.provider.JRELocaleProviderAdapter; import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.LocaleDataMetaInfo; @@ -148,11 +149,9 @@ private List applyParentLocales(String baseName, List candidates) { if (Objects.isNull(parentLocalesMap)) { Map map = new HashMap<>(); - Map parentLocales = baseMetaInfo.parentLocales(); - parentLocales.keySet().forEach(parent -> { - Arrays.asList(parentLocales.get(parent).split(" ")).stream().forEach(child -> { - map.put(Locale.forLanguageTag(child), - "root".equals(parent) ? Locale.ROOT : Locale.forLanguageTag(parent)); + baseMetaInfo.parentLocales().forEach((parent, children) -> { + Stream.of(children).forEach(child -> { + map.put(Locale.forLanguageTag(child), parent); }); }); parentLocalesMap = Collections.unmodifiableMap(map); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/share/native/libnet/InetAddress.c --- a/jdk/src/java.base/share/native/libnet/InetAddress.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/share/native/libnet/InetAddress.c Tue Sep 15 07:47:44 2015 -0700 @@ -57,6 +57,7 @@ c = (*env)->FindClass(env,"java/net/InetAddress$InetAddressHolder"); CHECK_NULL(c); iac_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL(iac_class); ia_holderID = (*env)->GetFieldID(env, ia_class, "holder", "Ljava/net/InetAddress$InetAddressHolder;"); CHECK_NULL(ia_holderID); ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "Z"); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java --- a/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007,2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2015, 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 @@ -130,6 +130,8 @@ protected native void disconnect0(int family); + native int dataAvailable(); + /** * Perform class load-time initializations. */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/conf/ppc64/jvm.cfg --- a/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Tue Sep 15 07:47:44 2015 -0700 @@ -1,4 +1,4 @@ -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,3 +31,4 @@ # and may not be available in a future release. # -server KNOWN +-client IGNORE diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/native/libjava/TimeZone_md.c --- a/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Tue Sep 15 07:47:44 2015 -0700 @@ -35,14 +35,20 @@ #include #include #include -#ifdef __solaris__ +#if defined(__solaris__) #include #endif #include "jvm.h" +#include "TimeZone_md.h" #define SKIP_SPACE(p) while (*p == ' ' || *p == '\t') p++; +#if defined(_ALLBSD_SOURCE) +#define dirent64 dirent +#define readdir64_r readdir_r +#endif + #if !defined(__solaris__) || defined(__sparcv9) || defined(amd64) #define fileopen fopen #define filegets fgets @@ -50,19 +56,20 @@ #endif #if defined(__linux__) || defined(_ALLBSD_SOURCE) - - static const char *ETC_TIMEZONE_FILE = "/etc/timezone"; static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; #else -#ifdef _AIX -static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; -#endif static const char *SYS_INIT_FILE = "/etc/default/init"; static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime"; -#endif /*__linux__*/ +#endif /* defined(__linux__) || defined(_ALLBSD_SOURCE) */ + +#if defined(_AIX) +static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; +#endif + +#if defined(__linux__) || defined(MACOSX) || defined(__solaris__) /* * Returns a pointer to the zone ID portion of the given zoneinfo file @@ -108,8 +115,8 @@ { DIR *dirp = NULL; struct stat statbuf; - struct dirent *dp = NULL; - struct dirent *entry = NULL; + struct dirent64 *dp = NULL; + struct dirent64 *entry = NULL; char *pathname = NULL; int fd = -1; char *dbuf = NULL; @@ -120,19 +127,13 @@ return NULL; } - entry = (struct dirent *) malloc((size_t) pathconf(dir, _PC_NAME_MAX)); + entry = (struct dirent64 *) malloc((size_t) pathconf(dir, _PC_NAME_MAX)); if (entry == NULL) { (void) closedir(dirp); return NULL; } -#if defined(_AIX) || defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ - && (defined(_POSIX_PTHREAD_SEMANTICS) || defined(_LP64))) - while (readdir_r(dirp, entry, &dp) == 0 && dp != NULL) { -#else - while ((dp = readdir_r(dirp, entry)) != NULL) { -#endif - + while (readdir64_r(dirp, entry, &dp) == 0 && dp != NULL) { /* * Skip '.' and '..' (and possibly other .* files) */ @@ -145,7 +146,7 @@ */ if ((strcmp(dp->d_name, "ROC") == 0) || (strcmp(dp->d_name, "posixrules") == 0) -#ifdef __solaris__ +#if defined(__solaris__) /* * Skip the "src" and "tab" directories on Solaris. */ @@ -230,7 +231,7 @@ char *buf; size_t size; -#ifdef __linux__ +#if defined(__linux__) /* * Try reading the /etc/timezone file for Debian distros. There's * no spec of the file format available. This parsing assumes that @@ -254,7 +255,7 @@ return tz; } } -#endif /* __linux__ */ +#endif /* defined(__linux__) */ /* * Next, try /etc/localtime to find the zone ID. @@ -318,8 +319,9 @@ free((void *) buf); return tz; } -#else -#ifdef __solaris__ + +#elif defined(__solaris__) + #if !defined(__sparcv9) && !defined(amd64) /* @@ -444,8 +446,7 @@ } /*NOTREACHED*/ } -#endif /* not __sparcv9 */ - +#endif /* !defined(__sparcv9) && !defined(amd64) */ /* * Performs Solaris dependent mapping. Returns a zone ID if @@ -546,7 +547,7 @@ } /* - * Retruns a zone ID of Solaris when the TZ value is "localtime". + * Returns a zone ID of Solaris when the TZ value is "localtime". * First, it tries scf. If scf fails, it looks for the same file as * /usr/share/lib/zoneinfo/localtime under /usr/share/lib/zoneinfo/. */ @@ -615,10 +616,11 @@ free((void *) buf); return tz; } -#endif /*__solaris__*/ -#endif /*__linux__*/ + +#endif /* defined(__solaris__) */ -#ifdef _AIX +#elif defined(_AIX) + static char * getPlatformTimeZoneID() { @@ -644,178 +646,33 @@ return tz; } -static char *mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz); -#endif -/* - * findJavaTZ_md() maps platform time zone ID to Java time zone ID - * using /lib/tzmappings. If the TZ value is not found, it - * trys some libc implementation dependent mappings. If it still - * can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm - * form. - */ -/*ARGSUSED1*/ -char * -findJavaTZ_md(const char *java_home_dir) -{ - char *tz; - char *javatz = NULL; - char *freetz = NULL; - - tz = getenv("TZ"); - -#if defined(__linux__) || defined(_ALLBSD_SOURCE) - if (tz == NULL) { -#else -#if defined (__solaris__) || defined(_AIX) - if (tz == NULL || *tz == '\0') { -#endif -#endif - tz = getPlatformTimeZoneID(); - freetz = tz; - } - - /* - * Remove any preceding ':' - */ - if (tz != NULL && *tz == ':') { - tz++; - } - -#ifdef __solaris__ - if (tz != NULL && strcmp(tz, "localtime") == 0) { - tz = getSolarisDefaultZoneID(); - if (freetz != NULL) { - free((void *) freetz); - } - freetz = tz; - } -#endif - - if (tz != NULL) { -#ifdef __linux__ - /* - * Ignore "posix/" prefix. - */ - if (strncmp(tz, "posix/", 6) == 0) { - tz += 6; - } -#endif - javatz = strdup(tz); - if (freetz != NULL) { - free((void *) freetz); - } - -#ifdef _AIX - freetz = mapPlatformToJavaTimezone(java_home_dir, javatz); - if (javatz != NULL) { - free((void *) javatz); - } - javatz = freetz; -#endif - } - - return javatz; -} - -/** - * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00") - */ - -#ifdef MACOSX - -char * -getGMTOffsetID() -{ - time_t offset; - char sign, buf[32]; - struct tm *local_tm; - time_t clock; - time_t currenttime; - - clock = time(NULL); - tzset(); - local_tm = localtime(&clock); - if (local_tm->tm_gmtoff >= 0) { - offset = (time_t) local_tm->tm_gmtoff; - sign = '+'; - } else { - offset = (time_t) -local_tm->tm_gmtoff; - sign = '-'; - } - sprintf(buf, (const char *)"GMT%c%02d:%02d", - sign, (int)(offset/3600), (int)((offset%3600)/60)); - return strdup(buf); -} -#else - -char * -getGMTOffsetID() -{ - time_t offset; - char sign, buf[32]; -#ifdef __solaris__ - struct tm localtm; - time_t currenttime; - - currenttime = time(NULL); - if (localtime_r(¤ttime, &localtm) == NULL) { - return NULL; - } - - offset = localtm.tm_isdst ? altzone : timezone; -#else - offset = timezone; -#endif /*__linux__*/ - - if (offset == 0) { - return strdup("GMT"); - } - - /* Note that the time offset direction is opposite. */ - if (offset > 0) { - sign = '-'; - } else { - offset = -offset; - sign = '+'; - } - sprintf(buf, (const char *)"GMT%c%02d:%02d", - sign, (int)(offset/3600), (int)((offset%3600)/60)); - return strdup(buf); -} -#endif /* MACOSX */ - -#ifdef _AIX static char * mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { FILE *tzmapf; - char mapfilename[PATH_MAX+1]; + char mapfilename[PATH_MAX + 1]; char line[256]; int linecount = 0; - char temp[100], *temp_tz; + char *tz_buf = NULL; + char *temp_tz = NULL; char *javatz = NULL; - char *str_tmp = NULL; - size_t temp_tz_len = 0; + size_t tz_len = 0; /* On AIX, the TZ environment variable may end with a comma - * followed by modifier fields. These are ignored here. - */ - strncpy(temp, tz, 100); - temp_tz = strtok_r(temp, ",", &str_tmp); + * followed by modifier fields. These are ignored here. */ + temp_tz = strchr(tz, ','); + tz_len = (temp_tz == NULL) ? strlen(tz) : temp_tz - tz; + tz_buf = (char *)malloc(tz_len + 1); + memcpy(tz_buf, tz, tz_len); + tz_buf[tz_len] = 0; - if(temp_tz == NULL) - goto tzerr; - - temp_tz_len = strlen(temp_tz); - - if (strlen(java_home_dir) >= (PATH_MAX - 15)) { - jio_fprintf(stderr, "java.home longer than maximum path length \n"); + /* Open tzmappings file, with buffer overrun check */ + if ((strlen(java_home_dir) + 15) > PATH_MAX) { + jio_fprintf(stderr, "Path %s/lib/tzmappings exceeds maximum path length\n", java_home_dir); goto tzerr; } - - strncpy(mapfilename, java_home_dir, PATH_MAX); + strcpy(mapfilename, java_home_dir); strcat(mapfilename, "/lib/tzmappings"); - if ((tzmapf = fopen(mapfilename, "r")) == NULL) { jio_fprintf(stderr, "can't open %s\n", mapfilename); goto tzerr; @@ -848,7 +705,7 @@ } *p++ = '\0'; - if ((result = strncmp(temp_tz, sol, temp_tz_len)) == 0) { + if ((result = strncmp(tz_buf, sol, tz_len)) == 0) { /* * If this is the current platform zone ID, * take the Java time zone ID (2nd field). @@ -874,11 +731,150 @@ (void) fclose(tzmapf); tzerr: + if (tz_buf != NULL ) { + free((void *) tz_buf); + } + if (javatz == NULL) { return getGMTOffsetID(); } return javatz; } + +#endif /* defined(_AIX) */ + +/* + * findJavaTZ_md() maps platform time zone ID to Java time zone ID + * using /lib/tzmappings. If the TZ value is not found, it + * trys some libc implementation dependent mappings. If it still + * can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm + * form. + */ +/*ARGSUSED1*/ +char * +findJavaTZ_md(const char *java_home_dir) +{ + char *tz; + char *javatz = NULL; + char *freetz = NULL; + + tz = getenv("TZ"); + + if (tz == NULL || *tz == '\0') { + tz = getPlatformTimeZoneID(); + freetz = tz; + } + + if (tz != NULL) { + /* Ignore preceding ':' */ + if (*tz == ':') { + tz++; + } +#if defined(__linux__) + /* Ignore "posix/" prefix on Linux. */ + if (strncmp(tz, "posix/", 6) == 0) { + tz += 6; + } #endif +#if defined(_AIX) + /* On AIX do the platform to Java mapping. */ + javatz = mapPlatformToJavaTimezone(java_home_dir, tz); + if (freetz != NULL) { + free((void *) freetz); + } +#else +#if defined(__solaris__) + /* Solaris might use localtime, so handle it here. */ + if (strcmp(tz, "localtime") == 0) { + javatz = getSolarisDefaultZoneID(); + if (freetz != NULL) { + free((void *) freetz); + } + } else +#endif + if (freetz == NULL) { + /* strdup if we are still working on getenv result. */ + javatz = strdup(tz); + } else if (freetz != tz) { + /* strdup and free the old buffer, if we moved the pointer. */ + javatz = strdup(tz); + free((void *) freetz); + } else { + /* we are good if we already work on a freshly allocated buffer. */ + javatz = tz; + } +#endif + } + + return javatz; +} + +/** + * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00") + */ + +#if defined(MACOSX) + +char * +getGMTOffsetID() +{ + time_t offset; + char sign, buf[32]; + struct tm *local_tm; + time_t clock; + time_t currenttime; + + clock = time(NULL); + tzset(); + local_tm = localtime(&clock); + if (local_tm->tm_gmtoff >= 0) { + offset = (time_t) local_tm->tm_gmtoff; + sign = '+'; + } else { + offset = (time_t) -local_tm->tm_gmtoff; + sign = '-'; + } + sprintf(buf, (const char *)"GMT%c%02d:%02d", + sign, (int)(offset/3600), (int)((offset%3600)/60)); + return strdup(buf); +} + +#else + +char * +getGMTOffsetID() +{ + time_t offset; + char sign, buf[32]; +#if defined(__solaris__) + struct tm localtm; + time_t currenttime; + + currenttime = time(NULL); + if (localtime_r(¤ttime, &localtm) == NULL) { + return NULL; + } + + offset = localtm.tm_isdst ? altzone : timezone; +#else + offset = timezone; +#endif + + if (offset == 0) { + return strdup("GMT"); + } + + /* Note that the time offset direction is opposite. */ + if (offset > 0) { + sign = '-'; + } else { + offset = -offset; + sign = '+'; + } + sprintf(buf, (const char *)"GMT%c%02d:%02d", + sign, (int)(offset/3600), (int)((offset%3600)/60)); + return strdup(buf); +} +#endif /* MACOSX */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/native/libnet/AbstractPlainDatagramSocketImpl.c --- a/jdk/src/java.base/unix/native/libnet/AbstractPlainDatagramSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2014, 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. - */ - -#include -#include - -#ifdef __solaris__ -#include -#include - -#ifndef BSD_COMP -#define BSD_COMP -#endif - -#endif - -#include - -#include "jvm.h" -#include "jni_util.h" -#include "net_util.h" - -#include "java_net_AbstractPlainDatagramSocketImpl.h" - -static jfieldID IO_fd_fdID; - -static jfieldID apdsi_fdID; - - -/* - * Class: java_net_AbstractPlainDatagramSocketImpl - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { - - apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", - "Ljava/io/FileDescriptor;"); - CHECK_NULL(apdsi_fdID); - - IO_fd_fdID = NET_GetFileDescriptorID(env); -} - -/* - * Class: java_net_AbstractPlainDatagramSocketImpl - * Method: dataAvailable - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable -(JNIEnv *env, jobject this) { - int fd, retval; - - jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); - - if (IS_NULL(fdObj)) { - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", - "Socket closed"); - return -1; - } - fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); - - if (ioctl(fd, FIONREAD, &retval) < 0) { - return -1; - } - return retval; -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c --- a/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, 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 @@ -32,6 +32,12 @@ #ifdef __solaris__ #include +#include +#include + +#ifndef BSD_COMP +#define BSD_COMP +#endif #endif #ifdef __linux__ #include @@ -52,6 +58,8 @@ #endif #endif // __linux__ +#include + #ifndef IPTOS_TOS_MASK #define IPTOS_TOS_MASK 0x1e #endif @@ -2240,3 +2248,28 @@ { mcast_join_leave(env, this, iaObj, niObj, JNI_FALSE); } + +/* + * Class: java_net_PlainDatagramSocketImpl + * Method: dataAvailable + * Signature: ()I + */ +JNIEXPORT jint JNICALL +Java_java_net_PlainDatagramSocketImpl_dataAvailable(JNIEnv *env, jobject this) +{ + int fd, retval; + + jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); + + if (IS_NULL(fdObj)) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket closed"); + return -1; + } + fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); + + if (ioctl(fd, FIONREAD, &retval) < 0) { + return -1; + } + return retval; +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/unix/native/libnet/SdpSupport.c --- a/jdk/src/java.base/unix/native/libnet/SdpSupport.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/unix/native/libnet/SdpSupport.c Tue Sep 15 07:47:44 2015 -0700 @@ -118,6 +118,8 @@ RESTARTABLE(dup2(s, fd), res); if (res < 0) JNU_ThrowIOExceptionWithLastError(env, "dup2"); - RESTARTABLE(close(s), res); + res = close(s); + if (res < 0 && !(*env)->ExceptionOccurred(env)) + JNU_ThrowIOExceptionWithLastError(env, "close"); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java --- a/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2015, 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 @@ -45,7 +45,7 @@ class DefaultDatagramSocketImplFactory { - static Class prefixImplClass = null; + private final static Class prefixImplClass; /* the windows version. */ private static float version; @@ -54,16 +54,19 @@ private static boolean preferIPv4Stack = false; /* If the version supports a dual stack TCP implementation */ - private static boolean useDualStackImpl = false; + private final static boolean useDualStackImpl; /* sun.net.useExclusiveBind */ private static String exclBindProp; /* True if exclusive binding is on for Windows */ - private static boolean exclusiveBind = true; - + private final static boolean exclusiveBind; static { + Class prefixImplClassLocal = null; + boolean useDualStackImplLocal = false; + boolean exclusiveBindLocal = true; + // Determine Windows Version. java.security.AccessController.doPrivileged( new PrivilegedAction() { @@ -78,7 +81,7 @@ "java.net.preferIPv4Stack")); exclBindProp = System.getProperty( "sun.net.useExclusiveBind"); - } catch (NumberFormatException e ) { + } catch (NumberFormatException e) { assert false : e; } return null; // nothing to return @@ -87,14 +90,14 @@ // (version >= 6.0) implies Vista or greater. if (version >= 6.0 && !preferIPv4Stack) { - useDualStackImpl = true; + useDualStackImplLocal = true; } if (exclBindProp != null) { // sun.net.useExclusiveBind is true - exclusiveBind = exclBindProp.length() == 0 ? true + exclusiveBindLocal = exclBindProp.length() == 0 ? true : Boolean.parseBoolean(exclBindProp); } else if (version < 6.0) { - exclusiveBind = false; + exclusiveBindLocal = false; } // impl.prefix @@ -103,12 +106,16 @@ prefix = AccessController.doPrivileged( new sun.security.action.GetPropertyAction("impl.prefix", null)); if (prefix != null) - prefixImplClass = Class.forName("java.net."+prefix+"DatagramSocketImpl"); + prefixImplClassLocal = Class.forName("java.net."+prefix+"DatagramSocketImpl"); } catch (Exception e) { System.err.println("Can't find class: java.net." + prefix + "DatagramSocketImpl: check impl.prefix property"); } + + prefixImplClass = prefixImplClassLocal; + useDualStackImpl = useDualStackImplLocal; + exclusiveBind = exclusiveBindLocal; } /** @@ -126,12 +133,10 @@ throw new SocketException("can't instantiate DatagramSocketImpl"); } } else { - if (isMulticast) - exclusiveBind = false; if (useDualStackImpl && !isMulticast) return new DualStackPlainDatagramSocketImpl(exclusiveBind); else - return new TwoStacksPlainDatagramSocketImpl(exclusiveBind); + return new TwoStacksPlainDatagramSocketImpl(exclusiveBind && !isMulticast); } } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java --- a/jdk/src/java.base/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2015, 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 @@ -292,4 +292,6 @@ int optionValue) throws SocketException; private static native int socketGetIntOption(int fd, int cmd) throws SocketException; + + native int dataAvailable(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java --- a/jdk/src/java.base/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2015, 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 @@ -207,6 +207,8 @@ protected native void disconnect0(int family); + native int dataAvailable(); + /** * Perform class load-time initializations. */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c --- a/jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2014, 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. - */ - -#include -#include - -#include "jvm.h" -#include "jni_util.h" -#include "net_util.h" - -#include "java_net_AbstractPlainDatagramSocketImpl.h" - -static jfieldID IO_fd_fdID = NULL; -static jfieldID apdsi_fdID = NULL; - -static jfieldID apdsi_fd1ID = NULL; -static jclass two_stacks_clazz = NULL; - - -/* - * Class: java_net_AbstractPlainDatagramSocketImpl - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { - - apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", - "Ljava/io/FileDescriptor;"); - CHECK_NULL(apdsi_fdID); - IO_fd_fdID = NET_GetFileDescriptorID(env); - CHECK_NULL(IO_fd_fdID); - - two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl"); - CHECK_NULL(two_stacks_clazz); - - /* Handle both TwoStacks and DualStack here */ - - if (JNU_Equals(env, cls, two_stacks_clazz)) { - /* fd1 present only in TwoStack.. */ - apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1", - "Ljava/io/FileDescriptor;"); - CHECK_NULL(apdsi_fd1ID); - } - - JNU_CHECK_EXCEPTION(env); -} - -/* - * Class: java_net_AbstractPlainDatagramSocketImpl - * Method: dataAvailable - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable -(JNIEnv *env, jobject this) { - SOCKET fd; - SOCKET fd1; - int rv = -1, rv1 = -1; - jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); - - if (!IS_NULL(fdObj)) { - int retval = 0; - fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); - rv = ioctlsocket(fd, FIONREAD, &retval); - if (retval > 0) { - return retval; - } - } - - if (!IS_NULL(apdsi_fd1ID)) { - /* TwoStacks */ - jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID); - if (!IS_NULL(fd1Obj)) { - int retval = 0; - fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID); - rv1 = ioctlsocket(fd1, FIONREAD, &retval); - if (retval > 0) { - return retval; - } - } - } - - if (rv < 0 && rv1 < 0) { - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", - "Socket closed"); - return -1; - } - - return 0; -} - diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/native/libnet/DualStackPlainDatagramSocketImpl.c --- a/jdk/src/java.base/windows/native/libnet/DualStackPlainDatagramSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/native/libnet/DualStackPlainDatagramSocketImpl.c Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2015, 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 @@ -70,6 +70,9 @@ return got_icmp; } +static jfieldID IO_fd_fdID = NULL; +static jfieldID pdsi_fdID = NULL; + /* * Class: java_net_DualStackPlainDatagramSocketImpl * Method: initIDs @@ -78,6 +81,13 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_initIDs (JNIEnv *env, jclass clazz) { + pdsi_fdID = (*env)->GetFieldID(env, clazz, "fd", + "Ljava/io/FileDescriptor;"); + CHECK_NULL(pdsi_fdID); + IO_fd_fdID = NET_GetFileDescriptorID(env); + CHECK_NULL(IO_fd_fdID); + JNU_CHECK_EXCEPTION(env); + initInetAddressIDs(env); } @@ -503,3 +513,32 @@ return result; } + +/* + * Class: java_net_DualStackPlainDatagramSocketImpl + * Method: dataAvailable + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_dataAvailable +(JNIEnv *env, jobject this) { + SOCKET fd; + int rv = -1; + jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); + + if (!IS_NULL(fdObj)) { + int retval = 0; + fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); + rv = ioctlsocket(fd, FIONREAD, &retval); + if (retval > 0) { + return retval; + } + } + + if (rv < 0) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket closed"); + return -1; + } + + return 0; +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/native/libnet/DualStackPlainSocketImpl.c --- a/jdk/src/java.base/windows/native/libnet/DualStackPlainSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/native/libnet/DualStackPlainSocketImpl.c Tue Sep 15 07:47:44 2015 -0700 @@ -45,9 +45,10 @@ jclass cls = (*env)->FindClass(env, "java/net/InetSocketAddress"); CHECK_NULL(cls); isa_class = (*env)->NewGlobalRef(env, cls); + CHECK_NULL(isa_class); isa_ctorID = (*env)->GetMethodID(env, cls, "", "(Ljava/net/InetAddress;I)V"); - + CHECK_NULL(isa_ctorID); initInetAddressIDs(env); // implement read timeout with select. diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c --- a/jdk/src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, 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 @@ -2563,3 +2563,44 @@ { mcast_join_leave (env, this, iaObj, niObj, JNI_FALSE); } + +/* + * Class: java_net_TwoStacksPlainDatagramSocketImpl + * Method: dataAvailable + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_java_net_TwoStacksPlainDatagramSocketImpl_dataAvailable +(JNIEnv *env, jobject this) { + SOCKET fd; + SOCKET fd1; + int rv = -1, rv1 = -1; + jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); + jobject fd1Obj; + + if (!IS_NULL(fdObj)) { + int retval = 0; + fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); + rv = ioctlsocket(fd, FIONREAD, &retval); + if (retval > 0) { + return retval; + } + } + + fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID); + if (!IS_NULL(fd1Obj)) { + int retval = 0; + fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID); + rv1 = ioctlsocket(fd1, FIONREAD, &retval); + if (retval > 0) { + return retval; + } + } + + if (rv < 0 && rv1 < 0) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket closed"); + return -1; + } + + return 0; +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/MimeType.java --- a/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/MimeType.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/MimeType.java Tue Sep 15 07:47:44 2015 -0700 @@ -224,7 +224,7 @@ * Set the value to be associated with the given name, replacing * any previous association. * - * @throw IllegalArgumentException if parameter or value is illegal + * @throws IllegalArgumentException if parameter or value is illegal */ public void setParameter(String name, String value) { parameters.set(name, value); @@ -233,7 +233,7 @@ /** * Remove any value associated with the given name. * - * @throw IllegalArgumentException if parameter may not be deleted + * @throws IllegalArgumentException if parameter may not be deleted */ public void removeParameter(String name) { parameters.remove(name); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxButton.java --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxButton.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxButton.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, 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 @@ -58,6 +58,7 @@ this.list = list; setModel(new DefaultButtonModel() { + @Override public void setArmed(final boolean armed) { super.setArmed(isPressed() ? true : armed); } @@ -66,12 +67,13 @@ setEnabled(comboBox.isEnabled()); } + @Override public boolean isEnabled() { return comboBox == null ? true : comboBox.isEnabled(); } - @SuppressWarnings("deprecation") - public boolean isFocusTraversable() { + @Override + public boolean isFocusable() { return false; } @@ -92,6 +94,7 @@ return State.ACTIVE; } + @Override public void paintComponent(final Graphics g) { // Don't Paint the button as usual // super.paintComponent( g ); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameDockIconUI.java --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameDockIconUI.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameDockIconUI.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, 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 @@ -303,7 +303,7 @@ } } - @SuppressWarnings("deprecation") + @Deprecated public void hide() { final Container parent = getParent(); final Rectangle r = this.getBounds(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java Tue Sep 15 07:47:44 2015 -0700 @@ -991,9 +991,7 @@ "Tree.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[]{"ESCAPE", "cancel"}),}; table.putDefaults(defaults); - - Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true); - table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(true, table); } protected void initSystemColorDefaults(final UIDefaults table) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java --- a/jdk/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, 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 @@ -125,9 +125,8 @@ return fConfig; } - @SuppressWarnings("deprecation") protected void setBounds(int x, int y, int w, int h) { - fBounds.reshape(x, y, w, y + h); + fBounds.setBounds(x, y, w, y + h); } // START compositing support API diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLLayer.java --- a/jdk/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLLayer.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLLayer.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, 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 @@ -77,7 +77,7 @@ } public Object getDestination() { - return peer; + return peer.getTarget(); } public SurfaceData replaceSurfaceData() { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Sep 15 07:47:44 2015 -0700 @@ -576,6 +576,14 @@ : getDefaultMaximizedBounds()); } + public Rectangle getMaximizedBounds() { + synchronized (getStateLock()) { + return (maximizedBounds == null) + ? getDefaultMaximizedBounds() + : maximizedBounds; + } + } + private void setPlatformMaximizedBounds(Rectangle bounds) { platformWindow.setMaximizedBounds( bounds.x, bounds.y, diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Sep 15 07:47:44 2015 -0700 @@ -498,14 +498,9 @@ // to be sure that there are no setBounds requests in the queue. LWCToolkit.flushNativeSelectors(); this.normalBounds = peer.getBounds(); - - GraphicsConfiguration config = getPeer().getGraphicsConfiguration(); - Insets i = ((CGraphicsDevice)config.getDevice()).getScreenInsets(); - Rectangle toBounds = config.getBounds(); - setBounds(toBounds.x + i.left, - toBounds.y + i.top, - toBounds.width - i.left - i.right, - toBounds.height - i.top - i.bottom); + Rectangle maximizedBounds = peer.getMaximizedBounds(); + setBounds(maximizedBounds.x, maximizedBounds.y, + maximizedBounds.width, maximizedBounds.height); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,7 +26,6 @@ package com.sun.java.swing.plaf.gtk; import java.awt.*; -import java.awt.event.*; import java.beans.*; import java.io.File; import java.lang.ref.*; @@ -41,6 +40,8 @@ import com.sun.java.swing.plaf.gtk.GTKConstants.PositionType; import com.sun.java.swing.plaf.gtk.GTKConstants.StateType; +import java.util.HashMap; +import java.util.Map; import sun.awt.SunToolkit; import sun.awt.UNIXToolkit; import sun.awt.OSInfo; @@ -61,7 +62,7 @@ * We should assume ON - or some variation of ON as no GTK desktop * ships with it OFF. */ - static Object aaTextInfo; + static Map aaTextInfo; /** * Solaris, or Linux with Sun JDS in a CJK Locale. @@ -1337,7 +1338,9 @@ if (fallbackFont != null) { table.put("TitledBorder.font", fallbackFont); } - table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + if (aaTextInfo != null) { + table.putAll(aaTextInfo); + } } protected void initSystemColorDefaults(UIDefaults table) { @@ -1477,7 +1480,8 @@ * XRender. */ gtkAAFontSettingsCond = !isSunCJK && SwingUtilities2.isLocalDisplay(); - aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(gtkAAFontSettingsCond); + aaTextInfo = new HashMap<>(2); + SwingUtilities2.putAATextInfo(gtkAAFontSettingsCond, aaTextInfo); } static ReferenceQueue queue = new ReferenceQueue(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Tue Sep 15 07:47:44 2015 -0700 @@ -39,6 +39,8 @@ import sun.swing.plaf.synth.SynthIcon; import com.sun.java.swing.plaf.gtk.GTKEngine.WidgetType; +import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; +import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST; /** * @@ -115,10 +117,12 @@ @Override public void installDefaults(SynthContext context) { super.installDefaults(context); - if (!context.getRegion().isSubregion()) { - context.getComponent().putClientProperty( - SwingUtilities2.AA_TEXT_PROPERTY_KEY, - GTKLookAndFeel.aaTextInfo); + Map aaTextInfo = GTKLookAndFeel.aaTextInfo; + if (aaTextInfo != null && !context.getRegion().isSubregion()) { + context.getComponent().putClientProperty(KEY_TEXT_ANTIALIASING, + aaTextInfo.get(KEY_TEXT_ANTIALIASING)); + context.getComponent().putClientProperty(KEY_TEXT_LCD_CONTRAST, + aaTextInfo.get(KEY_TEXT_LCD_CONTRAST)); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Tue Sep 15 07:47:44 2015 -0700 @@ -556,8 +556,7 @@ * for both client property and UIDefaults. * Also need to set up listeners for changes in these settings. */ - Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true); - table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(true, table); this.aaSettings = new FontDesktopProperty(SunToolkit.DESKTOPFONTHINTS); } @@ -835,12 +834,12 @@ "InternalFrame.closeIcon", WindowsIconFactory.createFrameCloseIcon(), "InternalFrame.icon", - (LazyValue) t -> new Object[]{ + (LazyValue) t -> new WindowsInternalFrameTitlePane.ScalableIconUIResource(new Object[]{ // The constructor takes one arg: an array of UIDefaults.LazyValue // representing the icons SwingUtilities2.makeIcon(getClass(), BasicLookAndFeel.class, "icons/JavaCup16.png"), SwingUtilities2.makeIcon(getClass(), WindowsLookAndFeel.class, "icons/JavaCup32.png") - }, + }), // Internal Frame Auditory Cue Mappings "InternalFrame.closeSound", "win.sound.close", "InternalFrame.maximizeSound", "win.sound.maximize", @@ -2402,9 +2401,8 @@ } protected void updateUI() { - Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true); UIDefaults defaults = UIManager.getLookAndFeelDefaults(); - defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(true, defaults); super.updateUI(); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/java/awt/MultipleGradientPaintContext.java --- a/jdk/src/java.desktop/share/classes/java/awt/MultipleGradientPaintContext.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/java/awt/MultipleGradientPaintContext.java Tue Sep 15 07:47:44 2015 -0700 @@ -517,7 +517,7 @@ * * @param position the unmanipulated position, which will be mapped * into the range 0 to 1 - * @returns integer color to display + * @return integer color to display */ protected final int indexIntoGradientsArrays(float position) { // first, manipulate position value depending on the cycle method diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/java/awt/Robot.java --- a/jdk/src/java.desktop/share/classes/java/awt/Robot.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/java/awt/Robot.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, 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 @@ -33,13 +33,10 @@ import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.awt.peer.RobotPeer; -import java.lang.reflect.InvocationTargetException; -import java.security.AccessController; import sun.awt.AWTPermissions; import sun.awt.ComponentFactory; import sun.awt.SunToolkit; -import sun.awt.OSInfo; import sun.awt.image.SunWritableRaster; /** @@ -558,28 +555,8 @@ */ public synchronized void waitForIdle() { checkNotDispatchThread(); - - try { - SunToolkit.flushPendingEvents(); - // 7185258: realSync() call blocks all DnD tests on OS X - if (AccessController.doPrivileged(OSInfo.getOSTypeAction()) == OSInfo.OSType.MACOSX) { - // post a dummy event to the queue so we know when - // all the events before it have been processed - EventQueue.invokeAndWait( new Runnable() { - public void run() { - // dummy implementation - } - } ); - } else { - ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); - } - } catch(InterruptedException ite) { - System.err.println("Robot.waitForIdle, non-fatal exception caught:"); - ite.printStackTrace(); - } catch(InvocationTargetException ine) { - System.err.println("Robot.waitForIdle, non-fatal exception caught:"); - ine.printStackTrace(); - } + SunToolkit.flushPendingEvents(); + ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); } private void checkNotDispatchThread() { @@ -593,6 +570,7 @@ * * @return the string representation. */ + @Override public synchronized String toString() { String params = "autoDelay = "+getAutoDelay()+", "+"autoWaitForIdle = "+isAutoWaitForIdle(); return getClass().getName() + "[ " + params + " ]"; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/java/awt/Toolkit.java --- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Tue Sep 15 07:47:44 2015 -0700 @@ -448,7 +448,7 @@ * * @param s the error message * @param e the original exception - * @throw the new AWTError including the cause (the original exception) + * @throws the new AWTError including the cause (the original exception) */ private static void newAWTError(Throwable e, String s) { AWTError newAWTError = new AWTError(s); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/JColorChooser.java --- a/jdk/src/java.desktop/share/classes/javax/swing/JColorChooser.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/JColorChooser.java Tue Sep 15 07:47:44 2015 -0700 @@ -133,13 +133,42 @@ * returns true. * @see java.awt.GraphicsEnvironment#isHeadless */ + public static Color showDialog(Component component, + String title, Color initialColor) throws HeadlessException { + return showDialog(component, title, initialColor, true); + } + + /** + * Shows a modal color-chooser dialog and blocks until the + * dialog is hidden. If the user presses the "OK" button, then + * this method hides/disposes the dialog and returns the selected color. + * If the user presses the "Cancel" button or closes the dialog without + * pressing "OK", then this method hides/disposes the dialog and returns + * null. + * + * @param component the parent Component for the dialog + * @param title the String containing the dialog's title + * @param initialColor the initial Color set when the color-chooser is shown + * @param colorTransparencySelectionEnabled true if the transparency of + * a color can be selected + * @return the selected color or null if the user opted out + * @exception HeadlessException if GraphicsEnvironment.isHeadless() + * returns true. + * @see java.awt.GraphicsEnvironment#isHeadless + */ @SuppressWarnings("deprecation") - public static Color showDialog(Component component, - String title, Color initialColor) throws HeadlessException { + public static Color showDialog(Component component, String title, + Color initialColor, boolean colorTransparencySelectionEnabled) + throws HeadlessException { final JColorChooser pane = new JColorChooser(initialColor != null? initialColor : Color.white); + for (AbstractColorChooserPanel ccPanel : pane.getChooserPanels()) { + ccPanel.setColorTransparencySelectionEnabled( + colorTransparencySelectionEnabled); + } + ColorTracker ok = new ColorTracker(pane); JDialog dialog = createDialog(component, title, true, pane, ok, null); @@ -150,7 +179,6 @@ return ok.getColor(); } - /** * Creates and returns a new dialog containing the specified * ColorChooser pane along with "OK", "Cancel", and "Reset" diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/JComponent.java --- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Tue Sep 15 07:47:44 2015 -0700 @@ -377,7 +377,8 @@ /** * AA text hints. */ - transient private Object aaTextInfo; + transient private Object aaHint; + transient private Object lcdRenderingHint; static Graphics safelyGetGraphics(Component c) { return safelyGetGraphics(c, SwingUtilities.getRoot(c)); @@ -616,6 +617,15 @@ */ public void updateUI() {} + /** + * Returns the look and feel delegate that renders this component. + * + * @return the {@code ComponentUI} object that renders this component + * @since 1.9 + */ + public ComponentUI getUI() { + return ui; + } /** * Sets the look and feel delegate for this component. @@ -655,8 +665,10 @@ uninstallUIAndProperties(); // aaText shouldn't persist between look and feels, reset it. - aaTextInfo = - UIManager.getDefaults().get(SwingUtilities2.AA_TEXT_PROPERTY_KEY); + aaHint = UIManager.getDefaults().get( + RenderingHints.KEY_TEXT_ANTIALIASING); + lcdRenderingHint = UIManager.getDefaults().get( + RenderingHints.KEY_TEXT_LCD_CONTRAST); ComponentUI oldUI = ui; ui = newUI; if (ui != null) { @@ -4048,8 +4060,10 @@ * @see #putClientProperty */ public final Object getClientProperty(Object key) { - if (key == SwingUtilities2.AA_TEXT_PROPERTY_KEY) { - return aaTextInfo; + if (key == RenderingHints.KEY_TEXT_ANTIALIASING) { + return aaHint; + } else if (key == RenderingHints.KEY_TEXT_LCD_CONTRAST) { + return lcdRenderingHint; } else if (key == SwingUtilities2.COMPONENT_UI_PROPERTY_KEY) { return ui; } @@ -4091,8 +4105,11 @@ * @see #addPropertyChangeListener */ public final void putClientProperty(Object key, Object value) { - if (key == SwingUtilities2.AA_TEXT_PROPERTY_KEY) { - aaTextInfo = value; + if (key == RenderingHints.KEY_TEXT_ANTIALIASING) { + aaHint = value; + return; + } else if (key == RenderingHints.KEY_TEXT_LCD_CONTRAST) { + lcdRenderingHint = value; return; } if (value == null && clientProperties == null) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/JTabbedPane.java --- a/jdk/src/java.desktop/share/classes/javax/swing/JTabbedPane.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/JTabbedPane.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, 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 @@ -2304,8 +2304,10 @@ } public Rectangle getBounds() { - return parent.getUI().getTabBounds(parent, - parent.indexOfTab(title)); + int i = parent.indexOfTab(title); + // Check for no title. Even though that's a bug in the app we should + // inhibit an ArrayIndexOutOfBoundsException from getTabBounds. + return (i == -1) ? null : parent.getUI().getTabBounds(parent, i); } public void setBounds(Rectangle r) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java --- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Tue Sep 15 07:47:44 2015 -0700 @@ -50,6 +50,14 @@ @SuppressWarnings("serial") // Same-version serialization only public abstract class AbstractColorChooserPanel extends JPanel { + + /** + * Identifies that the transparency of the color (alpha value) can be + * selected + */ + public static final String TRANSPARENCY_ENABLED_PROPERTY + = "TransparencyEnabled"; + private final PropertyChangeListener enabledListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { Object value = event.getNewValue(); @@ -202,6 +210,40 @@ } /** + * Sets whether color chooser panel allows to select the transparency + * (alpha value) of a color. + * This method fires a property-changed event, using the string value of + * {@code TRANSPARENCY_ENABLED_PROPERTY} as the name + * of the property. + * + *

The value is a hint and may not be applicable to all types of chooser + * panel. + * + *

The default value is {@code true}. + * + * @param b true if the transparency of a color can be selected + * + * @beaninfo + * bound: true + * description: Sets the transparency of a color selection on or off. + * + * @see #isColorTransparencySelectionEnabled() + */ + public void setColorTransparencySelectionEnabled(boolean b){ + } + + /** + * Gets whether color chooser panel allows to select the transparency + * (alpha value) of a color. + * + * @return true if the transparency of a color can be selected + * @see #setColorTransparencySelectionEnabled(boolean) + */ + public boolean isColorTransparencySelectionEnabled(){ + return true; + } + + /** * Draws the panel. * @param g the Graphics object */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserPanel.java --- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Tue Sep 15 07:47:44 2015 -0700 @@ -176,6 +176,21 @@ return null; } + @Override + public void setColorTransparencySelectionEnabled(boolean b){ + boolean oldValue = isColorTransparencySelectionEnabled(); + if (b != oldValue) { + panel.setColorTransparencySelectionEnabled(b); + firePropertyChange(TRANSPARENCY_ENABLED_PROPERTY, + oldValue, b); + } + } + + @Override + public boolean isColorTransparencySelectionEnabled(){ + return panel.isColorTransparencySelectionEnabled(); + } + public void propertyChange(PropertyChangeEvent event) { ColorSelectionModel model = getColorSelectionModel(); if (model != null) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorPanel.java --- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorPanel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorPanel.java Tue Sep 15 07:47:44 2015 -0700 @@ -145,7 +145,7 @@ } void colorChanged() { - this.color = new Color(getColor(0), true); + this.color = new Color(getColor(0), isColorTransparencySelectionEnabled()); Object parent = getParent(); if (parent instanceof ColorChooserPanel) { ColorChooserPanel chooser = (ColorChooserPanel) parent; @@ -208,6 +208,17 @@ return this.model.getColor(this.values); } + void setColorTransparencySelectionEnabled(boolean b) { + if (spinners[model.getCount() - 1].isVisible() != b) { + spinners[model.getCount() - 1].setVisible(b); + colorChanged(); + } + } + + boolean isColorTransparencySelectionEnabled() { + return spinners[model.getCount() - 1].isVisible(); + } + private void setValue(int index) { this.values[index] = this.spinners[index].getValue(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/colorchooser/SlidingSpinner.java --- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/SlidingSpinner.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/SlidingSpinner.java Tue Sep 15 07:47:44 2015 -0700 @@ -95,6 +95,10 @@ this.spinner.setVisible(visible); } + boolean isVisible() { + return this.slider.isVisible(); + } + public void stateChanged(ChangeEvent event) { if (!this.internal) { if (this.spinner == event.getSource()) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/plaf/LayerUI.java --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/LayerUI.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/LayerUI.java Tue Sep 15 07:47:44 2015 -0700 @@ -90,7 +90,7 @@ * and set the layer event mask to {@code 0} * in {@link #uninstallUI(javax.swing.JComponent)} after that. * By default this method calls the appropriate - * {@code process<event type>Event} + * {@code processEvent} * method for the given class of event. *

* Note: Events are processed only for displayable {@code JLayer}s. diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Tue Sep 15 07:47:44 2015 -0700 @@ -35,11 +35,11 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; +import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; +import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST; import sun.swing.DefaultLookup; -import static sun.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY; - /** * The class that manages a basic title bar *

@@ -217,8 +217,10 @@ } private void updateProperties() { - final Object aaTextInfo = frame.getClientProperty(AA_TEXT_PROPERTY_KEY); - putClientProperty(AA_TEXT_PROPERTY_KEY, aaTextInfo); + putClientProperty(KEY_TEXT_ANTIALIASING, + frame.getClientProperty(KEY_TEXT_ANTIALIASING)); + putClientProperty(KEY_TEXT_LCD_CONTRAST, + frame.getClientProperty(KEY_TEXT_LCD_CONTRAST)); } /** diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Tue Sep 15 07:47:44 2015 -0700 @@ -1514,8 +1514,7 @@ flushUnreferenced(); // Remove old listeners boolean lafCond = SwingUtilities2.isLocalDisplay(); - Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(lafCond); - table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(lafCond, table); new AATextListener(this); } @@ -2204,9 +2203,7 @@ } UIDefaults defaults = UIManager.getLookAndFeelDefaults(); boolean lafCond = SwingUtilities2.isLocalDisplay(); - Object aaTextInfo = - SwingUtilities2.AATextInfo.getAATextInfo(lafCond); - defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(lafCond, defaults); updateUI(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Tue Sep 15 07:47:44 2015 -0700 @@ -688,8 +688,7 @@ // enabled antialiasing depending on desktop settings flushUnreferenced(); - Object aaTextInfo = getAATextInfo(); - table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(useLAFConditions(), table); new AATextListener(this); if (defaultsMap != null) { @@ -794,7 +793,7 @@ * * @return the text antialiasing information associated to the desktop */ - private static Object getAATextInfo() { + private static boolean useLAFConditions() { String language = Locale.getDefault().getLanguage(); String desktop = AccessController.doPrivileged(new GetPropertyAction("sun.desktop")); @@ -805,10 +804,7 @@ boolean isGnome = "gnome".equals(desktop); boolean isLocal = SwingUtilities2.isLocalDisplay(); - boolean setAA = isLocal && (!isGnome || !isCjkLocale); - - Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(setAA); - return aaTextInfo; + return isLocal && (!isGnome || !isCjkLocale); } private static ReferenceQueue queue = new ReferenceQueue(); @@ -844,8 +840,7 @@ return; } - Object aaTextInfo = getAATextInfo(); - defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo); + SwingUtilities2.putAATextInfo(useLAFConditions(), defaults); updateUI(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFReader.java --- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFReader.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFReader.java Tue Sep 15 07:47:44 2015 -0700 @@ -298,8 +298,8 @@ * Handles a parameterless RTF keyword. This is called by the superclass * (RTFParser) when a keyword is found in the input stream. * - * @returns true if the keyword is recognized and handled; - * false otherwise + * @return true if the keyword is recognized and handled; + * false otherwise * @see RTFParser#handleKeyword */ public boolean handleKeyword(String keyword) @@ -444,8 +444,8 @@ * This is called by the superclass * (RTFParser) when a keyword is found in the input stream. * - * @returns true if the keyword is recognized and handled; - * false otherwise + * @return true if the keyword is recognized and handled; + * false otherwise * @see RTFParser#handleKeyword */ public boolean handleKeyword(String keyword, int parameter) @@ -553,7 +553,7 @@ * array of characters, mapping unsigned byte values to their Unicode * equivalents. The character set is loaded if necessary. * - * @returns the character set + * @return the character set */ public static Object getCharacterSet(final String name) @@ -577,7 +577,7 @@ * must contain 256 decimal integers, separated by whitespace, with * no punctuation. B- and C- style comments are allowed. * - * @returns the newly read character set + * @return the newly read character set */ static char[] readCharset(InputStream strm) throws IOException @@ -1349,7 +1349,7 @@ * Calculates the current text (character) attributes in a form suitable * for SwingText from the current parser state. * - * @returns a new MutableAttributeSet containing the text attributes. + * @return a new MutableAttributeSet containing the text attributes. */ MutableAttributeSet currentTextAttributes() { @@ -1410,7 +1410,7 @@ * Calculates the current paragraph attributes (with keys * as given in StyleConstants) from the current parser state. * - * @returns a newly created MutableAttributeSet. + * @return a newly created MutableAttributeSet. * @see StyleConstants */ MutableAttributeSet currentParagraphAttributes() @@ -1449,7 +1449,7 @@ * Calculates the current section attributes * from the current parser state. * - * @returns a newly created MutableAttributeSet. + * @return a newly created MutableAttributeSet. */ public AttributeSet currentSectionAttributes() { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java --- a/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java Tue Sep 15 07:47:44 2015 -0700 @@ -124,18 +124,7 @@ * @param appContext AppContext to associate with the event queue */ private static void initEQ(AppContext appContext) { - EventQueue eventQueue; - - String eqName = System.getProperty("AWT.EventQueueClass", - "java.awt.EventQueue"); - - try { - eventQueue = (EventQueue)Class.forName(eqName).newInstance(); - } catch (Exception e) { - e.printStackTrace(); - System.err.println("Failed loading " + eqName + ": " + e); - eventQueue = new EventQueue(); - } + EventQueue eventQueue = new EventQueue(); appContext.put(AppContext.EVENT_QUEUE_KEY, eventQueue); PostEventQueue postEventQueue = new PostEventQueue(eventQueue); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/awt/shell/DefaultShellFolder.java --- a/jdk/src/java.desktop/share/classes/sun/awt/shell/DefaultShellFolder.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/awt/shell/DefaultShellFolder.java Tue Sep 15 07:47:44 2015 -0700 @@ -50,7 +50,7 @@ * this default implementation can always be represented with a * java.io.File object instead. * - * @returns a java.io.File replacement object. + * @return a java.io.File replacement object. */ protected Object writeReplace() throws java.io.ObjectStreamException { return new File(getPath()); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java --- a/jdk/src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java Tue Sep 15 07:47:44 2015 -0700 @@ -67,8 +67,8 @@ * java.io.File instead. If not, then the object is most likely * depending on some internal (native) state and cannot be serialized. * - * @returns a java.io.File replacement object, or null - * if no suitable replacement can be found. + * @return a java.io.File replacement object, or null + * if no suitable replacement can be found. */ protected abstract Object writeReplace() throws java.io.ObjectStreamException; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java --- a/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java Tue Sep 15 07:47:44 2015 -0700 @@ -419,8 +419,8 @@ /** * Presents the user a dialog for changing properties of the * print job interactively. - * @returns false if the user cancels the dialog and - * true otherwise. + * @return false if the user cancels the dialog and + * true otherwise. * @exception HeadlessException if GraphicsEnvironment.isHeadless() * returns true. * @see java.awt.GraphicsEnvironment#isHeadless diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java --- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Tue Sep 15 07:47:44 2015 -0700 @@ -964,8 +964,8 @@ /** * Presents the user a dialog for changing properties of the * print job interactively. - * @returns false if the user cancels the dialog and - * true otherwise. + * @return false if the user cancels the dialog and + * true otherwise. * @exception HeadlessException if GraphicsEnvironment.isHeadless() * returns true. * @see java.awt.GraphicsEnvironment#isHeadless diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java --- a/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Tue Sep 15 07:47:44 2015 -0700 @@ -103,14 +103,6 @@ new FontRenderContext(null, false, false); /** - * A JComponent client property is used to determine text aa settings. - * To avoid having this property persist between look and feels changes - * the value of the property is set to null in JComponent.setUI - */ - public static final Object AA_TEXT_PROPERTY_KEY = - new StringBuffer("AATextInfoPropertyKey"); - - /** * Attribute key for the content elements. If it is set on an element, the * element is considered to be a line break. */ @@ -123,58 +115,23 @@ private static final StringBuilder SKIP_CLICK_COUNT = new StringBuilder("skipClickCount"); - /* Presently this class assumes default fractional metrics. - * This may need to change to emulate future platform L&Fs. - */ - public static class AATextInfo { - - private static AATextInfo getAATextInfoFromMap(Map hints) { - - Object aaHint = hints.get(KEY_TEXT_ANTIALIASING); - Object contHint = hints.get(KEY_TEXT_LCD_CONTRAST); - - if (aaHint == null || - aaHint == VALUE_TEXT_ANTIALIAS_OFF || - aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) { - return null; - } else { - return new AATextInfo(aaHint, (Integer)contHint); - } - } + @SuppressWarnings("unchecked") + public static void putAATextInfo(boolean lafCondition, + Map map) { + SunToolkit.setAAFontSettingsCondition(lafCondition); + Toolkit tk = Toolkit.getDefaultToolkit(); + Object desktopHints = tk.getDesktopProperty(SunToolkit.DESKTOPFONTHINTS); - @SuppressWarnings("unchecked") - public static AATextInfo getAATextInfo(boolean lafCondition) { - SunToolkit.setAAFontSettingsCondition(lafCondition); - Toolkit tk = Toolkit.getDefaultToolkit(); - Object map = tk.getDesktopProperty(SunToolkit.DESKTOPFONTHINTS); - if (map instanceof Map) { - return getAATextInfoFromMap((Map)map); - } else { - return null; + if (desktopHints instanceof Map) { + Map hints = (Map) desktopHints; + Object aaHint = hints.get(KEY_TEXT_ANTIALIASING); + if (aaHint == null + || aaHint == VALUE_TEXT_ANTIALIAS_OFF + || aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) { + return; } - } - - Object aaHint; - Integer lcdContrastHint; - FontRenderContext frc; - - /* These are rarely constructed objects, and only when a complete - * UI is being updated, so the cost of the tests here is minimal - * and saves tests elsewhere. - * We test that the values are ones we support/expect. - */ - public AATextInfo(Object aaHint, Integer lcdContrastHint) { - if (aaHint == null) { - throw new InternalError("null not allowed here"); - } - if (aaHint == VALUE_TEXT_ANTIALIAS_OFF || - aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) { - throw new InternalError("AA must be on"); - } - this.aaHint = aaHint; - this.lcdContrastHint = lcdContrastHint; - this.frc = new FontRenderContext(null, aaHint, - VALUE_FRACTIONALMETRICS_DEFAULT); + map.put(KEY_TEXT_ANTIALIASING, aaHint); + map.put(KEY_TEXT_LCD_CONTRAST, hints.get(KEY_TEXT_LCD_CONTRAST)); } } @@ -241,22 +198,6 @@ // /** - * Returns whether or not text should be drawn antialiased. - * - * @param c JComponent to test. - * @return Whether or not text should be drawn antialiased for the - * specified component. - */ - public static AATextInfo drawTextAntialiased(JComponent c) { - if (c != null) { - /* a non-null property implies some form of AA requested */ - return (AATextInfo)c.getClientProperty(AA_TEXT_PROPERTY_KEY); - } - // No component, assume aa is off - return null; - } - - /** * Returns the left side bearing of the first character of string. The * left side bearing is calculated from the passed in * FontMetrics. If the passed in String is less than one @@ -530,7 +471,6 @@ // If we get here we're not printing if (g instanceof Graphics2D) { - AATextInfo info = drawTextAntialiased(c); Graphics2D g2 = (Graphics2D)g; boolean needsTextLayout = ((c != null) && @@ -543,21 +483,27 @@ } } - if (info != null) { + Object aaHint = (c == null) + ? null + : c.getClientProperty(KEY_TEXT_ANTIALIASING); + if (aaHint != null) { Object oldContrast = null; Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING); - if (info.aaHint != oldAAValue) { - g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint); + if (aaHint != oldAAValue) { + g2.setRenderingHint(KEY_TEXT_ANTIALIASING, aaHint); } else { oldAAValue = null; } - if (info.lcdContrastHint != null) { + + Object lcdContrastHint = c.getClientProperty( + KEY_TEXT_LCD_CONTRAST); + if (lcdContrastHint != null) { oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST); - if (info.lcdContrastHint.equals(oldContrast)) { + if (lcdContrastHint.equals(oldContrast)) { oldContrast = null; } else { g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST, - info.lcdContrastHint); + lcdContrastHint); } } @@ -821,24 +767,28 @@ } // Assume we're not printing if we get here, or that we are invoked // via Swing text printing which is laid out for the printer. - AATextInfo info = drawTextAntialiased(c); - if (info != null && (g instanceof Graphics2D)) { + Object aaHint = (c == null) + ? null + : c.getClientProperty(KEY_TEXT_ANTIALIASING); + if (aaHint != null && (g instanceof Graphics2D)) { Graphics2D g2 = (Graphics2D)g; Object oldContrast = null; Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING); - if (info.aaHint != null && info.aaHint != oldAAValue) { - g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint); + if (aaHint != null && aaHint != oldAAValue) { + g2.setRenderingHint(KEY_TEXT_ANTIALIASING, aaHint); } else { oldAAValue = null; } - if (info.lcdContrastHint != null) { + + Object lcdContrastHint = c.getClientProperty(KEY_TEXT_LCD_CONTRAST); + if (lcdContrastHint != null) { oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST); - if (info.lcdContrastHint.equals(oldContrast)) { + if (lcdContrastHint.equals(oldContrast)) { oldContrast = null; } else { g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST, - info.lcdContrastHint); + lcdContrastHint); } } @@ -1117,15 +1067,35 @@ */ private static FontRenderContext getFRCProperty(JComponent c) { if (c != null) { - AATextInfo info = - (AATextInfo)c.getClientProperty(AA_TEXT_PROPERTY_KEY); - if (info != null) { - return info.frc; + Object aaHint = c.getClientProperty(KEY_TEXT_ANTIALIASING); + if (aaHint != null) { + return getFRCFromCache(aaHint); } } return null; } + private static final Object APP_CONTEXT_FRC_CACHE_KEY = new Object(); + + private static FontRenderContext getFRCFromCache(Object aaHint) { + @SuppressWarnings("unchecked") + Map cache = (Map) + AppContext.getAppContext().get(APP_CONTEXT_FRC_CACHE_KEY); + + if (cache == null) { + cache = new HashMap<>(); + AppContext.getAppContext().put(APP_CONTEXT_FRC_CACHE_KEY, cache); + } + + FontRenderContext frc = cache.get(aaHint); + if (frc == null) { + frc = new FontRenderContext(null, aaHint, + VALUE_FRACTIONALMETRICS_DEFAULT); + cache.put(aaHint, frc); + } + return frc; + } + /* * returns true if the Graphics is print Graphics * false otherwise diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/unix/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java Tue Sep 15 07:47:44 2015 -0700 @@ -96,7 +96,7 @@ /** * Processes the specified client message event. * - * @returns true if the event was successfully processed. + * @return true if the event was successfully processed. */ public boolean processClientMessage(XClientMessageEvent xclient) { if (xclient.get_message_type() != diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/unix/classes/sun/awt/X11/XDnDDragSourceProtocol.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDnDDragSourceProtocol.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDnDDragSourceProtocol.java Tue Sep 15 07:47:44 2015 -0700 @@ -68,7 +68,7 @@ /** * Performs protocol-specific drag initialization. * - * @returns true if the initialized successfully. + * @return true if the initialized successfully. */ protected void initializeDragImpl(int actions, Transferable contents, Map formatMap, long[] formats) diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceContextPeer.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceContextPeer.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceContextPeer.java Tue Sep 15 07:47:44 2015 -0700 @@ -379,7 +379,7 @@ /** * Updates the source action according to the specified state. * - * @returns true if the source + * @return true if the source */ private boolean updateSourceAction(int state) { int action = SunDragSourceContextPeer.convertModifiersToDropAction(XWindow.getModifiers(state, 0, 0), @@ -570,7 +570,7 @@ /** * The caller must own awtLock. * - * @returns true if the even was processed and shouldn't be passed along. + * @return true if the event was processed and shouldn't be passed along. */ private boolean doProcessEvent(XEvent ev) { assert XToolkit.isAWTLockHeldByCurrentThread(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceProtocol.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceProtocol.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceProtocol.java Tue Sep 15 07:47:44 2015 -0700 @@ -140,7 +140,7 @@ /** * Processes the specified client message event. * - * @returns true if the event was successfully processed. + * @return true if the event was successfully processed. */ public abstract boolean processClientMessage(XClientMessageEvent xclient) throws XException; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java Tue Sep 15 07:47:44 2015 -0700 @@ -293,7 +293,7 @@ /** * Query and then return the current composition state. - * @returns the composition state if isCompositionEnabled call + * @return the composition state if isCompositionEnabled call * is successful. Otherwise, it returns false. */ private boolean getCompositionState() { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsEnvironment.java --- a/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsEnvironment.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsEnvironment.java Tue Sep 15 07:47:44 2015 -0700 @@ -97,14 +97,14 @@ * Returns the number of pixels per logical inch along the screen width. * In a system with multiple display monitors, this value is the same for * all monitors. - * @returns number of pixels per logical inch in X direction + * @return number of pixels per logical inch in X direction */ public native int getXResolution(); /** * Returns the number of pixels per logical inch along the screen height. * In a system with multiple display monitors, this value is the same for * all monitors. - * @returns number of pixels per logical inch in Y direction + * @return number of pixels per logical inch in Y direction */ public native int getYResolution(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java --- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Tue Sep 15 07:47:44 2015 -0700 @@ -556,8 +556,8 @@ /** * Presents the user a dialog for changing properties of the * print job interactively. - * @returns false if the user cancels the dialog and - * true otherwise. + * @return false if the user cancels the dialog and + * true otherwise. * @exception HeadlessException if GraphicsEnvironment.isHeadless() * returns true. * @see java.awt.GraphicsEnvironment#isHeadless diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java --- a/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Tue Sep 15 07:47:44 2015 -0700 @@ -201,8 +201,8 @@ * - it's one of the classes likely to have custom rendering worth * accelerating * - * @returns true if we can use a d3d surface for this peer's onscreen - * rendering + * @return true if we can use a d3d surface for this peer's onscreen + * rendering */ public static boolean canUseD3DOnScreen(final WComponentPeer peer, final Win32GraphicsConfig gc, diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.management/share/classes/sun/management/HotspotCompilation.java --- a/jdk/src/java.management/share/classes/sun/management/HotspotCompilation.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.management/share/classes/sun/management/HotspotCompilation.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, 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 @@ -76,7 +76,6 @@ private LongCounter lastInvalidatedType; private class CompilerThreadInfo { - int index; String name; StringCounter method; LongCounter type; @@ -90,14 +89,6 @@ this.compiles = (LongCounter) lookup(basename + "compiles"); this.time = (LongCounter) lookup(basename + "time"); } - CompilerThreadInfo(String bname) { - String basename = bname + "."; - this.name = bname; - this.method = (StringCounter) lookup(basename + "method"); - this.type = (LongCounter) lookup(basename + "type"); - this.compiles = (LongCounter) lookup(basename + "compiles"); - this.time = (LongCounter) lookup(basename + "time"); - } CompilerThreadStat getCompilerThreadStat() { MethodInfo minfo = new MethodInfo(method.stringValue(), @@ -109,7 +100,7 @@ minfo); } } - private CompilerThreadInfo[] threads; + private List threads; private int numActiveThreads; // number of active compiler threads private Map counters; @@ -158,18 +149,12 @@ numActiveThreads = (int) compilerThreads.longValue(); // Allocate CompilerThreadInfo for compilerThread and adaptorThread - threads = new CompilerThreadInfo[numActiveThreads+1]; + threads = new ArrayList(); - // AdaptorThread has index 0 - if (counters.containsKey(SUN_CI + "adapterThread.compiles")) { - threads[0] = new CompilerThreadInfo("adapterThread", 0); - numActiveThreads++; - } else { - threads[0] = null; - } - - for (int i = 1; i < threads.length; i++) { - threads[i] = new CompilerThreadInfo("compilerThread", i-1); + for (int i = 0; i < numActiveThreads; i++) { + if (counters.containsKey(SUN_CI + "compilerThread." + i + ".method")) { + threads.add(new CompilerThreadInfo("compilerThread", i)); + } } } @@ -197,15 +182,10 @@ return nmethodSize.longValue(); } - public java.util.List getCompilerThreadStats() { - List list = new ArrayList<>(threads.length); - int i = 0; - if (threads[0] == null) { - // no adaptor thread - i = 1; - } - for (; i < threads.length; i++) { - list.add(threads[i].getCompilerThreadStat()); + public List getCompilerThreadStats() { + List list = new ArrayList<>(threads.size()); + for (CompilerThreadInfo info : threads) { + list.add(info.getCompilerThreadStat()); } return list; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java --- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,18 +25,12 @@ package sun.security.provider.certpath.ldap; -import java.math.BigInteger; import java.net.URI; -import java.util.*; - import java.security.*; -import java.security.cert.Certificate; import java.security.cert.*; -import javax.security.auth.x500.X500Principal; - +import java.util.*; import sun.security.util.Cache; import sun.security.util.Debug; -import sun.security.x509.X500Name; /** * A CertStore that retrieves Certificates and @@ -93,8 +87,6 @@ private static final Debug debug = Debug.getInstance("certpath"); - private final static boolean DEBUG = false; - private String ldapDN; private LDAPCertStoreImpl impl; @@ -108,7 +100,7 @@ String dn = null; if (params == null) { throw new InvalidAlgorithmParameterException( - "parameters required for LDAP Certore"); + "Parameters required for LDAP certstore"); } if (params instanceof LDAPCertStoreParameters) { LDAPCertStoreParameters p = (LDAPCertStoreParameters) params; @@ -119,7 +111,9 @@ URI u = p.getURI(); if (!u.getScheme().equalsIgnoreCase("ldap")) { throw new InvalidAlgorithmParameterException( - "Only LDAP URIs are supported for LDAP Certore"); + "Unsupported scheme '" + u.getScheme() + + "', only LDAP URIs are supported " + + "for LDAP certstore"); } // Use the same default values as in LDAPCertStoreParameters // if unspecified in URI @@ -137,8 +131,9 @@ } } else { throw new InvalidAlgorithmParameterException( - "parameters must be either LDAPCertStoreParameters or " + - "URICertStoreParameters"); + "Parameters must be either LDAPCertStoreParameters or " + + "URICertStoreParameters, but instance of " + + params.getClass().getName() + " passed"); } Key k = new Key(serverName, port); @@ -236,6 +231,7 @@ * match the specified selector * @throws CertStoreException if an exception occurs */ + @Override public synchronized Collection engineGetCertificates (CertSelector selector) throws CertStoreException { if (debug != null) { @@ -245,7 +241,9 @@ if (selector == null) { selector = new X509CertSelector(); } else if (!(selector instanceof X509CertSelector)) { - throw new CertStoreException("need X509CertSelector to find certs"); + throw new CertStoreException("Need X509CertSelector to find certs, " + + "but instance of " + selector.getClass().getName() + + " passed"); } return impl.getCertificates((X509CertSelector) selector, ldapDN); } @@ -271,6 +269,7 @@ * match the specified selector * @throws CertStoreException if an exception occurs */ + @Override public synchronized Collection engineGetCRLs(CRLSelector selector) throws CertStoreException { if (debug != null) { @@ -281,7 +280,9 @@ if (selector == null) { selector = new X509CRLSelector(); } else if (!(selector instanceof X509CRLSelector)) { - throw new CertStoreException("need X509CRLSelector to find CRLs"); + throw new CertStoreException("Need X509CRLSelector to find CRLs, " + + "but instance of " + selector.getClass().getName() + + " passed"); } return impl.getCRLs((X509CRLSelector) selector, ldapDN); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeKey.java --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeKey.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeKey.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,19 +31,9 @@ import java.lang.ref.*; import java.math.BigInteger; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.Key; -import java.security.PublicKey; -import java.security.PrivateKey; -import java.security.KeyFactorySpi; -import java.security.interfaces.RSAPrivateCrtKey; -import java.security.interfaces.RSAPublicKey; - -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.security.spec.RSAPrivateCrtKeySpec; -import java.security.spec.RSAPublicKeySpec; +import java.security.*; +import java.security.interfaces.*; +import java.security.spec.*; /** * Wrapper class for native keys needed for using ucrypto APIs. @@ -87,6 +77,41 @@ return b; } + static final class RSAPrivate extends NativeKey implements RSAPrivateKey { + + private static final long serialVersionUID = 1622705588904302831L; + + private final RSAPrivateKeySpec keySpec; + private final long keyId; + + RSAPrivate(KeySpec keySpec) throws InvalidKeySpecException { + super(2); + long pKey = 0L; + if (keySpec instanceof RSAPrivateKeySpec) { + RSAPrivateKeySpec ks = (RSAPrivateKeySpec) keySpec; + BigInteger mod = ks.getModulus(); + BigInteger privateExp = ks.getPrivateExponent(); + pKey = nativeInit(NativeKey.getMagnitude(mod), + NativeKey.getMagnitude(privateExp)); + } else { + throw new InvalidKeySpecException("Only supports RSAPrivateKeySpec"); + } + if (pKey == 0L) { + throw new UcryptoException("Error constructing RSA PrivateKey"); + } + // track native resource clean up + new KeyRef(this, pKey); + this.keySpec = (RSAPrivateKeySpec) keySpec; + this.keyId = pKey; + } + + long value() { return keyId; } + public BigInteger getModulus() { return keySpec.getModulus(); }; + public BigInteger getPrivateExponent() { return keySpec.getPrivateExponent(); }; + + private native static long nativeInit(byte[] mod, byte[] privExp); + } + static final class RSAPrivateCrt extends NativeKey implements RSAPrivateCrtKey { private static final long serialVersionUID = 6812507588904302831L; @@ -119,7 +144,7 @@ throw new InvalidKeySpecException("Only supports RSAPrivateCrtKeySpec"); } if (pKey == 0L) { - throw new UcryptoException("Error constructing RSA PrivateKey"); + throw new UcryptoException("Error constructing RSA PrivateCrtKey"); } // track native resource clean up new KeyRef(this, pKey); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSACipher.java --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSACipher.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSACipher.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, 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 @@ -37,9 +37,11 @@ import java.security.PublicKey; import java.security.PrivateKey; import java.security.spec.RSAPrivateCrtKeySpec; +import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; import java.security.interfaces.RSAKey; import java.security.interfaces.RSAPrivateCrtKey; +import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.KeyFactory; @@ -205,8 +207,8 @@ // Make sure the proper opmode uses the proper key if (doEncrypt && (!(newKey instanceof RSAPublicKey))) { throw new InvalidKeyException("RSAPublicKey required for encryption"); - } else if (!doEncrypt && (!(newKey instanceof RSAPrivateCrtKey))) { - throw new InvalidKeyException("RSAPrivateCrtKey required for decryption"); + } else if (!doEncrypt && (!(newKey instanceof RSAPrivateKey))) { + throw new InvalidKeyException("RSAPrivateKey required for decryption"); } NativeKey nativeKey = null; @@ -223,17 +225,26 @@ throw new InvalidKeyException(ikse); } } else { - RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) newKey; try { - nativeKey = (NativeKey) keyFactory.engineGeneratePrivate - (new RSAPrivateCrtKeySpec(privateKey.getModulus(), - privateKey.getPublicExponent(), - privateKey.getPrivateExponent(), - privateKey.getPrimeP(), - privateKey.getPrimeQ(), - privateKey.getPrimeExponentP(), - privateKey.getPrimeExponentQ(), - privateKey.getCrtCoefficient())); + if (newKey instanceof RSAPrivateCrtKey) { + RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) newKey; + nativeKey = (NativeKey) keyFactory.engineGeneratePrivate + (new RSAPrivateCrtKeySpec(privateKey.getModulus(), + privateKey.getPublicExponent(), + privateKey.getPrivateExponent(), + privateKey.getPrimeP(), + privateKey.getPrimeQ(), + privateKey.getPrimeExponentP(), + privateKey.getPrimeExponentQ(), + privateKey.getCrtCoefficient())); + } else if (newKey instanceof RSAPrivateKey) { + RSAPrivateKey privateKey = (RSAPrivateKey) newKey; + nativeKey = (NativeKey) keyFactory.engineGeneratePrivate + (new RSAPrivateKeySpec(privateKey.getModulus(), + privateKey.getPrivateExponent())); + } else { + throw new InvalidKeyException("Unsupported type of RSAPrivateKey"); + } } catch (InvalidKeySpecException ikse) { throw new InvalidKeyException(ikse); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSAKeyFactory.java --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSAKeyFactory.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSAKeyFactory.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, 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 @@ -38,16 +38,11 @@ import java.security.PrivateKey; import java.security.KeyFactorySpi; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.security.spec.RSAPrivateCrtKeySpec; -import java.security.spec.RSAPublicKeySpec; +import java.security.spec.*; /** * Ucrypto-private KeyFactory class for generating native keys - * needed for using ucrypto APIs. Given that it's not used - * externally, it only needs to support RSAPrivateCrtKeySpec - * and RSAPublicKeySpec objects. + * needed for using ucrypto APIs. * * @since 1.9 */ @@ -56,7 +51,13 @@ @Override protected PrivateKey engineGeneratePrivate(KeySpec keySpec) throws InvalidKeySpecException { - return new NativeKey.RSAPrivateCrt(keySpec); + if (keySpec instanceof RSAPrivateCrtKeySpec) { + return new NativeKey.RSAPrivateCrt(keySpec); + } else if (keySpec instanceof RSAPrivateKeySpec) { + return new NativeKey.RSAPrivate(keySpec); + } else { + throw new InvalidKeySpecException("Unsupported key spec"); + } } @Override diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSASignature.java --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSASignature.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSASignature.java Tue Sep 15 07:47:44 2015 -0700 @@ -43,9 +43,8 @@ import java.security.*; import java.security.interfaces.*; -import java.security.spec.RSAPrivateCrtKeySpec; -import java.security.spec.RSAPublicKeySpec; -import java.security.spec.InvalidKeySpecException; +import java.security.spec.*; + import sun.nio.ch.DirectBuffer; import java.nio.ByteBuffer; @@ -192,25 +191,31 @@ int newSigLength = sigLength; // Need to check RSA key length whenever a new private key is set if (privateKey != key) { - if (privateKey instanceof RSAPrivateCrtKey) { - RSAPrivateCrtKey rsaPrivKey = (RSAPrivateCrtKey) privateKey; - BigInteger mod = rsaPrivKey.getModulus(); - newSigLength = checkRSAKeyLength(mod); - try { + if (!(privateKey instanceof RSAPrivateKey)) { + throw new InvalidKeyException("RSAPrivateKey required"); + } + RSAPrivateKey rsaPrivKey = (RSAPrivateKey) privateKey; + BigInteger mod = rsaPrivKey.getModulus(); + newSigLength = checkRSAKeyLength(mod); + BigInteger pe = rsaPrivKey.getPrivateExponent(); + try { + if (rsaPrivKey instanceof RSAPrivateCrtKey) { + RSAPrivateCrtKey rsaPrivCrtKey = (RSAPrivateCrtKey) rsaPrivKey; newKey = (NativeKey) keyFactory.engineGeneratePrivate (new RSAPrivateCrtKeySpec(mod, - rsaPrivKey.getPublicExponent(), - rsaPrivKey.getPrivateExponent(), - rsaPrivKey.getPrimeP(), - rsaPrivKey.getPrimeQ(), - rsaPrivKey.getPrimeExponentP(), - rsaPrivKey.getPrimeExponentQ(), - rsaPrivKey.getCrtCoefficient())); - } catch (InvalidKeySpecException ikse) { - throw new InvalidKeyException(ikse); + rsaPrivCrtKey.getPublicExponent(), + pe, + rsaPrivCrtKey.getPrimeP(), + rsaPrivCrtKey.getPrimeQ(), + rsaPrivCrtKey.getPrimeExponentP(), + rsaPrivCrtKey.getPrimeExponentQ(), + rsaPrivCrtKey.getCrtCoefficient())); + } else { + newKey = (NativeKey) keyFactory.engineGeneratePrivate + (new RSAPrivateKeySpec(mod, pe)); } - } else { - throw new InvalidKeyException("RSAPrivateCrtKey required"); + } catch (InvalidKeySpecException ikse) { + throw new InvalidKeyException(ikse); } } init(true, newKey, newSigLength); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c --- a/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, 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 @@ -430,12 +430,18 @@ * Signature: (JZ[BI)I */ jint JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeFinal - (jlong pContext, jboolean encrypt, int outLen, jbyte* bufOut, jint outOfs) { + (jlong pContext, jboolean encrypt, int outLen, jbyte* out, jint outOfs) { crypto_ctx_t *context; int rv = 0; + unsigned char* bufOut = (unsigned char*) out; context = (crypto_ctx_t *) pContext; - rv = CipherFinal(context, encrypt, (unsigned char*)bufOut, outOfs, &outLen); + // Avoid null output buffer to workaround Solaris bug21481818 (fixed in S12) + if (bufOut == NULL) { + bufOut = (unsigned char*)(&outLen); + outLen = 0; + } + rv = CipherFinal(context, encrypt, bufOut, outOfs, &outLen); free(context); if (rv) { return -rv; // use negative value to indicate error! @@ -648,7 +654,8 @@ // out is null when nativeFinal() is called solely for resource clean up if (out == NULL) { - bufOut = NULL; + // Avoid null output buffer to workaround Solaris bug21481818 (fixed in S12) + bufOut = (unsigned char *)(&outLen); outLen = 0; } else { outLen = (*env)->GetArrayLength(env, out) - outOfs; @@ -661,10 +668,12 @@ rv = CipherFinal(context, encrypt, bufOut, 0, &outLen); if (rv) { free(context); - free(bufOut); + if (outLen != 0) { + free(bufOut); + } return -rv; } else { - if (bufOut != NULL) { + if (bufOut != NULL && outLen != 0) { (*env)->SetByteArrayRegion(env, out, outOfs, outLen, (jbyte *)bufOut); free(bufOut); } @@ -697,6 +706,86 @@ } /* + * Class: com_oracle_security_ucrypto_NativeKey_RSAPrivate + * Method: nativeInit + * Signature: ([B[B)J + */ +jlong JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit +(int modLen, jbyte* jMod, int privLen, jbyte* jPriv) { + + unsigned char *mod, *priv; + crypto_object_attribute_t* pKey = NULL; + + pKey = calloc(2, sizeof(crypto_object_attribute_t)); + if (pKey == NULL) { + return 0L; + } + mod = priv = NULL; + mod = malloc(modLen); + priv = malloc(privLen); + if (mod == NULL || priv == NULL) { + free(pKey); + free(mod); + free(priv); + return 0L; + } else { + memcpy(mod, jMod, modLen); + memcpy(priv, jPriv, privLen); + } + + // NOTE: numOfComponents should be 2 + pKey[0].oa_type = SUN_CKA_MODULUS; + pKey[0].oa_value = (char*) mod; + pKey[0].oa_value_len = (size_t) modLen; + pKey[1].oa_type = SUN_CKA_PRIVATE_EXPONENT; + pKey[1].oa_value = (char*) priv; + pKey[1].oa_value_len = (size_t) privLen; + + return (jlong) pKey; +} + +JNIEXPORT jlong JNICALL +Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit + (JNIEnv *env, jclass jCls, jbyteArray jMod, jbyteArray jPriv) { + + int modLen, privLen; + jbyte *bufMod, *bufPriv; + crypto_object_attribute_t* pKey = NULL; + + bufMod = bufPriv = NULL; + + modLen = (*env)->GetArrayLength(env, jMod); + bufMod = getBytes(env, jMod, 0, modLen); + if ((*env)->ExceptionCheck(env)) goto cleanup; + + privLen = (*env)->GetArrayLength(env, jPriv); + bufPriv = getBytes(env, jPriv, 0, privLen); + if ((*env)->ExceptionCheck(env)) goto cleanup; + + // proceed if no error; otherwise free allocated memory + pKey = calloc(2, sizeof(crypto_object_attribute_t)); + if (pKey == NULL) { + throwOutOfMemoryError(env, NULL); + goto cleanup; + } + + // NOTE: numOfComponents should be 2 + pKey[0].oa_type = SUN_CKA_MODULUS; + pKey[0].oa_value = (char*) bufMod; + pKey[0].oa_value_len = (size_t) modLen; + pKey[1].oa_type = SUN_CKA_PRIVATE_EXPONENT; + pKey[1].oa_value = (char*) bufPriv; + pKey[1].oa_value_len = (size_t) privLen; + return (jlong) pKey; + +cleanup: + free(bufMod); + free(bufPriv); + + return 0L; +} + +/* * Class: com_oracle_security_ucrypto_NativeKey_RSAPrivateCrt * Method: nativeInit * Signature: ([B[B[B[B[B[B[B[B)J diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2015, 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 @@ -106,7 +106,11 @@ errorString = " -- jvm args information unavailable"; String jvmArgs = MonitoredVmUtil.jvmArgs(vm); if (jvmArgs != null && jvmArgs.length() > 0) { - output.append(' ').append(jvmArgs); + output.append(' ') + .append( + // multi-line args are permitted + jvmArgs.replace("\n", "\\n").replace("\r", "\\r") + ); } } if (arguments.showVmFlags()) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/ProblemList.txt Tue Sep 15 07:47:44 2015 -0700 @@ -133,9 +133,6 @@ # 8029891 java/lang/ClassLoader/deadlock/GetResource.java generic-all -# 8133552 -java/lang/ProcessHandle/InfoTest.java generic-all - ############################################################################ # jdk_instrument @@ -363,10 +360,6 @@ # 8062512 java/util/spi/ResourceBundleControlProvider/UserDefaultControlTest.java generic-all -# 8029453 -java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java linux-all - - ############################################################################ # jdk_instrument @@ -387,11 +380,6 @@ # 6456333 sun/tools/jps/TestJpsJarRelative.java generic-all -# 8134420 -sun/tools/jps/TestJpsClass.java generic-all -sun/tools/jps/TestJpsJar.java generic-all -sun/tools/jps/TestJpsSanity.java generic-all - # 6734748 sun/tools/jinfo/JInfoRunningProcessFlagTest.java generic-all diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java --- a/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,6 +25,7 @@ * @test * @bug 8007267 * @summary [macosx] com.apple.eawt.Application.setDefaultMenuBar is not working + * @requires (os.family == "mac") * @author leonid.romanov@oracle.com * @modules java.desktop/sun.awt * java.desktop/com.apple.eawt @@ -34,7 +35,6 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; -import sun.awt.*; import java.lang.reflect.Method; @@ -43,7 +43,7 @@ static volatile int listenerCallCounter = 0; public static void main(String[] args) throws Exception { - if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) { + if (!System.getProperty("os.name").contains("OS X")) { System.out.println("This test is for MacOS only. Automatically passed on other platforms."); return; } @@ -55,7 +55,6 @@ } }); - SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); Robot robot = new Robot(); robot.setAutoDelay(100); @@ -64,7 +63,7 @@ robot.keyRelease(ks.getKeyCode()); robot.keyRelease(KeyEvent.VK_META); - toolkit.realSync(); + robot.waitForIdle(); if (listenerCallCounter != 1) { throw new Exception("Test failed: ActionListener either wasn't called or was called more than once"); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/com/oracle/security/ucrypto/CipherSignNotSupported.java --- a/jdk/test/com/oracle/security/ucrypto/CipherSignNotSupported.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/com/oracle/security/ucrypto/CipherSignNotSupported.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 8029849 + * @bug 8029849 8132082 * @summary Make sure signing via encrypt and verifying via decrypt are not * supported by OracleUcrypto provider. * @author Anthony Scarpino @@ -31,12 +31,10 @@ */ import java.util.Random; -import java.security.KeyPairGenerator; -import java.security.KeyPair; +import java.security.*; +import java.security.interfaces.*; +import java.security.spec.RSAPrivateKeySpec; import javax.crypto.Cipher; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.Provider; public class CipherSignNotSupported extends UcryptoTest { @@ -69,27 +67,43 @@ c.init(Cipher.ENCRYPT_MODE, kp.getPublic()); ct = c.doFinal(pt); // Decryption - c.init(Cipher.DECRYPT_MODE, kp.getPrivate()); - c.doFinal(ct); - // Sign - try { - c.init(Cipher.ENCRYPT_MODE, kp.getPrivate()); - ct = c.doFinal(pt); - throw new RuntimeException("Encrypt operation should have failed."); - } catch (InvalidKeyException e) { - if (e.getMessage().compareTo("RSAPublicKey required for " + - "encryption") != 0) { - System.out.println("Wrong exception thrown."); - throw e; + PrivateKey[] privKeys = new PrivateKey[2]; + privKeys[0] = kp.getPrivate(); + if (privKeys[0] instanceof RSAPrivateCrtKey) { + RSAPrivateCrtKey k = (RSAPrivateCrtKey) privKeys[0]; + KeyFactory kf = KeyFactory.getInstance("RSA"); + privKeys[1] = kf.generatePrivate + (new RSAPrivateKeySpec(k.getModulus(), k.getPrivateExponent())); + } else { + privKeys = new PrivateKey[] {privKeys[0]}; + } + + for (PrivateKey pk : privKeys) { + System.out.println("Testing " + pk); + c.init(Cipher.DECRYPT_MODE, pk); + c.doFinal(ct); + + // Sign + try { + c.init(Cipher.ENCRYPT_MODE, pk); + ct = c.doFinal(pt); + throw new RuntimeException("Encrypt operation should have failed."); + } catch (InvalidKeyException e) { + if (e.getMessage().compareTo("RSAPublicKey required for " + + "encryption") != 0) { + System.out.println("Wrong exception thrown."); + throw e; + } } } + // Verify try { c.init(Cipher.DECRYPT_MODE, kp.getPublic()); c.doFinal(ct); throw new RuntimeException("Decrypt operation should have failed."); } catch (InvalidKeyException e) { - if (e.getMessage().compareTo("RSAPrivateCrtKey required for " + + if (e.getMessage().compareTo("RSAPrivateKey required for " + "decryption") != 0) { System.out.println("Wrong exception thrown."); throw e; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/Component/GetScreenLocTest/GetScreenLocTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Component/GetScreenLocTest/GetScreenLocTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @test + * @bug 4356202 + * @summary Tests that getLocationOnScreen returns valid value(WindowMaker + * only). + * @author dom@sparc.spb.su: + */ +public class GetScreenLocTest { + //Declare things used in the test, like buttons and labels here + static Robot robot = null; + private static class MyCanvas extends Canvas { + public Dimension getPreferredSize() { + return new Dimension(100, 100); + } + public void paint(Graphics g) { + super.paint(g); + g.setColor(Color.blue); + Rectangle r = getBounds(); + g.fillRect(0, 0, r.width, r.height); + } + } + static int state = 0; // there are three states - (-1,-1),(0,0),(1,1) + + static void bigPause() { + Toolkit.getDefaultToolkit().sync(); + robot.waitForIdle(); + robot.delay(1000); + } + + static void doPress(Point p) { + robot.mouseMove(p.x, p.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + } + + public static void main(final String[] args) throws AWTException { + robot = new Robot(); + Frame bigOne = new Frame(); + bigOne.setSize(200, 200); + bigOne.setLocationRelativeTo(null); + bigOne.setVisible(true); + Frame f = new Frame(); + f.setLayout(new BorderLayout()); + f.setSize(120, 150); + f.setLocationRelativeTo(null); + Canvas c = new MyCanvas(); + f.add(c, BorderLayout.CENTER); + c.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + switch(state) { + case 0: // the first event should be (0,0) + if (e.getX() != 0 || e.getY() != 0) { + System.out.println("state 0: wrong location" + e); + break; + } + state++; + break; + case 1: // the second event should be (1,1) + if (e.getX() != 1 || e.getY() != 1) { + System.out.println("state 1: wrong location " + e); + break; + } + state++; + break; + case 2: // this should never happen + System.out.println("state 2: wrong location " + e); + } + } + }); + f.pack(); + f.setVisible(true); + bigPause(); + + Point p = c.getLocationOnScreen(); + doPress(p); + p.x += 1; + p.y += 1; + doPress(p); + p.x -= 2; + p.y -= 2; + doPress(p); + bigPause(); + + f.dispose(); + bigOne.dispose(); + + // ...and at the end the state should be 2 + if (state != 2) { + throw new RuntimeException("wrong state: " + state); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/EmbeddedFrame/DisplayChangedTest/DisplayChangedTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/EmbeddedFrame/DisplayChangedTest/DisplayChangedTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @bug 4980592 + @summary switching user in XP causes an NPE in + sun.awt.windows.WWindowPeer.displayChanged + @requires (os.family == "windows") + @modules java.desktop/java.awt.peer + @modules java.desktop/sun.awt.windows + @modules java.desktop/sun.awt + @author son@sparc.spb.su: area=embedded + @run main DisplayChangedTest + */ +/** + * DisplayChangedTest.java + * + * summary: switching user in XP causes an NPE in + * sun.awt.windows.WWindowPeer.displayChanged + */ +import java.awt.Frame; +import java.awt.Dialog; +import java.awt.TextArea; +import java.awt.peer.ComponentPeer; +import java.awt.peer.FramePeer; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Field; + +import sun.awt.AWTAccessor; + +public class DisplayChangedTest { + + /** + * Test fails if it throws any exception. + * + * @throws Exception + */ + private void init() throws Exception { + + if (!System.getProperty("os.name").startsWith("Windows")) { + System.out.println("This is Windows only test."); + return; + } + + Frame frame = new Frame("AWT Frame"); + frame.pack(); + + FramePeer frame_peer = AWTAccessor.getComponentAccessor() + .getPeer(frame); + Class comp_peer_class = Class.forName("sun.awt.windows.WComponentPeer"); + Field hwnd_field = comp_peer_class.getDeclaredField("hwnd"); + hwnd_field.setAccessible(true); + long hwnd = hwnd_field.getLong(frame_peer); + + Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame"); + Constructor constructor = clazz + .getConstructor(new Class[]{long.class}); + Frame embedded_frame = (Frame) constructor + .newInstance(new Object[]{new Long(hwnd)}); + frame.setVisible(true); + + ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer( + embedded_frame); + Class peerClass = peer.getClass(); + Method displayChangedM = peerClass.getMethod("displayChanged", + new Class[0]); + displayChangedM.invoke(peer, null); + embedded_frame.dispose(); + frame.dispose(); + + } + + public static void main(String args[]) throws Exception { + new DisplayChangedTest().init(); + } + +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @bug 6345002 + @summary grab problems with EmbeddedFrame + @requires (os.family == "windows") + @modules java.desktop/java.awt.peer + @modules java.desktop/sun.awt + @modules java.desktop/sun.awt.windows + @author Oleg.Semenov@sun.com area=EmbeddedFrame + @run main EmbeddedFrameGrabTest + */ +/** + * EmbeddedFrameGrabTest.java + * + * summary: grab problems with EmbeddedFrame + */ +import java.awt.Frame; +import java.awt.peer.FramePeer; +import javax.swing.JComboBox; +import java.awt.Panel; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.Rectangle; +import java.awt.TextArea; +import java.awt.Dialog; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; + +import sun.awt.AWTAccessor; + +public class EmbeddedFrameGrabTest { + + /** + * Test fails if it throws any exception. + * + * @throws Exception + */ + private void init() throws Exception { + + if (!System.getProperty("os.name").startsWith("Windows")) { + System.out.println("This is Windows only test."); + return; + } + + final Frame frame = new Frame("AWT Frame"); + frame.pack(); + frame.setSize(200, 200); + FramePeer frame_peer = AWTAccessor.getComponentAccessor() + .getPeer(frame); + Class comp_peer_class + = Class.forName("sun.awt.windows.WComponentPeer"); + Field hwnd_field = comp_peer_class.getDeclaredField("hwnd"); + hwnd_field.setAccessible(true); + long hwnd = hwnd_field.getLong(frame_peer); + + Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame"); + Constructor constructor + = clazz.getConstructor(new Class[]{long.class}); + final Frame embedded_frame + = (Frame) constructor.newInstance(new Object[]{ + new Long(hwnd)});; + final JComboBox combo = new JComboBox<>(new String[]{ + "Item 1", "Item 2" + }); + combo.setSelectedIndex(1); + final Panel p = new Panel(); + p.setLayout(new BorderLayout()); + embedded_frame.add(p, BorderLayout.CENTER); + embedded_frame.validate(); + p.add(combo); + p.validate(); + frame.setVisible(true); + Robot robot = new Robot(); + robot.delay(2000); + Rectangle clos = new Rectangle( + combo.getLocationOnScreen(), combo.getSize()); + robot.mouseMove(clos.x + clos.width / 2, clos.y + clos.height / 2); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.delay(1000); + if (!combo.isPopupVisible()) { + throw new RuntimeException("Combobox popup is not visible!"); + } + robot.mouseMove(clos.x + clos.width / 2, clos.y + clos.height + 3); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.delay(1000); + if (combo.getSelectedIndex() != 0) { + throw new RuntimeException("Combobox selection has not changed!"); + } + embedded_frame.remove(p); + embedded_frame.dispose(); + frame.dispose(); + + } + + public static void main(String args[]) throws Exception { + new EmbeddedFrameGrabTest().init(); + } + +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/Frame/SetMaximizedBounds/SetMaximizedBounds.java --- a/jdk/test/java/awt/Frame/SetMaximizedBounds/SetMaximizedBounds.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/awt/Frame/SetMaximizedBounds/SetMaximizedBounds.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,6 +24,7 @@ import java.awt.*; /* * @test + * @bug 8065739 8131339 * @summary When Frame.setExtendedState(Frame.MAXIMIZED_BOTH) * is called for a Frame after been called setMaximizedBounds() with * certain value, Frame bounds must equal to this value. @@ -55,12 +56,14 @@ for (GraphicsDevice gd : ge.getScreenDevices()) { for (GraphicsConfiguration gc : gd.getConfigurations()) { - testMaximizedBounds(gc); + testMaximizedBounds(gc, false); + testMaximizedBounds(gc, true); } } } - static void testMaximizedBounds(GraphicsConfiguration gc) throws Exception { + static void testMaximizedBounds(GraphicsConfiguration gc, boolean undecorated) + throws Exception { Frame frame = null; try { @@ -71,6 +74,7 @@ robot.setAutoDelay(50); frame = new Frame(); + frame.setUndecorated(undecorated); Rectangle maximizedBounds = new Rectangle( maxArea.x + maxArea.width / 6, maxArea.y + maxArea.height / 6, diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java --- a/jdk/test/java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -37,6 +37,8 @@ * @bug 8013468 * @summary Cursor does not update properly when in fullscreen mode on Mac * The core reason of the issue was the lack of a mouse entered event in fullscreen + * @requires (os.family == "mac") + * @modules java.desktop/com.apple.eawt * @library ../../regtesthelpers * @build Util * @modules java.desktop/com.apple.eawt diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java --- a/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Tue Sep 15 07:47:44 2015 -0700 @@ -36,6 +36,7 @@ * @test * @bug 8024185 * @summary Native Mac OS X full screen does not work after showing the splash + * @requires (os.family == "mac") * @library ../ * @library ../../../../lib/testlibrary * @modules java.desktop/sun.awt diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java --- a/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Tue Sep 15 07:47:44 2015 -0700 @@ -39,7 +39,7 @@ Class[] types = {B.class, BL.class, BLF.class, E.class, H.class, P.class, VU.class, D.class, EVD.class, EVE.class, EV.class, EVL.class, - EVX.class}; + EVX.class, R.class}; for (Class type : types) { PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(type, "value"); if (((B.class == type) || (BLF.class == type)) && pd.isBound()) { @@ -66,6 +66,10 @@ BeanUtils.reportPropertyDescriptor(pd); throw new Error("required"); } + if ((D.class == type) == !"getter".equals(pd.getShortDescription())) { + BeanUtils.reportPropertyDescriptor(pd); + throw new Error("shortDescription"); + } if ((VU.class == type) == !Boolean.TRUE.equals(pd.getValue("visualUpdate"))) { BeanUtils.reportPropertyDescriptor(pd); throw new Error("visualUpdate"); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/lang/ProcessHandle/InfoTest.java --- a/jdk/test/java/lang/ProcessHandle/InfoTest.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/lang/ProcessHandle/InfoTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -203,8 +203,10 @@ "commandLine() should start with: " + expectedPath + " but starts with " + commandLineCmdPath); + Assert.assertTrue(commandLine.contains(command.get()), + "commandLine() must contain the command: " + command.get()); List allArgs = p1.getArgs(); - for (int i = 0; i < allArgs.size(); i++) { + for (int i = 1; i < allArgs.size(); i++) { Assert.assertTrue(commandLine.contains(allArgs.get(i)), "commandLine() must contain argument: " + allArgs.get(i)); } @@ -255,10 +257,15 @@ } } } - p1.waitFor(Utils.adjustTimeout(5), TimeUnit.SECONDS); + p1.sendAction("exit"); + Assert.assertTrue(p1.waitFor(Utils.adjustTimeout(30L), TimeUnit.SECONDS), + "timeout waiting for process to terminate"); } catch (IOException | InterruptedException ie) { ie.printStackTrace(System.out); Assert.fail("unexpected exception", ie); + } finally { + // Destroy any children that still exist + ProcessUtil.destroyProcessTree(ProcessHandle.current()); } } @@ -268,8 +275,9 @@ @Test public static void test3() { try { - for (int sleepTime : Arrays.asList(1, 2)) { + for (long sleepTime : Arrays.asList(Utils.adjustTimeout(30), Utils.adjustTimeout(32))) { Process p = spawn("sleep", String.valueOf(sleepTime)); + ProcessHandle.Info info = p.info(); System.out.printf(" info: %s%n", info); @@ -295,7 +303,9 @@ Assert.assertEquals(args[0], String.valueOf(sleepTime)); } } - Assert.assertTrue(p.waitFor(15, TimeUnit.SECONDS)); + p.destroy(); + Assert.assertTrue(p.waitFor(Utils.adjustTimeout(30), TimeUnit.SECONDS), + "timeout waiting for process to terminate"); } } catch (IOException | InterruptedException ex) { ex.printStackTrace(System.out); diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/net/MulticastSocket/MultiDead.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/MulticastSocket/MultiDead.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8072466 + * @summary Deadlock when initializing MulticastSocket and DatagramSocket + * @library /lib/testlibrary + * @build jdk.testlibrary.* + * @run main/othervm MultiDead + */ + +import java.net.DatagramSocket; +import java.net.MulticastSocket; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.CountDownLatch; +import jdk.testlibrary.JDKToolLauncher; + +public class MultiDead { + private static final int THREAD_PAIR_COUNT = 4; + private static final int CHILDREN_COUNT = 20; + + public static void main(String[] args) throws Throwable { + if (args.length == 0 || args[0].equals("parent")) { + parentProcess(); + } + + if (args.length > 0 && args[0].equals("child")) { + childProcess(); + } + } + + private static void parentProcess() throws Throwable { + JDKToolLauncher launcher = JDKToolLauncher + .createUsingTestJDK("java") + .addToolArg("MultiDead") + .addToolArg("child"); + ProcessBuilder pb = new ProcessBuilder(launcher.getCommand()); + + AtomicReference child = new AtomicReference<>(); + AtomicBoolean stopFlag = new AtomicBoolean(false); + + Thread th = new Thread(() -> { + for (int i = 0; i < CHILDREN_COUNT; ++i) { + System.out.println("child #" + (i + 1) + " of " + + CHILDREN_COUNT); + try { + child.set(pb.start()); + child.get().waitFor(); + if (stopFlag.get()) { + break; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + + th.start(); + th.join(CHILDREN_COUNT * 1000); // 1 sec for a child to complete + stopFlag.set(true); + if (th.isAlive()) { + if (child.get() != null) { + child.get().destroyForcibly(); + } + throw new RuntimeException("Failed to complete on time."); + } + } + + private static void childProcess() { + CountDownLatch latch = new CountDownLatch(1); + for (int i = 0; i < THREAD_PAIR_COUNT; ++i) { + new Thread(() -> { + try { + latch.await(); + try (MulticastSocket a = new MulticastSocket(6000)) { + } + } catch (Exception ignore) { + } + }).start(); + + new Thread(() -> { + try { + latch.await(); + try (DatagramSocket b = new DatagramSocket(6000)) { + } + } catch (Exception ignore) { + } + }).start(); + } + latch.countDown(); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/nio/file/Files/StreamLinesTest.java --- a/jdk/test/java/nio/file/Files/StreamLinesTest.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/nio/file/Files/StreamLinesTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -138,18 +138,25 @@ StandardCharsets.ISO_8859_1, StandardCharsets.UTF_16); String[] lines = {"", "A", "AB", "ABC", "ABCD"}; - int[] linesSizes = {1, 2, 3, 4, 16, 256, 1024}; + int[] linesSizes = {0, 1, 2, 3, 4, 16, 256, 1024}; for (Charset charset : charsets) { - for (String line : lines) { - for (int linesSize : linesSizes) { - for (LineSeparator ls : EnumSet.complementOf(EnumSet.of(LineSeparator.NONE))) { - String description = String.format("%d lines of \"%s\" with separator %s", linesSize, line, ls); - l.add(of(description, - i -> line, - i -> ls, - linesSize, charset)); + for (int linesSize : linesSizes) { + if (linesSize > 0) { + for (String line : lines) { + for (LineSeparator ls : EnumSet.complementOf(EnumSet.of(LineSeparator.NONE))) { + String description = String.format("%d lines of \"%s\" with separator %s", linesSize, line, ls); + l.add(of(description, + i -> line, + i -> ls, + linesSize, charset)); + } } + } else { + l.add(of("Empty file: 0 lines", + i -> "", + i -> LineSeparator.NONE, + 0, charset)); } } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Tue Sep 15 07:47:44 2015 -0700 @@ -35,7 +35,6 @@ * @test * @bug 4486658 5031862 * @run main TimeoutLockLoops - * @key intermittent * @summary Checks for responsiveness of locks to timeouts. * Runs under the assumption that ITERS computations require more than * TIMEOUT msecs to complete, which seems to be a safe assumption for diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java --- a/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java Tue Sep 15 07:47:44 2015 -0700 @@ -27,9 +27,6 @@ */ import javax.sound.midi.MidiDevice; -import javax.sound.midi.MidiUnavailableException; -import javax.sound.midi.Patch; -import javax.sound.sampled.*; import javax.sound.midi.MidiDevice.Info; import com.sun.media.sound.*; @@ -48,13 +45,6 @@ throw new RuntimeException("assertTrue fails!"); } - - private static class FakeInfo extends Info { - public FakeInfo() { - super("a", "b", "c", "d"); - } - } - public static void main(String[] args) throws Exception { SoftProvider provider = new SoftProvider(); Info[] infos = provider.getDeviceInfo(); @@ -64,7 +54,5 @@ MidiDevice d = provider.getDevice(infos[i]); assertTrue(d instanceof SoftSynthesizer); } - assertTrue(provider.getDevice(new FakeInfo()) == null); - } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/sound/midi/MidiDeviceProvider/FakeInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/MidiDeviceProvider/FakeInfo.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Collection; +import java.util.HashSet; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiDevice.Info; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.spi.MidiDeviceProvider; + +import static java.util.ServiceLoader.load; + +/** + * @test + * @bug 8059743 + * @summary MidiDeviceProvider shouldn't returns incorrect results in case of + * some unknown MidiDevice.Info + * @author Sergey Bylokhov + */ +public final class FakeInfo { + + private static final class Fake extends Info { + + Fake() { + super("a", "b", "c", "d"); + } + } + + public static void main(final String[] args) { + final Info fake = new Fake(); + // MidiSystem API + try { + MidiSystem.getMidiDevice(fake); + throw new RuntimeException("IllegalArgumentException expected"); + } catch (final MidiUnavailableException e) { + throw new RuntimeException("IllegalArgumentException expected", e); + } catch (final IllegalArgumentException ignored) { + // expected + } + // MidiDeviceProvider API + final Collection errors = new HashSet<>(); + for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) { + try { + if (mdp.isDeviceSupported(fake)) { + throw new RuntimeException("fake is supported"); + } + final MidiDevice device = mdp.getDevice(fake); + System.err.println("MidiDevice: " + device); + throw new RuntimeException("IllegalArgumentException expected"); + } catch (final IllegalArgumentException e) { + errors.add(e.getMessage()); + } + } + if (errors.size() != 1) { + throw new RuntimeException("Wrong number of messages:" + errors); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/JColorChooser/Test8051548.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JColorChooser/Test8051548.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Frame; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.util.function.Predicate; +import javax.swing.JColorChooser; +import javax.swing.JFormattedTextField; +import javax.swing.JFrame; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.swing.colorchooser.AbstractColorChooserPanel; + +/* + * @test + * @bug 8051548 + * @summary JColorChooser should have a way to disable transparency controls + * @author Alexandr Scherbatiy + * @run main Test8051548 + */ + +public class Test8051548 { + + private static final String[][] TABS = { + {"HSV", "0"}, + {"HSL", "0"}, + {"RGB", "255"}, + {"CMYK", "255"} + }; + + private static JColorChooser colorChooser; + private static boolean propertyChangeListenerInvoked; + private static volatile Color color; + + public static void main(String[] args) throws Exception { + testColorPanels(); + testShowDialog(true); + testShowDialog(false); + } + + private static void testColorPanels() throws Exception { + SwingUtilities.invokeAndWait(() -> createAndShowGUI()); + + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.waitForIdle(); + + for (String[] tabs : TABS) { + final String tab = tabs[0]; + final String initialValue = tabs[1]; + + SwingUtilities.invokeAndWait(() -> { + + colorChooser.setColor(new Color(50, 100, 85)); + JTabbedPane tabbedPane = + (JTabbedPane) findComponent(colorChooser, "JTabbedPane"); + int index = tabbedPane.indexOfTab(tab); + tabbedPane.setSelectedIndex(index); + + AbstractColorChooserPanel colorChooserPanel + = (AbstractColorChooserPanel) findComponent( + tabbedPane.getComponent(index), "ColorChooserPanel"); + + propertyChangeListenerInvoked = false; + colorChooserPanel.addPropertyChangeListener((e) -> { + if (AbstractColorChooserPanel.TRANSPARENCY_ENABLED_PROPERTY. + equals(e.getPropertyName())) { + propertyChangeListenerInvoked = true; + if(!(Boolean)e.getOldValue()){ + throw new RuntimeException("Old color transparency" + + " selection property should be true!"); + } + if((Boolean)e.getNewValue()){ + throw new RuntimeException("New color transparency" + + " selection property should be false!"); + } + } + }); + + if (!colorChooserPanel.isColorTransparencySelectionEnabled()) { + throw new RuntimeException("Color transparency selection" + + " should be enabled by default"); + } + + JFormattedTextField transparencyTextField = (JFormattedTextField) + findTextField(colorChooserPanel, initialValue); + + if (!transparencyTextField.isEnabled()) { + throw new RuntimeException("Transparency controls are" + + " disabled by default!"); + } + + transparencyTextField.setValue(50); + + if(!colorHasAlpha()){ + throw new RuntimeException("Transparency selection should" + + " be enabled!"); + } + + colorChooserPanel.setColorTransparencySelectionEnabled(false); + + if (colorChooserPanel.isColorTransparencySelectionEnabled()) { + throw new RuntimeException("Color transparency selection" + + " should be disabled!"); + } + + if(!propertyChangeListenerInvoked){ + throw new RuntimeException("Property change listener is not" + + " invoked!"); + } + + if(colorHasAlpha()){ + throw new RuntimeException("Transparency selection should" + + " be disabled!"); + } + }); + + robot.waitForIdle(); + } + + } + + static void testShowDialog(boolean colorTransparencySelectionEnabled) throws Exception { + int alphaValue = 123; + Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeLater(() -> { + color = JColorChooser.showDialog(null, "Change Color", + new Color(10, 20, 30, alphaValue), + colorTransparencySelectionEnabled); + }); + + SwingUtilities.invokeAndWait(() -> { + // wait for dialog is shown + }); + + robot.waitForIdle(); + + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + + if (colorTransparencySelectionEnabled) { + if (color.getAlpha() != alphaValue) { + throw new RuntimeException("Color alpha has not bee reseted!"); + } + } else { + if (color.getAlpha() != 255) { + throw new RuntimeException("Color alpha has not bee reseted!"); + } + } + } + + private static boolean colorHasAlpha(){ + return colorChooser.getColor().getAlpha() != 255; + } + + private static void createAndShowGUI() { + JFrame frame = new JFrame(); + frame.setSize(700, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + colorChooser = new JColorChooser(); + frame.getContentPane().add(colorChooser); + frame.setVisible(true); + } + + private static Component findComponent(Component component, String name) { + return findComponent(component, + (comp) -> comp.getClass().getName().contains(name)); + } + + private static Component findTextField(Component component, String value) { + return findComponent(component, (comp) -> { + + if (comp instanceof JFormattedTextField) { + JFormattedTextField textField = (JFormattedTextField) comp; + return value.equals(textField.getText()); + } + return false; + }); + } + + private static Component findComponent(Component component, + Predicate predicate) { + + if (predicate.test(component)) { + return component; + } + + if (component instanceof Container) { + Container container = (Container) component; + for (int i = 0; i < container.getComponentCount(); i++) { + Component child = findComponent(container.getComponent(i), + predicate); + if (child != null) { + return child; + } + } + } + + return null; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/JComponent/4339584/GetUI.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JComponent/4339584/GetUI.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; + +/** + * @test + * @bug 4339584 + */ +public final class GetUI { + + public static void main(final String[] args) { + CustomJComponent component = new CustomJComponent(); + ComponentUI ui = new ComponentUI() { + }; + component.setUI(ui); + ComponentUI actual = component.getUI(); + if (actual != ui) { + System.err.println("Expected: " + ui); + System.err.println("Actual: " + actual); + throw new RuntimeException("Test failed"); + } + } + + private static class CustomJComponent extends JComponent { + + @Override + public ComponentUI getUI() { + return super.getUI(); + } + + @Override + public void setUI(ComponentUI ui) { + super.setUI(ui); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/JMenu/4213634/bug4213634.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JMenu/4213634/bug4213634.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.AWTException; +import java.awt.Robot; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +/* @test + * @bug 4213634 8017187 + * @author Scott Violet + * @library ../../regtesthelpers + * @build Util + * @run main bug4213634 + */ + + +public class bug4213634 { + + private JMenu menu; + + private JFrame frame; + + public static void main(String[] args) throws Throwable { + new bug4213634(); + } + + bug4213634() throws AWTException, InterruptedException, InvocationTargetException { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + createAndShowGUI(); + } + }); + + test(); + } + + public void createAndShowGUI() { + frame = new JFrame("TEST"); + JMenuBar mb = new JMenuBar(); + menu = mb.add(createMenu("1 - First Menu", true)); + mb.add(createMenu("2 - Second Menu", false)); + frame.setJMenuBar(mb); + JTextArea ta = new JTextArea("This test dedicated to Nancy and Kathleen, testers and bowlers extraordinaire\n\n\nNo exception means pass."); + frame.getContentPane().add("Center", ta); + JButton button = new JButton("Test"); + frame.getContentPane().add("South", button); + frame.setBounds(100, 100, 400, 400); + frame.setVisible(true); + button.requestFocusInWindow(); + } + + private void test() throws AWTException, InterruptedException, InvocationTargetException { + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.waitForIdle(); + + Util.hitMnemonics(robot, KeyEvent.VK_1); + robot.waitForIdle(); + + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + if (!menu.isSelected()) { + throw new RuntimeException( + "Failed: Menu didn't remain posted at end of test"); + } else { + System.out.println("Test passed!"); + frame.dispose(); + } + } + }); + } + private JMenu createMenu(String str, boolean bFlag) { + JMenuItem menuitem; + JMenu menu = new JMenu(str); + menu.setMnemonic(str.charAt(0)); + + for(int i = 0; i < 10; i ++) { + menuitem = new JMenuItem("JMenuItem" + i); + menuitem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + throw new RuntimeException( + "Failed: Mnemonic activated"); + } + }); + if(bFlag) + menuitem.setMnemonic('0' + i); + menu.add(menuitem); + } + return menu; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/UIDefaults/6302464/bug6302464.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/UIDefaults/6302464/bug6302464.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Map; +import java.util.HashSet; +import java.awt.Color; +import java.awt.Toolkit; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.image.BufferedImage; +import javax.swing.JLabel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UIDefaults; +import javax.swing.UIManager.LookAndFeelInfo; +import javax.swing.plaf.basic.BasicLookAndFeel; +import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; +import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_GASP; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; + +/** + * @test + * @bug 6302464 + * @author Alexandr Scherbatiy + * @summary Allow programmatic enabling of subpixel anti-aliasing in Swing + */ +public class bug6302464 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(bug6302464::testAntialiasingProperties); + } + + private static void testAntialiasingProperties() { + testCustomLAF(); + testFontRenderingContext(); + testAntialiasingHints(); + testLAFAAHints(); + } + + private static void testCustomLAF() { + try { + testCustomLAF(false); + testCustomLAF(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void testCustomLAF(boolean useAAHints) throws Exception { + CustomLookAndFeel customLAF = new CustomLookAndFeel(useAAHints); + UIManager.setLookAndFeel(customLAF); + + JLabel label = new JLabel(); + Object aaHint = label.getClientProperty(KEY_TEXT_ANTIALIASING); + Object lcdContrastHint = label.getClientProperty(KEY_TEXT_LCD_CONTRAST); + + if (aaHint != customLAF.getAAHint()) { + throw new RuntimeException("AA hint from custom L&F is not set"); + } + + if (lcdContrastHint != customLAF.getLCDContarstHint()) { + throw new RuntimeException("AA hint from custom L&F is not set"); + } + } + + private static final Object[] ANTIALIASING_HINTS = { + VALUE_TEXT_ANTIALIAS_GASP, + VALUE_TEXT_ANTIALIAS_LCD_HRGB, + VALUE_TEXT_ANTIALIAS_LCD_HBGR, + VALUE_TEXT_ANTIALIAS_LCD_VRGB, + VALUE_TEXT_ANTIALIAS_LCD_VBGR + }; + + private static void testFontRenderingContext() { + for (Object aaHint : ANTIALIASING_HINTS) { + testFontRenderingContext(aaHint); + } + } + + private static void testFontRenderingContext(Object aaHint) { + + JLabel label = new JLabel("Test"); + label.putClientProperty(KEY_TEXT_ANTIALIASING, aaHint); + FontRenderContext frc = label.getFontMetrics( + label.getFont()).getFontRenderContext(); + + if (!aaHint.equals(frc.getAntiAliasingHint())) { + throw new RuntimeException("Wrong aa hint in FontRenderContext"); + } + } + + private static void testAntialiasingHints() { + setMetalLookAndFeel(); + + HashSet colorsAAOff = getAntialiasedColors(VALUE_TEXT_ANTIALIAS_OFF, 100); + + if (colorsAAOff.size() > 2) { + throw new RuntimeException("Wrong number of antialiased colors."); + } + + HashSet colorsAAOnLCD100 = getAntialiasedColors( + VALUE_TEXT_ANTIALIAS_LCD_HRGB, 100); + + if (colorsAAOnLCD100.size() <= 2) { + throw new RuntimeException("Wrong number of antialiased colors."); + } + + HashSet colorsAAOnLCD250 = getAntialiasedColors( + VALUE_TEXT_ANTIALIAS_LCD_HRGB, 250); + + if (colorsAAOnLCD250.size() <= 2) { + throw new RuntimeException("Wrong number of antialiased colors."); + } + + if (colorsAAOnLCD100.equals(colorsAAOnLCD250)) { + throw new RuntimeException("LCD contarst is not used."); + } + } + + private static HashSet getAntialiasedColors(Object aaHint, int lcdContrast) { + + JLabel label = new JLabel("ABCD"); + label.setSize(label.getPreferredSize()); + label.putClientProperty(KEY_TEXT_ANTIALIASING, aaHint); + label.putClientProperty(KEY_TEXT_LCD_CONTRAST, lcdContrast); + + int w = label.getWidth(); + int h = label.getHeight(); + + BufferedImage buffImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + Graphics2D g = buffImage.createGraphics(); + g.setColor(Color.WHITE); + g.fillRect(0, 0, w, h); + label.paint(g); + g.dispose(); + + HashSet colors = new HashSet<>(); + + for (int i = 0; i < w; i++) { + for (int j = 0; j < h; j++) { + Color color = new Color(buffImage.getRGB(i, j)); + colors.add(color); + } + } + + return colors; + } + + private static void setMetalLookAndFeel() { + setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + } + + private static void setLookAndFeel(String lafClass) { + try { + UIManager.setLookAndFeel(lafClass); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void testLAFAAHints() { + + for (LookAndFeelInfo lafInfo : UIManager.getInstalledLookAndFeels()) { + testLAFAAHints(lafInfo); + } + } + + private static final String[] EXCLUDED_LAFS = {"CDE/Motif"}; + + private static boolean isExcludedLAF(LookAndFeelInfo lafInfo) { + for (String excludedLaf : EXCLUDED_LAFS) { + if (lafInfo.getName().equals(excludedLaf)) { + return true; + } + } + return false; + } + + private static void testLAFAAHints(LookAndFeelInfo lafInfo) { + setLookAndFeel(lafInfo.getClassName()); + + Object uiAAHint = UIManager.getDefaults().get(KEY_TEXT_ANTIALIASING); + Object uiLCDContrastHint = UIManager.getDefaults().get( + KEY_TEXT_LCD_CONTRAST); + + Object aaHints = Toolkit.getDefaultToolkit(). + getDesktopProperty("awt.font.desktophints"); + + if (isExcludedLAF(lafInfo)) { + if (uiAAHint != null || uiLCDContrastHint != null) { + throw new RuntimeException("Rendering hints set for excluded L&F"); + } + } else if (aaHints instanceof Map) { + Map map = (Map) aaHints; + + if (uiAAHint != map.get(KEY_TEXT_ANTIALIASING)) { + throw new RuntimeException("UI defaults contains wrong aa hint"); + } + + if (uiLCDContrastHint != map.get(KEY_TEXT_LCD_CONTRAST)) { + throw new RuntimeException("UI defaults contains wrong" + + "lcd contrast hint"); + } + } else if (uiAAHint != null || uiLCDContrastHint != null) { + throw new RuntimeException("Rendering hints set for empty desktop" + + "properties"); + } + } + + private static class CustomLookAndFeel extends BasicLookAndFeel { + + private final boolean useAAHints; + + public CustomLookAndFeel(boolean useAAHints) { + this.useAAHints = useAAHints; + } + + @Override + public String getDescription() { + return getName(); + } + + @Override + public String getName() { + return "Custom L&F"; + } + + @Override + public String getID() { + return getName(); + } + + @Override + public boolean isNativeLookAndFeel() { + return false; + } + + @Override + public boolean isSupportedLookAndFeel() { + return true; + } + + @Override + protected void initClassDefaults(UIDefaults table) { + super.initClassDefaults(table); + table.put(KEY_TEXT_ANTIALIASING, getAAHint()); + table.put(KEY_TEXT_LCD_CONTRAST, getLCDContarstHint()); + } + + private Object getAAHint() { + return useAAHints ? VALUE_TEXT_ANTIALIAS_GASP : null; + } + + private Object getLCDContarstHint() { + return useAAHints ? 115 : null; + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/UIDefaults/8133926/InternalFrameIcon.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/UIDefaults/8133926/InternalFrameIcon.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.swing.Icon; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import static javax.swing.UIManager.getInstalledLookAndFeels; + +/** + * @test + * @bug 8133926 + */ +public final class InternalFrameIcon implements Runnable { + + public static void main(final String[] args) throws Exception { + for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) { + SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf)); + SwingUtilities.invokeAndWait(new InternalFrameIcon()); + } + } + + private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + System.out.println("LookAndFeel: " + laf.getClassName()); + } catch (ClassNotFoundException | InstantiationException | + UnsupportedLookAndFeelException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + @Override + public void run() { + Object o = UIManager.getDefaults().get("InternalFrame.icon"); + if (o != null && !(o instanceof Icon)) { + throw new RuntimeException("Wrong object: " + o); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/javax/swing/text/Utilities/8134721/bug8134721.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/text/Utilities/8134721/bug8134721.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import javax.swing.SwingUtilities; +import javax.swing.text.Segment; +import javax.swing.text.Utilities; + +/** + * @test + * @bug 8134721 + * @author Alexandr Scherbatiy + * @summary NPE in SwingUtilities2.drawChars after JDK-6302464 + */ +public class bug8134721 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(bug8134721::testNPE); + } + + private static void testNPE() { + + Graphics g = null; + try { + String test = "\ttest\ttest2"; + BufferedImage buffImage = new BufferedImage( + 100, 100, BufferedImage.TYPE_INT_RGB); + g = buffImage.createGraphics(); + Segment segment = new Segment(test.toCharArray(), 0, test.length()); + Utilities.drawTabbedText(segment, 0, 0, g, null, 0); + } finally { + if (g != null) { + g.dispose(); + } + } + } +} \ No newline at end of file diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/java2d/SunGraphics2D/SurfaceDestination/SurfaceDestination.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/java2d/SunGraphics2D/SurfaceDestination/SurfaceDestination.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Component; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Window; +import java.awt.image.BufferedImage; + +import sun.java2d.SunGraphics2D; + +import static java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment; +import static java.awt.Transparency.BITMASK; +import static java.awt.Transparency.OPAQUE; +import static java.awt.Transparency.TRANSLUCENT; +import static java.awt.image.BufferedImage.TYPE_INT_ARGB; + +/** + * @test + * @bug 8134603 + * @modules java.desktop/sun.java2d + * @run main/othervm SurfaceDestination + */ +public final class SurfaceDestination { + + public static void main(final String[] args) { + final GraphicsEnvironment lge = getLocalGraphicsEnvironment(); + final GraphicsDevice dev = lge.getDefaultScreenDevice(); + final GraphicsConfiguration config = dev.getDefaultConfiguration(); + + test(config.createCompatibleImage(10, 10).getGraphics()); + test(config.createCompatibleImage(10, 10, OPAQUE).getGraphics()); + test(config.createCompatibleImage(10, 10, BITMASK).getGraphics()); + test(config.createCompatibleImage(10, 10, TRANSLUCENT).getGraphics()); + + test(new BufferedImage(10, 10, TYPE_INT_ARGB).getGraphics()); + + final Window frame = new Frame(); + frame.pack(); + try { + test(frame.getGraphics()); + test(frame.createImage(10, 10).getGraphics()); + } finally { + frame.dispose(); + } + } + + private static void test(final Graphics graphics) { + try { + if (graphics instanceof SunGraphics2D) { + final Object dst = ((SunGraphics2D) graphics).getDestination(); + if (!(dst instanceof Image) && !(dst instanceof Component)) { + throw new RuntimeException("Wrong type:" + dst); + } + } + } finally { + graphics.dispose(); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/krb5/auto/KrbTicket.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/KrbTicket.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import javax.security.auth.RefreshFailedException; +import javax.security.auth.Subject; +import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.login.LoginContext; + +/* + * @test + * @bug 6857795 8075299 + * @summary Checks Kerberos ticket properties + * @run main/othervm KrbTicket + */ +public class KrbTicket { + + private static final String REALM = "TEST.REALM"; + private static final String HOST = "localhost"; + private static final String USER = "TESTER"; + private static final String USER_PRINCIPAL = USER + "@" + REALM; + private static final String PASSWORD = "password"; + private static final String KRBTGT_PRINCIPAL = "krbtgt/" + REALM; + private static final String KRB5_CONF_FILENAME = "krb5.conf"; + private static final String JAAS_CONF = "jaas.conf"; + private static final long TICKET_LIFTETIME = 5 * 60 * 1000; // 5 mins + + public static void main(String[] args) throws Exception { + // define principals + Map principals = new HashMap<>(); + principals.put(USER_PRINCIPAL, PASSWORD); + principals.put(KRBTGT_PRINCIPAL, null); + + System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME); + + // start a local KDC instance + KDC kdc = KDC.startKDC(HOST, null, REALM, principals, null, null); + KDC.saveConfig(KRB5_CONF_FILENAME, kdc, + "forwardable = true", "proxiable = true"); + + // create JAAS config + Files.write(Paths.get(JAAS_CONF), Arrays.asList( + "Client {", + " com.sun.security.auth.module.Krb5LoginModule required;", + "};" + )); + System.setProperty("java.security.auth.login.config", JAAS_CONF); + System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); + + long startTime = Instant.now().getEpochSecond() * 1000; + + LoginContext lc = new LoginContext("Client", + new Helper.UserPasswordHandler(USER, PASSWORD)); + lc.login(); + + Subject subject = lc.getSubject(); + System.out.println("subject: " + subject); + + Set creds = subject.getPrivateCredentials( + KerberosTicket.class); + + if (creds.size() > 1) { + throw new RuntimeException("Multiple credintials found"); + } + + Object o = creds.iterator().next(); + if (!(o instanceof KerberosTicket)) { + throw new RuntimeException("Instance of KerberosTicket expected"); + } + KerberosTicket krbTkt = (KerberosTicket) o; + + System.out.println("forwardable = " + krbTkt.isForwardable()); + System.out.println("proxiable = " + krbTkt.isProxiable()); + System.out.println("renewable = " + krbTkt.isRenewable()); + System.out.println("current = " + krbTkt.isCurrent()); + + if (!krbTkt.isForwardable()) { + throw new RuntimeException("Forwardable ticket expected"); + } + + if (!krbTkt.isProxiable()) { + throw new RuntimeException("Proxiable ticket expected"); + } + + if (!krbTkt.isCurrent()) { + throw new RuntimeException("Ticket is not current"); + } + + if (krbTkt.isRenewable()) { + throw new RuntimeException("Not renewable ticket expected"); + } + try { + krbTkt.refresh(); + throw new RuntimeException( + "Expected RefreshFailedException not thrown"); + } catch(RefreshFailedException e) { + System.out.println("Expected exception: " + e); + } + + if (!checkTime(krbTkt, startTime)) { + throw new RuntimeException("Wrong ticket life time"); + } + + krbTkt.destroy(); + if (!krbTkt.isDestroyed()) { + throw new RuntimeException("Ticket not destroyed"); + } + + System.out.println("Test passed"); + } + + private static boolean checkTime(KerberosTicket krbTkt, long startTime) { + long ticketEndTime = krbTkt.getEndTime().getTime(); + long roughLifeTime = ticketEndTime - startTime; + System.out.println("start time = " + startTime); + System.out.println("end time = " + ticketEndTime); + System.out.println("rough life time = " + roughLifeTime); + return roughLifeTime >= TICKET_LIFTETIME; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/krb5/auto/tools/KinitConfPlusProps.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/tools/KinitConfPlusProps.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.net.PortUnreachableException; +import java.util.HashMap; +import java.util.Map; +import jdk.testlibrary.ProcessTools; +import jdk.testlibrary.OutputAnalyzer; + +/* + * @test + * @bug 6857795 8075299 + * @summary Checks if kinit uses both krb5 conf file and system properties + * @requires os.family == "windows" + * @library /lib/testlibrary + * @library /sun/security/krb5/auto + * @run main/othervm KinitConfPlusProps + */ +public class KinitConfPlusProps { + + private static final String KINIT = System.getProperty("java.home") + + File.separator + "bin" + File.separator + "kinit"; + private static final String KLIST = System.getProperty("java.home") + + File.separator + "bin" + File.separator + "klist"; + private static final String REALM = "REALM"; + private static final String ANOTHER_REALM = "ANOTHER.REALM"; + private static final String HOST = "localhost"; + private static final String CC_FILENAME = "krb5cc_test"; + private static final String USER = "TESTER"; + private static final String USER_PRINCIPAL = USER + "@" + REALM; + private static final String KRBTGT_PRINCIPAL = "krbtgt/" + REALM; + private static final String KEYTAB_FILE = "test.keytab"; + private static final String KRB5_CONF_FILENAME = "krb5.conf"; + + public static void main(String[] args) throws Exception { + // define principals + Map principals = new HashMap<>(); + principals.put(USER_PRINCIPAL, null); + principals.put(KRBTGT_PRINCIPAL, null); + + System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME); + + // start a local KDC instance + KDC kdc = KDC.startKDC(HOST, null, REALM, principals, KEYTAB_FILE, + KDC.KtabMode.APPEND); + KDC.saveConfig(KRB5_CONF_FILENAME, kdc, + "forwardable = true", "proxiable = true"); + + boolean success = true; + + /* + * kinit should fail since java.security.krb5.kdc + * and java.security.krb5.realm properties override correct values + * in krb5 conf file + */ + String[] command = {KINIT, "-k", + "-J-Djava.security.krb5.realm=" + REALM, + "-J-Djava.security.krb5.kdc=" + HOST, // without port + "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME, + "-t", KEYTAB_FILE, + "-c", CC_FILENAME, + USER + }; + + try { + OutputAnalyzer out = ProcessTools.executeCommand(command); + out.shouldHaveExitValue(-1); + out.shouldContain(PortUnreachableException.class.getName()); + } catch(Throwable e) { + System.out.println("Unexpected exception: " + e); + e.printStackTrace(System.out); + success = false; + } + + /* + * kinit should succeed + * since realm should be picked up from principal name + */ + command = new String[] {KINIT, "-k", + "-J-Djava.security.krb5.realm=" + ANOTHER_REALM, + "-J-Djava.security.krb5.kdc=" + HOST, + "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME, + "-t", KEYTAB_FILE, + "-c", CC_FILENAME, + USER_PRINCIPAL + }; + + try { + OutputAnalyzer out = ProcessTools.executeCommand(command); + out.shouldHaveExitValue(0); + out.shouldContain(CC_FILENAME); + } catch(Throwable e) { + System.out.println("Unexpected exception: " + e); + e.printStackTrace(System.out); + success = false; + } + + success &= checkTicketFlags(); + + /* + * kinit should succeed + * since realm should be picked up from principal name, + * and other data should come from krb5 conf file + */ + command = new String[] {KINIT, "-k", + "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME, + "-t", KEYTAB_FILE, + "-c", CC_FILENAME, + USER_PRINCIPAL + }; + + try { + OutputAnalyzer out = ProcessTools.executeCommand(command); + out.shouldHaveExitValue(0); + out.shouldContain(CC_FILENAME); + } catch(Throwable e) { + System.out.println("Unexpected exception: " + e); + e.printStackTrace(System.out); + success = false; + } + + success &= checkTicketFlags(); + + // kinit should succeed even if a principal name doesn't have realm + command = new String[] {KINIT, "-k", + "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME, + "-t", KEYTAB_FILE, + "-c", CC_FILENAME, + USER + }; + + try { + OutputAnalyzer out = ProcessTools.executeCommand(command); + out.shouldHaveExitValue(0); + out.shouldContain(CC_FILENAME); + } catch(Throwable e) { + System.out.println("Unexpected exception: " + e); + e.printStackTrace(System.out); + success = false; + } + + success &= checkTicketFlags(); + + if (!success) { + throw new RuntimeException("At least one test case failed"); + } + System.out.println("Test passed"); + } + + // check if a ticket has forwardable and proxiable flags + private static boolean checkTicketFlags() { + String[] command = new String[] {KLIST, "-f", "-c", CC_FILENAME}; + + try { + OutputAnalyzer out = ProcessTools.executeCommand(command); + out.shouldHaveExitValue(0); + out.shouldContain("FORWARDABLE"); + out.shouldContain("PROXIABLE"); + } catch(Throwable e) { + System.out.println("Unexpected exception: " + e); + e.printStackTrace(System.out); + return false; + } + + return true; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/provider/certpath/Extensions/OCSPNonceExtensionTests.java --- a/jdk/test/sun/security/provider/certpath/Extensions/OCSPNonceExtensionTests.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/sun/security/provider/certpath/Extensions/OCSPNonceExtensionTests.java Tue Sep 15 07:47:44 2015 -0700 @@ -79,14 +79,11 @@ Map testList = new LinkedHashMap() {{ put("CTOR Test (provide length)", testCtorByLength); + put("CTOR Test (provide nonce bytes)", testCtorByValue); + put("CTOR Test (set criticality forms)", testCtorCritForms); put("CTOR Test (provide extension DER encoding)", testCtorSuperByDerValue); - put("Use set() call to provide random data", testResetValue); - put("Test get() method", testGet); - put("test set() method", testSet); - put("Test getElements() method", testGetElements); put("Test getName() method", testGetName); - put("Test delete() method", testDelete); }}; System.out.println("============ Tests ============"); @@ -179,6 +176,20 @@ Boolean pass = Boolean.FALSE; String message = null; try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + // Try sending in a negative length + try { + Extension negLenNonce = new OCSPNonceExtension(-8); + throw new RuntimeException( + "Accepted a negative length nonce"); + } catch (IllegalArgumentException iae) { } + + // How about a zero length? + try { + Extension zeroLenNonce = new OCSPNonceExtension(0); + throw new RuntimeException("Accepted a zero length nonce"); + } catch (IllegalArgumentException iae) { } + + // Valid input to constructor Extension nonceByLen = new OCSPNonceExtension(32); // Verify overall encoded extension structure @@ -216,6 +227,82 @@ } }; + public static final TestCase testCtorByValue = new TestCase() { + @Override + public Map.Entry runTest() { + Boolean pass = Boolean.FALSE; + String message = null; + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + + // Try giving a null value for the nonce + try { + Extension nullNonce = new OCSPNonceExtension(null); + throw new RuntimeException("Accepted a null nonce"); + } catch (NullPointerException npe) { } + + // How about a zero-length byte array? + try { + Extension zeroLenNonce = + new OCSPNonceExtension(new byte[0]); + throw new RuntimeException("Accepted a zero length nonce"); + } catch (IllegalArgumentException iae) { } + + OCSPNonceExtension nonceByValue = + new OCSPNonceExtension(DEADBEEF_16); + + // Verify overall encoded extension structure + nonceByValue.encode(baos); + verifyExtStructure(baos.toByteArray()); + + // Verify the name, elements, and data conform to + // expected values for this specific object. + boolean crit = nonceByValue.isCritical(); + String oid = nonceByValue.getId(); + byte[] nonceData = nonceByValue.getNonceValue(); + + if (crit) { + message = "Extension incorrectly marked critical"; + } else if (!oid.equals(OCSP_NONCE_OID)) { + message = "Incorrect OID (Got " + oid + ", Expected " + + OCSP_NONCE_OID + ")"; + } else if (!Arrays.equals(nonceData, DEADBEEF_16)) { + message = "Returned nonce value did not match input"; + } else { + pass = Boolean.TRUE; + } + } catch (Exception e) { + e.printStackTrace(System.out); + message = e.getClass().getName(); + } + + return new AbstractMap.SimpleEntry<>(pass, message); + } + }; + + public static final TestCase testCtorCritForms = new TestCase() { + @Override + public Map.Entry runTest() { + Boolean pass = Boolean.FALSE; + String message = null; + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + Extension nonceByLength = new OCSPNonceExtension(true, 32); + Extension nonceByValue = + new OCSPNonceExtension(true, DEADBEEF_16); + pass = nonceByLength.isCritical() && nonceByValue.isCritical(); + if (!pass) { + message = "nonceByLength or nonceByValue was not marked " + + "critical as expected"; + } + } catch (Exception e) { + e.printStackTrace(System.out); + message = e.getClass().getName(); + } + + return new AbstractMap.SimpleEntry<>(pass, message); + } + }; + + public static final TestCase testCtorSuperByDerValue = new TestCase() { @Override public Map.Entry runTest() { @@ -260,145 +347,6 @@ } }; - public static final TestCase testResetValue = new TestCase() { - @Override - public Map.Entry runTest() { - Boolean pass = Boolean.FALSE; - String message = null; - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - OCSPNonceExtension nonce = new OCSPNonceExtension(32); - - // Reset the nonce data to reflect 16 bytes of DEADBEEF - nonce.set(OCSPNonceExtension.NONCE, (Object)DEADBEEF_16); - - // Verify overall encoded extension content - nonce.encode(baos); - dumpHexBytes(OCSP_NONCE_DB16); - System.out.println(); - dumpHexBytes(baos.toByteArray()); - - pass = Arrays.equals(baos.toByteArray(), OCSP_NONCE_DB16); - } catch (Exception e) { - e.printStackTrace(System.out); - message = e.getClass().getName(); - } - - return new AbstractMap.SimpleEntry<>(pass, message); - } - }; - - public static final TestCase testSet = new TestCase() { - @Override - public Map.Entry runTest() { - Boolean pass = Boolean.FALSE; - String message = null; - try { - OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32); - - // Set the nonce data to 16 bytes of DEADBEEF - nonceByLen.set(ELEMENT_NONCE, DEADBEEF_16); - byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE); - if (!Arrays.equals(nonceData, DEADBEEF_16)) { - throw new RuntimeException("Retuned nonce data does not " + - "match expected result"); - } - - // Now try to set a value using an object that is not a byte - // array - int[] INT_DB_16 = { - 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF - }; - try { - nonceByLen.set(ELEMENT_NONCE, INT_DB_16); - throw new RuntimeException("Accepted get() for " + - "unsupported element name"); - } catch (IOException ioe) { } // Expected result - - // And try setting a value using an unknown element name - try { - nonceByLen.set("FOO", DEADBEEF_16); - throw new RuntimeException("Accepted get() for " + - "unsupported element name"); - } catch (IOException ioe) { } // Expected result - - pass = Boolean.TRUE; - } catch (Exception e) { - e.printStackTrace(System.out); - message = e.getClass().getName(); - } - - return new AbstractMap.SimpleEntry<>(pass, message); - } - }; - - public static final TestCase testGet = new TestCase() { - @Override - public Map.Entry runTest() { - Boolean pass = Boolean.FALSE; - String message = null; - try { - OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32); - - // Grab the nonce data by its correct element name - byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE); - if (nonceData == null || nonceData.length != 32) { - throw new RuntimeException("Unexpected return value from " + - "get() method: either null or incorrect length"); - } - - // Now try to get any kind of data using an element name that - // doesn't exist for this extension. - try { - nonceByLen.get("FOO"); - throw new RuntimeException("Accepted get() for " + - "unsupported element name"); - } catch (IOException ioe) { } // Expected result - - pass = Boolean.TRUE; - } catch (Exception e) { - e.printStackTrace(System.out); - message = e.getClass().getName(); - } - - return new AbstractMap.SimpleEntry<>(pass, message); - } - }; - - public static final TestCase testGetElements = new TestCase() { - @Override - public Map.Entry runTest() { - Boolean pass = Boolean.FALSE; - String message = null; - try { - OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32); - - int elementCount = 0; - boolean foundElement = false; - - // There should be exactly one element and its name should - // be "nonce" - for (Enumeration elements = nonceByLen.getElements(); - elements.hasMoreElements(); elementCount++) { - if (elements.nextElement().equals(ELEMENT_NONCE)) { - foundElement = true; - } - } - - if (!foundElement || elementCount != 1) { - throw new RuntimeException("Unexpected or missing " + - "Enumeration element"); - } - - pass = Boolean.TRUE; - } catch (Exception e) { - e.printStackTrace(System.out); - message = e.getClass().getName(); - } - - return new AbstractMap.SimpleEntry<>(pass, message); - } - }; - public static final TestCase testGetName = new TestCase() { @Override public Map.Entry runTest() { @@ -415,44 +363,4 @@ return new AbstractMap.SimpleEntry<>(pass, message); } }; - - public static final TestCase testDelete = new TestCase() { - @Override - public Map.Entry runTest() { - Boolean pass = Boolean.FALSE; - String message = null; - try { - OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32); - - // First verify that there's data to begin with - byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE); - if (nonceData == null || nonceData.length != 32) { - throw new RuntimeException("Unexpected return value from " + - "get() method: either null or incorrect length"); - } - - // Attempt to delete using an element name that doesn't exist - // for this extension. - try { - nonceByLen.delete("FOO"); - throw new RuntimeException("Accepted delete() for " + - "unsupported element name"); - } catch (IOException ioe) { } // Expected result - - // Now attempt to properly delete the extension data - nonceByLen.delete(ELEMENT_NONCE); - nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE); - if (nonceData != null) { - throw new RuntimeException("Unexpected non-null return"); - } - - pass = Boolean.TRUE; - } catch (Exception e) { - e.printStackTrace(System.out); - message = e.getClass().getName(); - } - - return new AbstractMap.SimpleEntry<>(pass, message); - } - }; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/rsa/KeySizeTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/rsa/KeySizeTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.interfaces.RSAKey; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.RSAPrivateKeySpec; +import java.security.spec.RSAPublicKeySpec; + +/** + * @test + * @bug 8044199 + * @summary test if the private and public key size are the same as what is set + * through KeyPairGenerator. + * @run main KeySizeTest 512 10 + * @run main KeySizeTest 768 10 + * @run main KeySizeTest 1024 10 + * @run main KeySizeTest 2048 5 + * @run main KeySizeTest 4096 1 + */ +public class KeySizeTest { + + /** + * ALGORITHM name, fixed as RSA. + */ + private static final String KEYALG = "RSA"; + + /** + * JDK default RSA Provider. + */ + private static final String PROVIDER_NAME = "SunRsaSign"; + + public static void main(String[] args) throws Exception { + int iKeyPairSize = Integer.parseInt(args[0]); + int maxLoopCnt = Integer.parseInt(args[1]); + + int failCount = 0; + KeyPairGenerator keyPairGen + = KeyPairGenerator.getInstance(KEYALG, PROVIDER_NAME); + keyPairGen.initialize(iKeyPairSize); + // Generate RSA keypair + KeyPair keyPair = keyPairGen.generateKeyPair(); + + // Get priavte and public keys + PrivateKey privateKey = keyPair.getPrivate(); + PublicKey publicKey = keyPair.getPublic(); + try { + if (!sizeTest(keyPair)) { + failCount++; + } + } catch (Exception ex) { + ex.printStackTrace(System.err); + failCount++; + } + + for (int iCnt = 0; iCnt < maxLoopCnt; iCnt++) { + + // Get keysize (modulus) of keys + KeyFactory keyFact = KeyFactory.getInstance(KEYALG, PROVIDER_NAME); + + // Comparing binary length. + RSAPrivateKeySpec privateKeySpec + = (RSAPrivateKeySpec) keyFact.getKeySpec(privateKey, + RSAPrivateKeySpec.class); + int iPrivateKeySize = privateKeySpec.getModulus().bitLength(); + + RSAPublicKeySpec publicKeySpec + = (RSAPublicKeySpec) keyFact.getKeySpec(publicKey, + RSAPublicKeySpec.class); + int iPublicKeySize = publicKeySpec.getModulus().bitLength(); + + if ((iKeyPairSize != iPublicKeySize) || (iKeyPairSize != iPrivateKeySize)) { + System.err.println("iKeyPairSize : " + iKeyPairSize); + System.err.println("Generated a " + iPrivateKeySize + + " bit RSA private key"); + System.err.println("Generated a " + iPublicKeySize + + " bit RSA public key"); + failCount++; + } + } + + if (failCount > 0) { + throw new RuntimeException("There are " + failCount + " tests failed."); + } + } + + /** + * @param kpair test key pair. + * @return true if test passed. false if test failed. + */ + private static boolean sizeTest(KeyPair kpair) { + RSAPrivateKey priv = (RSAPrivateKey) kpair.getPrivate(); + RSAPublicKey pub = (RSAPublicKey) kpair.getPublic(); + + // test the getModulus method + if ((priv instanceof RSAKey) && (pub instanceof RSAKey)) { + if (!priv.getModulus().equals(pub.getModulus())) { + System.err.println("priv.getModulus() = " + priv.getModulus()); + System.err.println("pub.getModulus() = " + pub.getModulus()); + return false; + } + } + return true; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/rsa/PrivateKeyEqualityTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/rsa/PrivateKeyEqualityTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.security.KeyFactory; +import java.security.KeyPairGenerator; +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.interfaces.RSAPrivateCrtKey; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.RSAPrivateKeySpec; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.RSAPrivateCrtKeySpec; + +/** + * @test + * @bug 8044199 4666485 + * @summary Equality checking for RSAPrivateKey by SunRsaSign provider. + */ +public class PrivateKeyEqualityTest { + /** + * ALGORITHM name, fixed as RSA. + */ + private static final String KEYALG = "RSA"; + + /** + * JDK default RSA Provider. + */ + private static final String PROVIDER_NAME = "SunRsaSign"; + + public static void main(String[] args) throws NoSuchAlgorithmException, + NoSuchProviderException, InvalidKeySpecException { + // Generate the first key. + KeyPairGenerator generator + = KeyPairGenerator.getInstance(KEYALG, PROVIDER_NAME); + KeyPair keyPair = generator.generateKeyPair(); + RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); + if (!(rsaPrivateKey instanceof RSAPrivateCrtKey)) { + System.err.println("rsaPrivateKey class : " + rsaPrivateKey.getClass().getName()); + throw new RuntimeException("rsaPrivateKey is not a RSAPrivateCrtKey instance"); + } + + // Generate the second key. + KeyFactory factory = KeyFactory.getInstance(KEYALG, PROVIDER_NAME); + RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec( + rsaPrivateKey.getModulus(), rsaPrivateKey.getPrivateExponent()); + RSAPrivateKey rsaPrivateKey2 = (RSAPrivateKey) factory.generatePrivate( + rsaPrivateKeySpec); + + // Generate the third key. + PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec( + rsaPrivateKey.getEncoded()); + RSAPrivateKey rsaPrivateKey3 = (RSAPrivateKey) factory.generatePrivate( + encodedKeySpec); + + // Check for equality. + if (rsaPrivateKey.equals(rsaPrivateKey2)) { + throw new RuntimeException("rsaPrivateKey should not equal to rsaPrivateKey2"); + } + if (!rsaPrivateKey3.equals(rsaPrivateKey)) { + throw new RuntimeException("rsaPrivateKey3 should equal to rsaPrivateKey"); + } + if (rsaPrivateKey3.equals(rsaPrivateKey2)) { + throw new RuntimeException("rsaPrivateKey3 should not equal to rsaPrivateKey2"); + } + if (rsaPrivateKey2.equals(rsaPrivateKey3)) { + throw new RuntimeException("rsaPrivateKey2 should not equal to rsaPrivateKey3"); + } + + // Generate the fourth key. + RSAPrivateCrtKey rsaPrivateCrtKey = (RSAPrivateCrtKey)rsaPrivateKey; + RSAPrivateCrtKeySpec rsaPrivateCrtKeySpec = new RSAPrivateCrtKeySpec( + rsaPrivateCrtKey.getModulus(), + rsaPrivateCrtKey.getPublicExponent(), + rsaPrivateCrtKey.getPrivateExponent(), + rsaPrivateCrtKey.getPrimeP(), + rsaPrivateCrtKey.getPrimeQ(), + rsaPrivateCrtKey.getPrimeExponentP(), + rsaPrivateCrtKey.getPrimeExponentQ(), + rsaPrivateCrtKey.getCrtCoefficient() + ); + RSAPrivateCrtKey rsaPrivateKey4 = (RSAPrivateCrtKey) factory.generatePrivate( + rsaPrivateCrtKeySpec); + if (!rsaPrivateKey.equals(rsaPrivateKey4)) { + throw new RuntimeException("rsaPrivateKey should equal to rsaPrivateKey4"); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/rsa/SignatureTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/rsa/SignatureTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.Signature; +import java.security.SignatureException; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.RSAPrivateKeySpec; +import java.security.spec.RSAPublicKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Arrays; +import static javax.crypto.Cipher.PRIVATE_KEY; +import static javax.crypto.Cipher.PUBLIC_KEY; +import jdk.testlibrary.RandomFactory; + +/** + * @test + * @bug 8044199 + * @summary Create a signature for RSA and get its signed data. re-initiate + * the signature with the public key. The signature can be verified + * by acquired signed data. + * @key randomness + * @library ../../../lib/testlibrary + * @run main SignatureTest MD2withRSA 512 + * @run main SignatureTest MD5withRSA 512 + * @run main SignatureTest SHA1withRSA 512 + * @run main SignatureTest SHA256withRSA 512 + * @run main SignatureTest MD2withRSA 768 + * @run main SignatureTest MD5withRSA 768 + * @run main SignatureTest SHA1withRSA 768 + * @run main SignatureTest SHA256withRSA 768 + * @run main SignatureTest MD2withRSA 1024 + * @run main SignatureTest MD5withRSA 1024 + * @run main SignatureTest SHA1withRSA 1024 + * @run main SignatureTest SHA256withRSA 1024 + * @run main SignatureTest MD2withRSA 2048 + * @run main SignatureTest MD5withRSA 2048 + * @run main SignatureTest SHA1withRSA 2048 + * @run main SignatureTest SHA256withRSA 2048 + * @run main/timeout=240 SignatureTest MD2withRSA 4096 + * @run main/timeout=240 SignatureTest MD5withRSA 4096 + * @run main/timeout=240 SignatureTest SHA1withRSA 4096 + * @run main/timeout=240 SignatureTest SHA256withRSA 4096 + * @run main/timeout=240 SignatureTest MD2withRSA 5120 + * @run main/timeout=240 SignatureTest MD5withRSA 5120 + * @run main/timeout=240 SignatureTest SHA1withRSA 5120 + * @run main/timeout=240 SignatureTest SHA256withRSA 5120 + * @run main/timeout=240 SignatureTest MD2withRSA 6144 + * @run main/timeout=240 SignatureTest MD5withRSA 6144 + * @run main/timeout=240 SignatureTest SHA1withRSA 6144 + * @run main/timeout=240 SignatureTest SHA256withRSA 6144 + */ +public class SignatureTest { + /** + * ALGORITHM name, fixed as RSA. + */ + private static final String KEYALG = "RSA"; + + /** + * JDK default RSA Provider. + */ + private static final String PROVIDER = "SunRsaSign"; + + /** + * How much times signature updated. + */ + private static final int UPDATE_TIMES_FIFTY = 50; + + /** + * How much times signature initial updated. + */ + private static final int UPDATE_TIMES_HUNDRED = 100; + + public static void main(String[] args) throws Exception { + String testAlg = args[0]; + int testSize = Integer.parseInt(args[1]); + + byte[] data = new byte[100]; + RandomFactory.getRandom().nextBytes(data); + + // create a key pair + KeyPair kpair = generateKeys(KEYALG, testSize); + Key[] privs = manipulateKey(PRIVATE_KEY, kpair.getPrivate()); + Key[] pubs = manipulateKey(PUBLIC_KEY, kpair.getPublic()); + // For signature algorithm, create and verify a signature + + Arrays.stream(privs).forEach(priv + -> Arrays.stream(pubs).forEach(pub -> { + try { + checkSignature(data, (PublicKey) pub, (PrivateKey) priv, + testAlg); + } catch (NoSuchAlgorithmException | InvalidKeyException + | SignatureException | NoSuchProviderException ex) { + throw new RuntimeException(ex); + } + } + )); + + } + + private static KeyPair generateKeys(String keyalg, int size) + throws NoSuchAlgorithmException { + KeyPairGenerator kpg = KeyPairGenerator.getInstance(keyalg); + kpg.initialize(size); + return kpg.generateKeyPair(); + } + + private static Key[] manipulateKey(int type, Key key) + throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { + KeyFactory kf = KeyFactory.getInstance(KEYALG, PROVIDER); + + switch (type) { + case PUBLIC_KEY: + try { + kf.getKeySpec(key, RSAPrivateKeySpec.class); + throw new RuntimeException("Expected InvalidKeySpecException " + + "not thrown"); + } catch (InvalidKeySpecException expected) { + } + + return new Key[]{ + kf.generatePublic(kf.getKeySpec(key, RSAPublicKeySpec.class)), + kf.generatePublic(new X509EncodedKeySpec(key.getEncoded())), + kf.generatePublic(new RSAPublicKeySpec( + ((RSAPublicKey) key).getModulus(), + ((RSAPublicKey) key).getPublicExponent())) + }; + case PRIVATE_KEY: + try { + kf.getKeySpec(key, RSAPublicKeySpec.class); + throw new RuntimeException("Expected InvalidKeySpecException" + + " not thrown"); + } catch (InvalidKeySpecException expected) { + } + return new Key[]{ + kf.generatePrivate(kf.getKeySpec(key, + RSAPrivateKeySpec.class)), + kf.generatePrivate(new PKCS8EncodedKeySpec( + key.getEncoded())), + kf.generatePrivate(new RSAPrivateKeySpec(((RSAPrivateKey) key).getModulus(), + ((RSAPrivateKey) key).getPrivateExponent())) + }; + } + throw new RuntimeException("We shouldn't reach here"); + } + + private static void checkSignature(byte[] data, PublicKey pub, + PrivateKey priv, String sigalg) throws NoSuchAlgorithmException, + InvalidKeyException, SignatureException, NoSuchProviderException { + Signature sig = Signature.getInstance(sigalg, PROVIDER); + sig.initSign(priv); + for (int i = 0; i < UPDATE_TIMES_HUNDRED; i++) { + sig.update(data); + } + byte[] signedData = sig.sign(); + + // Make sure signature verifies with original data + sig.initVerify(pub); + for (int i = 0; i < UPDATE_TIMES_HUNDRED; i++) { + sig.update(data); + } + if (!sig.verify(signedData)) { + throw new RuntimeException("Failed to verify " + sigalg + + " signature"); + } + + // Make sure signature does NOT verify when the original data + // has changed + sig.initVerify(pub); + for (int i = 0; i < UPDATE_TIMES_FIFTY; i++) { + sig.update(data); + } + + if (sig.verify(signedData)) { + throw new RuntimeException("Failed to detect bad " + sigalg + + " signature"); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/rsa/SpecTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/rsa/SpecTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.math.BigInteger; +import java.security.InvalidAlgorithmParameterException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.interfaces.RSAKey; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.RSAKeyGenParameterSpec; + +/** + * @test + * @bug 8044199 + * @summary Check same KeyPair's private key and public key have same modulus. + * also check public key's public exponent equals to given spec's public + * exponent. + * @run main SpecTest 512 + * @run main SpecTest 768 + * @run main SpecTest 1024 + * @run main SpecTest 2048 + * @run main/timeout=240 SpecTest 4096 + * @run main/timeout=240 SpecTest 5120 + */ +public class SpecTest { + /** + * ALGORITHM name, fixed as RSA. + */ + private static final String KEYALG = "RSA"; + + /** + * JDK default RSA Provider. + */ + private static final String PROVIDER = "SunRsaSign"; + + /** + * + * @param kpair test key pair + * @param pubExponent expected public exponent. + * @return true if test passed. false if test failed. + */ + private static boolean specTest(KeyPair kpair, BigInteger pubExponent) { + boolean passed = true; + RSAPrivateKey priv = (RSAPrivateKey) kpair.getPrivate(); + RSAPublicKey pub = (RSAPublicKey) kpair.getPublic(); + + // test the getModulus method + if ((priv instanceof RSAKey) && (pub instanceof RSAKey)) { + if (!priv.getModulus().equals(pub.getModulus())) { + System.err.println("priv.getModulus() = " + priv.getModulus()); + System.err.println("pub.getModulus() = " + pub.getModulus()); + passed = false; + } + + if (!pubExponent.equals(pub.getPublicExponent())) { + System.err.println("pubExponent = " + pubExponent); + System.err.println("pub.getPublicExponent() = " + + pub.getPublicExponent()); + passed = false; + } + } + return passed; + } + + public static void main(String[] args) { + int failCount = 0; + + // Test key size. + int size = Integer.parseInt(args[0]); + + try { + KeyPairGenerator kpg1 = KeyPairGenerator.getInstance(KEYALG, PROVIDER); + kpg1.initialize(new RSAKeyGenParameterSpec(size, + RSAKeyGenParameterSpec.F4)); + if (!specTest(kpg1.generateKeyPair(), + RSAKeyGenParameterSpec.F4)) { + failCount++; + } + + KeyPairGenerator kpg2 = KeyPairGenerator.getInstance(KEYALG, PROVIDER); + kpg2.initialize(new RSAKeyGenParameterSpec(size, + RSAKeyGenParameterSpec.F0)); + if (!specTest(kpg2.generateKeyPair(), RSAKeyGenParameterSpec.F0)) { + failCount++; + } + } catch (NoSuchAlgorithmException | NoSuchProviderException + | InvalidAlgorithmParameterException ex) { + ex.printStackTrace(System.err); + failCount++; + } + + if (failCount != 0) { + throw new RuntimeException("There are " + failCount + + " tests failed."); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/x509/URICertStore/ExtensionsWithLDAP.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/x509/URICertStore/ExtensionsWithLDAP.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2015, 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. + */ + +import java.io.IOException; +import java.io.StringBufferInputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509Certificate; +import java.text.DateFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import sun.net.spi.nameservice.NameService; +import sun.net.spi.nameservice.NameServiceDescriptor; + +/* + * @test + * @bug 8134708 + * @summary Check if LDAP resources from CRLDP and AIA extensions can be loaded + * @run main/othervm ExtensionsWithLDAP + */ +public class ExtensionsWithLDAP { + + /* + * Certificate: + * Data: + * Version: 3 (0x2) + * Serial Number: 11174053930990688938 (0x9b1236d8f9c1daaa) + * Signature Algorithm: sha512WithRSAEncryption + * Issuer: CN=Root + * Validity + * Not Before: Sep 1 18:03:59 2015 GMT + * Not After : Jan 17 18:03:59 2043 GMT + * Subject: CN=Root + */ + private static final String CA_CERT = "" + + "-----BEGIN CERTIFICATE-----\n" + + "MIIC8TCCAdmgAwIBAgIJAJsSNtj5wdqqMA0GCSqGSIb3DQEBDQUAMA8xDTALBgNV\n" + + "BAMMBFJvb3QwHhcNMTUwOTAxMTgwMzU5WhcNNDMwMTE3MTgwMzU5WjAPMQ0wCwYD\n" + + "VQQDDARSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvj892vPm\n" + + "bB++x9QqqyBveP+ZqQ2B1stV7vh5JmDnOTevkZUOcemp3SXu/esNLSbpL+fARYXH\n" + + "V5ubnrfip6RbvcxPfVIIDJrRTLIIsU6W7M6/LJLbLkEVGy4ZV4IHkOw9W2O92rcv\n" + + "BkoqhzZnOTGR6uT3rRcKx4RevEKBKhZO+OPPf//lnckOybmYL7t7yQrajzHro76b\n" + + "QTXYjAUq/DKhglXfC7vF/JzlAvG2IunGmIfjGcnuDo/9X3Bxef/q5TxCS35fvb7t\n" + + "svC+g2QhTcBkQh4uNW2jSjlTIVp1uErCfP5aCjLaez5mqmb1hxPIlcvsNR23HwU6\n" + + "bQO7z7NBo9Do6QIDAQABo1AwTjAdBgNVHQ4EFgQUmLZNOBBkqdYoElyxklPYHmAb\n" + + "QXIwHwYDVR0jBBgwFoAUmLZNOBBkqdYoElyxklPYHmAbQXIwDAYDVR0TBAUwAwEB\n" + + "/zANBgkqhkiG9w0BAQ0FAAOCAQEAYV4fOhDi5q7+XNXCxO8Eil2frR9jqdP4LaQp\n" + + "3L0evW0gvPX68s2WmkPWzIu4TJcpdGFQqxyQFSXuKBXjthyiln77QItGTHWeafES\n" + + "q5ESrKdSaJZq1bTIrrReCIP74f+fY/F4Tnb3dCqzaljXfzpdbeRsIW6gF71xcOUQ\n" + + "nnPEjGVPLUegN+Wn/jQpeLxxIB7FmNXncdRUfMfZ43xVSKuMCy1UUYqJqTa/pXZj\n" + + "jCMeRPThRjRqHlJ69jStfWUQATbLyj9KN09rUaJxzmUSt61UqJi7sjcGySaCjAJc\n" + + "IcCdVmX/DmRLsdv8W36O3MgrvpT1zR3kaAlv2d8HppnBqcL3xg==\n" + + "-----END CERTIFICATE-----"; + + /* + * Certificate: + * Data: + * Version: 3 (0x2) + * Serial Number: 7 (0x7) + * Signature Algorithm: sha512WithRSAEncryption + * Issuer: CN=Root + * Validity + * Not Before: Sep 1 18:03:59 2015 GMT + * Not After : Jan 17 18:03:59 2043 GMT + * Subject: CN=EE + * ... + * X509v3 extensions: + * X509v3 CRL Distribution Points: + * Full Name: + * URI:ldap://ldap.host.for.crldp/main.crl + * Authority Information Access: + * CA Issuers - URI:ldap://ldap.host.for.aia/dc=Root?cACertificate + */ + private static final String EE_CERT = "" + + "-----BEGIN CERTIFICATE-----\n" + + "MIIDHTCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQ0FADAPMQ0wCwYDVQQDDARSb290\n" + + "MB4XDTE1MDkwMTE4MDM1OVoXDTQzMDExNzE4MDM1OVowDTELMAkGA1UEAwwCRUUw\n" + + "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpyz97liuWPDYcLH9TX8Bi\n" + + "T78olCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgK\n" + + "mLhuczF3M9VIcWr+JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz\n" + + "7leikne7KmclHvTfvFd0WDI7Gb9vo4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXR\n" + + "v5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfFe1DDsMg/KpKGiILYZ+g2qtVM\n" + + "ZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e+sO6H24w2F19\n" + + "AgMBAAGjgYUwgYIwNAYDVR0fBC0wKzApoCegJYYjbGRhcDovL2xkYXAuaG9zdC5m\n" + + "b3IuY3JsZHAvbWFpbi5jcmwwSgYIKwYBBQUHAQEEPjA8MDoGCCsGAQUFBzAChi5s\n" + + "ZGFwOi8vbGRhcC5ob3N0LmZvci5haWEvZGM9Um9vdD9jQUNlcnRpZmljYXRlMA0G\n" + + "CSqGSIb3DQEBDQUAA4IBAQBWDfZHpuUx0yn5d3+BuztFqoks1MkGdk+USlH0TB1/\n" + + "gWWBd+4S4PCKlpSur0gj2rMW4fP5HQfNlHci8JV8/bG4KuKRAXW56dg1818Hl3pc\n" + + "iIrUSRn8uUjH3p9qb+Rb/u3mmVQRyJjN2t/zceNsO8/+Dd808OB9aEwGs8lMT0nn\n" + + "ZYaaAqYz1GIY/Ecyx1vfEZEQ1ljo6i/r70C3igbypBUShxSiGsleiVTLOGNA+MN1\n" + + "/a/Qh0bkaQyTGqK3bwvzzMeQVqWu2EWTBD/PmND5ExkpRICdv8LBVXfLnpoBr4lL\n" + + "hnxn9+e0Ah+t8dS5EKfn44w5bI5PCu2bqxs6RCTxNjcY\n" + + "-----END CERTIFICATE-----"; + + + private static final String LDAP_HOST_CRLDP = "ldap.host.for.crldp"; + private static final String LDAP_HOST_AIA = "ldap.host.for.aia"; + + // a date within the certificates validity period + static final Date validationDate; + static { + try { + validationDate = DateFormat.getDateInstance( + DateFormat.MEDIUM, Locale.US).parse("Sep 02, 2015"); + } catch (ParseException e) { + throw new RuntimeException("Couldn't parse date", e); + } + } + + public static void main(String[] args) throws Exception { + // enable CRLDP and AIA extensions + System.setProperty("com.sun.security.enableCRLDP", "true"); + System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); + + // register a local name service + System.setProperty("sun.net.spi.nameservice.provider.1", "ns,localdns"); + + X509Certificate trustedCert = loadCertificate(CA_CERT); + X509Certificate eeCert = loadCertificate(EE_CERT); + + Set trustedCertsSet = new HashSet<>(); + trustedCertsSet.add(new TrustAnchor(trustedCert, null)); + + CertPath cp = (CertPath) CertificateFactory.getInstance("X509") + .generateCertPath(Arrays.asList(eeCert)); + + PKIXParameters params = new PKIXParameters(trustedCertsSet); + params.setDate(validationDate); + + // certpath validator should try to parse CRLDP and AIA extensions, + // and load CRLs/certs which they point to + // if a local name service catched requests for resolving host names + // which extensions contain, then it means that certpath validator + // tried to load CRLs/certs which they point to + try { + CertPathValidator.getInstance("PKIX").validate(cp, params); + throw new RuntimeException("CertPathValidatorException not thrown"); + } catch (CertPathValidatorException cpve) { + System.out.println("Expected exception: " + cpve); + } + + // check if it tried to resolve a host name from CRLDP extension + if (!LocalNameService.requestedHosts.contains(LDAP_HOST_CRLDP)) { + throw new RuntimeException( + "A hostname from CRLDP extension not requested"); + } + + // check if it tried to resolve a host name from AIA extension + if (!LocalNameService.requestedHosts.contains(LDAP_HOST_AIA)) { + throw new RuntimeException( + "A hostname from AIA extension not requested"); + } + + System.out.println("Test passed"); + } + + // load a X509 certificate + public static X509Certificate loadCertificate(String s) + throws IOException, CertificateException { + + try (StringBufferInputStream is = new StringBufferInputStream(s)) { + return (X509Certificate) CertificateFactory.getInstance("X509") + .generateCertificate(is); + } + } + + // a local name service which log requested host names + public static class LocalNameService implements NameServiceDescriptor { + + static final List requestedHosts = new ArrayList<>(); + + @Override + public NameService createNameService() throws Exception { + System.out.println("LocalNameService: createNameService() called"); + NameService ns = new NameService() { + + @Override + public InetAddress[] lookupAllHostAddr(String host) + throws UnknownHostException { + + System.out.println("LocalNameService: " + + "NameService.lookupAllHostAddr(): " + host); + + requestedHosts.add(host); + + throw new UnknownHostException(); + } + + @Override + public String getHostByAddr(byte[] addr) + throws UnknownHostException { + System.out.println("LocalNameService: " + + "NameService.getHostByAddr(): " + + Arrays.toString(addr)); + throw new UnknownHostException("No reverse lookup"); + } + }; + return ns; + } + + @Override + public String getProviderName() { + return "localdns"; + } + + @Override + public String getType() { + return "ns"; + } + } + +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/security/x509/URICertStore/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/x509/URICertStore/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,1 @@ +ExtensionsWithLDAP$LocalNameService diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/tools/jps/JpsBase.java --- a/jdk/test/sun/tools/jps/JpsBase.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/sun/tools/jps/JpsBase.java Tue Sep 15 07:47:44 2015 -0700 @@ -138,6 +138,8 @@ String tmp = str.replace("\\", "\\\\"); tmp = tmp.replace("+", "\\+"); tmp = tmp.replace(".", "\\."); + tmp = tmp.replace("\n", "\\\\n"); + tmp = tmp.replace("\r", "\\\\r"); return tmp; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/tools/jps/JpsHelper.java --- a/jdk/test/sun/tools/jps/JpsHelper.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/sun/tools/jps/JpsHelper.java Tue Sep 15 07:47:44 2015 -0700 @@ -97,7 +97,10 @@ * VM arguments to start test application with. * -XX:+UsePerfData is required for running the tests on embedded platforms. */ - public static final String[] VM_ARGS = {"-XX:+UsePerfData", "-Xmx512m", "-XX:+PrintGCDetails"}; + public static final String[] VM_ARGS = { + "-XX:+UsePerfData", "-Xmx512m", "-XX:+PrintGCDetails", + "-Dmultiline.prop=value1\nvalue2\r\nvalue3" + }; /** * VM flag to start test application with */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/util/resources/TimeZone/Bug6377794.java --- a/jdk/test/sun/util/resources/TimeZone/Bug6377794.java Thu Sep 10 14:55:18 2015 -0700 +++ b/jdk/test/sun/util/resources/TimeZone/Bug6377794.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,6 +25,7 @@ *@test *@bug 6377794 *@summary Test case for tzdata2005r support for 9 locales + *@run main/othervm -Djava.locale.providers=JRE,SPI Bug6377794 */ import java.util.Locale; diff -r 8a1504b43ad8 -r 351e2f1e9f17 jdk/test/sun/util/resources/cldr/Bug8134384.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/util/resources/cldr/Bug8134384.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8134384 + * @summary Tests CLDR TimeZoneNames has English names for all tzids + * @run main/othervm -Djava.locale.providers=CLDR Bug8134384 + */ + +import java.text.*; +import java.time.*; +import java.util.*; + +public class Bug8134384 { + public static void main(String [] args) { + TimeZone original = TimeZone.getDefault(); + + try { + for (String tz : TimeZone.getAvailableIDs() ) { + TimeZone.setDefault(TimeZone.getTimeZone(tz)); + // Summer solstice + String date1 = Date.from(Instant.parse("2015-06-21T00:00:00.00Z")).toString(); + testParse(Locale.ENGLISH, date1, tz); + testParse(Locale.US, date1, tz); + testParse(Locale.ROOT, date1, tz); + // Winter solstice + String date2 = Date.from(Instant.parse("2015-12-22T00:00:00.00Z")).toString(); + testParse(Locale.ENGLISH, date2, tz); + testParse(Locale.US, date2, tz); + testParse(Locale.ROOT, date2, tz); + } + } finally { + TimeZone.setDefault(original); + } + } + + private static void testParse(Locale locale, String date, String tz) { + try { + new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", locale).parse(date); + System.out.println(String.format(Locale.ENGLISH, "OK parsing '%s' in locale '%s', tz: %s", date, locale, tz)); + } catch (ParseException pe) { + throw new RuntimeException(String.format(Locale.ENGLISH, "ERROR parsing '%s' in locale '%s', tz: %s: %s", date, locale, tz, pe.toString())); + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/.hgtags --- a/langtools/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -323,3 +323,4 @@ 7fd155b7041c8aba7084f03e2fd1d6f74cceda75 jdk9-b78 eaab8a16dcfb807acacdb6d133f3ecd502667a8c jdk9-b79 c5671e662392df372b2005b75afa6cfdc0eebce7 jdk9-b80 +ead8b7192f00417185f0e64d0cb332f0f8ad4ae1 jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Sep 15 07:47:44 2015 -0700 @@ -1436,6 +1436,7 @@ } Assert.check(!sym.kind.isResolutionError()); try { + types.noWarnings.clear(); Type mt = rawInstantiate(env, site, sym, null, argtypes, typeargtypes, allowBoxing, useVarargs, types.noWarnings); currentResolutionContext.addApplicableCandidate(sym, mt); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/AutoFlushWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/AutoFlushWriter.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, 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.tools.sjavac; + +import java.io.FilterWriter; +import java.io.IOException; +import java.io.Writer; + +public class AutoFlushWriter extends FilterWriter { + + public AutoFlushWriter(Writer out) { + super(out); + } + + @Override + public void write(int c) throws IOException { + super.write(c); + if (c == '\n' || c == '\r') + flush(); + } + + @Override + public void write(String str, int off, int len) throws IOException { + super.write(str, off, len); + if (str.contains("\n") || str.contains("\r")) + flush(); + } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + super.write(cbuf, off, len); + for (char c : cbuf) { + if (c == '\n' || c == '\r') { + flush(); + break; + } + } + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Tue Sep 15 07:47:44 2015 -0700 @@ -31,7 +31,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.PrintStream; import java.io.Writer; import java.net.URI; import java.util.ArrayList; @@ -78,8 +77,8 @@ int debugLevel, boolean incremental, int numCores, - PrintStream out, - PrintStream err) { + Writer out, + Writer err) { boolean rc = true; for (String pkgName : pkgSrcs.keySet()) { String pkgNameF = pkgName.replace('.',File.separatorChar); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,14 +26,22 @@ package com.sun.tools.sjavac; import java.io.File; -import java.io.PrintStream; +import java.io.IOException; +import java.io.Writer; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import com.sun.tools.sjavac.comp.CompilationService; import com.sun.tools.sjavac.options.Options; @@ -83,8 +91,8 @@ int debugLevel, boolean incremental, int numCores, - final PrintStream out, - final PrintStream err) { + final Writer out, + final Writer err) { Log.debug("Performing CompileJavaPackages transform..."); @@ -200,102 +208,83 @@ } } - // The return values for each chunked compile. - final CompilationSubResult[] rn = new CompilationSubResult[numCompiles]; - // The requets, might or might not run as a background thread. - final Thread[] requests = new Thread[numCompiles]; - long start = System.currentTimeMillis(); - for (int i=0; iemptyList(), - cc.srcs, - visibleSources); - // In the code below we have to keep in mind that two - // different compilation results may include results for - // the same package. - synchronized (lock) { - - for (String pkg : rn[ii].packageArtifacts.keySet()) { - Set pkgArtifacts = rn[ii].packageArtifacts.get(pkg); - packageArtifacts.merge(pkg, pkgArtifacts, Util::union); - } - - for (String pkg : rn[ii].packageDependencies.keySet()) { - packageDependencies.putIfAbsent(pkg, new HashMap<>()); - packageDependencies.get(pkg).putAll(rn[ii].packageDependencies.get(pkg)); - } - - for (String pkg : rn[ii].packageCpDependencies.keySet()) { - packageCpDependencies.putIfAbsent(pkg, new HashMap<>()); - packageCpDependencies.get(pkg).putAll(rn[ii].packageCpDependencies.get(pkg)); - } + // Prepare compilation calls + List> compilationCalls = new ArrayList<>(); + final Object lock = new Object(); + for (int i = 0; i < numCompiles; i++) { + CompileChunk cc = compileChunks[i]; + if (cc.srcs.isEmpty()) { + continue; + } - for (String pkg : rn[ii].packagePubapis.keySet()) { - packagePubapis.merge(pkg, rn[ii].packagePubapis.get(pkg), PubApi::mergeTypes); - } - - for (String pkg : rn[ii].dependencyPubapis.keySet()) { - dependencyPubapis.merge(pkg, rn[ii].dependencyPubapis.get(pkg), PubApi::mergeTypes); - } - } + String chunkId = id + "-" + String.valueOf(i); + compilationCalls.add(() -> { + CompilationSubResult result = sjavac.compile("n/a", + chunkId, + args.prepJavacArgs(), + Collections.emptyList(), + cc.srcs, + visibleSources); + synchronized (lock) { + safeWrite(result.stdout, out); + safeWrite(result.stderr, err); } - }; + return result; + }); + } - if (cc.srcs.size() > 0) { - String numdeps = ""; - if (cc.numDependents > 0) numdeps = "(with "+cc.numDependents+" dependents) "; - if (!incremental || cc.numPackages > 16) { - String info = "("+cc.pkgFromTos+")"; - if (info.equals("( to )")) { - info = ""; - } - Log.info("Compiling "+cc.srcs.size()+" files "+numdeps+"in "+cc.numPackages+" packages "+info); - } else { - Log.info("Compiling "+cc.pkgNames+numdeps); - } - if (concurrentCompiles) { - requests[ii].start(); - } - else { - requests[ii].run(); - // If there was an error, then stop early when running single threaded. - if (rn[i].returnCode != 0) { - Log.info(rn[i].stdout); - Log.error(rn[i].stderr); - return false; - } - } + // Perform compilations and collect results + List subResults = new ArrayList<>(); + List> futs = new ArrayList<>(); + ExecutorService exec = Executors.newFixedThreadPool(concurrentCompiles ? compilationCalls.size() : 1); + for (Callable compilationCall : compilationCalls) { + futs.add(exec.submit(compilationCall)); + } + for (Future fut : futs) { + try { + subResults.add(fut.get()); + } catch (ExecutionException ee) { + Log.error("Compilation failed: " + ee.getMessage()); + } catch (InterruptedException ee) { + Log.error("Compilation interrupted: " + ee.getMessage()); + Thread.currentThread().interrupt(); } } - if (concurrentCompiles) { - // If there are background threads for the concurrent compiles, then join them. - for (int i=0; i pkgArtifacts = subResult.packageArtifacts.get(pkg); + packageArtifacts.merge(pkg, pkgArtifacts, Util::union); + } + + for (String pkg : subResult.packageDependencies.keySet()) { + packageDependencies.putIfAbsent(pkg, new HashMap<>()); + packageDependencies.get(pkg).putAll(subResult.packageDependencies.get(pkg)); + } + + for (String pkg : subResult.packageCpDependencies.keySet()) { + packageCpDependencies.putIfAbsent(pkg, new HashMap<>()); + packageCpDependencies.get(pkg).putAll(subResult.packageCpDependencies.get(pkg)); + } + + for (String pkg : subResult.packagePubapis.keySet()) { + packagePubapis.merge(pkg, subResult.packagePubapis.get(pkg), PubApi::mergeTypes); + } + + for (String pkg : subResult.dependencyPubapis.keySet()) { + dependencyPubapis.merge(pkg, subResult.dependencyPubapis.get(pkg), PubApi::mergeTypes); + } + + // Check the return values. + if (subResult.returnCode != 0) { + rc = false; } } - // Check the return values. - for (int i=0; i 0) { - if (rn[i].returnCode != 0) { - Log.info(rn[i].stdout); - Log.error(rn[i].stderr); - rc = false; - } - } - } long duration = System.currentTimeMillis() - start; long minutes = duration/60000; long seconds = (duration-minutes*60000)/1000; @@ -304,6 +293,16 @@ return rc; } + private void safeWrite(String str, Writer w) { + if (str.length() > 0) { + try { + w.write(str); + } catch (IOException e) { + Log.error("Could not print compilation output."); + } + } + } + /** * Split up the sources into compile chunks. If old package dependents information * is available, sort the order of the chunks into the most dependent first! diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Tue Sep 15 07:47:44 2015 -0700 @@ -85,8 +85,8 @@ int debugLevel, boolean incremental, int numCores, - PrintStream out, - PrintStream err) { + Writer out, + Writer err) { boolean rc = true; for (String pkgName : pkgSrcs.keySet()) { String pkgNameF = Util.toFileSystemPath(pkgName); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Tue Sep 15 07:47:44 2015 -0700 @@ -31,7 +31,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.PrintStream; +import java.io.Writer; import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -72,8 +72,8 @@ int debugLevel, boolean incremental, int numCores, - PrintStream out, - PrintStream err) + Writer out, + Writer err) { boolean rc = true; String dest_filename; diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Tue Sep 15 07:47:44 2015 -0700 @@ -31,7 +31,7 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.PrintStream; +import java.io.Writer; import java.net.URI; import java.nio.file.NoSuchFileException; import java.text.SimpleDateFormat; @@ -131,12 +131,12 @@ private CompileJavaPackages compileJavaPackages = new CompileJavaPackages(); // Where to send stdout and stderr. - private PrintStream out, err; + private Writer out, err; // Command line options. private Options options; - JavacState(Options op, boolean removeJavacState, PrintStream o, PrintStream e) { + JavacState(Options op, boolean removeJavacState, Writer o, Writer e) { options = op; out = o; err = e; @@ -311,7 +311,7 @@ /** * Load a javac_state file. */ - public static JavacState load(Options options, PrintStream out, PrintStream err) { + public static JavacState load(Options options, Writer out, Writer err) { JavacState db = new JavacState(options, false, out, err); Module lastModule = null; Package lastPackage = null; diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java Tue Sep 15 07:47:44 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, 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 @@ -25,7 +25,8 @@ package com.sun.tools.sjavac; -import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.Writer; /** * Utility class only for sjavac logging. @@ -37,7 +38,7 @@ * deletion without notice. */ public class Log { - private static PrintStream out, err; + private static PrintWriter out, err; public final static int WARN = 1; public final static int INFO = 2; @@ -71,9 +72,9 @@ err.println(msg); } - static public void initializeLog(PrintStream o, PrintStream e) { - out = o; - err = e; + static public void initializeLog(Writer o, Writer e) { + out = new PrintWriter(o); + err = new PrintWriter(e); } static public void setLogLevel(String l) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,7 +25,7 @@ package com.sun.tools.sjavac; -import java.io.PrintStream; +import java.io.Writer; import java.net.URI; import java.util.Map; import java.util.Set; @@ -97,8 +97,8 @@ int debugLevel, boolean incremental, int numCores, - PrintStream out, - PrintStream err); + Writer out, + Writer err); void setExtra(String e); void setExtra(Options args); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,13 +25,14 @@ package com.sun.tools.sjavac.client; -import java.io.PrintStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import com.sun.tools.sjavac.AutoFlushWriter; import com.sun.tools.sjavac.Log; import com.sun.tools.sjavac.Util; import com.sun.tools.sjavac.comp.SjavacImpl; import com.sun.tools.sjavac.options.Options; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.Sjavac; /** @@ -43,10 +44,12 @@ public class ClientMain { public static int run(String[] args) { - return run(args, System.out, System.err); + return run(args, + new AutoFlushWriter(new OutputStreamWriter(System.out)), + new AutoFlushWriter(new OutputStreamWriter(System.err))); } - public static int run(String[] args, PrintStream out, PrintStream err) { + public static int run(String[] args, Writer out, Writer err) { Log.initializeLog(out, err); @@ -78,14 +81,11 @@ sjavac = new SjavacImpl(); } - CompilationResult cr = sjavac.compile(args); - - out.print(cr.stdout); - err.print(cr.stderr); + int rc = sjavac.compile(args, out, err); if (!background) sjavac.shutdown(); - return cr.returnCode; + return rc; } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java Tue Sep 15 07:47:44 2015 -0700 @@ -25,11 +25,14 @@ package com.sun.tools.sjavac.client; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.Writer; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; @@ -43,7 +46,6 @@ import com.sun.tools.sjavac.options.OptionHelper; import com.sun.tools.sjavac.options.Options; import com.sun.tools.sjavac.server.CompilationSubResult; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.PortFile; import com.sun.tools.sjavac.server.Sjavac; import com.sun.tools.sjavac.server.SjavacServer; @@ -119,29 +121,47 @@ } @Override - public CompilationResult compile(String[] args) { - CompilationResult result; + public int compile(String[] args, Writer stdout, Writer stderr) { + int result = -1; try (Socket socket = tryConnect()) { - // The ObjectInputStream constructor will block until the - // corresponding ObjectOutputStream has written and flushed the - // header, so it is important that the ObjectOutputStreams on server - // and client are opened before the ObjectInputStreams. - ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); - oos.writeObject(id); - oos.writeObject(SjavacServer.CMD_COMPILE); - oos.writeObject(args); - oos.flush(); - result = (CompilationResult) ois.readObject(); - } catch (IOException | ClassNotFoundException ex) { - Log.error("[CLIENT] Exception caught: " + ex); - result = new CompilationResult(CompilationSubResult.ERROR_FATAL); - result.stderr = Util.getStackTrace(ex); + PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); + BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + + // Send args array to server + out.println(args.length); + for (String arg : args) + out.println(arg); + out.flush(); + + // Read server response line by line + String line; + while (null != (line = in.readLine())) { + String[] typeAndContent = line.split(":", 2); + String type = typeAndContent[0]; + String content = typeAndContent[1]; + switch (type) { + case SjavacServer.LINE_TYPE_STDOUT: + stdout.write(content); + stdout.write('\n'); + break; + case SjavacServer.LINE_TYPE_STDERR: + stderr.write(content); + stderr.write('\n'); + break; + case SjavacServer.LINE_TYPE_RC: + result = Integer.parseInt(content); + break; + } + } + } catch (IOException ioe) { + Log.error("[CLIENT] Exception caught: " + ioe); + result = CompilationSubResult.ERROR_FATAL; + ioe.printStackTrace(new PrintWriter(stderr)); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); // Restore interrupt Log.error("[CLIENT] compile interrupted."); - result = new CompilationResult(CompilationSubResult.ERROR_FATAL); - result.stderr = Util.getStackTrace(ie); + result = CompilationSubResult.ERROR_FATAL; + ie.printStackTrace(new PrintWriter(stderr)); } return result; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,13 +24,13 @@ */ package com.sun.tools.sjavac.comp; +import java.io.Writer; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import com.sun.tools.sjavac.Log; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.Sjavac; /** @@ -54,10 +54,10 @@ } @Override - public CompilationResult compile(String[] args) { + public int compile(String[] args, Writer out, Writer err) { try { return pool.submit(() -> { - return delegate.compile(args); + return delegate.compile(args, out, err); }).get(); } catch (Exception e) { e.printStackTrace(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,12 +24,9 @@ */ package com.sun.tools.sjavac.comp; -import static com.sun.tools.sjavac.server.CompilationResult.ERROR_FATAL; -import static java.nio.charset.StandardCharsets.UTF_8; - -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -49,7 +46,6 @@ import com.sun.tools.sjavac.Util; import com.sun.tools.sjavac.options.Options; import com.sun.tools.sjavac.options.SourceLocation; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.Sjavac; /** @@ -64,39 +60,33 @@ public class SjavacImpl implements Sjavac { @Override - public CompilationResult compile(String[] args) { - - ByteArrayOutputStream outBaos = new ByteArrayOutputStream(); - ByteArrayOutputStream errBaos = new ByteArrayOutputStream(); - PrintStream out = new PrintStream(outBaos); - PrintStream err = new PrintStream(errBaos); - + public int compile(String[] args, Writer out, Writer err) { Options options; try { options = Options.parseArgs(args); } catch (IllegalArgumentException e) { Log.error(e.getMessage()); - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; } Log.setLogLevel(options.getLogLevel()); if (!validateOptions(options)) - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; if (!createIfMissing(options.getDestDir())) - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; if (!createIfMissing(options.getStateDir())) - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; Path gensrc = options.getGenSrcDir(); if (gensrc != null && !createIfMissing(gensrc)) - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; Path hdrdir = options.getHeaderDir(); if (hdrdir != null && !createIfMissing(hdrdir)) - return new CompilationResult(ERROR_FATAL); + return RC_FATAL; // Load the prev build state database. JavacState javac_state = JavacState.load(options, out, err); @@ -132,9 +122,7 @@ if (sources.isEmpty()) { Log.error("Found nothing to compile!"); - return new CompilationResult(CompilationResult.ERROR_FATAL, - new String(outBaos.toByteArray(), UTF_8), - new String(errBaos.toByteArray(), UTF_8)); + return RC_FATAL; } @@ -251,19 +239,13 @@ javac_state.removeSuperfluousArtifacts(recently_compiled); } - return new CompilationResult(rc[0] ? 0 : ERROR_FATAL, - new String(outBaos.toByteArray(), UTF_8), - new String(errBaos.toByteArray(), UTF_8)); + return rc[0] ? RC_OK : RC_FATAL; } catch (ProblemException e) { Log.error(e.getMessage()); - return new CompilationResult(ERROR_FATAL, - new String(outBaos.toByteArray(), UTF_8), - new String(errBaos.toByteArray(), UTF_8)); + return RC_FATAL; } catch (Exception e) { - e.printStackTrace(err); - return new CompilationResult(ERROR_FATAL, - new String(outBaos.toByteArray(), UTF_8), - new String(errBaos.toByteArray(), UTF_8)); + e.printStackTrace(new PrintWriter(err)); + return RC_FATAL; } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2014, 2015, 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.tools.sjavac.server; - -import java.io.Serializable; - -/** - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - */ -public class CompilationResult implements Serializable { - - static final long serialVersionUID = 46739181113L; - - // Return code constants - public final static int ERROR_FATAL = -1; - - public String stdout; - public String stderr; - public int returnCode; - - public CompilationResult(int returnCode) { - this(returnCode, "", ""); - } - - public CompilationResult(int returnCode, String stdout, String stderr) { - this.returnCode = returnCode; - this.stdout = stdout; - this.stderr = stderr; - } - - public void setReturnCode(int returnCode) { - this.returnCode = returnCode; - } -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,6 +24,7 @@ */ package com.sun.tools.sjavac.server; +import java.io.Writer; import java.util.Timer; import java.util.TimerTask; @@ -60,10 +61,10 @@ } @Override - public CompilationResult compile(String[] args) { + public int compile(String[] args, Writer out, Writer err) { startCall(); try { - return delegate.compile(args); + return delegate.compile(args, out, err); } finally { endCall(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/LinePrefixFilterWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/LinePrefixFilterWriter.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2015, 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.tools.sjavac.server; + +import java.io.FilterWriter; +import java.io.IOException; +import java.io.Writer; + +/** + * Inserts {@literal prefix} in front of each line written. + * + * A line is considered to be terminated by any one of a line feed, a carriage + * return, or a carriage return followed immediately by a line feed. + */ +public class LinePrefixFilterWriter extends FilterWriter { + + private final String prefix; + private boolean atBeginningOfLine = true; + private char lastChar = '\0'; + + protected LinePrefixFilterWriter(Writer out, String prefix) { + super(out); + this.prefix = prefix; + } + + @Override + public void write(String str, int off, int len) throws IOException { + for (int i = 0; i < len; i++) { + write(str.charAt(off + i)); + } + } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + for (int i = 0; i < len; i++) { + write(cbuf[off + i]); + } + } + + @Override + public void write(int c) throws IOException { + if (lastChar == '\r' && c == '\n') { + // Second character of CR+LF sequence. + // Do nothing. We already started a new line on last character. + } else { + if (atBeginningOfLine) { + super.write(prefix, 0, prefix.length()); + } + super.write(c); + atBeginningOfLine = c == '\r' || c == '\n'; + } + lastChar = (char) c; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,15 +24,21 @@ */ package com.sun.tools.sjavac.server; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; +import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_RC; +import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_STDERR; +import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_STDOUT; + +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; +import java.io.Writer; import java.net.Socket; +import com.sun.tools.sjavac.AutoFlushWriter; import com.sun.tools.sjavac.Log; + /** * A RequestHandler handles requests performed over a socket. Specifically it * - Reads the command string specifying which method is to be invoked @@ -61,15 +67,26 @@ @Override public void run() { - try (ObjectOutputStream oout = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream oin = new ObjectInputStream(socket.getInputStream())) { - String id = (String) oin.readObject(); - String cmd = (String) oin.readObject(); - Log.info("Handling request, id: " + id + " cmd: " + cmd); - switch (cmd) { - case SjavacServer.CMD_COMPILE: handleCompileRequest(oin, oout); break; - default: Log.error("Unknown command: " + cmd); + try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) { + + // Read argument array + int n = Integer.parseInt(in.readLine()); + String[] args = new String[n]; + for (int i = 0; i < n; i++) { + args[i] = in.readLine(); } + + // Perform compilation + Writer stdout = new LinePrefixFilterWriter(new AutoFlushWriter(out), LINE_TYPE_STDOUT + ":"); + Writer stderr = new LinePrefixFilterWriter(new AutoFlushWriter(out), LINE_TYPE_STDERR + ":"); + int rc = sjavac.compile(args, stdout, stderr); + stdout.flush(); + stderr.flush(); + + // Send return code back to client + out.println(LINE_TYPE_RC + ":" + rc); + } catch (Exception ex) { // Not much to be done at this point. The client side request // code will most likely throw an IOException and the @@ -79,21 +96,4 @@ Log.error(sw.toString()); } } - - private void handleCompileRequest(ObjectInputStream oin, - ObjectOutputStream oout) throws IOException { - try { - // Read request arguments - String[] args = (String[]) oin.readObject(); - - // Perform compilation - CompilationResult cr = sjavac.compile(args); - - // Write request response - oout.writeObject(cr); - oout.flush(); - } catch (ClassNotFoundException cnfe) { - throw new IOException(cnfe); - } - } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,6 +26,7 @@ package com.sun.tools.sjavac.server; import java.io.IOException; +import java.io.OutputStreamWriter; import com.sun.tools.sjavac.Log; @@ -38,7 +39,8 @@ public class ServerMain { public static int run(String[] args) { - Log.initializeLog(System.out, System.err); + Log.initializeLog(new OutputStreamWriter(System.out), + new OutputStreamWriter(System.err)); // Any options other than --startserver? if (args.length > 1) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java Tue Sep 15 07:47:44 2015 -0700 @@ -24,6 +24,8 @@ */ package com.sun.tools.sjavac.server; +import java.io.Writer; + /** * Interface of the SjavacImpl, the sjavac client and all wrappers such as @@ -35,6 +37,10 @@ * deletion without notice. */ public interface Sjavac { - CompilationResult compile(String[] args); + + final static int RC_FATAL = -1; + final static int RC_OK = 0; + + int compile(String[] args, Writer stdout, Writer stderr); void shutdown(); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java Tue Sep 15 07:47:44 2015 -0700 @@ -53,8 +53,10 @@ */ public class SjavacServer implements Terminable { - // Used in protocol to indicate which method to invoke - public final static String CMD_COMPILE = "compile"; + // Used in protocol to tell the content of each line + public final static String LINE_TYPE_RC = "RC"; + public final static String LINE_TYPE_STDOUT = "STDOUT"; + public final static String LINE_TYPE_STDERR = "STDERR"; final private String portfilename; final private String logfile; diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/test/tools/javac/lib/combo/ReusableContext.java --- a/langtools/test/tools/javac/lib/combo/ReusableContext.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/test/tools/javac/lib/combo/ReusableContext.java Tue Sep 15 07:47:44 2015 -0700 @@ -31,8 +31,12 @@ import com.sun.source.util.TaskListener; import com.sun.source.util.TreeScanner; import com.sun.tools.javac.api.MultiTaskListener; +import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.ClassType; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.code.Types; import com.sun.tools.javac.comp.Check; import com.sun.tools.javac.comp.CompileStates; @@ -93,23 +97,46 @@ //find if any of the roots have redefined java.* classes Symtab syms = Symtab.instance(this); - new TreeScanner() { - @Override - public Void visitClass(ClassTree node, Void aVoid) { - Symbol sym = ((JCClassDecl)node).sym; - if (sym != null) { - syms.classes.remove(sym.flatName()); - if (sym.flatName().toString().startsWith("java.")) { - polluted = true; - } - } - return super.visitClass(node, aVoid); - } - }.scan(roots, null); + pollutionScanner.scan(roots, syms); roots.clear(); } } + /** + * This scanner detects as to whether the shared context has been polluted. This happens + * whenever a compiled program redefines a core class (in 'java.*' package) or when + * (typically because of cyclic inheritance) the symbol kind of a core class has been touched. + */ + TreeScanner pollutionScanner = new TreeScanner() { + @Override + public Void visitClass(ClassTree node, Symtab syms) { + Symbol sym = ((JCClassDecl)node).sym; + if (sym != null) { + syms.classes.remove(sym.flatName()); + Type sup = supertype(sym); + if (isCoreClass(sym) || + (sup != null && isCoreClass(sup.tsym) && sup.tsym.kind != Kinds.Kind.TYP)) { + polluted = true; + } + } + return super.visitClass(node, syms); + } + + private boolean isCoreClass(Symbol s) { + return s.flatName().toString().startsWith("java."); + } + + private Type supertype(Symbol s) { + if (s.type == null || + !s.type.hasTag(TypeTag.CLASS)) { + return null; + } else { + ClassType ct = (ClassType)s.type; + return ct.supertype_field; + } + } + }; + @Override public void finished(TaskEvent e) { if (e.getKind() == Kind.PARSE) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/test/tools/javac/sym/ElementStructureTest.java --- a/langtools/test/tools/javac/sym/ElementStructureTest.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/test/tools/javac/sym/ElementStructureTest.java Tue Sep 15 07:47:44 2015 -0700 @@ -56,6 +56,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.ServiceLoader; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; @@ -76,6 +77,7 @@ import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; import javax.tools.FileObject; +import javax.tools.JavaCompiler; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; @@ -88,7 +90,6 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.Symbol.CompletionFailure; import com.sun.tools.javac.platform.PlatformProvider; -import com.sun.tools.javac.util.ServiceLoader; /**To generate the hash values for version N, invoke this class like: * @@ -243,7 +244,11 @@ } void run(Writer output, String version) throws Exception { - JavacTaskImpl task = (JavacTaskImpl) ToolProvider.getSystemJavaCompiler().getTask(null, null, null, Arrays.asList("-release", version), null, Arrays.asList(new ToolBox.JavaSource("Test", ""))); + List options = Arrays.asList("-release", version, "-classpath", ""); + List files = Arrays.asList(new ToolBox.JavaSource("Test", "")); + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, null, null, options, null, files); + task.parse(); JavaFileManager fm = task.getContext().get(JavaFileManager.class); diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/test/tools/sjavac/IdleShutdown.java --- a/langtools/test/tools/sjavac/IdleShutdown.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/test/tools/sjavac/IdleShutdown.java Tue Sep 15 07:47:44 2015 -0700 @@ -29,9 +29,9 @@ * @build Wrapper * @run main Wrapper IdleShutdown */ +import java.io.Writer; import java.util.concurrent.atomic.AtomicLong; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.IdleResetSjavac; import com.sun.tools.sjavac.server.Sjavac; import com.sun.tools.sjavac.server.Terminable; @@ -65,11 +65,11 @@ // Use Sjavac object and wait less than TIMEOUT_MS in between calls Thread.sleep(TIMEOUT_MS - 1000); log("Compiling"); - service.compile(new String[0]); + service.compile(new String[0], null, null); Thread.sleep(TIMEOUT_MS - 1000); log("Compiling"); - service.compile(new String[0]); + service.compile(new String[0], null, null); if (timeoutTimestamp.get() != -1) throw new AssertionError("Premature timeout detected."); @@ -103,13 +103,13 @@ public void shutdown() { } @Override - public CompilationResult compile(String[] args) { + public int compile(String[] args, Writer out, Writer err) { // Attempt to trigger idle timeout during a call by sleeping try { Thread.sleep(TIMEOUT_MS + 1000); } catch (InterruptedException e) { } - return null; + return 0; } } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 langtools/test/tools/sjavac/PooledExecution.java --- a/langtools/test/tools/sjavac/PooledExecution.java Thu Sep 10 14:55:18 2015 -0700 +++ b/langtools/test/tools/sjavac/PooledExecution.java Tue Sep 15 07:47:44 2015 -0700 @@ -30,11 +30,11 @@ * @build Wrapper * @run main Wrapper PooledExecution */ +import java.io.Writer; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import com.sun.tools.sjavac.comp.PooledSjavac; -import com.sun.tools.sjavac.server.CompilationResult; import com.sun.tools.sjavac.server.Sjavac; @@ -67,7 +67,7 @@ for (int i = 0; i < NUM_REQUESTS; i++) { tasks[i] = new Thread() { public void run() { - service.compile(new String[0]); + service.compile(new String[0], null, null); tasksFinished.incrementAndGet(); } }; @@ -109,7 +109,7 @@ AtomicInteger activeRequests = new AtomicInteger(0); @Override - public CompilationResult compile(String[] args) { + public int compile(String[] args, Writer out, Writer err) { leftToStart.countDown(); int numActiveRequests = activeRequests.incrementAndGet(); System.out.printf("Left to start: %2d / Currently active: %2d%n", @@ -123,7 +123,7 @@ } activeRequests.decrementAndGet(); System.out.println("Task completed"); - return null; + return 0; } @Override diff -r 8a1504b43ad8 -r 351e2f1e9f17 make/common/NativeCompilation.gmk --- a/make/common/NativeCompilation.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/make/common/NativeCompilation.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -624,28 +624,7 @@ $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \ $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map - else ifeq ($(OPENJDK_TARGET_OS), solaris) - $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo - # Setup the command line creating debuginfo files, to be run after linking. - # It cannot be run separately since it updates the original target file - # - # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. - # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from - # empty section headers until a fixed $(OBJCOPY) is available. - # An empty section header has sh_addr == 0 and sh_size == 0. - # This problem has only been seen on Solaris X64, but we call this tool - # on all Solaris builds just in case. - # - # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. - # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. - $1_CREATE_DEBUGINFO_CMDS := \ - $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$($1_TARGET) $$(NEWLINE) \ - $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \ - $(CD) $$($1_OUTPUT_DIR) && \ - $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$($1_DEBUGINFO_FILES) $$($1_TARGET) - $1_DEBUGINFO_EXTRA_DEPS := $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) - - else ifeq ($(OPENJDK_TARGET_OS), linux) + else ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris), ) $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo # Setup the command line creating debuginfo files, to be run after linking. # It cannot be run separately since it updates the original target file @@ -653,7 +632,6 @@ $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \ $(CD) $$($1_OUTPUT_DIR) && \ $(OBJCOPY) --add-gnu-debuglink=$$($1_DEBUGINFO_FILES) $$($1_TARGET) - endif # No MacOS X support # This dependency dance ensures that debug info files get rebuilt @@ -694,7 +672,7 @@ $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps) $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \ - $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE) + $$($1_VARDEPS_FILE) $(ECHO) $(LOG_INFO) "Linking $$($1_BASENAME)" $(call LogFailures, $$($1_OBJECT_DIR)/$1_link.log, $1_link, \ $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \ @@ -735,7 +713,7 @@ $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps) $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_MANIFEST) \ - $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE) + $$($1_VARDEPS_FILE) $(ECHO) $(LOG_INFO) "Linking executable $$($1_BASENAME)" $(call LogFailures, $$($1_OBJECT_DIR)/$1_link.log, $1_link, \ $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \ diff -r 8a1504b43ad8 -r 351e2f1e9f17 make/common/TestFilesCompilation.gmk --- a/make/common/TestFilesCompilation.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/make/common/TestFilesCompilation.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -32,8 +32,6 @@ include NativeCompilation.gmk -# FIXME: This is a bad fix currently needed due to JDK-8064808 not being resolved. -include $(JDK_TOPDIR)/make/Tools.gmk # Setup make rules for creating a set of native test files (libraries or # executables). This will locate native files matching a certain pattern, diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/.hgtags --- a/nashorn/.hgtags Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/.hgtags Tue Sep 15 07:47:44 2015 -0700 @@ -314,3 +314,4 @@ 6f634e84387e97b2421d5e776e46935784156d1c jdk9-b78 9b3eca69b88b2d1bebce92d58280ae66fc0b6091 jdk9-b79 61b401b23fc28208930977d46b690423911173c6 jdk9-b80 +42d8ed4651b62572b39e6fed3fafcb7ee93f9dc2 jdk9-b81 diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Tue Sep 15 07:47:44 2015 -0700 @@ -54,10 +54,9 @@ import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP; import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC; import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE; +import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN; +import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_DESC; +import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE; @@ -282,9 +281,9 @@ assert specs != null; if (!specs.isEmpty()) { mi.memberInfoArray(className, specs); - mi.invokeStatic(SCRIPTFUNCTIONIMPL_TYPE, SCRIPTFUNCTIONIMPL_MAKEFUNCTION, SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC); + mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC); } else { - mi.invokeStatic(SCRIPTFUNCTIONIMPL_TYPE, SCRIPTFUNCTIONIMPL_MAKEFUNCTION, SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC); + mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC); } if (arityFound) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Tue Sep 15 07:47:44 2015 -0700 @@ -38,9 +38,8 @@ import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR; import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC; import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_TYPE; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_INIT_DESC3; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_INIT_DESC4; -import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE; +import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC3; +import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC4; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE; @@ -76,7 +75,7 @@ byte[] getClassBytes() { // new class extending from ScriptObject - final String superClass = (constructor != null)? SCRIPTFUNCTIONIMPL_TYPE : SCRIPTOBJECT_TYPE; + final String superClass = (constructor != null)? SCRIPTFUNCTION_TYPE : SCRIPTOBJECT_TYPE; cw.visit(V1_7, ACC_FINAL, className, null, superClass, null); if (memberCount > 0) { // add fields @@ -182,8 +181,8 @@ loadMap(mi); } else { // call Function. - superClass = SCRIPTFUNCTIONIMPL_TYPE; - superDesc = (memberCount > 0) ? SCRIPTFUNCTIONIMPL_INIT_DESC4 : SCRIPTFUNCTIONIMPL_INIT_DESC3; + superClass = SCRIPTFUNCTION_TYPE; + superDesc = (memberCount > 0) ? SCRIPTFUNCTION_INIT_DESC4 : SCRIPTFUNCTION_INIT_DESC3; mi.loadLiteral(constructor.getName()); mi.visitLdcInsn(new Handle(H_INVOKESTATIC, scriptClassInfo.getJavaName(), constructor.getJavaName(), constructor.getJavaDesc())); loadMap(mi); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Tue Sep 15 07:47:44 2015 -0700 @@ -31,10 +31,9 @@ import java.util.Collections; import java.util.List; import jdk.internal.org.objectweb.asm.Type; -import jdk.nashorn.internal.objects.PrototypeObject; -import jdk.nashorn.internal.objects.ScriptFunctionImpl; import jdk.nashorn.internal.runtime.AccessorProperty; import jdk.nashorn.internal.runtime.PropertyMap; +import jdk.nashorn.internal.runtime.PrototypeObject; import jdk.nashorn.internal.runtime.ScriptFunction; import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.Specialization; @@ -88,7 +87,6 @@ static final Type TYPE_PROPERTYMAP = Type.getType(PropertyMap.class); static final Type TYPE_PROTOTYPEOBJECT = Type.getType(PrototypeObject.class); static final Type TYPE_SCRIPTFUNCTION = Type.getType(ScriptFunction.class); - static final Type TYPE_SCRIPTFUNCTIONIMPL = Type.getType(ScriptFunctionImpl.class); static final Type TYPE_SCRIPTOBJECT = Type.getType(ScriptObject.class); static final String PROTOTYPE_SUFFIX = "$Prototype"; @@ -122,17 +120,14 @@ static final String SCRIPTFUNCTION_SETARITY_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE); static final String SCRIPTFUNCTION_SETPROTOTYPE = "setPrototype"; static final String SCRIPTFUNCTION_SETPROTOTYPE_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT); - - // ScriptFunctionImpl - static final String SCRIPTFUNCTIONIMPL_TYPE = TYPE_SCRIPTFUNCTIONIMPL.getInternalName(); - static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION = "makeFunction"; - static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC = + static final String SCRIPTFUNCTION_CREATEBUILTIN = "createBuiltin"; + static final String SCRIPTFUNCTION_CREATEBUILTIN_DESC = Type.getMethodDescriptor(TYPE_SCRIPTFUNCTION, TYPE_STRING, TYPE_METHODHANDLE); - static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC = + static final String SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC = Type.getMethodDescriptor(TYPE_SCRIPTFUNCTION, TYPE_STRING, TYPE_METHODHANDLE, TYPE_SPECIALIZATION_ARRAY); - static final String SCRIPTFUNCTIONIMPL_INIT_DESC3 = + static final String SCRIPTFUNCTION_INIT_DESC3 = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_STRING, TYPE_METHODHANDLE, TYPE_SPECIALIZATION_ARRAY); - static final String SCRIPTFUNCTIONIMPL_INIT_DESC4 = + static final String SCRIPTFUNCTION_INIT_DESC4 = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_STRING, TYPE_METHODHANDLE, TYPE_PROPERTYMAP, TYPE_SPECIALIZATION_ARRAY); // ScriptObject diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/make/BuildNashorn.gmk --- a/nashorn/make/BuildNashorn.gmk Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/make/BuildNashorn.gmk Tue Sep 15 07:47:44 2015 -0700 @@ -31,7 +31,7 @@ include JavaCompilation.gmk include SetupJavaCompilers.gmk -JDK_CLASSES := $(subst $(SPACE),$(PATH_SEP),$(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \ +JDK_CLASSES := $(call PathList, $(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \ java.base java.logging java.scripting))) NASHORN_JAR := $(IMAGES_OUTPUTDIR)/nashorn.jar @@ -48,7 +48,7 @@ $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \ JVM := $(JAVA), \ JAVAC := $(NEW_JAVAC), \ - FLAGS := -g -source 8 -target 8 -bootclasspath "$(JDK_CLASSES)", \ + FLAGS := -g -source 8 -target 8 -bootclasspath $(JDK_CLASSES), \ SERVER_DIR := $(SJAVAC_SERVER_DIR), \ SERVER_JVM := $(SJAVAC_SERVER_JAVA))) @@ -86,7 +86,8 @@ $(RM) -rf $(@D)/jdk $(@D)/netscape $(CP) -R -p $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes/* $(@D)/ $(FIXPATH) $(JAVA) \ - -Xbootclasspath/p:"$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes" \ + -Xbootclasspath/p:$(call PathList, $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \ + $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes) \ jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) $(TOUCH) $@ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/EvalWithArbitraryThis.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/EvalWithArbitraryThis.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import javax.script.*; +import jdk.nashorn.api.scripting.*; + +// Simple nashorn demo that evals a script with arbitrary script +// object bound as "this" for the evaluated script. + +public class EvalWithArbitraryThis { + public static void main(String[] args) throws Exception { + ScriptEngineManager m = new ScriptEngineManager(); + ScriptEngine e = m.getEngineByName("nashorn"); + Object sobj = e.eval("( { foo: 343, bar: 'hello' } )"); + + // "this" bound to sobj in this eval. + // so it prints sobj.foo and sobj.bar. + ((ScriptObjectMirror)sobj).eval("print(this.foo); print(this.bar)"); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/EvalWithArbitraryThis.java.orig --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/EvalWithArbitraryThis.java.orig Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import javax.script.*; +import jdk.nashorn.api.scripting.*; + +// Simple nashorn demo that evals a script with arbitrary script +// object bound as "this" for the evaluated script. + +public class EvalWithArbitraryThis { + public static void main(String[] args) throws Exception { + ScriptEngineManager m = new ScriptEngineManager(); + ScriptEngine e = m.getEngineByName("nashorn"); + Object sobj = e.eval("( { foo: 343, bar: 'hello' } )"); + + // "this" bound to sobj in this eval. + // so it prints sobj.foo and sobj.bar. + ((ScriptObjectMirror)sobj).eval("print(this.foo); print(this.bar)"); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/LambdaAsFunc.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/LambdaAsFunc.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import javax.script.*; +import java.util.function.*; + +// example demonstrating that arbitrary Lambda can be called as function from script + +public class LambdaAsFunc { + public static void main(String[] args) throws Exception { + ScriptEngineManager m = new ScriptEngineManager(); + ScriptEngine e = m.getEngineByName("nashorn"); + + // expose a lambda as top-level script function + e.put("upper", (Function) String::toUpperCase); + + // call lambda as though it is a normal script function + System.out.println(e.eval("upper('hello')")); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/Main.asm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/Main.asm Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Simple sample to demonstrate openjdk asmtools assembler with +// nashorn dynalink linker in a invokedynamic instruction. +// +// To assemble this file, use the following command: +// +// java -cp org.openjdk.asmtools.Main jasm Main.asm +// +// See also: https://wiki.openjdk.java.net/display/CodeTools/asmtools +// +// NOTE: Uses nashorn internals and so *may* break with later nashorn! + +super public class Main + version 52:0 +{ + + +public Method "":"()V" + stack 1 locals 1 +{ + aload_0; + invokespecial Method java/lang/Object."":"()V"; + return; +} + +public static Method main:"([Ljava/lang/String;)V" + stack 2 locals 2 +{ + // List l = new ArrayList(); + new class java/util/ArrayList; + dup; + invokespecial Method java/util/ArrayList."":"()V"; + astore_1; + aload_1; + + // l.add("hello"); + ldc String "hello"; + invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2; + pop; + + // l.add("world"); + aload_1; + ldc String "world"; + invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2; + pop; + + // printLength(l); + aload_1; + invokestatic Method printLength:"(Ljava/lang/Object;)V"; + + // printLength(args); // args is argument of main method + aload_0; + invokestatic Method printLength:"(Ljava/lang/Object;)V"; + return; +} + +private static Method printLength:"(Ljava/lang/Object;)V" + stack 2 locals 1 +{ + getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; + aload_0; + + // Using nashorn embedded dynalink linker with the following invokedynamic + // 'length' property on a bean - arrays, lists supported + + invokedynamic InvokeDynamic REF_invokeStatic:jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite;":"dyn:getProp|getElem|getMethod:length":"(Ljava/lang/Object;)Ljava/lang/Object;" int 0; + + // print 'length' value + invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/Object;)V"; + return; +} + +} // end Class Main diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/Main.class Binary file nashorn/samples/Main.class has changed diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/PrintToString.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/PrintToString.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import javax.script.*; +import java.io.StringWriter; + +// simple example demonstrating capturing of "print" output +// from script execution as a String via script engine API. + +public class PrintToString { + public static void main(String[] args) throws ScriptException { + ScriptEngineManager m = new ScriptEngineManager(); + ScriptEngine e = m.getEngineByName("nashorn"); + StringWriter sw = new StringWriter(); + e.getContext().setWriter(sw); + e.eval("print('hello world')"); + System.out.println(sw.toString()); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/array_removeif.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/array_removeif.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Sample for Collection.removeIf and Java.to +// See http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#removeIf-java.util.function.Predicate- + +var langs = [ + "java", "javascript", + "C", "C#", "C++", + "Erlang", "Haskell" +]; + +// convert script array to a Java List +function asList(array) { + return Java.to(array, java.util.List); +} + +// remove elements that satisfy a predicate +// using Collection.removeIf(Predicate) +asList(langs).removeIf( + function(s) s.startsWith("C")); + +// print modified array +print(langs); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/bind_on_java.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/bind_on_java.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// sample to demonstrate calling Function.prototype.bind on Java methods. + +var DoubleStream = java.util.stream.DoubleStream; +var r = new java.util.Random(); + +// bind "this" for nextGaussian method of Random class +var next = Function.bind.call(r.nextGaussian, r); + +// next is used as no argument "function" +DoubleStream + .generate(function() next()) + .limit(100) + .forEach(print); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/call_bind_java.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/call_bind_java.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Sample demonstrating calling Java methods like normal +// functions. Bound instance methods, static methods can be +// called like normal script functions. + +// Java types used +var Files = Java.type("java.nio.file.Files"); +var FileSystems = Java.type("java.nio.file.FileSystems"); +var System = Java.type("java.lang.System"); + +var fs = FileSystems.default; +var bind = Function.prototype.bind; + +// Java methods as "functions" + +// Java method with bound "this" +var Path = bind.call(fs.getPath, fs); +// Java static method +var Property = System.getProperty; + +// call Java static methods and bound instance methods +// like normal script functions. + +var root = Path("/"); +// print URI for root dir +print(root.toUri()); +var home = Path(Property("user.home")); +// list home directory +Files.walk(home).forEach(print); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/check_nashorn.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/check_nashorn.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// check if script is being run using nashorn script engine +function isNashorn() { + try { + // "engine" variable is of type javax.script.ScriptEngine is defined + // by nashorn jsr-223 engine. Check the name of the engine from + // javax.script.ScriptEngineFactory associated + + return engine.factory.engineName.contains("Nashorn"); + } catch (e) { + // if engine or any of the properties are undefined + // then script is not being run using nashorn. + return false; + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/datetime.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/datetime.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// converting b/w JavaScript Date and Java LocalDateTime + +// JavaScript Date with current time +var d = new Date(); +print(d); + +// Java 8 java.time classes used +var Instant = java.time.Instant; +var LocalDateTime = java.time.LocalDateTime; +var ZoneId = java.time.ZoneId; + +// Date.prototype.getTime + +// getTime() method returns the numeric value corresponding to the time +// for the specified date according to universal time. The value returned +// by the getTime() method is the number of milliseconds since 1 January 1970 00:00:00 UTC. +// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime + +// Java Instant.ofEpochMilli to convert time in milliseconds to Instant object +// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#ofEpochMilli-long- + +var instant = Instant.ofEpochMilli(d.getTime()); + +// Instant to LocalDateTime using LocalDateTime.ofInstant +// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId- + +var ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); +print(ldt); + +// converting a LocalDateTime to JavaScript Date +// convert LocalDateTime to Instant first +// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#atZone-java.time.ZoneId- + +var instant = ldt.atZone(ZoneId.systemDefault()).toInstant(); + +// instant to to epoch milliseconds +// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#toEpochMilli-- +// and then to JavaScript Date from time in milliseconds +// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date + +var d1 = new Date(instant.toEpochMilli()); +print(d1); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/defaults.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/defaults.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// print default methods of a Java class + +if (arguments.length == 0) { + print("Usage: jjs defaults.js -- "); + exit(1); +} + +var jclass = Java.type(arguments[0]).class; +for each (m in jclass.methods) { + // http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#isDefault-- + if (m.default) print(m); +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/find_max_lines.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/find_max_lines.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Find the file with maximum number of lines + +var Files = Java.type("java.nio.file.Files"); +var Integer = Java.type("java.lang.Integer"); +var Paths = Java.type("java.nio.file.Paths"); + +var file = arguments.length == 0? "." : arguments[0]; +var ext = arguments.length > 1? arguments[1] : ".java"; +var path = Paths.get(file); + +// return number of lines in given Path (that represents a file) +function lines(p) { + var strm = Files.lines(p); + try { + return strm.count(); + } finally { + strm.close(); + } +} + +// walk files, map to file and lines, find the max +var obj = Files.find(path, Integer.MAX_VALUE, + function(p, a) !p.toFile().isDirectory() && p.toString().endsWith(ext)). +map(function(p) ({ path : p, lines: lines(p) })). +max(function(x, y) x.lines - y.lines).get(); + +// print path and lines of the max line file +print(obj.path, obj.lines); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/fixed_point.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/fixed_point.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Simple sample demonstrating "fixed point" computation with Streams + +// See also https://mitpress.mit.edu/sicp/chapter1/node21.html#secprocgeneralmethods +var Stream = Java.type("java.util.stream.Stream"); + +// generic fixed point procedure +function fixed_point(f, init_guess) { + var tolerance = 0.00001; + function close_enough(v1, v2) Math.abs(v1 - v2) < tolerance; + + var prev; + return Stream.iterate(init_guess, f) + .filter(function(x) { + try { + return prev == undefined? false : close_enough(prev, x); + } finally { + prev = x; + } + }) + .findFirst() + .get(); +} + +// solution to x = cos(x) +print(fixed_point(Math.cos, 1.0)) + +// solution to x = sin(x) + cos(x) +print(fixed_point(function(x) Math.sin(x) + Math.cos(x), 1.0)); + +// square root by Newton's method +// http://en.wikipedia.org/wiki/Newton's_method +function sqrt(n) + fixed_point(function(x) (x + n/x) / 2, 2.0); + +print(sqrt(2)) +print(sqrt(3)) + + diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/importstatic.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/importstatic.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Java like "import static class_name.*" for nashorn + +function importStatic(clazz) { + // make sure the argument is a Java type + if (! Java.isType(clazz)) { + throw new TypeError(clazz + " is not a Java type"); + } + + // bind properties of clazz to an object + var obj = Object.bindProperties({}, clazz); + + // copy properties to global to "import" those + for (var i in obj) { + this[i] = obj[i]; + } +} + +importStatic(java.time.Instant); +print(now()); +print(ofEpochSecond(1)); +print(parse("2007-12-03T10:15:30.00Z")); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/java_completion.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/java_completion.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Simple sample demonstrating the use of JShell API with nashorn + +// display source code completion suggestions for a Java snippet using JShell's API +// See http://openjdk.java.net/projects/kulla/ + +var repl = Java.type("jdk.jshell.JShell").create() +var analysis = repl.sourceCodeAnalysis() +var code = "System." +var suggestions = analysis.completionSuggestions(code, code.length, [0]) +suggestions.forEach(function(s) print(s.continuation)) diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/jrtlist.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/jrtlist.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// list contents of "jrt" file system in Java 9 + +with(new JavaImporter(java.nio.file, java.net)) { + var fs = FileSystems.getFileSystem(URI.create("jrt:/")) + Files.walk(fs.getPath("/")).forEach(print); +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/mothers_day.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/mothers_day.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,56 @@ +# compute Mothers day of the given the year + +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// print "Mother's day" of the given year using Java Time API + +if (arguments.length == 0) { + print("Usage: jjs mothers_day.js -- year"); + exit(1); +} + +// java classes used +var DayOfWeek = java.time.DayOfWeek; +var LocalDate = java.time.LocalDate; +var TemporalAdjusters = java.time.temporal.TemporalAdjusters; + +var year = parseInt(arguments[0]); + +// See: https://en.wikipedia.org/?title=Mother%27s_Day +// We need second Sunday of May. Make April 30 of the given +// year adjust and adjust to next Sunday from there twice. To adjust a Date +// we use a common TemporalAdjuster provided in JDK8. +// https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html + +print(LocalDate.of(year, 4, 30). + with(TemporalAdjusters.next(DayOfWeek.SUNDAY)). + with(TemporalAdjusters.next(DayOfWeek.SUNDAY))); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/passwordgen.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/passwordgen.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Simple password generator using SecureRandom + stream API + +// accept optional password length from command line +var len = arguments.length? parseInt(arguments[0]) : 8; + +// Java types used +var Collectors = Java.type("java.util.stream.Collectors"); +var SecureRandom = Java.type("java.security.SecureRandom"); + +// allowed password chars +var chars = + "!@#$%ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + +// generated and print password +print(new SecureRandom(). + ints(len, 0, chars.length). + mapToObj(function(i) chars[i]). + collect(Collectors.joining(""))); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/print_symlinks.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/print_symlinks.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Print all symbolic links in user's home directory + +// JavaImporter and "with" to simulate "import" statements in Java. +// See https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions + +with (new JavaImporter(java.nio.file, java.lang)) { + + var userDir = System.getProperty("user.dir") + var home = FileSystems.default.getPath(userDir); + + // JS functions can be passed where Java lambdas are required. + // Also, using "Expression closure" extension here. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Expression_Closures + + Files.walk(home). + filter(function(p) Files.isSymbolicLink(p)). + forEach(function(p) + print(p, '->', Files.readSymbolicLink(p))); +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/sort_by_java8.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/sort_by_java8.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Simple sorting with Java8 APIs + +// Separation key-extraction from key ordering + +// Simple demo for Comparator.comparing +// http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function- + +// data to be sorted +var cards = [ + { name: "hello", email: "foo@hello.com" }, + { name: "world", email: "bar@world.com" }, + { name: "see", email: "see@dontsee.com" }, +]; + +var Collections = java.util.Collections; +var Comparator = java.util.Comparator; + +// sort records name in reverse order of names +Collections.sort(cards, + Comparator.comparing(function(a) a.name).reversed()); + +print(JSON.stringify(cards)) + +// sort records by email +Collections.sort(cards, + Comparator.comparing(function(a) a.email)); + +print(JSON.stringify(cards)) diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/samples/this_for_eval.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/samples/this_for_eval.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of Oracle nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// how to pass arbitrary "this" object for eval'ed script? + +var obj = { foo: 44 }; + +// the following won't work. eval.apply is indirect eval call +// and so 'this' will be global object always! So, this +// line will print 'undefined' +eval.apply(obj, [ " print(this.foo)" ]); + +obj.myEval = eval; + +// still won't work - still indirect 'eval' call! +// still undefined is printed! +obj.myEval("print(this.foo)"); + +function func(code) { + eval(code); +} + +// eval called inside func and so get's func's "this" as it's "this"! +// So, 44 is printed + +func.apply(obj, [ "print(this.foo)" ]); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Tue Sep 15 07:47:44 2015 -0700 @@ -49,9 +49,9 @@ Console(final InputStream cmdin, final PrintStream cmdout, final File historyFile, final Completer completer) throws IOException { + TerminalFactory.registerFlavor(Flavor.WINDOWS, isCygwin()? JJSUnixTerminal::new : JJSWindowsTerminal::new); + TerminalFactory.registerFlavor(Flavor.UNIX, JJSUnixTerminal::new); in = new ConsoleReader(cmdin, cmdout); - TerminalFactory.registerFlavor(Flavor.WINDOWS, JJSWindowsTerminal :: new); - TerminalFactory.registerFlavor(Flavor.UNIX, JJSUnixTerminal :: new); in.setExpandEvents(false); in.setHandleUserInterrupt(true); in.setBellEnabled(true); @@ -134,4 +134,8 @@ setAnsiSupported(false); } } + + private static boolean isCygwin() { + return System.getenv("SHELL") != null; + } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Tue Sep 15 07:47:44 2015 -0700 @@ -117,7 +117,7 @@ * return factory.createLinker(); * } * - * public static CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType type) { + * public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { * return dynamicLinker.link(new MonomorphicCallSite(CallSiteDescriptorFactory.create(lookup, name, type))); * } * } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java Tue Sep 15 07:47:44 2015 -0700 @@ -152,7 +152,7 @@ boolean isAccessible(final Member m) { final Class declaring = m.getDeclaringClass(); // (declaring == clazz) is just an optimization - we're calling this only from code that operates on a - // non-restriced class, so if the declaring class is identical to the class being inspected, then forego + // non-restricted class, so if the declaring class is identical to the class being inspected, then forego // a potentially expensive restricted-package check. return declaring == clazz || !CheckRestrictedPackage.isRestrictedClass(declaring); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java Tue Sep 15 07:47:44 2015 -0700 @@ -98,7 +98,6 @@ * target method to a call site type (including mapping variable arity methods to a call site signature with different * arity). * @author Attila Szegedi - * @version $Id: $ */ abstract class SingleDynamicMethod extends DynamicMethod { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java Tue Sep 15 07:47:44 2015 -0700 @@ -353,7 +353,7 @@ /** * Applies argument filters to both the invocation and the guard (if there is one). - * @param pos the position of the first argumen being filtered + * @param pos the position of the first argument being filtered * @param filters the argument filters * @return a filtered invocation */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java Tue Sep 15 07:47:44 2015 -0700 @@ -110,7 +110,7 @@ /** * Check if invocation is cacheable - * @return true if cachable, false otherwise + * @return true if cacheable, false otherwise */ public boolean isCacheable() { return cacheable; diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java Tue Sep 15 07:47:44 2015 -0700 @@ -77,7 +77,7 @@ * @return a synchronizing wrapper function */ public static Object makeSynchronizedFunction(final ScriptFunction func, final Object sync) { - return func.makeSynchronizedFunction(unwrap(sync)); + return func.createSynchronized(unwrap(sync)); } /** diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Tue Sep 15 07:47:44 2015 -0700 @@ -103,7 +103,7 @@ /** * Charset used by this reader * - * @return the Chartset used to convert bytes to chars + * @return the Charset used to convert bytes to chars */ public Charset getCharset() { return cs; diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java Tue Sep 15 07:47:44 2015 -0700 @@ -80,7 +80,7 @@ public CompilationUnitTree parse(final URL url, final DiagnosticListener listener) throws IOException, NashornException; /** - * Parses the readerand returns compilation unit tree + * Parses the reader and returns compilation unit tree * * @param name name of the source file to parse * @param reader from which source is read @@ -133,7 +133,7 @@ *

"-strict"
enable ECMAScript strict mode
* * - * @throws NullPointerException if options arrry or any of it's element is null + * @throws NullPointerException if options array or any of its element is null * @throws IllegalArgumentException on unsupported option value. * @return a new Parser instance. */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java Tue Sep 15 07:47:44 2015 -0700 @@ -35,7 +35,7 @@ /** * Regular expression pattern to match. * - * @return regular expression patten + * @return regular expression pattern */ public String getPattern(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java Tue Sep 15 07:47:44 2015 -0700 @@ -298,7 +298,28 @@ @Override public boolean enterFunctionNode(final FunctionNode functionNode) { - if (!USE_APPLY2CALL) { + // Cheap tests first + if (!( + // is the transform globally enabled? + USE_APPLY2CALL + + // Are we compiling lazily? We can't known the number and types of the actual parameters at + // the caller when compiling eagerly, so this only works with on-demand compilation. + && compiler.isOnDemandCompilation() + + // Does the function even reference the "arguments" identifier (without redefining it)? If not, + // it trivially can't have an expression of form "f.apply(self, arguments)" that this transform + // is targeting. + && functionNode.needsArguments() + + // Does the function have eval? If so, it can arbitrarily modify arguments so we can't touch it. + && !functionNode.hasEval() + + // Finally, does the function declare any parameters explicitly? We don't support that. It could + // be done, but has some complications. Therefore only a function with no explicit parameters + // is considered. + && functionNode.getNumOfParams() == 0)) + { return false; } @@ -308,18 +329,6 @@ return false; } - if (!compiler.isOnDemandCompilation()) { - return false; - } - - if (functionNode.getNumOfParams() != 0) { - return false; - } - - if (functionNode.hasEval()) { - return false; - } - if (!hasApplies(functionNode)) { return false; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Tue Sep 15 07:47:44 2015 -0700 @@ -244,7 +244,7 @@ /** * Creates a synthetic initializer for a variable (a var statement that doesn't occur in the source code). Typically - * used to create assignmnent of {@code :callee} to the function name symbol in self-referential function + * used to create assignment of {@code :callee} to the function name symbol in self-referential function * expressions as well as for assignment of {@code :arguments} to {@code arguments}. * * @param name the ident node identifying the variable to initialize diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Sep 15 07:47:44 2015 -0700 @@ -132,7 +132,6 @@ import jdk.nashorn.internal.ir.visitor.NodeOperatorVisitor; import jdk.nashorn.internal.ir.visitor.NodeVisitor; import jdk.nashorn.internal.objects.Global; -import jdk.nashorn.internal.objects.ScriptFunctionImpl; import jdk.nashorn.internal.parser.Lexer.RegexToken; import jdk.nashorn.internal.parser.TokenType; import jdk.nashorn.internal.runtime.Context; @@ -195,9 +194,9 @@ private static final Call ENSURE_NUMBER = CompilerConstants.staticCallNoLookup(OptimisticReturnFilters.class, "ensureNumber", double.class, Object.class, int.class); - private static final Call CREATE_FUNCTION_OBJECT = CompilerConstants.staticCallNoLookup(ScriptFunctionImpl.class, + private static final Call CREATE_FUNCTION_OBJECT = CompilerConstants.staticCallNoLookup(ScriptFunction.class, "create", ScriptFunction.class, Object[].class, int.class, ScriptObject.class); - private static final Call CREATE_FUNCTION_OBJECT_NO_SCOPE = CompilerConstants.staticCallNoLookup(ScriptFunctionImpl.class, + private static final Call CREATE_FUNCTION_OBJECT_NO_SCOPE = CompilerConstants.staticCallNoLookup(ScriptFunction.class, "create", ScriptFunction.class, Object[].class, int.class); private static final Call TO_NUMBER_FOR_EQ = CompilerConstants.staticCallNoLookup(JSType.class, @@ -1495,7 +1494,7 @@ int argsCount; @Override void loadStack() { - /** + /* * We want to load 'eval' to check if it is indeed global builtin eval. * If this eval call is inside a 'with' statement, dyn:getMethod|getProp|getElem * would be generated if ident is a "isFunction". But, that would result in a @@ -4330,7 +4329,7 @@ } private void prologue() { - /** + /* * This loads the parts of the target, e.g base and index. they are kept * on the stack throughout the store and used at the end to execute it */ @@ -4798,7 +4797,7 @@ * conversion has no side effects. * @param name the name of the property being get * @param flags call site flags - * @param isMethod whether we're preferrably retrieving a function + * @param isMethod whether we're preferably retrieving a function * @return the current method emitter */ MethodEmitter dynamicGet(final String name, final int flags, final boolean isMethod, final boolean isIndex) { @@ -5230,7 +5229,7 @@ private Type returnValueType; // If we are in the middle of an object literal initialization, we need to update the map private PropertyMap objectLiteralMap; - // Object literal stack depth for object literal - not necessarly top if property is a tree + // Object literal stack depth for object literal - not necessarily top if property is a tree private int objectLiteralStackDepth = -1; // The line number at the continuation point private int lineNumber; @@ -5395,7 +5394,7 @@ method.load(lvarTypes.get(slot), slot); method.convert(stackTypes[i]); // stack: s0=object literal being initialized - // change map of s0 so that the property we are initilizing when we failed + // change map of s0 so that the property we are initializing when we failed // is now ci.returnValueType if (i == objectLiteralStackDepth) { method.dup(); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java Tue Sep 15 07:47:44 2015 -0700 @@ -591,8 +591,8 @@ Class rootClass = null; long length = 0L; - final CodeInstaller codeInstaller = compiler.getCodeInstaller(); - final Map bytecode = compiler.getBytecode(); + final CodeInstaller codeInstaller = compiler.getCodeInstaller(); + final Map bytecode = compiler.getBytecode(); for (final Entry entry : bytecode.entrySet()) { final String className = entry.getKey(); @@ -745,7 +745,7 @@ abstract FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode functionNode) throws CompilationException; /** - * Apply a transform to a function node, returning the transfored function node. If the transform is not + * Apply a transform to a function node, returning the transformed function node. If the transform is not * applicable, an exception is thrown. Every transform requires the function to have a certain number of * states to operate. It can have more states set, but not fewer. The state list, i.e. the constructor * arguments to any of the CompilationPhase enum entries, is a set of REQUIRED states. diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Tue Sep 15 07:47:44 2015 -0700 @@ -101,7 +101,7 @@ private final ConstantData constantData; - private final CodeInstaller installer; + private final CodeInstaller installer; /** logger for compiler, trampolines and related code generation events * that affect classes */ @@ -352,47 +352,83 @@ private static final AtomicInteger COMPILATION_ID = new AtomicInteger(0); /** - * Constructor + * Creates a new compiler instance for initial compilation of a script. * - * @param context context - * @param env script environment * @param installer code installer * @param source source to compile * @param errors error manager * @param isStrict is this a strict compilation + * @return a new compiler */ - public Compiler( - final Context context, - final ScriptEnvironment env, - final CodeInstaller installer, + public static Compiler forInitialCompilation( + final CodeInstaller installer, final Source source, final ErrorManager errors, final boolean isStrict) { - this(context, env, installer, source, errors, isStrict, false, null, null, null, null, null, null); + return new Compiler(installer.getContext(), installer, source, errors, isStrict); } /** - * Constructor + * Creates a compiler without a code installer. It can only be used to compile code, not install the + * generated classes and as such it is useful only for implementation of {@code --compile-only} command + * line option. + * @param context the current context + * @param source source to compile + * @param isStrict is this a strict compilation + * @return a new compiler + */ + public static Compiler forNoInstallerCompilation( + final Context context, + final Source source, + final boolean isStrict) { + return new Compiler(context, null, source, context.getErrorManager(), isStrict); + } + + /** + * Creates a compiler for an on-demand compilation job. * - * @param context context - * @param env script environment * @param installer code installer * @param source source to compile - * @param errors error manager * @param isStrict is this a strict compilation - * @param isOnDemand is this an on demand compilation * @param compiledFunction compiled function, if any * @param types parameter and return value type information, if any is known * @param invalidatedProgramPoints invalidated program points for recompilation * @param typeInformationFile descriptor of the location where type information is persisted * @param continuationEntryPoints continuation entry points for restof method * @param runtimeScope runtime scope for recompilation type lookup in {@code TypeEvaluator} + * @return a new compiler */ - @SuppressWarnings("unused") - public Compiler( + public static Compiler forOnDemandCompilation( + final CodeInstaller installer, + final Source source, + final boolean isStrict, + final RecompilableScriptFunctionData compiledFunction, + final TypeMap types, + final Map invalidatedProgramPoints, + final Object typeInformationFile, + final int[] continuationEntryPoints, + final ScriptObject runtimeScope) { + final Context context = installer.getContext(); + return new Compiler(context, installer, source, context.getErrorManager(), isStrict, true, + compiledFunction, types, invalidatedProgramPoints, typeInformationFile, + continuationEntryPoints, runtimeScope); + } + + /** + * Convenience constructor for non on-demand compiler instances. + */ + private Compiler( final Context context, - final ScriptEnvironment env, - final CodeInstaller installer, + final CodeInstaller installer, + final Source source, + final ErrorManager errors, + final boolean isStrict) { + this(context, installer, source, errors, isStrict, false, null, null, null, null, null, null); + } + + private Compiler( + final Context context, + final CodeInstaller installer, final Source source, final ErrorManager errors, final boolean isStrict, @@ -404,7 +440,7 @@ final int[] continuationEntryPoints, final ScriptObject runtimeScope) { this.context = context; - this.env = env; + this.env = context.getEnv(); this.installer = installer; this.constantData = new ConstantData(); this.compileUnits = CompileUnit.createCompileUnitSet(); @@ -416,7 +452,7 @@ this.onDemand = isOnDemand; this.compiledFunction = compiledFunction; this.types = types; - this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new HashMap() : invalidatedProgramPoints; + this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new HashMap<>() : invalidatedProgramPoints; this.typeInformationFile = typeInformationFile; this.continuationEntryPoints = continuationEntryPoints == null ? null: continuationEntryPoints.clone(); this.typeEvaluator = new TypeEvaluator(this, runtimeScope); @@ -426,7 +462,7 @@ this.optimistic = env._optimistic_types; } - private static String safeSourceName(final ScriptEnvironment env, final CodeInstaller installer, final Source source) { + private String safeSourceName() { String baseName = new File(source.getName()).getName(); final int index = baseName.lastIndexOf(".js"); @@ -485,7 +521,7 @@ sb.append('$'); } - sb.append(Compiler.safeSourceName(env, installer, source)); + sb.append(safeSourceName()); return sb.toString(); } @@ -684,7 +720,7 @@ return constantData; } - CodeInstaller getCodeInstaller() { + CodeInstaller getCodeInstaller() { return installer; } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java Tue Sep 15 07:47:44 2015 -0700 @@ -192,7 +192,7 @@ private static Set symbolNames; /** - * Prefix used for internal methods generated in script clases. + * Prefix used for internal methods generated in script classes. */ private static final String INTERNAL_METHOD_PREFIX = ":"; @@ -225,7 +225,7 @@ } /** - * Check whether a name is that of a reserved compiler constnat + * Check whether a name is that of a reserved compiler constant * @param name name * @return true if compiler constant name */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java Tue Sep 15 07:47:44 2015 -0700 @@ -447,7 +447,7 @@ undefineLocalVariables(liveLocalCount, true); // Temporaries are promoted firstTemp = liveLocalCount; - // No trailing undefineds + // No trailing undefined values localVariableTypes.subList(firstTemp, localVariableTypes.size()).clear(); assert symbolBoundary.length() == firstTemp; // Generalize all reference types to Object, and promote boolean to int diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Tue Sep 15 07:47:44 2015 -0700 @@ -521,7 +521,7 @@ } /* - * create a new trynode + * create a new try node * if we have catches: * * try try @@ -532,7 +532,7 @@ * catchall * rethrow * - * otheriwse + * otherwise * * try try * x x diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Tue Sep 15 07:47:44 2015 -0700 @@ -1158,7 +1158,7 @@ /** * Pop a value from the stack and store it in a variable denoted by the given symbol. The variable should be either * a local variable, or a function parameter (and not a scoped variable). For local variables, this method will also - * do the bookeeping of the local variable table as well as mark values in all alternative slots for the symbol as + * do the bookkeeping of the local variable table as well as mark values in all alternative slots for the symbol as * dead. In this regard it differs from {@link #storeHidden(Type, int)}. * * @param symbol the symbol to store into. diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Tue Sep 15 07:47:44 2015 -0700 @@ -786,7 +786,7 @@ * @param primitiveSetter primitive setter for the current type with an element of the current type * @param objectSetter the object setter * - * @return method handle that checks if the element to be set is of the currenttype, even though it's boxed + * @return method handle that checks if the element to be set is of the current type, even though it's boxed * and instead of using the generic object setter, that would blow up the type and invalidate the map, * unbox it and call the primitive setter instead */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java Tue Sep 15 07:47:44 2015 -0700 @@ -36,7 +36,7 @@ * The bytecode ops are coupled to a MethodVisitor from ASM for * byte code generation. They know nothing about our MethodGenerator, * which is the abstraction for working with Nashorn JS types - * For exmaple, anything like "two or one slots" for a type, which + * For example, anything like "two or one slots" for a type, which * is represented in bytecode and ASM, is abstracted away in the * MethodGenerator. There you just say "dup" or "store". * diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java Tue Sep 15 07:47:44 2015 -0700 @@ -34,7 +34,7 @@ * This is a subclass of lexical context used for filling * blocks (and function nodes) with statements. When popping * a block from the lexical context, any statements that have - * been generated in it are commited to the block. This saves + * been generated in it are committed to the block. This saves * unnecessary object mutations and lexical context replacement */ public class BlockLexicalContext extends LexicalContext { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java Tue Sep 15 07:47:44 2015 -0700 @@ -452,7 +452,7 @@ * * @param token token * @param finish finish - * @param value undefined value, passed only for polymorphisism discrimination + * @param value undefined value, passed only for polymorphism discrimination * * @return the new literal node */ diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java Tue Sep 15 07:47:44 2015 -0700 @@ -276,7 +276,7 @@ * * @param request a request * - * @return the inverted rquest, or null if not applicable + * @return the inverted request, or null if not applicable */ public static Request invert(final Request request) { switch (request) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Tue Sep 15 07:47:44 2015 -0700 @@ -36,7 +36,7 @@ import jdk.nashorn.internal.ir.debug.NashornTextifier.NashornLabel; /** - * Subclass of the ASM classs reader that retains more info, such + * Subclass of the ASM class reader that retains more info, such * as bytecode offsets */ public class NashornClassReader extends ClassReader { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Tue Sep 15 07:47:44 2015 -0700 @@ -193,7 +193,7 @@ } /** - * Get the class histograpm + * Get the class histogram * @return class histogram element list */ public List getClassHistogram() { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java Tue Sep 15 07:47:44 2015 -0700 @@ -192,7 +192,7 @@ /** * Factory method for array data * - * @param nb underlying nativebuffer + * @param nb underlying native buffer * @param start start element * @param end end element * diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2010, 2013, 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 jdk.nashorn.internal.objects; - -import jdk.nashorn.internal.runtime.ScriptFunction; -import jdk.nashorn.internal.runtime.ScriptFunctionData; -import jdk.nashorn.internal.runtime.ScriptObject; -import jdk.nashorn.internal.runtime.ScriptRuntime; - -/** - * A {@code ScriptFunctionImpl} subclass for functions created using {@code Function.prototype.bind}. Such functions - * must track their {@code [[TargetFunction]]} property for purposes of correctly implementing {@code [[HasInstance]]}; - * see {@link ScriptFunction#isInstance(ScriptObject)}. - */ -final class BoundScriptFunctionImpl extends ScriptFunctionImpl { - private final ScriptFunction targetFunction; - - BoundScriptFunctionImpl(final ScriptFunctionData data, final ScriptFunction targetFunction) { - super(data, Global.instance()); - setPrototype(ScriptRuntime.UNDEFINED); - this.targetFunction = targetFunction; - } - - @Override - protected ScriptFunction getTargetFunction() { - return targetFunction; - } -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Tue Sep 15 07:47:44 2015 -0700 @@ -1583,7 +1583,11 @@ return ScriptFunction.getPrototype(builtinObject); } - ScriptObject getFunctionPrototype() { + /** + * Get the builtin Function prototype. + * @return the Function.prototype. + */ + public ScriptObject getFunctionPrototype() { return ScriptFunction.getPrototype(builtinFunction); } @@ -1768,7 +1772,12 @@ return ScriptFunction.getPrototype(getBuiltinFloat64Array()); } - ScriptFunction getTypeErrorThrower() { + /** + * Return the function that throws TypeError unconditionally. Used as "poison" methods for certain Function properties. + * + * @return the TypeError throwing function + */ + public ScriptFunction getTypeErrorThrower() { return typeErrorThrower; } @@ -2157,7 +2166,7 @@ // We want to avoid adding our generic lexical scope switchpoint to global constant invocations, // because those are invalidated per-key in the addBoundProperties method above. - // We therefor check if the invocation does already have a switchpoint and the property is non-inherited, + // We therefore check if the invocation does already have a switchpoint and the property is non-inherited, // assuming this only applies to global constants. If other non-inherited properties will // start using switchpoints some time in the future we'll have to revisit this. if (isScope && context.getEnv()._es6 && (invocation.getSwitchPoints() == null || !hasOwnProperty(name))) { @@ -2202,10 +2211,10 @@ * Adds jjs shell interactive mode builtin functions to global scope. */ public void addShellBuiltins() { - Object value = ScriptFunctionImpl.makeFunction("input", ShellFunctions.INPUT); + Object value = ScriptFunction.createBuiltin("input", ShellFunctions.INPUT); addOwnProperty("input", Attribute.NOT_ENUMERABLE, value); - value = ScriptFunctionImpl.makeFunction("evalinput", ShellFunctions.EVALINPUT); + value = ScriptFunction.createBuiltin("evalinput", ShellFunctions.EVALINPUT); addOwnProperty("evalinput", Attribute.NOT_ENUMERABLE, value); } @@ -2251,35 +2260,35 @@ this.setInitialProto(getObjectPrototype()); // initialize global function properties - this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL); - - this.parseInt = ScriptFunctionImpl.makeFunction("parseInt", GlobalFunctions.PARSEINT, + this.eval = this.builtinEval = ScriptFunction.createBuiltin("eval", EVAL); + + this.parseInt = ScriptFunction.createBuiltin("parseInt", GlobalFunctions.PARSEINT, new Specialization[] { new Specialization(GlobalFunctions.PARSEINT_Z), new Specialization(GlobalFunctions.PARSEINT_I), new Specialization(GlobalFunctions.PARSEINT_J), new Specialization(GlobalFunctions.PARSEINT_OI), new Specialization(GlobalFunctions.PARSEINT_O) }); - this.parseFloat = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT); - this.isNaN = ScriptFunctionImpl.makeFunction("isNaN", GlobalFunctions.IS_NAN, + this.parseFloat = ScriptFunction.createBuiltin("parseFloat", GlobalFunctions.PARSEFLOAT); + this.isNaN = ScriptFunction.createBuiltin("isNaN", GlobalFunctions.IS_NAN, new Specialization[] { new Specialization(GlobalFunctions.IS_NAN_I), new Specialization(GlobalFunctions.IS_NAN_J), new Specialization(GlobalFunctions.IS_NAN_D) }); - this.parseFloat = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT); - this.isNaN = ScriptFunctionImpl.makeFunction("isNaN", GlobalFunctions.IS_NAN); - this.isFinite = ScriptFunctionImpl.makeFunction("isFinite", GlobalFunctions.IS_FINITE); - this.encodeURI = ScriptFunctionImpl.makeFunction("encodeURI", GlobalFunctions.ENCODE_URI); - this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT); - this.decodeURI = ScriptFunctionImpl.makeFunction("decodeURI", GlobalFunctions.DECODE_URI); - this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT); - this.escape = ScriptFunctionImpl.makeFunction("escape", GlobalFunctions.ESCAPE); - this.unescape = ScriptFunctionImpl.makeFunction("unescape", GlobalFunctions.UNESCAPE); - this.print = ScriptFunctionImpl.makeFunction("print", env._print_no_newline ? PRINT : PRINTLN); - this.load = ScriptFunctionImpl.makeFunction("load", LOAD); - this.loadWithNewGlobal = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL); - this.exit = ScriptFunctionImpl.makeFunction("exit", EXIT); - this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT); + this.parseFloat = ScriptFunction.createBuiltin("parseFloat", GlobalFunctions.PARSEFLOAT); + this.isNaN = ScriptFunction.createBuiltin("isNaN", GlobalFunctions.IS_NAN); + this.isFinite = ScriptFunction.createBuiltin("isFinite", GlobalFunctions.IS_FINITE); + this.encodeURI = ScriptFunction.createBuiltin("encodeURI", GlobalFunctions.ENCODE_URI); + this.encodeURIComponent = ScriptFunction.createBuiltin("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT); + this.decodeURI = ScriptFunction.createBuiltin("decodeURI", GlobalFunctions.DECODE_URI); + this.decodeURIComponent = ScriptFunction.createBuiltin("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT); + this.escape = ScriptFunction.createBuiltin("escape", GlobalFunctions.ESCAPE); + this.unescape = ScriptFunction.createBuiltin("unescape", GlobalFunctions.UNESCAPE); + this.print = ScriptFunction.createBuiltin("print", env._print_no_newline ? PRINT : PRINTLN); + this.load = ScriptFunction.createBuiltin("load", LOAD); + this.loadWithNewGlobal = ScriptFunction.createBuiltin("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL); + this.exit = ScriptFunction.createBuiltin("exit", EXIT); + this.quit = ScriptFunction.createBuiltin("quit", EXIT); // built-in constructors this.builtinArray = initConstructorAndSwitchPoint("Array", ScriptFunction.class); @@ -2359,7 +2368,7 @@ // default file name addOwnProperty(ScriptEngine.FILENAME, Attribute.NOT_ENUMERABLE, null); // __noSuchProperty__ hook for ScriptContext search of missing variables - final ScriptFunction noSuchProp = ScriptFunctionImpl.makeStrictFunction(NO_SUCH_PROPERTY_NAME, NO_SUCH_PROPERTY); + final ScriptFunction noSuchProp = ScriptFunction.createStrictBuiltin(NO_SUCH_PROPERTY_NAME, NO_SUCH_PROPERTY); addOwnProperty(NO_SUCH_PROPERTY_NAME, Attribute.NOT_ENUMERABLE, noSuchProp); } } @@ -2370,17 +2379,17 @@ final ScriptObject errorProto = getErrorPrototype(); // Nashorn specific accessors on Error.prototype - stack, lineNumber, columnNumber and fileName - final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", NativeError.GET_STACK); - final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", NativeError.SET_STACK); + final ScriptFunction getStack = ScriptFunction.createBuiltin("getStack", NativeError.GET_STACK); + final ScriptFunction setStack = ScriptFunction.createBuiltin("setStack", NativeError.SET_STACK); errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack); - final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER); - final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER); + final ScriptFunction getLineNumber = ScriptFunction.createBuiltin("getLineNumber", NativeError.GET_LINENUMBER); + final ScriptFunction setLineNumber = ScriptFunction.createBuiltin("setLineNumber", NativeError.SET_LINENUMBER); errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber); - final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER); - final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER); + final ScriptFunction getColumnNumber = ScriptFunction.createBuiltin("getColumnNumber", NativeError.GET_COLUMNNUMBER); + final ScriptFunction setColumnNumber = ScriptFunction.createBuiltin("setColumnNumber", NativeError.SET_COLUMNNUMBER); errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber); - final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME); - final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME); + final ScriptFunction getFileName = ScriptFunction.createBuiltin("getFileName", NativeError.GET_FILENAME); + final ScriptFunction setFileName = ScriptFunction.createBuiltin("setFileName", NativeError.SET_FILENAME); errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName); // ECMA 15.11.4.2 Error.prototype.name @@ -2420,14 +2429,14 @@ private void initScripting(final ScriptEnvironment scriptEnv) { ScriptObject value; - value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE); + value = ScriptFunction.createBuiltin("readLine", ScriptingFunctions.READLINE); addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value); - value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY); + value = ScriptFunction.createBuiltin("readFully", ScriptingFunctions.READFULLY); addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value); final String execName = ScriptingFunctions.EXEC_NAME; - value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC); + value = ScriptFunction.createBuiltin(execName, ScriptingFunctions.EXEC); value.addOwnProperty(ScriptingFunctions.THROW_ON_ERROR_NAME, Attribute.NOT_ENUMERABLE, false); addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value); @@ -2610,7 +2619,7 @@ this.builtinFunction = initConstructor("Function", ScriptFunction.class); // create global anonymous function - final ScriptFunction anon = ScriptFunctionImpl.newAnonymousFunction(); + final ScriptFunction anon = ScriptFunction.createAnonymous(); // need to copy over members of Function.prototype to anon function anon.addBoundProperties(getFunctionPrototype()); @@ -2622,10 +2631,7 @@ anon.deleteOwnProperty(anon.getMap().findProperty("prototype")); // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3 - this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0); - typeErrorThrower.setPrototype(UNDEFINED); - // Non-constructor built-in functions do not have "prototype" property - typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype")); + this.typeErrorThrower = ScriptFunction.createBuiltin("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER); typeErrorThrower.preventExtensions(); // now initialize Object @@ -2636,8 +2642,8 @@ // ES6 draft compliant __proto__ property of Object.prototype // accessors on Object.prototype for "__proto__" - final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", NativeObject.GET__PROTO__); - final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", NativeObject.SET__PROTO__); + final ScriptFunction getProto = ScriptFunction.createBuiltin("getProto", NativeObject.GET__PROTO__); + final ScriptFunction setProto = ScriptFunction.createBuiltin("setProto", NativeObject.SET__PROTO__); ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto); // Function valued properties of Function.prototype were not properly diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,6 +26,7 @@ package jdk.nashorn.internal.objects; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; + import java.io.PrintWriter; import java.util.LinkedList; import java.util.Objects; @@ -246,7 +247,7 @@ final PrintWriter out = Context.getCurrentErr(); out.println("ScriptObject count " + ScriptObject.getCount()); - out.println("Scope count " + Scope.getCount()); + out.println("Scope count " + Scope.getScopeCount()); out.println("ScriptObject listeners added " + PropertyListeners.getListenersAdded()); out.println("ScriptObject listeners removed " + PropertyListeners.getListenersRemoved()); out.println("ScriptFunction constructor calls " + ScriptFunction.getConstructorCount()); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java Tue Sep 15 07:47:44 2015 -0700 @@ -148,8 +148,8 @@ initException(sobj); sobj.delete(STACK, false); if (! sobj.has("stack")) { - final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", GET_STACK); - final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", SET_STACK); + final ScriptFunction getStack = ScriptFunction.createBuiltin("getStack", GET_STACK); + final ScriptFunction setStack = ScriptFunction.createBuiltin("setStack", SET_STACK); sobj.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack); } return UNDEFINED; diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java Tue Sep 15 07:47:44 2015 -0700 @@ -621,11 +621,11 @@ if (find != null) { final Object value = find.getObjectValue(); if (value instanceof ScriptFunction) { - final ScriptFunctionImpl func = (ScriptFunctionImpl)value; + final ScriptFunction func = (ScriptFunction)value; // TODO: It's a shame we need to produce a function bound to this and name, when we'd only need it bound // to name. Probably not a big deal, but if we can ever make it leaner, it'd be nice. return new GuardedInvocation(MH.dropArguments(MH.constant(Object.class, - func.makeBoundFunction(this, new Object[] { name })), 0, Object.class), + func.createBound(this, new Object[] { name })), 0, Object.class), testJSAdaptor(adaptee, null, null, null), adaptee.getProtoSwitchPoint(__call__, find.getOwner())); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java Tue Sep 15 07:47:44 2015 -0700 @@ -96,7 +96,7 @@ @Function(name="synchronized", attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static Object synchronizedFunc(final Object self, final Object func, final Object obj) { if (func instanceof ScriptFunction) { - return ((ScriptFunction)func).makeSynchronizedFunction(obj); + return ((ScriptFunction)func).createSynchronized(obj); } throw typeError("not.a.function", ScriptRuntime.safeToString(func)); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java Tue Sep 15 07:47:44 2015 -0700 @@ -33,6 +33,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Locale; import jdk.internal.dynalink.linker.GuardedInvocation; @@ -187,6 +188,7 @@ format.setMinimumFractionDigits(fractionDigits); format.setMaximumFractionDigits(fractionDigits); format.setGroupingUsed(false); + format.setRoundingMode(RoundingMode.HALF_UP); return format.format(x); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Tue Sep 15 07:47:44 2015 -0700 @@ -728,7 +728,7 @@ * * $$ -> $ * $& -> the matched substring - * $` -> the portion of string that preceeds matched substring + * $` -> the portion of string that precedes matched substring * $' -> the portion of string that follows the matched substring * $n -> the nth capture, where n is [1-9] and $n is NOT followed by a decimal digit * $nn -> the nnth capture, where nn is a two digit decimal number [01-99]. diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/PrototypeObject.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/PrototypeObject.java Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2010, 2013, 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 jdk.nashorn.internal.objects; - -import static jdk.nashorn.internal.lookup.Lookup.MH; -import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import jdk.nashorn.internal.runtime.AccessorProperty; -import jdk.nashorn.internal.runtime.Property; -import jdk.nashorn.internal.runtime.PropertyMap; -import jdk.nashorn.internal.runtime.ScriptFunction; -import jdk.nashorn.internal.runtime.ScriptObject; - -/** - * Instances of this class serve as "prototype" object for script functions. - * The purpose is to expose "constructor" property from "prototype". Also, nasgen - * generated prototype classes extend from this class. - * - */ -public class PrototypeObject extends ScriptObject { - private static final PropertyMap map$; - - private Object constructor; - - private static final MethodHandle GET_CONSTRUCTOR = findOwnMH("getConstructor", Object.class, Object.class); - private static final MethodHandle SET_CONSTRUCTOR = findOwnMH("setConstructor", void.class, Object.class, Object.class); - - static { - final ArrayList properties = new ArrayList<>(1); - properties.add(AccessorProperty.create("constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR)); - map$ = PropertyMap.newMap(properties); - } - - private PrototypeObject(final Global global, final PropertyMap map) { - super(global.getObjectPrototype(), map != map$? map.addAll(map$) : map$); - } - - PrototypeObject() { - this(Global.instance(), map$); - } - - /** - * PropertyObject constructor - * - * @param map property map - */ - PrototypeObject(final PropertyMap map) { - this(Global.instance(), map); - } - - PrototypeObject(final ScriptFunction func) { - this(Global.instance(), map$); - this.constructor = func; - } - - /** - * Get the constructor for this {@code PrototypeObject} - * @param self self reference - * @return constructor, probably, but not necessarily, a {@link ScriptFunction} - */ - static Object getConstructor(final Object self) { - return (self instanceof PrototypeObject) ? - ((PrototypeObject)self).getConstructor() : - UNDEFINED; - } - - /** - * Reset the constructor for this {@code PrototypeObject} - * @param self self reference - * @param constructor constructor, probably, but not necessarily, a {@link ScriptFunction} - */ - static void setConstructor(final Object self, final Object constructor) { - if (self instanceof PrototypeObject) { - ((PrototypeObject)self).setConstructor(constructor); - } - } - - private Object getConstructor() { - return constructor; - } - - private void setConstructor(final Object constructor) { - this.constructor = constructor; - } - - private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) { - return MH.findStatic(MethodHandles.lookup(), PrototypeObject.class, name, MH.type(rtype, types)); - } -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ScriptFunctionImpl.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Thu Sep 10 14:55:18 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,313 +0,0 @@ -/* - * Copyright (c) 2010, 2013, 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 jdk.nashorn.internal.objects; - -import static jdk.nashorn.internal.lookup.Lookup.MH; -import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; - -import java.lang.invoke.MethodHandle; -import java.util.ArrayList; -import jdk.nashorn.internal.runtime.AccessorProperty; -import jdk.nashorn.internal.runtime.GlobalFunctions; -import jdk.nashorn.internal.runtime.Property; -import jdk.nashorn.internal.runtime.PropertyMap; -import jdk.nashorn.internal.runtime.RecompilableScriptFunctionData; -import jdk.nashorn.internal.runtime.ScriptFunction; -import jdk.nashorn.internal.runtime.ScriptFunctionData; -import jdk.nashorn.internal.runtime.ScriptObject; -import jdk.nashorn.internal.runtime.Specialization; - -/** - * Concrete implementation of ScriptFunction. This sets correct map for the - * function objects -- to expose properties like "prototype", "length" etc. - */ -public class ScriptFunctionImpl extends ScriptFunction { - - /** Reference to constructor prototype. */ - private Object prototype; - - // property map for strict mode functions - private static final PropertyMap strictmodemap$; - // property map for bound functions - private static final PropertyMap boundfunctionmap$; - // property map for non-strict, non-bound functions. - private static final PropertyMap map$; - - // Marker object for lazily initialized prototype object - private static final Object LAZY_PROTOTYPE = new Object(); - - private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final Specialization[] specs, final Global global) { - super(name, invokeHandle, map$, null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR); - init(global); - } - - /** - * Constructor called by Nasgen generated code, no membercount, use the default map. - * Creates builtin functions only. - * - * @param name name of function - * @param invokeHandle handle for invocation - * @param specs specialized versions of this method, if available, null otherwise - */ - ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final Specialization[] specs) { - this(name, invokeHandle, specs, Global.instance()); - } - - private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs, final Global global) { - super(name, invokeHandle, map.addAll(map$), null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR); - init(global); - } - - /** - * Constructor called by Nasgen generated code, no membercount, use the map passed as argument. - * Creates builtin functions only. - * - * @param name name of function - * @param invokeHandle handle for invocation - * @param map initial property map - * @param specs specialized versions of this method, if available, null otherwise - */ - ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs) { - this(name, invokeHandle, map, specs, Global.instance()); - } - - private ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final Specialization[] specs, final int flags, final Global global) { - super(name, methodHandle, getMap(isStrict(flags)), scope, specs, flags); - init(global); - } - - /** - * Constructor called by Global.newScriptFunction (runtime). - * - * @param name name of function - * @param methodHandle handle for invocation - * @param scope scope object - * @param specs specialized versions of this method, if available, null otherwise - * @param flags {@link ScriptFunctionData} flags - */ - ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final Specialization[] specs, final int flags) { - this(name, methodHandle, scope, specs, flags, Global.instance()); - } - - private ScriptFunctionImpl(final RecompilableScriptFunctionData data, final ScriptObject scope, final Global global) { - super(data, getMap(data.isStrict()), scope); - init(global); - } - - /** - * Factory method called by compiler generated code for functions that need parent scope. - * - * @param constants the generated class' constant array - * @param index the index of the {@code RecompilableScriptFunctionData} object in the constants array. - * @param scope the parent scope object - * @return a newly created function object - */ - public static ScriptFunction create(final Object[] constants, final int index, final ScriptObject scope) { - return new ScriptFunctionImpl((RecompilableScriptFunctionData)constants[index], scope, Global.instance()); - } - - /** - * Factory method called by compiler generated code for functions that don't need parent scope. - * - * @param constants the generated class' constant array - * @param index the index of the {@code RecompilableScriptFunctionData} object in the constants array. - * @return a newly created function object - */ - public static ScriptFunction create(final Object[] constants, final int index) { - return create(constants, index, null); - } - - /** - * Only invoked internally from {@link BoundScriptFunctionImpl} constructor. - * @param data the script function data for the bound function. - * @param global the global object - */ - ScriptFunctionImpl(final ScriptFunctionData data, final Global global) { - super(data, boundfunctionmap$, null); - init(global); - } - - static { - final ArrayList properties = new ArrayList<>(3); - properties.add(AccessorProperty.create("prototype", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, G$PROTOTYPE, S$PROTOTYPE)); - properties.add(AccessorProperty.create("length", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$LENGTH, null)); - properties.add(AccessorProperty.create("name", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$NAME, null)); - map$ = PropertyMap.newMap(properties); - strictmodemap$ = createStrictModeMap(map$); - boundfunctionmap$ = createBoundFunctionMap(strictmodemap$); - } - - private static PropertyMap createStrictModeMap(final PropertyMap map) { - final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE; - PropertyMap newMap = map; - // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors. - newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags)); - newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags)); - return newMap; - } - - private static boolean isStrict(final int flags) { - return (flags & ScriptFunctionData.IS_STRICT) != 0; - } - - // Choose the map based on strict mode! - private static PropertyMap getMap(final boolean strict) { - return strict ? strictmodemap$ : map$; - } - - private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) { - // Bound function map is same as strict function map, but additionally lacks the "prototype" property, see - // ECMAScript 5.1 section 15.3.4.5 - return strictModeMap.deleteProperty(strictModeMap.findProperty("prototype")); - } - - // Instance of this class is used as global anonymous function which - // serves as Function.prototype object. - private static class AnonymousFunction extends ScriptFunctionImpl { - private static final PropertyMap anonmap$ = PropertyMap.newMap(); - - AnonymousFunction() { - super("", GlobalFunctions.ANONYMOUS, anonmap$, null); - } - } - - static ScriptFunctionImpl newAnonymousFunction() { - return new AnonymousFunction(); - } - - private static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle, final Specialization[] specs, final int flags) { - final ScriptFunctionImpl func = new ScriptFunctionImpl(name, methodHandle, null, specs, flags); - func.setPrototype(UNDEFINED); - // Non-constructor built-in functions do not have "prototype" property - func.deleteOwnProperty(func.getMap().findProperty("prototype")); - - return func; - } - - /** - * Factory method for non-constructor built-in functions - * - * @param name function name - * @param methodHandle handle for invocation - * @param specs specialized versions of function if available, null otherwise - * @return new ScriptFunction - */ - static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle, final Specialization[] specs) { - return makeFunction(name, methodHandle, specs, ScriptFunctionData.IS_BUILTIN); - } - - /** - * Factory method for non-constructor built-in, strict functions - * - * @param name function name - * @param methodHandle handle for invocation - * @return new ScriptFunction - */ - static ScriptFunction makeStrictFunction(final String name, final MethodHandle methodHandle) { - return makeFunction(name, methodHandle, null, ScriptFunctionData.IS_BUILTIN | ScriptFunctionData.IS_STRICT ); - } - - /** - * Factory method for non-constructor built-in functions - * - * @param name function name - * @param methodHandle handle for invocation - * @return new ScriptFunction - */ - static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle) { - return makeFunction(name, methodHandle, null); - } - - @Override - public ScriptFunction makeSynchronizedFunction(final Object sync) { - final MethodHandle mh = MH.insertArguments(ScriptFunction.INVOKE_SYNC, 0, this, sync); - return makeFunction(getName(), mh); - } - - /** - * Same as {@link ScriptFunction#makeBoundFunction(Object, Object[])}. The only reason we override it is so that we - * can expose it. - * @param self the self to bind to this function. Can be null (in which case, null is bound as this). - * @param args additional arguments to bind to this function. Can be null or empty to not bind additional arguments. - * @return a function with the specified self and parameters bound. - */ - @Override - public ScriptFunction makeBoundFunction(final Object self, final Object[] args) { - return super.makeBoundFunction(self, args); - } - - /** - * This method is used to create a bound function based on this function. - * - * @param data the {@code ScriptFunctionData} specifying the functions immutable portion. - * @return a function initialized from the specified data. Its parent scope will be set to null, therefore the - * passed in data should not expect a callee. - */ - @Override - protected ScriptFunction makeBoundFunction(final ScriptFunctionData data) { - return new BoundScriptFunctionImpl(data, getTargetFunction()); - } - - // return Object.prototype - used by "allocate" - @Override - protected final ScriptObject getObjectPrototype() { - return Global.objectPrototype(); - } - - @Override - public final Object getPrototype() { - if (prototype == LAZY_PROTOTYPE) { - prototype = new PrototypeObject(this); - } - return prototype; - } - - @Override - public final void setPrototype(final Object newProto) { - if (newProto instanceof ScriptObject && newProto != this.prototype && allocatorMap != null) { - // Replace our current allocator map with one that is associated with the new prototype. - allocatorMap = allocatorMap.changeProto((ScriptObject)newProto); - } - this.prototype = newProto; - } - - // Internals below.. - private void init(final Global global) { - this.setInitialProto(global.getFunctionPrototype()); - this.prototype = LAZY_PROTOTYPE; - - // We have to fill user accessor functions late as these are stored - // in this object rather than in the PropertyMap of this object. - assert objectSpill == null; - final ScriptFunction typeErrorThrower = global.getTypeErrorThrower(); - if (findProperty("arguments", true) != null) { - initUserAccessors("arguments", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower); - } - if (findProperty("caller", true) != null) { - initUserAccessors("caller", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower); - } - } -} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Tue Sep 15 07:47:44 2015 -0700 @@ -808,7 +808,7 @@ if (!oldStrictMode && directiveStmts != null) { // check that directives preceding this one do not violate strictness for (final Node statement : directiveStmts) { - // the get value will force unescape of preceeding + // the get value will force unescape of preceding // escaped string directives getValue(statement.getToken()); } @@ -2507,7 +2507,7 @@ // run: function() { println("run"); } // }; // - // The object literal following the "new Constructor()" expresssion + // The object literal following the "new Constructor()" expression // is passed as an additional (last) argument to the constructor. if (!env._no_syntax_extensions && type == LBRACE) { arguments.add(objectLiteral()); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java Tue Sep 15 07:47:44 2015 -0700 @@ -90,7 +90,7 @@ } /** - * Adds a Statement at the end of the Statementlist + * Adds a statement at the end of the statement list * @param statement The statement to add */ @Override @@ -99,7 +99,7 @@ } /** - * Adds a statement at the begining of the statementlist + * Adds a statement at the beginning of the statement list * @param statement The statement to add */ @Override diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java Tue Sep 15 07:47:44 2015 -0700 @@ -53,13 +53,13 @@ public void setStatements(final List statements); /** - * Adds a Statement at the end of the Statementlist + * Adds a statement at the end of the statement list * @param statement The statement to add */ public void appendStatement(final Statement statement); /** - * Adds a statement at the begining of the statementlist + * Adds a statement at the beginning of the statement list * @param statement The statement to add */ public void prependStatement(final Statement statement); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java Tue Sep 15 07:47:44 2015 -0700 @@ -38,15 +38,14 @@ * The compiler still retains most of the state around code emission * and management internally, so this is to avoid passing around any * logic that isn't directly related to installing a class - * @param owner class type for this code installer * */ -public interface CodeInstaller { +public interface CodeInstaller { /** - * Return the owner for the CodeInstaller, e.g. a {@link Context} - * @return owner + * Return the {@link Context} associated with this code installer. + * @return the context. */ - public T getOwner(); + public Context getContext(); /** * Install a class. @@ -106,7 +105,7 @@ * new, independent class loader. * @return a new code installer with a new independent class loader. */ - public CodeInstaller withNewLoader(); + public CodeInstaller withNewLoader(); /** * Returns true if this code installer is compatible with the other code installer. Compatibility is expected to be @@ -115,6 +114,6 @@ * @param other the other code installer tested for compatibility with this code installer. * @return true if this code installer is compatible with the other code installer. */ - public boolean isCompatibleWith(CodeInstaller other); + public boolean isCompatibleWith(CodeInstaller other); } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Tue Sep 15 07:47:44 2015 -0700 @@ -102,7 +102,7 @@ /* * An optimistic builtin with isOptimistic=true works like any optimistic generated function, i.e. it * can throw unwarranted optimism exceptions. As native functions trivially can't have parts of them - * regenerated as restof methods, this only works if the methods are atomic/functional in their behavior + * regenerated as "restOf" methods, this only works if the methods are atomic/functional in their behavior * and doesn't modify state before an UOE can be thrown. If they aren't, we can reexecute a wider version * of the same builtin in a recompilation handler for FinalScriptFunctionData. There are several * candidate methods in Native* that would benefit from this, but I haven't had time to implement any @@ -567,7 +567,7 @@ return handle; } - // Otherwise, we need a new level of indirection; need to introduce a mutable call site that can relink itslef + // Otherwise, we need a new level of indirection; need to introduce a mutable call site that can relink itself // to the compiled function's changed target whenever the optimistic assumptions are invalidated. final CallSite cs = new MutableCallSite(handle.type()); relinkComposableInvoker(cs, this, isConstructor); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Tue Sep 15 07:47:44 2015 -0700 @@ -153,7 +153,7 @@ * Currently we are conservative and associate the name of a builtin class with all * its properties, so it's enough to invalidate a property to break all assumptions * about a prototype. This can be changed to a more fine grained approach, but no one - * ever needs this, given the very rare occurance of swapping out only parts of + * ever needs this, given the very rare occurrence of swapping out only parts of * a builtin v.s. the entire builtin object */ private final Map builtinSwitchPoints = new HashMap<>(); @@ -167,7 +167,7 @@ * ContextCodeInstaller that has the privilege of installing classes in the Context. * Can only be instantiated from inside the context and is opaque to other classes */ - public static class ContextCodeInstaller implements CodeInstaller { + public static class ContextCodeInstaller implements CodeInstaller { private final Context context; private final ScriptLoader loader; private final CodeSource codeSource; @@ -185,13 +185,9 @@ this.codeSource = codeSource; } - /** - * Return the script environment for this installer - * @return ScriptEnvironment - */ @Override - public ScriptEnvironment getOwner() { - return context.env; + public Context getContext() { + return context; } @Override @@ -254,7 +250,7 @@ } @Override - public CodeInstaller withNewLoader() { + public CodeInstaller withNewLoader() { // Reuse this installer if we're within our limits. if (usageCount < MAX_USAGES && bytesDefined < MAX_BYTES_DEFINED) { return this; @@ -263,7 +259,7 @@ } @Override - public boolean isCompatibleWith(final CodeInstaller other) { + public boolean isCompatibleWith(final CodeInstaller other) { if (other instanceof ContextCodeInstaller) { final ContextCodeInstaller cci = (ContextCodeInstaller)other; return cci.context == context && cci.codeSource == codeSource; @@ -1300,14 +1296,12 @@ final URL url = source.getURL(); final ScriptLoader loader = env._loader_per_compile ? createNewLoader() : scriptLoader; final CodeSource cs = new CodeSource(url, (CodeSigner[])null); - final CodeInstaller installer = new ContextCodeInstaller(this, loader, cs); + final CodeInstaller installer = new ContextCodeInstaller(this, loader, cs); if (storedScript == null) { final CompilationPhases phases = Compiler.CompilationPhases.COMPILE_ALL; - final Compiler compiler = new Compiler( - this, - env, + final Compiler compiler = Compiler.forInitialCompilation( installer, source, errMan, @@ -1481,7 +1475,7 @@ * @param level log level * @param mh method handle * @param paramStart first parameter to print - * @param printReturnValue should we print the return vaulue? + * @param printReturnValue should we print the return value? * @param text debug printout to add * * @return instrumented method handle, or null if logger not enabled diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Tue Sep 15 07:47:44 2015 -0700 @@ -297,4 +297,3 @@ } } - diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java Tue Sep 15 07:47:44 2015 -0700 @@ -67,7 +67,7 @@ * * Thus everything registered as a global constant gets an extra chance. Set once, * reregister the switchpoint. Set twice or more - don't try again forever, or we'd - * just end up relinking our way into megamorphisism. + * just end up relinking our way into megamorphism. * * Also it has to be noted that this kind of linking creates a coupling between a Global * and the call sites in compiled code belonging to the Context. For this reason, the diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,7 +26,6 @@ package jdk.nashorn.internal.runtime; import java.lang.invoke.MethodHandle; -import java.util.Iterator; import java.util.concurrent.Callable; import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.parser.JSONParser; diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Sep 15 07:47:44 2015 -0700 @@ -1967,7 +1967,7 @@ /** * Get the unboxed (primitive) type for an object * @param o object - * @return primive type or Object.class if not primitive + * @return primitive type or Object.class if not primitive */ public static Class unboxedFieldType(final Object o) { if (o == null) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java Tue Sep 15 07:47:44 2015 -0700 @@ -38,7 +38,7 @@ private final Source source; // token responsible for this exception private final long token; - // if this is traslated as ECMA error, which type should be used? + // if this is translated as ECMA error, which type should be used? private final JSErrorType errorType; /** diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java Tue Sep 15 07:47:44 2015 -0700 @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import java.util.WeakHashMap; +import java.util.concurrent.atomic.LongAdder; /** * Helper class to manage property listeners and notification. @@ -37,8 +38,15 @@ private Map listeners; // These counters are updated in debug mode - private static int listenersAdded; - private static int listenersRemoved; + private static LongAdder listenersAdded; + private static LongAdder listenersRemoved; + + static { + if (Context.DEBUG) { + listenersAdded = new LongAdder(); + listenersRemoved = new LongAdder(); + } + } /** * Copy constructor @@ -54,16 +62,16 @@ * Return aggregate listeners added to all PropertyListenerManagers * @return the listenersAdded */ - public static int getListenersAdded() { - return listenersAdded; + public static long getListenersAdded() { + return listenersAdded.longValue(); } /** * Return aggregate listeners removed from all PropertyListenerManagers * @return the listenersRemoved */ - public static int getListenersRemoved() { - return listenersRemoved; + public static long getListenersRemoved() { + return listenersRemoved.longValue(); } /** @@ -122,7 +130,7 @@ */ synchronized final void addListener(final String key, final PropertyMap propertyMap) { if (Context.DEBUG) { - listenersAdded++; + listenersAdded.increment(); } if (listeners == null) { listeners = new WeakHashMap<>(); @@ -151,6 +159,9 @@ propertyMap.propertyAdded(prop); } listeners.remove(prop.getKey()); + if (Context.DEBUG) { + listenersRemoved.increment(); + } } } } @@ -168,6 +179,9 @@ propertyMap.propertyDeleted(prop); } listeners.remove(prop.getKey()); + if (Context.DEBUG) { + listenersRemoved.increment(); + } } } } @@ -187,6 +201,9 @@ propertyMap.propertyModified(oldProp, newProp); } listeners.remove(oldProp.getKey()); + if (Context.DEBUG) { + listenersRemoved.increment(); + } } } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Tue Sep 15 07:47:44 2015 -0700 @@ -42,6 +42,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.WeakHashMap; +import java.util.concurrent.atomic.LongAdder; import jdk.nashorn.internal.scripts.JO; /** @@ -114,7 +115,7 @@ } if (Context.DEBUG) { - count++; + count.increment(); } } @@ -135,8 +136,8 @@ this.freeSlots = propertyMap.freeSlots; if (Context.DEBUG) { - count++; - clonedCount++; + count.increment(); + clonedCount.increment(); } } @@ -328,7 +329,7 @@ if (sp != null) { protoGetSwitches.remove(key); if (Context.DEBUG) { - protoInvalidations++; + protoInvalidations.increment(); } SwitchPoint.invalidateAll(new SwitchPoint[] { sp }); } @@ -343,7 +344,7 @@ final int size = protoGetSwitches.size(); if (size > 0) { if (Context.DEBUG) { - protoInvalidations += size; + protoInvalidations.add(size); } SwitchPoint.invalidateAll(protoGetSwitches.values().toArray(new SwitchPoint[size])); protoGetSwitches.clear(); @@ -713,7 +714,7 @@ } if (Context.DEBUG && cachedMap != null) { - protoHistoryHit++; + protoHistoryHit.increment(); } return cachedMap; @@ -762,7 +763,7 @@ if (historicMap != null) { if (Context.DEBUG) { - historyHit++; + historyHit.increment(); } return historicMap; @@ -910,7 +911,7 @@ } if (Context.DEBUG) { - setProtoNewMapCount++; + setProtoNewMapCount.increment(); } final PropertyMap newMap = new PropertyMap(this); @@ -1030,52 +1031,62 @@ } // counters updated only in debug mode - private static int count; - private static int clonedCount; - private static int historyHit; - private static int protoInvalidations; - private static int protoHistoryHit; - private static int setProtoNewMapCount; + private static LongAdder count; + private static LongAdder clonedCount; + private static LongAdder historyHit; + private static LongAdder protoInvalidations; + private static LongAdder protoHistoryHit; + private static LongAdder setProtoNewMapCount; + static { + if (Context.DEBUG) { + count = new LongAdder(); + clonedCount = new LongAdder(); + historyHit = new LongAdder(); + protoInvalidations = new LongAdder(); + protoHistoryHit = new LongAdder(); + setProtoNewMapCount = new LongAdder(); + } + } /** * @return Total number of maps. */ - public static int getCount() { - return count; + public static long getCount() { + return count.longValue(); } /** * @return The number of maps that were cloned. */ - public static int getClonedCount() { - return clonedCount; + public static long getClonedCount() { + return clonedCount.longValue(); } /** * @return The number of times history was successfully used. */ - public static int getHistoryHit() { - return historyHit; + public static long getHistoryHit() { + return historyHit.longValue(); } /** * @return The number of times prototype changes caused invalidation. */ - public static int getProtoInvalidations() { - return protoInvalidations; + public static long getProtoInvalidations() { + return protoInvalidations.longValue(); } /** * @return The number of times proto history was successfully used. */ - public static int getProtoHistoryHit() { - return protoHistoryHit; + public static long getProtoHistoryHit() { + return protoHistoryHit.longValue(); } /** * @return The number of times prototypes were modified. */ - public static int getSetProtoNewMapCount() { - return setProtoNewMapCount; + public static long getSetProtoNewMapCount() { + return setProtoNewMapCount.longValue(); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PrototypeObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PrototypeObject.java Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010, 2013, 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 jdk.nashorn.internal.runtime; + +import static jdk.nashorn.internal.lookup.Lookup.MH; +import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import jdk.nashorn.internal.objects.Global; + +/** + * Instances of this class serve as "prototype" object for script functions. + * The purpose is to expose "constructor" property from "prototype". Also, nasgen + * generated prototype classes extend from this class. + */ +public class PrototypeObject extends ScriptObject { + private static final PropertyMap map$; + + private Object constructor; + + private static final MethodHandle GET_CONSTRUCTOR = findOwnMH("getConstructor", Object.class, Object.class); + private static final MethodHandle SET_CONSTRUCTOR = findOwnMH("setConstructor", void.class, Object.class, Object.class); + + static { + final ArrayList properties = new ArrayList<>(1); + properties.add(AccessorProperty.create("constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR)); + map$ = PropertyMap.newMap(properties); + } + + private PrototypeObject(final Global global, final PropertyMap map) { + super(global.getObjectPrototype(), map != map$? map.addAll(map$) : map$); + } + + /** + * Prototype constructor + */ + protected PrototypeObject() { + this(Global.instance(), map$); + } + + /** + * PropertyObject constructor + * + * @param map property map + */ + protected PrototypeObject(final PropertyMap map) { + this(Global.instance(), map); + } + + /** + * PropertyObject constructor + * + * @param func constructor function + */ + protected PrototypeObject(final ScriptFunction func) { + this(Global.instance(), map$); + this.constructor = func; + } + + /** + * Get the constructor for this {@code PrototypeObject} + * @param self self reference + * @return constructor, probably, but not necessarily, a {@link ScriptFunction} + */ + public static Object getConstructor(final Object self) { + return (self instanceof PrototypeObject) ? + ((PrototypeObject)self).getConstructor() : + UNDEFINED; + } + + /** + * Reset the constructor for this {@code PrototypeObject} + * @param self self reference + * @param constructor constructor, probably, but not necessarily, a {@link ScriptFunction} + */ + public static void setConstructor(final Object self, final Object constructor) { + if (self instanceof PrototypeObject) { + ((PrototypeObject)self).setConstructor(constructor); + } + } + + private Object getConstructor() { + return constructor; + } + + private void setConstructor(final Object constructor) { + this.constructor = constructor; + } + + private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) { + return MH.findStatic(MethodHandles.lookup(), PrototypeObject.class, name, MH.type(rtype, types)); + } +} diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Tue Sep 15 07:47:44 2015 -0700 @@ -119,7 +119,7 @@ private final Object endParserState; /** Code installer used for all further recompilation/specialization of this ScriptFunction */ - private transient CodeInstaller installer; + private transient CodeInstaller installer; private final Map nestedFunctions; @@ -153,7 +153,7 @@ */ public RecompilableScriptFunctionData( final FunctionNode functionNode, - final CodeInstaller installer, + final CodeInstaller installer, final AllocationStrategy allocationStrategy, final Map nestedFunctions, final Map externalScopeDepths, @@ -285,7 +285,7 @@ * @param src source * @param inst code installer */ - public void initTransients(final Source src, final CodeInstaller inst) { + public void initTransients(final Source src, final CodeInstaller inst) { if (this.source == null && this.installer == null) { this.source = src; this.installer = inst; @@ -500,7 +500,7 @@ } private FunctionNode deserialize(final byte[] serializedAst) { - final ScriptEnvironment env = installer.getOwner(); + final ScriptEnvironment env = installer.getContext().getEnv(); final Timing timing = env._timing; final long t1 = System.nanoTime(); try { @@ -647,8 +647,8 @@ * a new class loader with optimistic typing so that deoptimized code can get reclaimed by GC. * @return a code installer for installing new code. */ - private CodeInstaller getInstallerForNewCode() { - final ScriptEnvironment env = installer.getOwner(); + private CodeInstaller getInstallerForNewCode() { + final ScriptEnvironment env = installer.getContext().getEnv(); return env._optimistic_types || env._loader_per_compile ? installer.withNewLoader() : installer; } @@ -658,15 +658,10 @@ final TypeMap typeMap = typeMap(actualCallSiteType); final Type[] paramTypes = typeMap == null ? null : typeMap.getParameterTypes(functionNodeId); final Object typeInformationFile = OptimisticTypesPersistence.getLocationDescriptor(source, functionNodeId, paramTypes); - final Context context = Context.getContextTrusted(); - return new Compiler( - context, - context.getEnv(), + return Compiler.forOnDemandCompilation( getInstallerForNewCode(), functionNode.getSource(), // source - context.getErrorManager(), isStrict() | functionNode.isStrict(), // is strict - true, // is on demand this, // compiledFunction, i.e. this RecompilableScriptFunctionData typeMap, // type map getEffectiveInvalidatedProgramPoints(invalidatedProgramPoints, typeInformationFile), // invalidated program points @@ -709,7 +704,7 @@ final TypeMap typeMap = typeMap(actualCallSiteType); final Type[] paramTypes = typeMap == null ? null : typeMap.getParameterTypes(functionNodeId); cacheKey = CodeStore.getCacheKey(functionNodeId, paramTypes); - final CodeInstaller newInstaller = getInstallerForNewCode(); + final CodeInstaller newInstaller = getInstallerForNewCode(); final StoredScript script = newInstaller.loadScript(source, cacheKey); if (script != null) { @@ -730,7 +725,7 @@ } boolean usePersistentCodeCache() { - return installer != null && installer.getOwner()._persistent_cache; + return installer != null && installer.getContext().getEnv()._persistent_cache; } private MethodType explicitParams(final MethodType callSiteType) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Tue Sep 15 07:47:44 2015 -0700 @@ -27,6 +27,7 @@ import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup; +import java.util.concurrent.atomic.LongAdder; import jdk.nashorn.internal.codegen.CompilerConstants; /** @@ -38,7 +39,7 @@ private int splitState = -1; /** This is updated only in debug mode - counts number of {@code ScriptObject} instances created that are scope */ - private static int count; + private static final LongAdder count = Context.DEBUG ? new LongAdder() : null; /** Method handle that points to {@link Scope#getSplitState}. */ public static final CompilerConstants.Call GET_SPLIT_STATE = virtualCallNoLookup(Scope.class, "getSplitState", int.class); @@ -52,9 +53,7 @@ */ public Scope(final PropertyMap map) { super(map); - if (Context.DEBUG) { - count++; - } + incrementCount(); } /** @@ -65,9 +64,7 @@ */ public Scope(final ScriptObject proto, final PropertyMap map) { super(proto, map); - if (Context.DEBUG) { - count++; - } + incrementCount(); } /** @@ -79,9 +76,7 @@ */ public Scope(final PropertyMap map, final long[] primitiveSpill, final Object[] objectSpill) { super(map, primitiveSpill, objectSpill); - if (Context.DEBUG) { - count++; - } + incrementCount(); } @Override @@ -123,7 +118,13 @@ * * @return number of scope ScriptObjects created */ - public static int getScopeCount() { - return count; + public static long getScopeCount() { + return count != null ? count.sum() : 0; + } + + private static void incrementCount() { + if (Context.DEBUG) { + count.increment(); + } } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Tue Sep 15 07:47:44 2015 -0700 @@ -22,7 +22,6 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package jdk.nashorn.internal.runtime; import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup; @@ -40,6 +39,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.concurrent.atomic.LongAdder; import jdk.internal.dynalink.CallSiteDescriptor; import jdk.internal.dynalink.linker.GuardedInvocation; import jdk.internal.dynalink.linker.LinkRequest; @@ -55,38 +55,54 @@ import jdk.nashorn.internal.runtime.logging.DebugLogger; /** - * Runtime representation of a JavaScript function. + * Runtime representation of a JavaScript function. This class has only private + * and protected constructors. There are no *public* constructors - but only + * factory methods that follow the naming pattern "createXYZ". */ -public abstract class ScriptFunction extends ScriptObject { +public class ScriptFunction extends ScriptObject { - /** Method handle for prototype getter for this ScriptFunction */ + /** + * Method handle for prototype getter for this ScriptFunction + */ public static final MethodHandle G$PROTOTYPE = findOwnMH_S("G$prototype", Object.class, Object.class); - /** Method handle for prototype setter for this ScriptFunction */ + /** + * Method handle for prototype setter for this ScriptFunction + */ public static final MethodHandle S$PROTOTYPE = findOwnMH_S("S$prototype", void.class, Object.class, Object.class); - /** Method handle for length getter for this ScriptFunction */ + /** + * Method handle for length getter for this ScriptFunction + */ public static final MethodHandle G$LENGTH = findOwnMH_S("G$length", int.class, Object.class); - /** Method handle for name getter for this ScriptFunction */ + /** + * Method handle for name getter for this ScriptFunction + */ public static final MethodHandle G$NAME = findOwnMH_S("G$name", Object.class, Object.class); - /** Method handle used for implementing sync() in mozilla_compat */ + /** + * Method handle used for implementing sync() in mozilla_compat + */ public static final MethodHandle INVOKE_SYNC = findOwnMH_S("invokeSync", Object.class, ScriptFunction.class, Object.class, Object.class, Object[].class); - /** Method handle for allocate function for this ScriptFunction */ + /** + * Method handle for allocate function for this ScriptFunction + */ static final MethodHandle ALLOCATE = findOwnMH_V("allocate", Object.class); private static final MethodHandle WRAPFILTER = findOwnMH_S("wrapFilter", Object.class, Object.class); private static final MethodHandle SCRIPTFUNCTION_GLOBALFILTER = findOwnMH_S("globalFilter", Object.class, Object.class); - /** method handle to scope getter for this ScriptFunction */ + /** + * method handle to scope getter for this ScriptFunction + */ public static final Call GET_SCOPE = virtualCallNoLookup(ScriptFunction.class, "getScope", ScriptObject.class); - private static final MethodHandle IS_FUNCTION_MH = findOwnMH_S("isFunctionMH", boolean.class, Object.class, ScriptFunctionData.class); + private static final MethodHandle IS_FUNCTION_MH = findOwnMH_S("isFunctionMH", boolean.class, Object.class, ScriptFunctionData.class); - private static final MethodHandle IS_APPLY_FUNCTION = findOwnMH_S("isApplyFunction", boolean.class, boolean.class, Object.class, Object.class); + private static final MethodHandle IS_APPLY_FUNCTION = findOwnMH_S("isApplyFunction", boolean.class, boolean.class, Object.class, Object.class); private static final MethodHandle IS_NONSTRICT_FUNCTION = findOwnMH_S("isNonStrictFunction", boolean.class, Object.class, Object.class, ScriptFunctionData.class); @@ -94,55 +110,298 @@ private static final MethodHandle WRAP_THIS = MH.findStatic(MethodHandles.lookup(), ScriptFunctionData.class, "wrapThis", MH.type(Object.class, Object.class)); - /** The parent scope. */ + // various property maps used for different kinds of functions + // property map for anonymous function that serves as Function.prototype + private static final PropertyMap anonmap$; + // property map for strict mode functions + private static final PropertyMap strictmodemap$; + // property map for bound functions + private static final PropertyMap boundfunctionmap$; + // property map for non-strict, non-bound functions. + private static final PropertyMap map$; + + // Marker object for lazily initialized prototype object + private static final Object LAZY_PROTOTYPE = new Object(); + + private static PropertyMap createStrictModeMap(final PropertyMap map) { + final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE; + PropertyMap newMap = map; + // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors. + newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags)); + newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags)); + return newMap; + } + + private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) { + // Bound function map is same as strict function map, but additionally lacks the "prototype" property, see + // ECMAScript 5.1 section 15.3.4.5 + return strictModeMap.deleteProperty(strictModeMap.findProperty("prototype")); + } + + static { + anonmap$ = PropertyMap.newMap(); + final ArrayList properties = new ArrayList<>(3); + properties.add(AccessorProperty.create("prototype", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, G$PROTOTYPE, S$PROTOTYPE)); + properties.add(AccessorProperty.create("length", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$LENGTH, null)); + properties.add(AccessorProperty.create("name", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$NAME, null)); + map$ = PropertyMap.newMap(properties); + strictmodemap$ = createStrictModeMap(map$); + boundfunctionmap$ = createBoundFunctionMap(strictmodemap$); + } + + private static boolean isStrict(final int flags) { + return (flags & ScriptFunctionData.IS_STRICT) != 0; + } + + // Choose the map based on strict mode! + private static PropertyMap getMap(final boolean strict) { + return strict ? strictmodemap$ : map$; + } + + /** + * The parent scope. + */ private final ScriptObject scope; private final ScriptFunctionData data; - /** The property map used for newly allocated object when function is used as constructor. */ + /** + * The property map used for newly allocated object when function is used as + * constructor. + */ protected PropertyMap allocatorMap; /** + * Reference to constructor prototype. + */ + protected Object prototype; + + /** * Constructor * - * @param name function name - * @param methodHandle method handle to function (if specializations are present, assumed to be most generic) - * @param map property map - * @param scope scope - * @param specs specialized version of this function - other method handles - * @param flags {@link ScriptFunctionData} flags + * @param data static function data + * @param map property map + * @param scope scope */ - protected ScriptFunction( + private ScriptFunction( + final ScriptFunctionData data, + final PropertyMap map, + final ScriptObject scope, + final Global global) { + + super(map); + + if (Context.DEBUG) { + constructorCount.increment(); + } + + this.data = data; + this.scope = scope; + this.setInitialProto(global.getFunctionPrototype()); + this.prototype = LAZY_PROTOTYPE; + + // We have to fill user accessor functions late as these are stored + // in this object rather than in the PropertyMap of this object. + assert objectSpill == null; + if (isStrict() || isBoundFunction()) { + final ScriptFunction typeErrorThrower = global.getTypeErrorThrower(); + initUserAccessors("arguments", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower); + initUserAccessors("caller", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower); + } + } + + /** + * Constructor + * + * @param name function name + * @param methodHandle method handle to function (if specializations are + * present, assumed to be most generic) + * @param map property map + * @param scope scope + * @param specs specialized version of this function - other method handles + * @param flags {@link ScriptFunctionData} flags + */ + private ScriptFunction( final String name, final MethodHandle methodHandle, final PropertyMap map, final ScriptObject scope, final Specialization[] specs, - final int flags) { - - this(new FinalScriptFunctionData(name, methodHandle, specs, flags), map, scope); + final int flags, + final Global global) { + this(new FinalScriptFunctionData(name, methodHandle, specs, flags), map, scope, global); } /** * Constructor * - * @param data static function data - * @param map property map - * @param scope scope + * @param name name of function + * @param methodHandle handle for invocation + * @param scope scope object + * @param specs specialized versions of this method, if available, null + * otherwise + * @param flags {@link ScriptFunctionData} flags + */ + private ScriptFunction( + final String name, + final MethodHandle methodHandle, + final ScriptObject scope, + final Specialization[] specs, + final int flags) { + this(name, methodHandle, getMap(isStrict(flags)), scope, specs, flags, Global.instance()); + } + + /** + * Constructor called by Nasgen generated code, zero added members, use the + * default map. Creates builtin functions only. + * + * @param name name of function + * @param invokeHandle handle for invocation + * @param specs specialized versions of this method, if available, null + * otherwise + */ + protected ScriptFunction(final String name, final MethodHandle invokeHandle, final Specialization[] specs) { + this(name, invokeHandle, map$, null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR, Global.instance()); + } + + /** + * Constructor called by Nasgen generated code, non zero member count, use + * the map passed as argument. Creates builtin functions only. + * + * @param name name of function + * @param invokeHandle handle for invocation + * @param map initial property map + * @param specs specialized versions of this method, if available, null + * otherwise + */ + protected ScriptFunction(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs) { + this(name, invokeHandle, map.addAll(map$), null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR, Global.instance()); + } + + // Factory methods to create various functions + /** + * Factory method called by compiler generated code for functions that need + * parent scope. + * + * @param constants the generated class' constant array + * @param index the index of the {@code RecompilableScriptFunctionData} + * object in the constants array. + * @param scope the parent scope object + * @return a newly created function object */ - protected ScriptFunction( - final ScriptFunctionData data, - final PropertyMap map, - final ScriptObject scope) { + public static ScriptFunction create(final Object[] constants, final int index, final ScriptObject scope) { + final RecompilableScriptFunctionData data = (RecompilableScriptFunctionData) constants[index]; + return new ScriptFunction(data, getMap(data.isStrict()), scope, Global.instance()); + } + + /** + * Factory method called by compiler generated code for functions that don't + * need parent scope. + * + * @param constants the generated class' constant array + * @param index the index of the {@code RecompilableScriptFunctionData} + * object in the constants array. + * @return a newly created function object + */ + public static ScriptFunction create(final Object[] constants, final int index) { + return create(constants, index, null); + } + + /** + * Create anonymous function that serves as Function.prototype + * + * @return anonymous function object + */ + public static ScriptFunction createAnonymous() { + return new ScriptFunction("", GlobalFunctions.ANONYMOUS, anonmap$, null); + } + + // builtin function create helper factory + private static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle, final Specialization[] specs, final int flags) { + final ScriptFunction func = new ScriptFunction(name, methodHandle, null, specs, flags); + func.setPrototype(UNDEFINED); + // Non-constructor built-in functions do not have "prototype" property + func.deleteOwnProperty(func.getMap().findProperty("prototype")); + + return func; + } - super(map); + /** + * Factory method for non-constructor built-in functions + * + * @param name function name + * @param methodHandle handle for invocation + * @param specs specialized versions of function if available, null + * otherwise + * @return new ScriptFunction + */ + public static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle, final Specialization[] specs) { + return ScriptFunction.createBuiltin(name, methodHandle, specs, ScriptFunctionData.IS_BUILTIN); + } - if (Context.DEBUG) { - constructorCount++; + /** + * Factory method for non-constructor built-in functions + * + * @param name function name + * @param methodHandle handle for invocation + * @return new ScriptFunction + */ + public static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle) { + return ScriptFunction.createBuiltin(name, methodHandle, null); + } + + /** + * Factory method for non-constructor built-in, strict functions + * + * @param name function name + * @param methodHandle handle for invocation + * @return new ScriptFunction + */ + public static ScriptFunction createStrictBuiltin(final String name, final MethodHandle methodHandle) { + return ScriptFunction.createBuiltin(name, methodHandle, null, ScriptFunctionData.IS_BUILTIN | ScriptFunctionData.IS_STRICT); + } + + // Subclass to represent bound functions + private static class Bound extends ScriptFunction { + private final ScriptFunction target; + + Bound(final ScriptFunctionData boundData, final ScriptFunction target) { + super(boundData, boundfunctionmap$, null, Global.instance()); + setPrototype(ScriptRuntime.UNDEFINED); + this.target = target; } - this.data = data; - this.scope = scope; + @Override + protected ScriptFunction getTargetFunction() { + return target; + } + } + + /** + * Creates a version of this function bound to a specific "self" and other + * arguments, as per {@code Function.prototype.bind} functionality in + * ECMAScript 5.1 section 15.3.4.5. + * + * @param self the self to bind to this function. Can be null (in which + * case, null is bound as this). + * @param args additional arguments to bind to this function. Can be null or + * empty to not bind additional arguments. + * @return a function with the specified self and parameters bound. + */ + public final ScriptFunction createBound(final Object self, final Object[] args) { + return new Bound(data.makeBoundFunctionData(this, self, args), getTargetFunction()); + } + + /** + * Create a function that invokes this function synchronized on {@code sync} + * or the self object of the invocation. + * + * @param sync the Object to synchronize on, or undefined + * @return synchronized function + */ + public final ScriptFunction createSynchronized(final Object sync) { + final MethodHandle mh = MH.insertArguments(ScriptFunction.INVOKE_SYNC, 0, this, sync); + return createBuiltin(getName(), mh); } @Override @@ -151,8 +410,8 @@ } /** - * ECMA 15.3.5.3 [[HasInstance]] (V) - * Step 3 if "prototype" value is not an Object, throw TypeError + * ECMA 15.3.5.3 [[HasInstance]] (V) Step 3 if "prototype" value is not an + * Object, throw TypeError */ @Override public boolean isInstance(final ScriptObject instance) { @@ -171,22 +430,25 @@ } /** - * Returns the target function for this function. If the function was not created using - * {@link #makeBoundFunction(Object, Object[])}, its target function is itself. If it is bound, its target function - * is the target function of the function it was made from (therefore, the target function is always the final, - * unbound recipient of the calls). + * Returns the target function for this function. If the function was not + * created using {@link #createBound(Object, Object[])}, its target + * function is itself. If it is bound, its target function is the target + * function of the function it was made from (therefore, the target function + * is always the final, unbound recipient of the calls). + * * @return the target function for this function. */ protected ScriptFunction getTargetFunction() { return this; } - boolean isBoundFunction() { + final boolean isBoundFunction() { return getTargetFunction() != this; } /** * Set the arity of this ScriptFunction + * * @param arity arity */ public final void setArity(final int arity) { @@ -195,59 +457,66 @@ /** * Is this a ECMAScript 'use strict' function? + * * @return true if function is in strict mode */ - public boolean isStrict() { + public final boolean isStrict() { return data.isStrict(); } /** - * Returns true if this is a non-strict, non-built-in function that requires non-primitive this argument - * according to ECMA 10.4.3. + * Returns true if this is a non-strict, non-built-in function that requires + * non-primitive this argument according to ECMA 10.4.3. + * * @return true if this argument must be an object */ - public boolean needsWrappedThis() { + public final boolean needsWrappedThis() { return data.needsWrappedThis(); } private static boolean needsWrappedThis(final Object fn) { - return fn instanceof ScriptFunction ? ((ScriptFunction)fn).needsWrappedThis() : false; + return fn instanceof ScriptFunction ? ((ScriptFunction) fn).needsWrappedThis() : false; } /** * Execute this script function. - * @param self Target object. - * @param arguments Call arguments. + * + * @param self Target object. + * @param arguments Call arguments. * @return ScriptFunction result. - * @throws Throwable if there is an exception/error with the invocation or thrown from it + * @throws Throwable if there is an exception/error with the invocation or + * thrown from it */ - Object invoke(final Object self, final Object... arguments) throws Throwable { + final Object invoke(final Object self, final Object... arguments) throws Throwable { if (Context.DEBUG) { - invokes++; + invokes.increment(); } return data.invoke(this, self, arguments); } /** * Execute this script function as a constructor. - * @param arguments Call arguments. + * + * @param arguments Call arguments. * @return Newly constructed result. - * @throws Throwable if there is an exception/error with the invocation or thrown from it + * @throws Throwable if there is an exception/error with the invocation or + * thrown from it */ - Object construct(final Object... arguments) throws Throwable { + final Object construct(final Object... arguments) throws Throwable { return data.construct(this, arguments); } /** - * Allocate function. Called from generated {@link ScriptObject} code - * for allocation as a factory method + * Allocate function. Called from generated {@link ScriptObject} code for + * allocation as a factory method * - * @return a new instance of the {@link ScriptObject} whose allocator this is + * @return a new instance of the {@link ScriptObject} whose allocator this + * is */ @SuppressWarnings("unused") private Object allocate() { if (Context.DEBUG) { - allocations++; + allocations.increment(); } assert !isBoundFunction(); // allocate never invoked on bound functions @@ -257,7 +526,7 @@ if (object != null) { final Object prototype = getPrototype(); if (prototype instanceof ScriptObject) { - object.setInitialProto((ScriptObject)prototype); + object.setInitialProto((ScriptObject) prototype); } if (object.getProto() == null) { @@ -277,43 +546,28 @@ /** * Return Object.prototype - used by "allocate" + * * @return Object.prototype */ - protected abstract ScriptObject getObjectPrototype(); - - /** - * Creates a version of this function bound to a specific "self" and other arguments, as per - * {@code Function.prototype.bind} functionality in ECMAScript 5.1 section 15.3.4.5. - * @param self the self to bind to this function. Can be null (in which case, null is bound as this). - * @param args additional arguments to bind to this function. Can be null or empty to not bind additional arguments. - * @return a function with the specified self and parameters bound. - */ - protected ScriptFunction makeBoundFunction(final Object self, final Object[] args) { - return makeBoundFunction(data.makeBoundFunctionData(this, self, args)); + protected final ScriptObject getObjectPrototype() { + return Global.objectPrototype(); } - /** - * Create a version of this function as in {@link ScriptFunction#makeBoundFunction(Object, Object[])}, - * but using a {@link ScriptFunctionData} for the bound data. - * - * @param boundData ScriptFuntionData for the bound function - * @return a function with the bindings performed according to the given data - */ - protected abstract ScriptFunction makeBoundFunction(ScriptFunctionData boundData); - @Override public final String safeToString() { return toSource(); } @Override - public String toString() { + public final String toString() { return data.toString(); } /** - * Get this function as a String containing its source code. If no source code - * exists in this ScriptFunction, its contents will be displayed as {@code [native code]} + * Get this function as a String containing its source code. If no source + * code exists in this ScriptFunction, its contents will be displayed as + * {@code [native code]} + * * @return string representation of this function's source */ public final String toSource() { @@ -322,27 +576,32 @@ /** * Get the prototype object for this function + * * @return prototype */ - public abstract Object getPrototype(); + public final Object getPrototype() { + if (prototype == LAZY_PROTOTYPE) { + prototype = new PrototypeObject(this); + } + return prototype; + } /** * Set the prototype object for this function - * @param prototype new prototype object + * + * @param newPrototype new prototype object */ - public abstract void setPrototype(Object prototype); + public final void setPrototype(Object newPrototype) { + if (newPrototype instanceof ScriptObject && newPrototype != this.prototype && allocatorMap != null) { + // Replace our current allocator map with one that is associated with the new prototype. + allocatorMap = allocatorMap.changeProto((ScriptObject) newPrototype); + } + this.prototype = newPrototype; + } /** - * Create a function that invokes this function synchronized on {@code sync} or the self object - * of the invocation. - * @param sync the Object to synchronize on, or undefined - * @return synchronized function - */ - public abstract ScriptFunction makeSynchronizedFunction(Object sync); - - /** - * Return the invoke handle bound to a given ScriptObject self reference. - * If callee parameter is required result is rebound to this. + * Return the invoke handle bound to a given ScriptObject self reference. If + * callee parameter is required result is rebound to this. * * @param self self reference * @return bound invoke handle @@ -352,9 +611,12 @@ } /** - * Bind the method handle to this {@code ScriptFunction} instance if it needs a callee parameter. If this function's - * method handles don't have a callee parameter, the handle is returned unchanged. - * @param methodHandle the method handle to potentially bind to this function instance. + * Bind the method handle to this {@code ScriptFunction} instance if it + * needs a callee parameter. If this function's method handles don't have a + * callee parameter, the handle is returned unchanged. + * + * @param methodHandle the method handle to potentially bind to this + * function instance. * @return the potentially bound method handle */ private MethodHandle bindToCalleeIfNeeded(final MethodHandle methodHandle) { @@ -364,15 +626,16 @@ /** * Get the name for this function + * * @return the name */ public final String getName() { return data.getName(); } - /** * Get the scope for this function + * * @return the scope */ public final ScriptObject getScope() { @@ -383,36 +646,37 @@ * Prototype getter for this ScriptFunction - follows the naming convention * used by Nasgen and the code generator * - * @param self self reference + * @param self self reference * @return self's prototype */ public static Object G$prototype(final Object self) { - return self instanceof ScriptFunction ? - ((ScriptFunction)self).getPrototype() : - UNDEFINED; + return self instanceof ScriptFunction + ? ((ScriptFunction) self).getPrototype() + : UNDEFINED; } /** * Prototype setter for this ScriptFunction - follows the naming convention * used by Nasgen and the code generator * - * @param self self reference + * @param self self reference * @param prototype prototype to set */ public static void S$prototype(final Object self, final Object prototype) { if (self instanceof ScriptFunction) { - ((ScriptFunction)self).setPrototype(prototype); + ((ScriptFunction) self).setPrototype(prototype); } } /** * Length getter - ECMA 15.3.3.2: Function.length + * * @param self self reference * @return length */ public static int G$length(final Object self) { if (self instanceof ScriptFunction) { - return ((ScriptFunction)self).data.getArity(); + return ((ScriptFunction) self).data.getArity(); } return 0; @@ -420,12 +684,13 @@ /** * Name getter - ECMA Function.name + * * @param self self refence * @return the name, or undefined if none */ public static Object G$name(final Object self) { if (self instanceof ScriptFunction) { - return ((ScriptFunction)self).getName(); + return ((ScriptFunction) self).getName(); } return UNDEFINED; @@ -433,6 +698,7 @@ /** * Get the prototype for this ScriptFunction + * * @param constructor constructor * @return prototype, or null if given constructor is not a ScriptFunction */ @@ -440,7 +706,7 @@ if (constructor != null) { final Object proto = constructor.getPrototype(); if (proto instanceof ScriptObject) { - return (ScriptObject)proto; + return (ScriptObject) proto; } } @@ -448,29 +714,37 @@ } // These counters are updated only in debug mode. - private static int constructorCount; - private static int invokes; - private static int allocations; + private static LongAdder constructorCount; + private static LongAdder invokes; + private static LongAdder allocations; + + static { + if (Context.DEBUG) { + constructorCount = new LongAdder(); + invokes = new LongAdder(); + allocations = new LongAdder(); + } + } /** * @return the constructorCount */ - public static int getConstructorCount() { - return constructorCount; + public static long getConstructorCount() { + return constructorCount.longValue(); } /** * @return the invokes */ - public static int getInvokes() { - return invokes; + public static long getInvokes() { + return invokes.longValue(); } /** * @return the allocations */ - public static int getAllocations() { - return allocations; + public static long getAllocations() { + return allocations.longValue(); } @Override @@ -490,7 +764,6 @@ return Context.getGlobal().wrapAsObject(obj); } - @SuppressWarnings("unused") private static Object globalFilter(final Object object) { // replace whatever we get with the current global object @@ -498,14 +771,16 @@ } /** - * Some receivers are primitive, in that case, according to the Spec we create a new - * native object per callsite with the wrap filter. We can only apply optimistic builtins - * if there is no per instance state saved for these wrapped objects (e.g. currently NativeStrings), - * otherwise we can't create optimistic versions + * Some receivers are primitive, in that case, according to the Spec we + * create a new native object per callsite with the wrap filter. We can only + * apply optimistic builtins if there is no per instance state saved for + * these wrapped objects (e.g. currently NativeStrings), otherwise we can't + * create optimistic versions * - * @param self receiver - * @param linkLogicClass linkLogicClass, or null if no link logic exists - * @return link logic instance, or null if one could not be constructed for this receiver + * @param self receiver + * @param linkLogicClass linkLogicClass, or null if no link logic exists + * @return link logic instance, or null if one could not be constructed for + * this receiver */ private static LinkLogic getLinkLogic(final Object self, final Class linkLogicClass) { if (linkLogicClass == null) { @@ -518,25 +793,25 @@ final Object wrappedSelf = wrapFilter(self); if (wrappedSelf instanceof OptimisticBuiltins) { - if (wrappedSelf != self && ((OptimisticBuiltins)wrappedSelf).hasPerInstanceAssumptions()) { + if (wrappedSelf != self && ((OptimisticBuiltins) wrappedSelf).hasPerInstanceAssumptions()) { return null; //pessimistic - we created a wrapped object different from the primitive, but the assumptions have instance state } - return ((OptimisticBuiltins)wrappedSelf).getLinkLogic(linkLogicClass); + return ((OptimisticBuiltins) wrappedSelf).getLinkLogic(linkLogicClass); } return null; } /** - * dyn:call call site signature: (callee, thiz, [args...]) - * generated method signature: (callee, thiz, [args...]) + * dyn:call call site signature: (callee, thiz, [args...]) generated method + * signature: (callee, thiz, [args...]) * * cases: * (a) method has callee parameter - * (1) for local/scope calls, we just bind thiz and drop the second argument. - * (2) for normal this-calls, we have to swap thiz and callee to get matching signatures. + * (1) for local/scope calls, we just bind thiz and drop the second argument. + * (2) for normal this-calls, we have to swap thiz and callee to get matching signatures. * (b) method doesn't have callee parameter (builtin functions) - * (3) for local/scope calls, bind thiz and drop both callee and thiz. - * (4) for normal this-calls, drop callee. + * (3) for local/scope calls, bind thiz and drop both callee and thiz. + * (4) for normal this-calls, drop callee. * * @return guarded invocation for call */ @@ -544,11 +819,11 @@ protected GuardedInvocation findCallMethod(final CallSiteDescriptor desc, final LinkRequest request) { final MethodType type = desc.getMethodType(); - final String name = getName(); + final String name = getName(); final boolean isUnstable = request.isCallSiteUnstable(); - final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc); - final boolean isCall = !scopeCall && data.isBuiltin() && "call".equals(name); - final boolean isApply = !scopeCall && data.isBuiltin() && "apply".equals(name); + final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc); + final boolean isCall = !scopeCall && data.isBuiltin() && "call".equals(name); + final boolean isApply = !scopeCall && data.isBuiltin() && "apply".equals(name); final boolean isApplyOrCall = isCall | isApply; @@ -569,7 +844,7 @@ return new GuardedInvocation( handle, null, - (SwitchPoint)null, + (SwitchPoint) null, ClassCastException.class); } @@ -672,14 +947,14 @@ this, cf.getFlags()) : guard, - spsArray, + spsArray, exceptionGuard); } private GuardedInvocation createApplyOrCallCall(final boolean isApply, final CallSiteDescriptor desc, final LinkRequest request, final Object[] args) { final MethodType descType = desc.getMethodType(); final int paramCount = descType.parameterCount(); - if(descType.parameterType(paramCount - 1).isArray()) { + if (descType.parameterType(paramCount - 1).isArray()) { // This is vararg invocation of apply or call. This can normally only happen when we do a recursive // invocation of createApplyOrCallCall (because we're doing apply-of-apply). In this case, create delegate // linkage by unpacking the vararg invocation and use pairArguments to introduce the necessary spreader. @@ -786,7 +1061,7 @@ inv = MH.filterArguments(inv, 2, NativeFunction.TO_APPLY_ARGS); } else { // If the original call site doesn't pass argArray, pass in an empty array - inv = MH.insertArguments(inv, 2, (Object)ScriptRuntime.EMPTY_ARRAY); + inv = MH.insertArguments(inv, 2, (Object) ScriptRuntime.EMPTY_ARRAY); } } @@ -851,7 +1126,7 @@ final LinkRequest request, final Object[] args) { final MethodType descType = desc.getMethodType(); final int paramCount = descType.parameterCount(); - final Object[] varArgs = (Object[])args[paramCount - 1]; + final Object[] varArgs = (Object[]) args[paramCount - 1]; // -1 'cause we're not passing the vararg array itself final int copiedArgCount = args.length - 1; final int varArgCount = varArgs.length; @@ -893,7 +1168,7 @@ // If the last parameter type of the guard is an array, then it is already itself a guard for a vararg apply // invocation. We must filter the last argument with toApplyArgs otherwise deeper levels of nesting will fail // with ClassCastException of NativeArray to Object[]. - if(guardType.parameterType(guardParamCount - 1).isArray()) { + if (guardType.parameterType(guardParamCount - 1).isArray()) { arrayConvertingGuard = MH.filterArguments(guard, guardParamCount - 1, NativeFunction.TO_APPLY_ARGS); } else { arrayConvertingGuard = guard; @@ -903,19 +1178,20 @@ } private static MethodHandle bindImplicitThis(final Object fn, final MethodHandle mh) { - final MethodHandle bound; - if(fn instanceof ScriptFunction && ((ScriptFunction)fn).needsWrappedThis()) { - bound = MH.filterArguments(mh, 1, SCRIPTFUNCTION_GLOBALFILTER); - } else { - bound = mh; - } - return MH.insertArguments(bound, 1, ScriptRuntime.UNDEFINED); - } + final MethodHandle bound; + if (fn instanceof ScriptFunction && ((ScriptFunction) fn).needsWrappedThis()) { + bound = MH.filterArguments(mh, 1, SCRIPTFUNCTION_GLOBALFILTER); + } else { + bound = mh; + } + return MH.insertArguments(bound, 1, ScriptRuntime.UNDEFINED); + } /** * Used for noSuchMethod/noSuchProperty and JSAdapter hooks. * - * These don't want a callee parameter, so bind that. Name binding is optional. + * These don't want a callee parameter, so bind that. Name binding is + * optional. */ MethodHandle getCallMethodHandle(final MethodType type, final String bindName) { return pairArguments(bindToNameIfNeeded(bindToCalleeIfNeeded(data.getGenericInvoker(scope)), bindName), type); @@ -939,10 +1215,11 @@ } /** - * Get the guard that checks if a {@link ScriptFunction} is equal to - * a known ScriptFunction, using reference comparison + * Get the guard that checks if a {@link ScriptFunction} is equal to a known + * ScriptFunction, using reference comparison * - * @param function The ScriptFunction to check against. This will be bound to the guard method handle + * @param function The ScriptFunction to check against. This will be bound + * to the guard method handle * * @return method handle for guard */ @@ -957,11 +1234,12 @@ } /** - * Get a guard that checks if a {@link ScriptFunction} is equal to - * a known ScriptFunction using reference comparison, and whether the type of - * the second argument (this-object) is not a JavaScript primitive type. + * Get a guard that checks if a {@link ScriptFunction} is equal to a known + * ScriptFunction using reference comparison, and whether the type of the + * second argument (this-object) is not a JavaScript primitive type. * - * @param function The ScriptFunction to check against. This will be bound to the guard method handle + * @param function The ScriptFunction to check against. This will be bound + * to the guard method handle * * @return method handle for guard */ @@ -972,12 +1250,12 @@ @SuppressWarnings("unused") private static boolean isFunctionMH(final Object self, final ScriptFunctionData data) { - return self instanceof ScriptFunction && ((ScriptFunction)self).data == data; + return self instanceof ScriptFunction && ((ScriptFunction) self).data == data; } @SuppressWarnings("unused") private static boolean isNonStrictFunction(final Object self, final Object arg, final ScriptFunctionData data) { - return self instanceof ScriptFunction && ((ScriptFunction)self).data == data && arg instanceof ScriptObject; + return self instanceof ScriptFunction && ((ScriptFunction) self).data == data && arg instanceof ScriptObject; } //TODO this can probably be removed given that we have builtin switchpoints in the context @@ -990,7 +1268,7 @@ @SuppressWarnings("unused") private static Object[] addZerothElement(final Object[] args, final Object value) { // extends input array with by adding new zeroth element - final Object[] src = args == null? ScriptRuntime.EMPTY_ARRAY : args; + final Object[] src = args == null ? ScriptRuntime.EMPTY_ARRAY : args; final Object[] result = new Object[src.length + 1]; System.arraycopy(src, 0, result, 1, src.length); result[0] = value; @@ -1014,4 +1292,3 @@ return MH.findVirtual(MethodHandles.lookup(), ScriptFunction.class, name, MH.type(rtype, types)); } } - diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Tue Sep 15 07:47:44 2015 -0700 @@ -151,7 +151,7 @@ * Is this a ScriptFunction generated with strict semantics? * @return true if strict, false otherwise */ - public boolean isStrict() { + public final boolean isStrict() { return (flags & IS_STRICT) != 0; } @@ -164,11 +164,11 @@ return getName(); } - boolean isBuiltin() { + final boolean isBuiltin() { return (flags & IS_BUILTIN) != 0; } - boolean isConstructor() { + final boolean isConstructor() { return (flags & IS_CONSTRUCTOR) != 0; } @@ -179,7 +179,7 @@ * according to ECMA 10.4.3. * @return true if this argument must be an object */ - boolean needsWrappedThis() { + final boolean needsWrappedThis() { return (flags & USES_THIS) != 0 && (flags & IS_STRICT_OR_BUILTIN) == 0; } @@ -318,7 +318,7 @@ * Used to find an apply to call version that fits this callsite. * We cannot just, as in the normal matcher case, return e.g. (Object, Object, int) * for (Object, Object, int, int, int) or we will destroy the semantics and get - * a function that, when padded with undefineds, behaves differently + * a function that, when padded with undefined values, behaves differently * @param type actual call site type * @return apply to call that perfectly fits this callsite or null if none found */ @@ -397,7 +397,7 @@ /** * This method is used to create the immutable portion of a bound function. - * See {@link ScriptFunction#makeBoundFunction(Object, Object[])} + * See {@link ScriptFunction#createBound(Object, Object[])} * * @param fn the original function being bound * @param self this reference to bind. Can be null. diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Tue Sep 15 07:47:44 2015 -0700 @@ -64,6 +64,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.LongAdder; import jdk.internal.dynalink.CallSiteDescriptor; import jdk.internal.dynalink.linker.GuardedInvocation; import jdk.internal.dynalink.linker.LinkRequest; @@ -211,7 +212,7 @@ */ public ScriptObject(final PropertyMap map) { if (Context.DEBUG) { - ScriptObject.count++; + ScriptObject.count.increment(); } this.arrayData = ArrayData.EMPTY_ARRAY; this.setMap(map == null ? PropertyMap.newMap() : map); @@ -2316,7 +2317,7 @@ MH.dropArguments( MH.constant( ScriptFunction.class, - func.makeBoundFunction(thiz, new Object[] { name })), + func.createBound(thiz, new Object[] { name })), 0, Object.class), NashornGuards.combineGuards( @@ -2422,7 +2423,7 @@ return UNDEFINED; } - return ((ScriptFunction)value).makeBoundFunction(this, new Object[] {name}); + return ((ScriptFunction)value).createBound(this, new Object[] {name}); } private GuardedInvocation createEmptyGetter(final CallSiteDescriptor desc, final boolean explicitInstanceOfCheck, final String name) { @@ -3811,15 +3812,20 @@ } /** This is updated only in debug mode - counts number of {@code ScriptObject} instances created */ - private static int count; - + private static LongAdder count; + + static { + if (Context.DEBUG) { + count = new LongAdder(); + } + } /** * Get number of {@code ScriptObject} instances created. If not running in debug * mode this is always 0 * * @return number of ScriptObjects created */ - public static int getCount() { - return count; + public static long getCount() { + return count.longValue(); } } diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java Tue Sep 15 07:47:44 2015 -0700 @@ -77,7 +77,7 @@ return compilationId; } - private Map> installClasses(final Source source, final CodeInstaller installer) { + private Map> installClasses(final Source source, final CodeInstaller installer) { final Map> installedClasses = new HashMap<>(); final byte[] mainClassBytes = classBytes.get(mainClassName); final Class mainClass = installer.install(mainClassName, mainClassBytes); @@ -96,7 +96,7 @@ return installedClasses; } - FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller installer) { + FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller installer) { final Map> installedClasses = installClasses(data.getSource(), installer); assert initializers != null; @@ -124,7 +124,7 @@ * @param installer the installer * @return main script class */ - Class installScript(final Source source, final CodeInstaller installer) { + Class installScript(final Source source, final CodeInstaller installer) { final Map> installedClasses = installClasses(source, installer); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Tue Sep 15 07:47:44 2015 -0700 @@ -352,7 +352,7 @@ } private static Object bindToExpression(final ScriptFunction fn, final Object receiver) { - return fn.makeBoundFunction(withFilterExpression(receiver), ScriptRuntime.EMPTY_ARRAY); + return fn.createBound(withFilterExpression(receiver), ScriptRuntime.EMPTY_ARRAY); } private MethodHandle expressionGuard(final String name, final ScriptObject owner) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Tue Sep 15 07:47:44 2015 -0700 @@ -191,7 +191,7 @@ /** * Return element setter for a {@link ContinuousArrayData} - * @param clazz clazz for exact type guard + * @param clazz class for exact type guard * @param setHas set has guard * @param elementType element type * @return method handle for element setter diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Tue Sep 15 07:47:44 2015 -0700 @@ -34,7 +34,7 @@ * This filter handles the presence of undefined array elements. */ final class UndefinedArrayFilter extends ArrayFilter { - /** Bit vector tracking undefines. */ + /** Bit vector tracking undefined slots. */ private final BitVector undefined; UndefinedArrayFilter(final ArrayData underlying) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Tue Sep 15 07:47:44 2015 -0700 @@ -49,7 +49,6 @@ import jdk.nashorn.internal.codegen.CompilerConstants.Call; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; -import jdk.nashorn.internal.objects.ScriptFunctionImpl; import jdk.nashorn.internal.runtime.ECMAException; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.OptimisticReturnFilters; @@ -396,8 +395,8 @@ * @throws ECMAException with {@code TypeError} if the object is not a callable. */ public static Object bindCallable(final Object callable, final Object boundThis, final Object[] boundArgs) { - if (callable instanceof ScriptFunctionImpl) { - return ((ScriptFunctionImpl)callable).makeBoundFunction(boundThis, boundArgs); + if (callable instanceof ScriptFunction) { + return ((ScriptFunction)callable).createBound(boundThis, boundArgs); } else if (callable instanceof BoundCallable) { return ((BoundCallable)callable).bind(boundArgs); } else if (isCallable(callable)) { diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java Tue Sep 15 07:47:44 2015 -0700 @@ -43,6 +43,7 @@ import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.LongAdder; import jdk.internal.dynalink.ChainedCallSite; import jdk.internal.dynalink.DynamicLinker; import jdk.internal.dynalink.linker.GuardedInvocation; @@ -70,7 +71,7 @@ LinkerCallSite(final NashornCallSiteDescriptor descriptor) { super(descriptor); if (Context.DEBUG) { - LinkerCallSite.count++; + LinkerCallSite.count.increment(); } } @@ -173,7 +174,7 @@ * @return self reference */ public static Object increaseMissCount(final String desc, final Object self) { - ++missCount; + missCount.increment(); if (r.nextInt(100) < missSamplingPercentage) { final AtomicInteger i = missCounts.get(desc); if (i == null) { @@ -509,12 +510,19 @@ } // counters updated in debug mode - private static int count; + private static LongAdder count; private static final HashMap missCounts = new HashMap<>(); - private static int missCount; + private static LongAdder missCount; private static final Random r = new Random(); private static final int missSamplingPercentage = Options.getIntProperty("nashorn.tcs.miss.samplePercent", 1); + static { + if (Context.DEBUG) { + count = new LongAdder(); + missCount = new LongAdder(); + } + } + @Override protected int getMaxChainLength() { return 8; @@ -524,16 +532,16 @@ * Get the callsite count * @return the count */ - public static int getCount() { - return count; + public static long getCount() { + return count.longValue(); } /** * Get the callsite miss count * @return the missCount */ - public static int getMissCount() { - return missCount; + public static long getMissCount() { + return missCount.longValue(); } /** diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Tue Sep 15 07:47:44 2015 -0700 @@ -26,7 +26,6 @@ package jdk.nashorn.internal.runtime.linker; import static jdk.nashorn.internal.lookup.Lookup.MH; -import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -42,13 +41,11 @@ import jdk.internal.dynalink.linker.LinkerServices; import jdk.internal.dynalink.linker.MethodHandleTransformer; import jdk.internal.dynalink.support.DefaultInternalObjectFilter; -import jdk.internal.dynalink.support.Guards; import jdk.internal.dynalink.support.Lookup; import jdk.nashorn.api.scripting.ScriptUtils; import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ScriptObject; -import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.internal.runtime.options.Options; /** diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java Tue Sep 15 07:47:44 2015 -0700 @@ -65,7 +65,7 @@ final boolean DONT_OPTIMIZE = false; - final boolean USE_STRING_TEMPLATES = true; // use embeded string templates in Regex object as byte arrays instead of compiling them into int bytecode array + final boolean USE_STRING_TEMPLATES = true; // use embedded string templates in Regex object as byte arrays instead of compiling them into int bytecode array final boolean NON_UNICODE_SDW = true; diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js Tue Sep 15 07:47:44 2015 -0700 @@ -55,7 +55,7 @@ // do not start with '/'. If regexp, then eval it to make RegExp object return value.startsWith('/')? eval(value) : value.substring(1); } else { - // anythin else is returned "as is"" + // anything else is returned "as is" return value; } }); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Tue Sep 15 07:47:44 2015 -0700 @@ -42,8 +42,8 @@ import jdk.nashorn.api.scripting.NashornException; import jdk.nashorn.internal.codegen.Compiler; import jdk.nashorn.internal.codegen.Compiler.CompilationPhases; +import jdk.nashorn.internal.ir.Expression; import jdk.nashorn.internal.ir.FunctionNode; -import jdk.nashorn.internal.ir.Expression; import jdk.nashorn.internal.ir.debug.ASTWriter; import jdk.nashorn.internal.ir.debug.PrintVisitor; import jdk.nashorn.internal.objects.Global; @@ -255,12 +255,9 @@ return COMPILATION_ERROR; } - new Compiler( + Compiler.forNoInstallerCompilation( context, - env, - null, //null - pass no code installer - this is compile only functionNode.getSource(), - context.getErrorManager(), env._strict | functionNode.isStrict()). compile(functionNode, CompilationPhases.COMPILE_ALL_NO_INSTALL); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/test/script/basic/JDK-8134569.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8134569.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8134569: Add tests for prototype callsites + * + * @test + * @run + */ + +function create() { + function C() { + this.i1 = 1; + this.i2 = 2; + this.i3 = 3; + return this; + } + return new C(); +} + +function createEmpty() { + function C() { + return this; + } + return new C(); +} + +function createDeep() { + function C() { + this.i1 = 1; + this.i2 = 2; + this.i3 = 3; + return this; + } + function D() { + this.p1 = 1; + this.p2 = 2; + this.p3 = 3; + return this; + } + C.prototype = new D(); + return new C(); +} + +function createEval() { + return eval("Object.create({})"); +} + +function p(o) { print(o.x) } + +var a, b; + +create(); +a = create(); +b = create(); +a.__proto__.x = 123; + +p(a); +p(b); + +a = create(); +b = create(); +b.__proto__.x = 123; + +p(a); +p(b); + +a = createEmpty(); +b = createEmpty(); +a.__proto__.x = 123; + +p(a); +p(b); + +a = createEmpty(); +b = createEmpty(); +b.__proto__.x = 123; + +p(a); +p(b); + +a = createDeep(); +b = createDeep(); +a.__proto__.__proto__.x = 123; + +p(a); +p(b); + +a = createDeep(); +b = createDeep(); +b.__proto__.__proto__.x = 123; + +p(a); +p(b); + +a = createEval(); +b = createEval(); +a.__proto__.x = 123; + +p(a); +p(b); + +a = createEval(); +b = createEval(); +b.__proto__.x = 123; + +p(a); +p(b); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/test/script/basic/JDK-8134569.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8134569.js.EXPECTED Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,16 @@ +123 +undefined +undefined +123 +123 +undefined +undefined +123 +123 +undefined +undefined +123 +123 +undefined +undefined +123 diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/test/script/basic/JDK-8135000.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8135000.js Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8135000: Number.prototype.toFixed returns wrong string for 0.5 and -0.5 + * + * @test + * @run + */ + +print(-2.6.toFixed()); +print(-2.5.toFixed()); +print(-2.4.toFixed()); +print(-1.6.toFixed()); +print(-1.5.toFixed()); +print(-1.4.toFixed()); +print(-0.6.toFixed()); +print(-0.5.toFixed()); +print(-0.4.toFixed()); +print(0.4.toFixed()); +print(0.5.toFixed()); +print(0.6.toFixed()); +print(1.4.toFixed()); +print(1.5.toFixed()); +print(1.6.toFixed()); +print(2.4.toFixed()); +print(2.5.toFixed()); +print(2.6.toFixed()); diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/test/script/basic/JDK-8135000.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8135000.js.EXPECTED Tue Sep 15 07:47:44 2015 -0700 @@ -0,0 +1,18 @@ +-3 +-3 +-2 +-2 +-2 +-1 +-1 +-1 +0 +0 +1 +1 +1 +2 +2 +2 +3 +3 diff -r 8a1504b43ad8 -r 351e2f1e9f17 nashorn/test/script/trusted/JDK-8006529.js --- a/nashorn/test/script/trusted/JDK-8006529.js Thu Sep 10 14:55:18 2015 -0700 +++ b/nashorn/test/script/trusted/JDK-8006529.js Tue Sep 15 07:47:44 2015 -0700 @@ -120,7 +120,7 @@ var sourceForMethod = Source.class.getMethod("sourceFor", java.lang.String.class, java.lang.String.class) var ParserConstructor = Parser.class.getConstructor(ScriptEnvironment.class, Source.class, ErrorManager.class) -var CompilerConstructor = Compiler.class.getConstructor(Context.class, ScriptEnvironment.class, CodeInstaller.class, Source.class, ErrorManager.class, boolean.class); +var CompilerConstructor = Compiler.class.getMethod("forNoInstallerCompilation", Context.class, Source.class, boolean.class); // compile(script) -- compiles a script specified as a string with its // source code, returns a jdk.nashorn.internal.ir.FunctionNode object @@ -134,7 +134,7 @@ var parser = ParserConstructor.newInstance(env, source, ThrowErrorManager.class.newInstance()); var func = parseMethod.invoke(parser); - var compiler = CompilerConstructor.newInstance(ctxt, env, null, source, null, false); + var compiler = CompilerConstructor.invoke(null, ctxt, source, false); return compileMethod.invoke(compiler, func, phases); };