--- a/.hgtags Thu Sep 10 14:55:20 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
--- a/.hgtags-top-repo Thu Sep 10 14:55:20 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
--- a/common/autoconf/generated-configure.sh Thu Sep 10 14:55:20 2015 -0700
+++ b/common/autoconf/generated-configure.sh Tue Sep 15 07:47:44 2015 -0700
@@ -4364,7 +4364,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1435822080
+DATE_WHEN_GENERATED=1441958217
###############################################################################
#
@@ -38307,6 +38307,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:
+ # - <major>.<minor>
+ # - <major>.<minor>.<micro>
+ 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
--- a/common/autoconf/spec.gmk.in Thu Sep 10 14:55:20 2015 -0700
+++ b/common/autoconf/spec.gmk.in Tue Sep 15 07:47:44 2015 -0700
@@ -30,25 +30,6 @@
# (called @OPENJDK_BUILD_AUTOCONF_NAME@ by autoconf)
# using 'configure @CONFIGURE_COMMAND_LINE@'
-# When calling macros, the spaces between arguments are
-# often semantically important! Sometimes we need to subst
-# spaces and commas, therefore we need the following macros.
-X:=
-SPACE:=$(X) $(X)
-COMMA:=,
-DOLLAR:=$$
-HASH:=\#
-LEFT_PAREN:=(
-RIGHT_PAREN:=)
-SQUOTE:='
-#'
-DQUOTE:="
-#"
-define NEWLINE
-
-
-endef
-
# The command line given to configure.
CONFIGURE_COMMAND_LINE:=@CONFIGURE_COMMAND_LINE@
--- a/common/autoconf/toolchain.m4 Thu Sep 10 14:55:20 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:
+ # - <major>.<minor>
+ # - <major>.<minor>.<micro>
+ 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
--- a/corba/.hgtags Thu Sep 10 14:55:20 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
--- a/hotspot/.hgtags Thu Sep 10 14:55:20 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
--- a/hotspot/src/share/vm/code/codeCache.cpp Thu Sep 10 14:55:20 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());
--- a/hotspot/src/share/vm/code/compiledIC.cpp Thu Sep 10 14:55:20 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
--- a/hotspot/src/share/vm/code/compiledIC.hpp Thu Sep 10 14:55:20 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();
--- a/hotspot/src/share/vm/code/nmethod.cpp Thu Sep 10 14:55:20 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
--- a/hotspot/src/share/vm/code/nmethod.hpp Thu Sep 10 14:55:20 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; }
--- a/hotspot/src/share/vm/opto/loopopts.cpp Thu Sep 10 14:55:20 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
--- a/hotspot/src/share/vm/opto/stringopts.cpp Thu Sep 10 14:55:20 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();
}
}
--- a/hotspot/src/share/vm/runtime/sweeper.cpp Thu Sep 10 14:55:20 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);
--- /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);
+ }
+
+}
--- a/jaxp/.hgtags Thu Sep 10 14:55:20 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
--- a/jaxws/.hgtags Thu Sep 10 14:55:20 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
--- a/jdk/.hgtags Thu Sep 10 14:55:20 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
--- a/jdk/make/Tools.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/make/Tools.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -159,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)
--- a/jdk/make/launcher/LauncherCommon.gmk Thu Sep 10 14:55:20 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)
--- a/jdk/make/lib/LibCommon.gmk Thu Sep 10 14:55:20 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
--- a/jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java Thu Sep 10 14:55:20 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<String, String> resourceNameToLocales = new HashMap<>();\n" +
+ (CLDRConverter.isBaseModule ?
+ " private static final Map<Locale, String[]> 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<String, String> parentLocales() {\n" +
- " Map<String, String> 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<Locale, String[]> parentLocales() {\n" +
+ " return parentLocalesMap;\n" +
+ " }\n}");
} else {
out.println("}");
}
--- a/jdk/make/src/native/add_gnu_debuglink/add_gnu_debuglink.c Thu Sep 10 14:55:20 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 <fcntl.h>
-#include <stdio.h>
-#include <libelf.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-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;
-}
--- a/jdk/make/src/native/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c Thu Sep 10 14:55:20 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 <fcntl.h>
-#include <stdio.h>
-#include <libelf.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-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);
-}
--- a/jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c Thu Sep 10 14:55:20 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/<pid> 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/<pid>/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;
--- a/jdk/src/java.base/macosx/native/libosxsecurity/KeystoreImpl.m Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/src/java.base/macosx/native/libosxsecurity/KeystoreImpl.m Tue Sep 15 07:47:44 2015 -0700
@@ -508,7 +508,7 @@
SecKeychainRef defaultKeychain = NULL;
SecKeychainCopyDefault(&defaultKeychain);
- SecExternalItemType dataType = (isCertificate == JNI_TRUE ? kSecFormatX509Cert : kSecFormatWrappedPKCS8);
+ SecExternalFormat dataFormat = (isCertificate == JNI_TRUE ? kSecFormatX509Cert : kSecFormatWrappedPKCS8);
// Convert the password obj into a CFStringRef that the keychain importer can use for encryption.
SecKeyImportExportParameters paramBlock;
@@ -533,7 +533,7 @@
paramBlock.keyUsage = CSSM_KEYUSE_ANY;
paramBlock.keyAttributes = CSSM_KEYATTR_RETURN_DEFAULT;
- err = SecKeychainItemImport(cfDataToImport, NULL, &dataType, NULL,
+ err = SecKeychainItemImport(cfDataToImport, NULL, &dataFormat, NULL,
0, ¶mBlock, defaultKeychain, &createdItems);
if (err == noErr) {
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -864,7 +864,9 @@
if (computed[i] != actual[i]) {
throw new IOException(
"Keystore was tampered with, or "
- + "password was incorrect");
+ + "password was incorrect",
+ new UnrecoverableKeyException(
+ "Password verification failed"));
}
}
}
--- a/jdk/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Tue Sep 15 07:47:44 2015 -0700
@@ -51,6 +51,8 @@
import java.util.*;
import java.security.AlgorithmParameters;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
@@ -2060,7 +2062,7 @@
}
if (!MessageDigest.isEqual(macData.getDigest(), macResult)) {
- throw new SecurityException("Failed PKCS12" +
+ throw new UnrecoverableKeyException("Failed PKCS12" +
" integrity checking");
}
} catch (Exception e) {
--- a/jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Thu Sep 10 14:55:20 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<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
if (Objects.isNull(parentLocalesMap)) {
Map<Locale, Locale> map = new HashMap<>();
- Map<String, String> 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);
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyStore.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyStore.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, 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
@@ -750,6 +750,21 @@
} else {
login(new PasswordCallbackHandler(password));
}
+ } catch(LoginException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof PKCS11Exception) {
+ PKCS11Exception pe = (PKCS11Exception) cause;
+ if (pe.getErrorCode() == CKR_PIN_INCORRECT) {
+ // if password is wrong, the cause of the IOException
+ // should be an UnrecoverableKeyException
+ throw new IOException("load failed",
+ new UnrecoverableKeyException().initCause(e));
+ }
+ }
+ throw new IOException("load failed", e);
+ }
+
+ try {
if (mapLabels() == true) {
// CKA_LABELs are shared by multiple certs
writeDisabled = true;
@@ -757,7 +772,7 @@
if (debug != null) {
dumpTokenMap();
}
- } catch (LoginException | KeyStoreException | PKCS11Exception e) {
+ } catch (KeyStoreException | PKCS11Exception e) {
throw new IOException("load failed", e);
}
}
--- a/jdk/test/ProblemList.txt Thu Sep 10 14:55:20 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
--- a/jdk/test/java/lang/ProcessHandle/InfoTest.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/java/lang/ProcessHandle/InfoTest.java Tue Sep 15 07:47:44 2015 -0700
@@ -257,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());
}
}
@@ -270,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);
@@ -297,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);
--- a/jdk/test/java/security/KeyStore/TestKeyStoreBasic.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/java/security/KeyStore/TestKeyStoreBasic.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -21,36 +21,97 @@
* questions.
*/
-import static java.lang.System.out;
-
+import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.KeyStoreException;
-import java.security.Provider;
-import java.security.Security;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.spec.KeySpec;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
/*
* @test
- * @bug 8048621
- * @summary Test the basic operations of KeyStore, provided by SunJCE (jceks),
- * and SunPKCS11-Solaris(PKCS11KeyStore)
+ * @bug 8048621 8133090
+ * @summary Test basic operations with keystores (jks, jceks, pkcs12)
* @author Yu-Ching Valerie PENG
*/
+public class TestKeyStoreBasic {
-public class TestKeyStoreBasic {
+ private static final String PRIVATE_KEY_PKCS8_BASE64 = ""
+ + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpyz97liuWPDYcLH9TX8BiT78o"
+ + "lCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgKmLhuczF3M9VIcWr+"
+ + "JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz7leikne7KmclHvTfvFd0WDI7Gb9v"
+ + "o4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXRv5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfF"
+ + "e1DDsMg/KpKGiILYZ+g2qtVMZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e"
+ + "+sO6H24w2F19AgMBAAECggEBAId/12187dO6wUPCjumuJA1QrrBnbKdKONyai36uoc1Od4s5QFj7"
+ + "+hEIeS7rbGNYQuBvnkgusAbzkW0FIpxpHce3EJez/emux6pEOKoP77BwMt9gy+txyu0+BHi91FQg"
+ + "AGvrnQDO5EYVY4Cz/WjOsJzKu8zVLg+DS0Toa2qRFwmUe9mVAXPNOCZ3Oae/Q6tCDsaINNw0fmjj"
+ + "jn6uohPbS+n6xENG3FkQXB36getXy310xTGED2J27cmAQH6gLR6Kl2iROzNPbbpBqbuemI9kbcld"
+ + "EwBS1jRfZWeaPstYA1niVrE9UgUBzemnoh4TDkG076sYthHMr5QFGjPswnwtJ4ECgYEA0sURQ5+v"
+ + "baH4tdaemI3qpnknXTlzSpuZZmAoyvY0Id0mlduwKwmZ3Y5989wHfnnhFfyNO4IkTKjI2Wp97qP5"
+ + "4eqUNpA7FtNU7KUzMcFDTtwtNZuRYMrKlqo2lLbA+gVrAYpYZFL4b7tcwtX4DnYorDsmude6W8sG"
+ + "4Mx2VdFJC9UCgYEAzjsdXCYH5doWUHb0dvn9ID7IikffEMRM720MRjrnnnVbpzx6ACntkPDNZg7p"
+ + "TRE/mx7iBz81ZaUWE+V0wd0JvCHEdpAz3mksyvDFhU4Bgs6xzf2pSul5muhsx3hHcvvPezz5Bnxs"
+ + "faJlzkxfwotyGmvWN15GA/pyfsZjsbbTpwkCgYAO6NnbysQCIV8SnegCKqfatt9N/O5m7LLhRxQb"
+ + "p2bwrlA4cZ34rWkw/w9x3LK7A6wkfgUPnJkswxPSLXJTG05l6M4rPfCwIKr1Qopojp9QSMr569NQ"
+ + "4YeLOOc7heIIzbFQHpU6I5Rncv2Q2sn9W+ZsqJKIuvX34FjQNiZ406EzMQKBgHSxOGS61D84DuZK"
+ + "2Ps1awhC3kB4eHzJRms3vflDPWoJJ+pSKwpKrzUTPHXiPBqyhtYkPGszVeiE6CAr9sv3YZnFVaBs"
+ + "6hyQUJsob+uE/w/gGvXe8VsFDx0bJOodYfhrCbTHBHWqE81nBcocpxayxsayfAzqWB3KKd0YLrMR"
+ + "K2PZAoGAcZa8915R2m0KZ6HVJUt/JDR85jCbN71kcVDFY2XSFkOJvOdFoHNfRckfLzjq9Y2MSSTV"
+ + "+QDWbDo2doUQCejJUTaN8nP79tfyir24X5uVPvQaeVoGTKYb+LfUqK0F60lStmjuddIGSZH55y3v"
+ + "+9XjmxbVERtd1lqgQg3VlmKlEXY=";
+
+ /*
+ * 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
+ */
+ private static final String CERTIFICATE = ""
+ + "-----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-----\n";
+
private static final char[] PASSWD2 = new char[] {
'b', 'o', 'r', 'e', 'd'
};
- private static final char[] PASSWDK = new String("cannot be null")
+ private static final char[] PASSWDK = "cannot be null"
.toCharArray();
private static final String[] KS_Type = {
"jks", "jceks", "pkcs12", "PKCS11KeyStore"
};
- private static final String[] PRO_TYPE = {
+ private static final String[] PROVIDERS = {
"SUN", "SunJCE", "SunJSSE", "SunPKCS11-Solaris"
};
private static final String ALIAS_HEAD = "test";
@@ -61,41 +122,58 @@
}
public void run() throws Exception {
- Provider[] providers = Security.getProviders();
- for (Provider p: providers) {
- String prvName = p.getName();
- if (prvName.startsWith("SunJCE")
- || prvName.startsWith("SunPKCS11-Solaris")) {
- try {
- runTest(p);
- out.println("Test with provider " + p.getName() + ""
- + " passed");
- } catch (java.security.KeyStoreException e) {
- if (prvName.startsWith("SunPKCS11-Solaris")) {
- out.println("KeyStoreException is expected "
- + "PKCS11KeyStore is invalid keystore type.");
- e.printStackTrace();
- } else {
- throw e;
- }
+ for (String provider : PROVIDERS) {
+ try {
+ runTest(provider);
+ System.out.println("Test with provider " + provider + "passed");
+ } catch (java.security.KeyStoreException e) {
+ if (provider.equals("SunPKCS11-Solaris")) {
+ System.out.println("KeyStoreException is expected: "
+ + "PKCS11KeyStore is invalid keystore type: " + e);
+ } else {
+ throw e;
+ }
+ } catch (NoSuchProviderException e) {
+ String osName = System.getProperty("os.name");
+ if (provider.equals("SunPKCS11-Solaris")
+ && !osName.equals("SunOS")) {
+ System.out.println("Skip SunPKCS11-Solaris provider on "
+ + osName);
+ } else {
+ throw e;
}
}
}
}
- public void runTest(Provider p) throws Exception {
- SecretKey key = new SecretKeySpec(
- new String("No one knows").getBytes(), "PBE");
+ public void runTest(String provider) throws Exception {
+
+ // load private key
+ // all keystore types should support private keys
+ KeySpec spec = new PKCS8EncodedKeySpec(
+ Base64.getMimeDecoder().decode(PRIVATE_KEY_PKCS8_BASE64));
+ PrivateKey privateKey = KeyFactory.getInstance("RSA")
+ .generatePrivate(spec);
+
+ // load x509 certificate
+ Certificate cert;
+ try (InputStream is = new BufferedInputStream(
+ new ByteArrayInputStream(CERTIFICATE.getBytes()))) {
+ cert = CertificateFactory.getInstance("X.509")
+ .generateCertificate(is);
+ }
+
int numEntries = 5;
- String proName = p.getName();
String type = null;
- for (int i = 0; i < PRO_TYPE.length; i++) {
- if (proName.compareTo(PRO_TYPE[i]) == 0) {
+ for (int i = 0; i < PROVIDERS.length; i++) {
+ if (provider.compareTo(PROVIDERS[i]) == 0) {
type = KS_Type[i];
break;
}
}
- KeyStore ks = KeyStore.getInstance(type, p);
+
+ System.out.printf("Test %s provider and %s keystore%n", provider, type);
+ KeyStore ks = KeyStore.getInstance(type, provider);
KeyStore ks2 = KeyStore.getInstance(type, ks.getProvider().getName());
// create an empty key store
@@ -103,7 +181,8 @@
// store the secret keys
for (int j = 0; j < numEntries; j++) {
- ks.setKeyEntry(ALIAS_HEAD + j, key, PASSWDK, null);
+ ks.setKeyEntry(ALIAS_HEAD + j, privateKey, PASSWDK,
+ new Certificate[] { cert });
}
// initialize the 2nd key store object with the 1st one
@@ -134,13 +213,18 @@
throw new RuntimeException(
"ERROR: passed the loading with incorrect password");
} catch (IOException ex) {
+ System.out.println("Expected exception: " + ex);
+ if (!causedBy(ex, UnrecoverableKeyException.class)) {
+ ex.printStackTrace(System.out);
+ throw new RuntimeException("Unexpected cause");
+ }
+ System.out.println("Expected cause: "
+ + UnrecoverableKeyException.class.getName());
+
bais.reset();
ks.load(bais, PASSWD2);
bais.reset();
ks.load(bais, null);
- } finally {
- bais.close();
- baos.close();
}
// check key store type
@@ -158,7 +242,6 @@
private void checkType(KeyStore obj, String type) {
if (!obj.getType().equals(type)) {
throw new RuntimeException("ERROR: wrong key store type");
-
}
}
@@ -168,7 +251,6 @@
if (!obj.containsAlias(ALIAS_HEAD + k)) {
throw new RuntimeException("ERROR: alias (" + k
+ ") should exist");
-
}
}
}
@@ -176,16 +258,25 @@
// compare the creation dates - true if all the same
private void compareCreationDate(KeyStore o1, KeyStore o2, int range)
throws KeyStoreException {
- boolean result = true;
- String alias = null;
+ String alias;
for (int k = 0; k < range; k++) {
alias = ALIAS_HEAD + k;
if (!o1.getCreationDate(alias).equals(o2.getCreationDate(alias))) {
throw new RuntimeException("ERROR: entry creation time (" + k
+ ") differs");
-
}
}
}
+ // checks if an exception was caused by specified exception class
+ private static boolean causedBy(Exception e, Class klass) {
+ Throwable cause = e;
+ while ((cause = cause.getCause()) != null) {
+ if (cause.getClass().equals(klass)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathEncodingTest.java Tue Sep 15 07:47:44 2015 -0700
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 1998, 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.ByteArrayInputStream;
+import java.security.cert.CertPath;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.List;
+
+/*
+ * @test
+ * @bug 8074931
+ * @summary CertPathEncodingTest tests the ability of the CertPath and
+ * CertificateFactory to encode and decode CertPaths.
+ */
+public final class CertPathEncodingTest {
+ /*
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 935438132 (0x37c1a734)
+ Signature Algorithm: dsaWithSHA1
+ Issuer: C=us, O=sun, OU=east, OU=bcn, CN=yassir
+ Validity
+ Not Before: Aug 23 19:55:32 1999 GMT
+ Not After : Aug 22 19:55:32 2000 GMT
+ Subject: C=us, O=sun, OU=east, OU=bcn
+ Subject Public Key Info:
+ Public Key Algorithm: dsaEncryption
+ pub:
+ 63:47:4f:f6:29:e5:98:a2:21:fd:da:97:9e:3f:ca:
+ b0:17:49:8d:8a:a7:06:0d:a6:78:97:39:59:33:72:
+ a2:a5:74:d5:3a:ef:e6:7c:07:d7:8e:8e:d1:66:73:
+ 99:14:04:96:f5:31:d6:72:ee:d2:53:f8:90:b5:f3:
+ c3:f1:64:ba:1a:9e:c0:0a:da:92:48:c5:d3:84:7e:
+ 48:09:66:d9:51:ba:74:56:5a:77:8a:8c:9a:9c:f6:
+ 84:12:61:12:51:dc:c6:4f:84:94:ec:cb:78:51:83:
+ 8c:20:8a:53:7b:d2:b6:36:df:50:35:95:1f:cb:50:
+ 55:8b:3f:fb:e2:77:cb
+ P:
+ 00:fd:7f:53:81:1d:75:12:29:52:df:4a:9c:2e:ec:
+ e4:e7:f6:11:b7:52:3c:ef:44:00:c3:1e:3f:80:b6:
+ 51:26:69:45:5d:40:22:51:fb:59:3d:8d:58:fa:bf:
+ c5:f5:ba:30:f6:cb:9b:55:6c:d7:81:3b:80:1d:34:
+ 6f:f2:66:60:b7:6b:99:50:a5:a4:9f:9f:e8:04:7b:
+ 10:22:c2:4f:bb:a9:d7:fe:b7:c6:1b:f8:3b:57:e7:
+ c6:a8:a6:15:0f:04:fb:83:f6:d3:c5:1e:c3:02:35:
+ 54:13:5a:16:91:32:f6:75:f3:ae:2b:61:d7:2a:ef:
+ f2:22:03:19:9d:d1:48:01:c7
+ Q:
+ 00:97:60:50:8f:15:23:0b:cc:b2:92:b9:82:a2:eb:
+ 84:0b:f0:58:1c:f5
+ G:
+ 00:f7:e1:a0:85:d6:9b:3d:de:cb:bc:ab:5c:36:b8:
+ 57:b9:79:94:af:bb:fa:3a:ea:82:f9:57:4c:0b:3d:
+ 07:82:67:51:59:57:8e:ba:d4:59:4f:e6:71:07:10:
+ 81:80:b4:49:16:71:23:e8:4c:28:16:13:b7:cf:09:
+ 32:8c:c8:a6:e1:3c:16:7a:8b:54:7c:8d:28:e0:a3:
+ ae:1e:2b:b3:a6:75:91:6e:a3:7f:0b:fa:21:35:62:
+ f1:fb:62:7a:01:24:3b:cc:a4:f1:be:a8:51:90:89:
+ a8:83:df:e1:5a:e5:9f:06:92:8b:66:5e:80:7b:55:
+ 25:64:01:4c:3b:fe:cf:49:2a
+ X509v3 extensions:
+ X509v3 Key Usage: critical
+ Digital Signature, Key Encipherment, Certificate Sign
+ Signature Algorithm: dsaWithSHA1
+ r:
+ 52:80:52:2b:2c:3d:02:66:58:b4:dc:ef:52:26:70:
+ 1b:53:ca:b3:7d
+ s:
+ 62:03:b2:ab:3e:18:2a:66:09:b6:ce:d4:05:a5:8e:
+ a5:7a:0d:55:67
+ */
+ private static final String cert1 =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIICzTCCAougAwIBAgIEN8GnNDALBgcqhkjOOAQDBQAwSTELMAkGA1UEBhMCdXMx\n" +
+ "DDAKBgNVBAoTA3N1bjENMAsGA1UECxMEZWFzdDEMMAoGA1UECxMDYmNuMQ8wDQYD\n" +
+ "VQQDEwZ5YXNzaXIwHhcNOTkwODIzMTk1NTMyWhcNMDAwODIyMTk1NTMyWjA4MQsw\n" +
+ "CQYDVQQGEwJ1czEMMAoGA1UEChMDc3VuMQ0wCwYDVQQLEwRlYXN0MQwwCgYDVQQL\n" +
+ "EwNiY24wggG1MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YR\n" +
+ "t1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZ\n" +
+ "UKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOu\n" +
+ "K2HXKu/yIgMZndFIAccCFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps9\n" +
+ "3su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZV4661FlP5nEHEIGAtEkWcSPoTCgW\n" +
+ "E7fPCTKMyKbhPBZ6i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7YnoBJDvMpPG+qFGQ\n" +
+ "iaiD3+Fa5Z8GkotmXoB7VSVkAUw7/s9JKgOBggACf2NHT/Yp5ZiiIf3al54/yrAX\n" +
+ "SY2KpwYNpniXOVkzcqKldNU67+Z8B9eOjtFmc5kUBJb1MdZy7tJT+JC188PxZLoa\n" +
+ "nsAK2pJIxdOEfkgJZtlRunRWWneKjJqc9oQSYRJR3MZPhJTsy3hRg4wgilN70rY2\n" +
+ "31A1lR/LUFWLP/vid8ujEzARMA8GA1UdDwEB/wQFAwMHpAAwCwYHKoZIzjgEAwUA\n" +
+ "Ay8AMCwCFFKAUissPQJmWLTc71ImcBtTyrN9AhRiA7KrPhgqZgm2ztQFpY6leg1V\n" +
+ "Zw==\n" +
+ "-----END CERTIFICATE-----\n" +
+ "";
+
+ /*
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 935095671 (0x37bc6d77)
+ Signature Algorithm: dsaWithSHA1
+ Issuer: C=us, O=sun, OU=east, OU=bcn, CN=yassir
+ Validity
+ Not Before: Aug 19 20:47:51 1999 GMT
+ Not After : Aug 18 20:47:51 2000 GMT
+ Subject: C=us, O=sun, OU=east, OU=bcn, CN=yassir
+ Subject Public Key Info:
+ Public Key Algorithm: dsaEncryption
+ pub:
+ 0a:cc:a4:ec:d6:88:45:c2:24:6b:0d:78:f1:82:f3:
+ 5e:3e:31:5d:fb:64:d5:06:5e:39:16:f1:0a:85:d1:
+ ff:d1:a4:74:c5:e6:b0:ba:93:1c:ee:69:51:be:3b:
+ a6:66:44:50:b4:f0:5e:0e:dd:9f:08:71:fe:a1:91:
+ 2e:d4:9e:6b:b2:c0:82:3c:91:6c:18:b0:d9:bc:a3:
+ 48:91:3f:8b:59:01:61:00:02:ab:22:31:bc:7c:6c:
+ 0d:9f:ed:be:33:e6:5c:44:9e:62:30:95:f8:6d:22:
+ d7:e5:85:4c:b0:98:6e:ad:cc:ca:3b:ad:cb:fa:f7:
+ 9f:37:13:f7:ca:e2:22:ba
+ P:
+ 00:fd:7f:53:81:1d:75:12:29:52:df:4a:9c:2e:ec:
+ e4:e7:f6:11:b7:52:3c:ef:44:00:c3:1e:3f:80:b6:
+ 51:26:69:45:5d:40:22:51:fb:59:3d:8d:58:fa:bf:
+ c5:f5:ba:30:f6:cb:9b:55:6c:d7:81:3b:80:1d:34:
+ 6f:f2:66:60:b7:6b:99:50:a5:a4:9f:9f:e8:04:7b:
+ 10:22:c2:4f:bb:a9:d7:fe:b7:c6:1b:f8:3b:57:e7:
+ c6:a8:a6:15:0f:04:fb:83:f6:d3:c5:1e:c3:02:35:
+ 54:13:5a:16:91:32:f6:75:f3:ae:2b:61:d7:2a:ef:
+ f2:22:03:19:9d:d1:48:01:c7
+ Q:
+ 00:97:60:50:8f:15:23:0b:cc:b2:92:b9:82:a2:eb:
+ 84:0b:f0:58:1c:f5
+ G:
+ 00:f7:e1:a0:85:d6:9b:3d:de:cb:bc:ab:5c:36:b8:
+ 57:b9:79:94:af:bb:fa:3a:ea:82:f9:57:4c:0b:3d:
+ 07:82:67:51:59:57:8e:ba:d4:59:4f:e6:71:07:10:
+ 81:80:b4:49:16:71:23:e8:4c:28:16:13:b7:cf:09:
+ 32:8c:c8:a6:e1:3c:16:7a:8b:54:7c:8d:28:e0:a3:
+ ae:1e:2b:b3:a6:75:91:6e:a3:7f:0b:fa:21:35:62:
+ f1:fb:62:7a:01:24:3b:cc:a4:f1:be:a8:51:90:89:
+ a8:83:df:e1:5a:e5:9f:06:92:8b:66:5e:80:7b:55:
+ 25:64:01:4c:3b:fe:cf:49:2a
+ X509v3 extensions:
+ X509v3 Key Usage: critical
+ Digital Signature, Key Encipherment, Certificate Sign
+ X509v3 Basic Constraints: critical
+ CA:TRUE, pathlen:5
+ Signature Algorithm: dsaWithSHA1
+ r:
+ 2f:88:46:37:94:92:b2:02:07:5b:8d:76:e5:81:23:
+ 85:7f:bc:8d:b9
+ s:
+ 00:8b:d7:41:fa:11:c7:ab:27:92:5d:0a:03:98:56:
+ 36:42:5f:f5:1f:9d
+ */
+ private static final String cert2 =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIIC9TCCArKgAwIBAgIEN7xtdzALBgcqhkjOOAQDBQAwSTELMAkGA1UEBhMCdXMx\n" +
+ "DDAKBgNVBAoTA3N1bjENMAsGA1UECxMEZWFzdDEMMAoGA1UECxMDYmNuMQ8wDQYD\n" +
+ "VQQDEwZ5YXNzaXIwHhcNOTkwODE5MjA0NzUxWhcNMDAwODE4MjA0NzUxWjBJMQsw\n" +
+ "CQYDVQQGEwJ1czEMMAoGA1UEChMDc3VuMQ0wCwYDVQQLEwRlYXN0MQwwCgYDVQQL\n" +
+ "EwNiY24xDzANBgNVBAMTBnlhc3NpcjCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQD9\n" +
+ "f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2\n" +
+ "y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD\n" +
+ "9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5gqLr\n" +
+ "hAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrU\n" +
+ "WU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6\n" +
+ "ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kqA4GEAAKB\n" +
+ "gArMpOzWiEXCJGsNePGC814+MV37ZNUGXjkW8QqF0f/RpHTF5rC6kxzuaVG+O6Zm\n" +
+ "RFC08F4O3Z8Icf6hkS7UnmuywII8kWwYsNm8o0iRP4tZAWEAAqsiMbx8bA2f7b4z\n" +
+ "5lxEnmIwlfhtItflhUywmG6tzMo7rcv69583E/fK4iK6oycwJTAPBgNVHQ8BAf8E\n" +
+ "BQMDB6QAMBIGA1UdEwEB/wQIMAYBAf8CAQUwCwYHKoZIzjgEAwUAAzAAMC0CFC+I\n" +
+ "RjeUkrICB1uNduWBI4V/vI25AhUAi9dB+hHHqyeSXQoDmFY2Ql/1H50=\n" +
+ "-----END CERTIFICATE-----\n" +
+ "";
+
+ private static final String pkcs7path =
+ "MIIF9QYJKoZIhvcNAQcCoIIF5jCCBeICAQExADALBgkqhkiG9w0BBwGgggXKMIICzTCCAougAwIB\n" +
+ "AgIEN8GnNDALBgcqhkjOOAQDBQAwSTELMAkGA1UEBhMCdXMxDDAKBgNVBAoTA3N1bjENMAsGA1UE\n" +
+ "CxMEZWFzdDEMMAoGA1UECxMDYmNuMQ8wDQYDVQQDEwZ5YXNzaXIwHhcNOTkwODIzMTk1NTMyWhcN\n" +
+ "MDAwODIyMTk1NTMyWjA4MQswCQYDVQQGEwJ1czEMMAoGA1UEChMDc3VuMQ0wCwYDVQQLEwRlYXN0\n" +
+ "MQwwCgYDVQQLEwNiY24wggG1MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YR\n" +
+ "t1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQ\n" +
+ "IsJPu6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCFQCX\n" +
+ "YFCPFSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZ\n" +
+ "V4661FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7\n" +
+ "YnoBJDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7VSVkAUw7/s9JKgOBggACf2NHT/Yp5ZiiIf3al54/\n" +
+ "yrAXSY2KpwYNpniXOVkzcqKldNU67+Z8B9eOjtFmc5kUBJb1MdZy7tJT+JC188PxZLoansAK2pJI\n" +
+ "xdOEfkgJZtlRunRWWneKjJqc9oQSYRJR3MZPhJTsy3hRg4wgilN70rY231A1lR/LUFWLP/vid8uj\n" +
+ "EzARMA8GA1UdDwEB/wQFAwMHpAAwCwYHKoZIzjgEAwUAAy8AMCwCFFKAUissPQJmWLTc71ImcBtT\n" +
+ "yrN9AhRiA7KrPhgqZgm2ztQFpY6leg1VZzCCAvUwggKyoAMCAQICBDe8bXcwCwYHKoZIzjgEAwUA\n" +
+ "MEkxCzAJBgNVBAYTAnVzMQwwCgYDVQQKEwNzdW4xDTALBgNVBAsTBGVhc3QxDDAKBgNVBAsTA2Jj\n" +
+ "bjEPMA0GA1UEAxMGeWFzc2lyMB4XDTk5MDgxOTIwNDc1MVoXDTAwMDgxODIwNDc1MVowSTELMAkG\n" +
+ "A1UEBhMCdXMxDDAKBgNVBAoTA3N1bjENMAsGA1UECxMEZWFzdDEMMAoGA1UECxMDYmNuMQ8wDQYD\n" +
+ "VQQDEwZ5YXNzaXIwggG3MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YRt1I8\n" +
+ "70QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJP\n" +
+ "u6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCFQCXYFCP\n" +
+ "FSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZV466\n" +
+ "1FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7YnoB\n" +
+ "JDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7VSVkAUw7/s9JKgOBhAACgYAKzKTs1ohFwiRrDXjxgvNe\n" +
+ "PjFd+2TVBl45FvEKhdH/0aR0xeawupMc7mlRvjumZkRQtPBeDt2fCHH+oZEu1J5rssCCPJFsGLDZ\n" +
+ "vKNIkT+LWQFhAAKrIjG8fGwNn+2+M+ZcRJ5iMJX4bSLX5YVMsJhurczKO63L+vefNxP3yuIiuqMn\n" +
+ "MCUwDwYDVR0PAQH/BAUDAwekADASBgNVHRMBAf8ECDAGAQH/AgEFMAsGByqGSM44BAMFAAMwADAt\n" +
+ "AhQviEY3lJKyAgdbjXblgSOFf7yNuQIVAIvXQfoRx6snkl0KA5hWNkJf9R+dMQA=\n" +
+ "";
+
+ // Runs test of CertPath encoding and decoding.
+ public static void main(String[] args) throws Exception {
+ // Make the CertPath whose encoded form has already been stored
+ CertificateFactory certFac = CertificateFactory.getInstance("X509");
+
+ final List<Certificate> certs = new ArrayList<>();
+ certs.add(certFac.generateCertificate(new ByteArrayInputStream(cert1.getBytes())));
+ certs.add(certFac.generateCertificate(new ByteArrayInputStream(cert2.getBytes())));
+
+ CertPath cp = certFac.generateCertPath(certs);
+
+ // Get the encoded form of the CertPath we made
+ byte[] encoded = cp.getEncoded("PKCS7");
+
+ // check if it matches the encoded value
+ if (!Arrays.equals(encoded, Base64.getMimeDecoder().decode(pkcs7path.getBytes()))) {
+ throw new RuntimeException("PKCS#7 encoding doesn't match stored value");
+ }
+
+ // Generate a CertPath from the encoded value and check if it equals
+ // the CertPath generated from the certificates
+ CertPath decodedCP = certFac.generateCertPath(new ByteArrayInputStream(encoded), "PKCS7");
+ if (!decodedCP.equals(cp)) {
+ throw new RuntimeException("CertPath decoded from PKCS#7 isn't equal to original");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/X509CertSelectorTest.java Tue Sep 15 07:47:44 2015 -0700
@@ -0,0 +1,538 @@
+/*
+ * Copyright (c) 2000, 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 static sun.security.x509.GeneralNameInterface.NAME_DIRECTORY;
+import static sun.security.x509.NameConstraintsExtension.EXCLUDED_SUBTREES;
+import static sun.security.x509.NameConstraintsExtension.PERMITTED_SUBTREES;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.GeneralSecurityException;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509CertSelector;
+import java.security.cert.X509Certificate;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import sun.security.util.DerInputStream;
+import sun.security.util.DerOutputStream;
+import sun.security.util.DerValue;
+import sun.security.util.ObjectIdentifier;
+import sun.security.x509.AlgorithmId;
+import sun.security.x509.AuthorityKeyIdentifierExtension;
+import sun.security.x509.CertificatePoliciesExtension;
+import sun.security.x509.DNSName;
+import sun.security.x509.GeneralName;
+import sun.security.x509.GeneralNameInterface;
+import sun.security.x509.GeneralNames;
+import sun.security.x509.GeneralSubtree;
+import sun.security.x509.GeneralSubtrees;
+import sun.security.x509.KeyIdentifier;
+import sun.security.x509.NameConstraintsExtension;
+import sun.security.x509.PolicyInformation;
+import sun.security.x509.PrivateKeyUsageExtension;
+import sun.security.x509.SubjectAlternativeNameExtension;
+import sun.security.x509.X500Name;
+
+/*
+ * @test
+ * @bug 8074931
+ * @summary This class tests the X509CertSelector. The tests check particular criteria
+ * by setting them to a value that should match our test certificate and
+ * ensuring that they do match, then setting them to a value that should not
+ * match our test certificate and ensuring that they do not match.
+ * @modules java.base/sun.security.x509
+ * java.base/sun.security.util
+ */
+public class X509CertSelectorTest {
+ /*
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 954172088 (0x38df82b8)
+ Signature Algorithm: dsaWithSHA1
+ Issuer: C=us, O=sun, OU=testing
+ Validity
+ Not Before: Mar 27 15:48:08 2000 GMT
+ Not After : Jun 25 14:48:08 2000 GMT
+ Subject: C=us, O=sun, OU=testing, CN=mullan
+ Subject Public Key Info:
+ Public Key Algorithm: dsaEncryption
+ pub: 0
+ P: 0
+ Q: 0
+ G: 0
+ X509v3 extensions:
+ X509v3 Name Constraints: critical
+ 0D.B0@.>1.0...U....us1.0
+ ..U.
+ ..sun1.0...U....testing1.0
+ ..U....mullan
+ X509v3 Subject Key Identifier:
+ 56:E8:88:AE:9D:B5:3F:2B:CB:A0:4C:4B:E2:87:53:07:33:77:1B:DF
+ X509v3 Authority Key Identifier:
+ keyid:8E:DD:AF:6F:EE:02:12:F4:61:E9:2F:E3:64:1A:6F:71:32:25:20:C0
+
+ X509v3 Subject Alternative Name:
+ email:mullan@east.sun.com
+ X509v3 Private Key Usage Period:
+ Not Before: Jan 1 05:00:00 2000 GMT, Not After: Jan 1 05:00:00 2001 GMT
+ X509v3 Key Usage: critical
+ Digital Signature
+ X509v3 Certificate Policies:
+ 0$0\..*...0.0...+.......0..
+ Testing...
+ Signature Algorithm: dsaWithSHA1
+ r:
+ 44:c7:35:40:5d:6c:28:75:7f:73:b2:f8:0d:72:6c:
+ 09:65:b8:81:14
+ s:
+ 76:79:f5:c7:37:3b:0d:9b:db:70:2f:20:80:36:e3:
+ 80:e8:a6:c6:71
+ */
+ private static final String testCert =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIICLjCCAeygAwIBAgIEON+CuDALBgcqhkjOOAQDBQAwLTELMAkGA1UEBhMCdXMx\n" +
+ "DDAKBgNVBAoTA3N1bjEQMA4GA1UECxMHdGVzdGluZzAeFw0wMDAzMjcxNTQ4MDha\n" +
+ "Fw0wMDA2MjUxNDQ4MDhaMD4xCzAJBgNVBAYTAnVzMQwwCgYDVQQKEwNzdW4xEDAO\n" +
+ "BgNVBAsTB3Rlc3RpbmcxDzANBgNVBAMTBm11bGxhbjAcMBQGByqGSM44BAEwCQIB\n" +
+ "AAIBAAIBAAMEAAIBAKOCASMwggEfMFAGA1UdHgEB/wRGMESgQjBApD4xCzAJBgNV\n" +
+ "BAYTAnVzMQwwCgYDVQQKEwNzdW4xEDAOBgNVBAsTB3Rlc3RpbmcxDzANBgNVBAMT\n" +
+ "Bm11bGxhbjAdBgNVHQ4EFgQUVuiIrp21PyvLoExL4odTBzN3G98wHwYDVR0jBBgw\n" +
+ "FoAUjt2vb+4CEvRh6S/jZBpvcTIlIMAwHgYDVR0RBBcwFYETbXVsbGFuQGVhc3Qu\n" +
+ "c3VuLmNvbTArBgNVHRAEJDAigA8yMDAwMDEwMTA1MDAwMFqBDzIwMDEwMTAxMDUw\n" +
+ "MDAwWjAPBgNVHQ8BAf8EBQMDB4AAMC0GA1UdIAQmMCQwIgYEKoSAADAaMBgGCCsG\n" +
+ "AQUFBwICMAwSClRlc3RpbmcuLi4wCwYHKoZIzjgEAwUAAy8AMCwCFETHNUBdbCh1\n" +
+ "f3Oy+A1ybAlluIEUAhR2efXHNzsNm9twLyCANuOA6KbGcQ==\n" +
+ "-----END CERTIFICATE-----\n" +
+ "";
+
+ private static final String testKey =
+ "MIIBtjCCASsGByqGSM44BAEwggEeAoGBAIVWPEkcxbxhQRCqVzg55tNqbP5j0K4kdu4bkmXvfqC5\n" +
+ "+qA75DvnfzsOJseb+9AuKXWk/DvCzFDmrY1YaU3scZC3OQEO9lEO3F4VDKOaudY6OT1SI22pAIwz\n" +
+ "j5pvq+i7zOp4xUqkQUeh/4iQSfxOT5UrFGjkcbnbpVkCXD/GxAz7AhUAjtnm3dVIddUUHl6wxpZ7\n" +
+ "GcA6gSsCgYAf/PXzQtemgIDjpFrNNSgTEKkLposBXKatAM+gUKlMUjf8SQvquqPxDtRrscGjXkoL\n" +
+ "oTkaR7/akULYFpBvUcFkeIFiCnJg8M9XhCWdLvn9MPt+jR2oxookvCb9xLtD6WvIM/wd/nZ1iK4u\n" +
+ "iY1+q85xvns/Awbtwl7oZDAwE2TUKAOBhAACgYBDc9UZ+3xsZubUZvRG5cpyJceYpJp2exOPVJXn\n" +
+ "jR4CcR+cT9bAJpFSxqE/8KtNHXxHdu4f3DU67IMOVDpugzihyzXJvNm3w2H9x+6xczHG2wjvAJeh\n" +
+ "X62EWbUatxPXFAoVKZWuUbaYaZzdWBDtNRrCuKKsLo0GFy8g2BZISuD3jw==\n" +
+ "";
+
+ // Certificate to run tests on
+ private final X509Certificate cert;
+
+ public static void main(String[] args) throws Exception {
+ X509CertSelectorTest test = new X509CertSelectorTest();
+ test.doTest();
+ }
+
+ public X509CertSelectorTest() throws CertificateException, IOException {
+ cert = (X509Certificate) CertificateFactory.getInstance("X.509")
+ .generateCertificate(new ByteArrayInputStream(testCert.getBytes()));
+ }
+
+ // Runs the test.
+ private void doTest() throws Exception {
+ System.out.println("START OF TESTS FOR " + "X509CertSelector");
+
+ testSerialNumber();
+ testIssuer();
+ testSubjectKeyIdentifier();
+ testAuthorityKeyIdentifier();
+ testCertificateValid();
+ testPrivateKeyValid();
+ testSubjectPublicKeyAlgID();
+ testKeyUsage();
+ testSubjectAltName();
+ testPolicy();
+ testPathToName();
+ testSubject();
+ testSubjectPublicKey();
+ testNameConstraints();
+ testBasicConstraints();
+ testCertificate();
+ }
+
+ // Tests matching on the serial number contained in the certificate.
+ private void testSerialNumber() {
+ System.out.println("X.509 Certificate Match on serialNumber");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ selector.setSerialNumber(new BigInteger("999999999"));
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setSerialNumber(cert.getSerialNumber());
+ checkMatch(selector, cert, true);
+ }
+
+ // Tests matching on the issuer name contained in the certificate.
+ private void testIssuer() throws IOException {
+ System.out.println("X.509 Certificate Match on issuer");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ selector.setIssuer("ou=bogus,ou=east,o=sun,c=us");
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setIssuer((cert.getIssuerX500Principal()).getName("RFC2253"));
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the subject key identifier contained in the
+ * certificate.
+ */
+ private void testSubjectKeyIdentifier() throws IOException {
+ System.out.println("X.509 Certificate Match on subjectKeyIdentifier");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ byte[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ selector.setSubjectKeyIdentifier(b);
+ checkMatch(selector, cert, false);
+
+ // good match
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.14"));
+ byte[] encoded = in.getOctetString();
+ selector.setSubjectKeyIdentifier(encoded);
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the authority key identifier contained in the
+ * certificate.
+ */
+ private void testAuthorityKeyIdentifier() throws IOException {
+ System.out.println("X.509 Certificate Match on authorityKeyIdentifier");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ byte[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ AuthorityKeyIdentifierExtension a = new AuthorityKeyIdentifierExtension(new KeyIdentifier(b), null, null);
+ selector.setAuthorityKeyIdentifier(a.getExtensionValue());
+ checkMatch(selector, cert, false);
+
+ // good match
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.35"));
+ byte[] encoded = in.getOctetString();
+ selector.setAuthorityKeyIdentifier(encoded);
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the certificate validity component contained in the
+ * certificate.
+ */
+ private void testCertificateValid() {
+ System.out.println("X.509 Certificate Match on certificateValid");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ Calendar cal = Calendar.getInstance();
+ cal.set(1968, 12, 31);
+ selector.setCertificateValid(cal.getTime());
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setCertificateValid(cert.getNotBefore());
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the private key validity component contained in the
+ * certificate.
+ */
+ private void testPrivateKeyValid() throws IOException, CertificateException {
+ System.out.println("X.509 Certificate Match on privateKeyValid");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ Calendar cal = Calendar.getInstance();
+ cal.set(1968, 12, 31);
+ selector.setPrivateKeyValid(cal.getTime());
+ checkMatch(selector, cert, false);
+
+ // good match
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.16"));
+ byte[] encoded = in.getOctetString();
+ PrivateKeyUsageExtension ext = new PrivateKeyUsageExtension(false, encoded);
+ Date validDate = (Date) ext.get(PrivateKeyUsageExtension.NOT_BEFORE);
+ selector.setPrivateKeyValid(validDate);
+ checkMatch(selector, cert, true);
+
+ }
+
+ private ObjectIdentifier getCertPubKeyAlgOID(X509Certificate xcert) throws IOException {
+ byte[] encodedKey = xcert.getPublicKey().getEncoded();
+ DerValue val = new DerValue(encodedKey);
+ if (val.tag != DerValue.tag_Sequence) {
+ throw new RuntimeException("invalid key format");
+ }
+
+ return AlgorithmId.parse(val.data.getDerValue()).getOID();
+ }
+
+ /*
+ * Tests matching on the subject public key algorithm ID component contained
+ * in the certificate.
+ */
+ private void testSubjectPublicKeyAlgID() throws IOException {
+ System.out.println("X.509 Certificate Match on subjectPublicKeyAlgID");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ selector.setSubjectPublicKeyAlgID("2.5.29.14");
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setSubjectPublicKeyAlgID(getCertPubKeyAlgOID(cert).toString());
+ checkMatch(selector, cert, true);
+
+ }
+
+ // Tests matching on the key usage extension contained in the certificate.
+ private void testKeyUsage() {
+ System.out.println("X.509 Certificate Match on keyUsage");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ boolean[] keyUsage = { true, false, true, false, true, false, true, false };
+ selector.setKeyUsage(keyUsage);
+ System.out.println("Selector = " + selector.toString());
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setKeyUsage(cert.getKeyUsage());
+ System.out.println("Selector = " + selector.toString());
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the subject alternative name extension contained in the
+ * certificate.
+ */
+ private void testSubjectAltName() throws IOException {
+ System.out.println("X.509 Certificate Match on subjectAltName");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ GeneralNameInterface dnsName = new DNSName("foo.com");
+ DerOutputStream tmp = new DerOutputStream();
+ dnsName.encode(tmp);
+ selector.addSubjectAlternativeName(2, tmp.toByteArray());
+ checkMatch(selector, cert, false);
+
+ // good match
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.17"));
+ byte[] encoded = in.getOctetString();
+ SubjectAlternativeNameExtension ext = new SubjectAlternativeNameExtension(false, encoded);
+ GeneralNames names = (GeneralNames) ext.get(SubjectAlternativeNameExtension.SUBJECT_NAME);
+ GeneralName name = (GeneralName) names.get(0);
+ selector.setSubjectAlternativeNames(null);
+ DerOutputStream tmp2 = new DerOutputStream();
+ name.getName().encode(tmp2);
+ selector.addSubjectAlternativeName(name.getType(), tmp2.toByteArray());
+ checkMatch(selector, cert, true);
+
+ // good match 2 (matches at least one)
+ selector.setMatchAllSubjectAltNames(false);
+ selector.addSubjectAlternativeName(2, "foo.com");
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the policy constraints extension contained in the
+ * certificate.
+ */
+ private void testPolicy() throws IOException {
+ System.out.println("X.509 Certificate Match on certificatePolicies");
+ // test encoding of CertificatePoliciesExtension because we wrote the
+ // code
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ Set<String> s = new HashSet<>();
+ s.add(new String("1.2.5.7.68"));
+ selector.setPolicy(s);
+ checkMatch(selector, cert, false);
+
+ // good match
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.32"));
+ CertificatePoliciesExtension ext = new CertificatePoliciesExtension(false, in.getOctetString());
+ List<PolicyInformation> policies = ext.get(CertificatePoliciesExtension.POLICIES);
+ // match on the first policy id
+ PolicyInformation policyInfo = (PolicyInformation) policies.get(0);
+ s.clear();
+ s.add(policyInfo.getPolicyIdentifier().getIdentifier().toString());
+ selector.setPolicy(s);
+ checkMatch(selector, cert, true);
+ }
+
+ /*
+ * Tests matching on the name constraints extension contained in the
+ * certificate.
+ */
+ private void testPathToName() throws IOException {
+ System.out.println("X.509 Certificate Match on pathToName");
+
+ X509CertSelector selector = null;
+ DerInputStream in = new DerInputStream(cert.getExtensionValue("2.5.29.30"));
+ byte[] encoded = in.getOctetString();
+ NameConstraintsExtension ext = new NameConstraintsExtension(false, encoded);
+ GeneralSubtrees permitted = (GeneralSubtrees) ext.get(PERMITTED_SUBTREES);
+ GeneralSubtrees excluded = (GeneralSubtrees) ext.get(EXCLUDED_SUBTREES);
+
+ // bad matches on pathToName within excluded subtrees
+ if (excluded != null) {
+ Iterator<GeneralSubtree> e = excluded.iterator();
+ while (e.hasNext()) {
+ GeneralSubtree tree = e.next();
+ if (tree.getName().getType() == NAME_DIRECTORY) {
+ X500Name excludedDN1 = new X500Name(tree.getName().toString());
+ X500Name excludedDN2 = new X500Name("CN=Bogus, " + tree.getName().toString());
+ DerOutputStream derDN1 = new DerOutputStream();
+ DerOutputStream derDN2 = new DerOutputStream();
+ excludedDN1.encode(derDN1);
+ excludedDN2.encode(derDN2);
+ selector = new X509CertSelector();
+ selector.addPathToName(NAME_DIRECTORY, derDN1.toByteArray());
+ checkMatch(selector, cert, false);
+ selector.setPathToNames(null);
+ selector.addPathToName(NAME_DIRECTORY, derDN2.toByteArray());
+ checkMatch(selector, cert, false);
+ }
+ }
+ }
+
+ // good matches on pathToName within permitted subtrees
+ if (permitted != null) {
+ Iterator<GeneralSubtree> e = permitted.iterator();
+ while (e.hasNext()) {
+ GeneralSubtree tree = e.next();
+ if (tree.getName().getType() == NAME_DIRECTORY) {
+ X500Name permittedDN1 = new X500Name(tree.getName().toString());
+ X500Name permittedDN2 = new X500Name("CN=good, " + tree.getName().toString());
+ DerOutputStream derDN1 = new DerOutputStream();
+ DerOutputStream derDN2 = new DerOutputStream();
+ permittedDN1.encode(derDN1);
+ permittedDN2.encode(derDN2);
+ selector = new X509CertSelector();
+ selector.addPathToName(NAME_DIRECTORY, derDN1.toByteArray());
+ checkMatch(selector, cert, true);
+ selector.setPathToNames(null);
+ selector.addPathToName(NAME_DIRECTORY, derDN2.toByteArray());
+ checkMatch(selector, cert, true);
+ }
+ }
+ }
+ }
+
+ // Tests matching on the subject name contained in the certificate.
+ private void testSubject() throws IOException {
+ System.out.println("X.509 Certificate Match on subject");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ selector.setSubject("ou=bogus,ou=east,o=sun,c=us");
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setSubject(cert.getSubjectX500Principal().getName("RFC2253"));
+ checkMatch(selector, cert, true);
+ }
+
+ // Tests matching on the subject public key contained in the certificate.
+ private void testSubjectPublicKey() throws IOException, GeneralSecurityException {
+ System.out.println("X.509 Certificate Match on subject public key");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
+ Base64.getMimeDecoder().decode(testKey.getBytes()));
+ KeyFactory keyFactory = KeyFactory.getInstance("DSA");
+ PublicKey pubKey = keyFactory.generatePublic(keySpec);
+ selector.setSubjectPublicKey(pubKey);
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setSubjectPublicKey(cert.getPublicKey());
+ checkMatch(selector, cert, true);
+ }
+
+ // Tests matching on the name constraints contained in the certificate.
+ private void testNameConstraints() throws IOException {
+ System.out.println("X.509 Certificate Match on name constraints");
+ // bad match
+ GeneralSubtrees subjectTree = new GeneralSubtrees();
+ subjectTree.add(getGeneralSubtree((X500Name) cert.getSubjectDN()));
+ NameConstraintsExtension ext = new NameConstraintsExtension((GeneralSubtrees) null, subjectTree);
+ X509CertSelector selector = new X509CertSelector();
+ selector.setNameConstraints(ext.getExtensionValue());
+ checkMatch(selector, cert, false);
+
+ // good match
+ ext = new NameConstraintsExtension(subjectTree, null);
+ selector.setNameConstraints(ext.getExtensionValue());
+ checkMatch(selector, cert, true);
+ }
+
+ // Tests matching on basic constraints.
+ private void testBasicConstraints() {
+ System.out.println("X.509 Certificate Match on basic constraints");
+ // bad match
+ X509CertSelector selector = new X509CertSelector();
+ int mpl = cert.getBasicConstraints();
+ selector.setBasicConstraints(0);
+ checkMatch(selector, cert, false);
+
+ // good match
+ selector.setBasicConstraints(mpl);
+ checkMatch(selector, cert, true);
+ }
+
+ // Tests certificateEquals criterion
+ private void testCertificate() {
+ System.out.println("X.509 Certificate Match on certificateEquals criterion");
+
+ X509CertSelector selector = new X509CertSelector();
+ // good match
+ selector.setCertificate(cert);
+ checkMatch(selector, cert, true);
+ }
+
+ private void checkMatch(X509CertSelector selector, X509Certificate cert, boolean match) {
+ boolean result = selector.match(cert);
+ if (match != result)
+ throw new RuntimeException(selector + " match " + cert + " is " + result + ", but expect " + match);
+ }
+
+ private static GeneralSubtree getGeneralSubtree(GeneralNameInterface gni) {
+ // Create a new GeneralSubtree with the specified name, 0 base, and
+ // unlimited length
+ GeneralName gn = new GeneralName(gni);
+ GeneralSubtree subTree = new GeneralSubtree(gn, 0, -1);
+ return subTree;
+ }
+}
--- /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<String, String> 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;
+ }
+}
--- /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<String, String> 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;
+ }
+}
--- a/jdk/test/sun/security/pkcs11/PKCS11Test.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/pkcs11/PKCS11Test.java Tue Sep 15 07:47:44 2015 -0700
@@ -33,6 +33,8 @@
public abstract class PKCS11Test {
+ static final String PKCS11 = "PKCS11";
+
// directory of the test source
static final String BASE = System.getProperty("test.src", ".");
@@ -644,4 +646,12 @@
return "";
}
}
+
+ static byte[] generateData(int length) {
+ byte data[] = new byte[length];
+ for (int i=0; i<data.length; i++) {
+ data[i] = (byte) (i % 256);
+ }
+ return data;
+ }
}
--- a/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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,7 +28,6 @@
* @author Andreas Sterbenz
* @library ..
* @run main/othervm AddPrivateKey
- * @key randomness
*/
import java.io.*;
@@ -43,6 +42,13 @@
// all providers.
public class AddPrivateKey extends SecmodTest {
+ private static final String ALIAS1 = "entry1";
+ private static final String ALIAS2 = "entry2";
+ private static final String ALIAS3 = "entry3";
+ private static final int MAX_LINE = 85;
+ private static final int DATA_LENGTH = 4096;
+ private static final byte[] DATA = generateData(DATA_LENGTH);
+
public static void main(String[] args) throws Exception {
if (initSecmod() == false) {
return;
@@ -57,7 +63,7 @@
System.out.println();
Security.addProvider(p);
- KeyStore ks = KeyStore.getInstance("PKCS11", p);
+ KeyStore ks = KeyStore.getInstance(PKCS11, p);
ks.load(null, password);
for (String alias : aliases(ks)) {
System.out.println("Deleting: " + alias);
@@ -65,25 +71,28 @@
}
KeyStore jks = KeyStore.getInstance("JKS");
- InputStream in = new FileInputStream(new File(BASE, "keystore.jks"));
- char[] jkspass = "passphrase".toCharArray();
- jks.load(in, jkspass);
- List<PrivateKeyEntry> entries = new ArrayList<PrivateKeyEntry>();
- for (String alias : Collections.list(jks.aliases())) {
- if (jks.entryInstanceOf(alias, PrivateKeyEntry.class)) {
- PrivateKeyEntry entry = (PrivateKeyEntry)jks.getEntry(alias, new PasswordProtection(jkspass));
- String algorithm = entry.getPrivateKey().getAlgorithm();
- System.out.println("-Entry " + alias + " (" + algorithm + ")");
- if ((supportsEC == false) && algorithm.equals("EC")) {
- System.out.println("EC not supported by provider, skipping");
- continue;
- }
- if ((supportsEC == false) && algorithm.equals("DSA")) {
- System.out.println("Provider does not appear to have CKA_NETSCAPE_DB fix, skipping");
- continue;
- }
- test(p, entry);
- } // else ignore
+ try (InputStream in = new FileInputStream(BASE + SEP + "keystore.jks")) {
+ char[] jkspass = "passphrase".toCharArray();
+ jks.load(in, jkspass);
+ for (String alias : Collections.list(jks.aliases())) {
+ if (jks.entryInstanceOf(alias, PrivateKeyEntry.class)) {
+ PrivateKeyEntry entry = (PrivateKeyEntry)jks.getEntry(alias,
+ new PasswordProtection(jkspass));
+ String algorithm = entry.getPrivateKey().getAlgorithm();
+ System.out.printf("-Entry %s (%s)%n", alias, algorithm);
+ if ((supportsEC == false) && algorithm.equals("EC")) {
+ System.out.println("EC not supported by provider, "
+ + "skipping");
+ continue;
+ }
+ if ((supportsEC == false) && algorithm.equals("DSA")) {
+ System.out.println("Provider does not appear to have "
+ + "CKA_NETSCAPE_DB fix, skipping");
+ continue;
+ }
+ test(p, entry);
+ } // else ignore
+ }
}
System.out.println("OK");
}
@@ -92,10 +101,6 @@
return Collections.list(ks.aliases());
}
- private final static String ALIAS1 = "entry1";
- private final static String ALIAS2 = "entry2";
- private final static String ALIAS3 = "entry3";
-
private static void test(Provider p, PrivateKeyEntry entry) throws Exception {
PrivateKey key = entry.getPrivateKey();
X509Certificate[] chain = (X509Certificate[])entry.getCertificateChain();
@@ -122,11 +127,8 @@
PrivateKey key2 = (PrivateKey)ks.getKey(ALIAS1, null);
System.out.println(toString(key2));
- X509Certificate[] chain2 = (X509Certificate[])ks.getCertificateChain(ALIAS1);
- // NSS makes token keys always sensitive, skip this check
-// if (key.equals(key2) == false) {
-// throw new Exception("key mismatch");
-// }
+ X509Certificate[] chain2 =
+ (X509Certificate[]) ks.getCertificateChain(ALIAS1);
if (Arrays.equals(chain, chain2) == false) {
throw new Exception("chain mismatch");
}
@@ -154,7 +156,8 @@
PrivateKey key4 = (PrivateKey)ks.getKey(ALIAS2, null);
System.out.println(toString(key4));
- X509Certificate[] chain4 = (X509Certificate[])ks.getCertificateChain(ALIAS2);
+ X509Certificate[] chain4 = (X509Certificate[])
+ ks.getCertificateChain(ALIAS2);
if (Arrays.equals(chain, chain4) == false) {
throw new Exception("chain mismatch");
}
@@ -172,7 +175,8 @@
PrivateKey key5 = (PrivateKey)ks.getKey(ALIAS3, null);
System.out.println(toString(key5));
- X509Certificate[] chain5 = (X509Certificate[])ks.getCertificateChain(ALIAS3);
+ X509Certificate[] chain5 = (X509Certificate[])
+ ks.getCertificateChain(ALIAS3);
if (Arrays.equals(chain, chain5) == false) {
throw new Exception("chain mismatch");
}
@@ -186,24 +190,22 @@
System.out.println("OK");
}
- private final static byte[] DATA = new byte[4096];
-
- static {
- Random random = new Random();
- random.nextBytes(DATA);
- }
-
- private static void sign(Provider p, PrivateKey privateKey, PublicKey publicKey) throws Exception {
+ private static void sign(Provider p, PrivateKey privateKey,
+ PublicKey publicKey) throws Exception {
String keyAlg = privateKey.getAlgorithm();
String alg;
- if (keyAlg.equals("RSA")) {
- alg = "SHA1withRSA";
- } else if (keyAlg.equals("DSA")) {
- alg = "SHA1withDSA";
- } else if (keyAlg.equals("EC")) {
- alg = "SHA1withECDSA";
- } else {
- throw new Exception("Unknown algorithm " + keyAlg);
+ switch (keyAlg) {
+ case "RSA":
+ alg = "SHA1withRSA";
+ break;
+ case "DSA":
+ alg = "SHA1withDSA";
+ break;
+ case "EC":
+ alg = "SHA1withECDSA";
+ break;
+ default:
+ throw new Exception("Unknown algorithm " + keyAlg);
}
Signature s = Signature.getInstance(alg, p);
s.initSign(privateKey);
@@ -217,8 +219,6 @@
}
}
- private final static int MAX_LINE = 85;
-
private static String toString(Object o) {
String s = String.valueOf(o).split("\n")[0];
return (s.length() <= MAX_LINE) ? s : s.substring(0, MAX_LINE);
--- a/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -44,29 +44,47 @@
return;
}
- InputStream in = new FileInputStream(BASE + SEP + "anchor.cer");
- CertificateFactory factory = CertificateFactory.getInstance("X.509");
- X509Certificate cert = (X509Certificate)factory.generateCertificate(in);
- in.close();
-// System.out.println(cert);
+ X509Certificate cert;
+ try (InputStream in = new FileInputStream(BASE + SEP + "anchor.cer")) {
+ CertificateFactory factory =
+ CertificateFactory.getInstance("X.509");
+ cert = (X509Certificate)factory.generateCertificate(in);
+ }
String configName = BASE + SEP + "nss.cfg";
Provider p = getSunPKCS11(configName);
System.out.println(p);
Security.addProvider(p);
- KeyStore ks = KeyStore.getInstance("PKCS11", p);
+ KeyStore ks = KeyStore.getInstance(PKCS11, p);
ks.load(null, password);
- Collection<String> aliases = new TreeSet<String>(Collections.list(ks.aliases()));
+ Collection<String> aliases = new TreeSet<>(Collections.list(
+ ks.aliases()));
System.out.println("entries: " + aliases.size());
System.out.println(aliases);
int size1 = aliases.size();
String alias = "anchor";
- ks.setCertificateEntry(alias, cert);
+ if (ks.containsAlias(alias)) {
+ throw new Exception("Alias exists: " + alias);
+ }
+
ks.setCertificateEntry(alias, cert);
+ KeyStore.Entry first = ks.getEntry(alias, null);
+ System.out.println("first entry = " + first);
+ if (!ks.entryInstanceOf(alias, TrustedCertificateEntry.class)) {
+ throw new Exception("Unexpected first entry type: " + first);
+ }
- aliases = new TreeSet<String>(Collections.list(ks.aliases()));
+ ks.setCertificateEntry(alias, cert);
+ KeyStore.Entry second = ks.getEntry(alias, null);
+ System.out.println("second entry = " + second);
+ if (!ks.entryInstanceOf(alias, TrustedCertificateEntry.class)) {
+ throw new Exception("Unexpected second entry type: "
+ + second);
+ }
+
+ aliases = new TreeSet<>(Collections.list(ks.aliases()));
System.out.println("entries: " + aliases.size());
System.out.println(aliases);
int size2 = aliases.size();
@@ -79,8 +97,12 @@
throw new Exception("KeyStore returned incorrect certificate");
}
+ ks.deleteEntry(alias);
+ if (ks.containsAlias(alias)) {
+ throw new Exception("Alias still exists: " + alias);
+ }
+
System.out.println("OK");
-
}
}
--- a/jdk/test/sun/security/pkcs11/Secmod/Crypto.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/pkcs11/Secmod/Crypto.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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,11 +28,8 @@
* @author Andreas Sterbenz
* @library ..
* @run main/othervm Crypto
- * @key randomness
*/
-import java.util.*;
-
import java.security.*;
public class Crypto extends SecmodTest {
@@ -51,9 +48,7 @@
System.out.println(kp.getPublic());
System.out.println(kp.getPrivate());
- SecureRandom random = new SecureRandom();
- byte[] data = new byte[2048];
- random.nextBytes(data);
+ byte[] data = generateData(2048);
Signature sig = Signature.getInstance("SHA1withRSA", p);
sig.initSign(kp.getPrivate());
--- a/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -24,11 +24,11 @@
/**
* @test
* @bug 6273877 6322208 6275523
- * @summary make sure we can access the NSS softtoken KeyStore and use a private key
+ * @summary make sure we can access the NSS softtoken KeyStore
+ * and use a private key
* @author Andreas Sterbenz
* @library ..
* @run main/othervm GetPrivateKey
- * @key randomness
*/
import java.util.*;
@@ -49,18 +49,17 @@
System.out.println(p);
Security.addProvider(p);
- KeyStore ks = KeyStore.getInstance("PKCS11", p);
+ KeyStore ks = KeyStore.getInstance(PKCS11, p);
ks.load(null, password);
- Collection<String> aliases = new TreeSet<String>(Collections.list(ks.aliases()));
+ Collection<String> aliases = new TreeSet<>(
+ Collections.list(ks.aliases()));
System.out.println("entries: " + aliases.size());
System.out.println(aliases);
PrivateKey privateKey = (PrivateKey)ks.getKey(keyAlias, password);
System.out.println(privateKey);
- byte[] data = new byte[1024];
- Random random = new Random();
- random.nextBytes(data);
+ byte[] data = generateData(1024);
System.out.println("Signing...");
Signature signature = Signature.getInstance("MD5withRSA");
@@ -68,7 +67,8 @@
signature.update(data);
byte[] sig = signature.sign();
- X509Certificate[] chain = (X509Certificate[])ks.getCertificateChain(keyAlias);
+ X509Certificate[] chain =
+ (X509Certificate[]) ks.getCertificateChain(keyAlias);
signature.initVerify(chain[0].getPublicKey());
signature.update(data);
boolean ok = signature.verify(sig);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/LoadKeystore.java Tue Sep 15 07:47:44 2015 -0700
@@ -0,0 +1,94 @@
+/*
+ * 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.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.Provider;
+import java.security.Security;
+import java.security.UnrecoverableKeyException;
+import java.util.Collections;
+
+/*
+ * @test
+ * @bug 8048622 8134232
+ * @summary Checks that PKCS#11 keystore can't be loaded with wrong password
+ * @library ../
+ * @run main/othervm LoadKeystore
+ */
+public class LoadKeystore extends SecmodTest {
+
+ public static void main(String[] args) throws Exception {
+ if (!initSecmod()) {
+ return;
+ }
+
+ String configName = BASE + SEP + "nss.cfg";
+ Provider p = getSunPKCS11(configName);
+
+ System.out.println("Add provider " + p);
+ System.out.println();
+ Security.addProvider(p);
+
+ try {
+ System.out.println("Load keystore with wrong type");
+ KeyStore.getInstance("unknown", p);
+ throw new RuntimeException("Expected exception not thrown");
+ } catch(KeyStoreException e) {
+ System.out.println("Expected exception: " + e);
+ }
+
+ KeyStore ks = KeyStore.getInstance("PKCS11", p);
+ if (!"PKCS11".equals(ks.getType())) {
+ throw new RuntimeException("Unexpected keystore type: "
+ + ks.getType());
+ }
+ if (!p.equals(ks.getProvider())) {
+ throw new RuntimeException("Unexpected keystore provider: "
+ + ks.getProvider());
+ }
+
+ try {
+ System.out.println("Load keystore with wrong password");
+ ks.load(null, "wrong".toCharArray());
+ throw new RuntimeException("Expected exception not thrown");
+ } catch(IOException e) {
+ System.out.println("Expected exception: " + e);
+ Throwable cause = e.getCause();
+ if (!(cause instanceof UnrecoverableKeyException)) {
+ e.printStackTrace(System.out);
+ throw new RuntimeException("Unexpected cause: " + cause);
+ }
+ System.out.println("Expected cause: " + cause);
+ }
+
+ System.out.println("Load keystore with correct password");
+ ks.load(null, password);
+ for (String alias : Collections.list(ks.aliases())) {
+ System.out.println("Alias: " + alias);
+ }
+
+ System.out.println("Test passed");
+ }
+
+}
--- a/jdk/test/sun/security/provider/KeyStore/DKSTest.java Thu Sep 10 14:55:20 2015 -0700
+++ b/jdk/test/sun/security/provider/KeyStore/DKSTest.java Tue Sep 15 07:47:44 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -60,8 +60,38 @@
new KeyStore.PasswordProtection("passphrase".toCharArray()));
}};
+ private static final Map<String, KeyStore.ProtectionParameter>
+ WRONG_PASSWORDS = new HashMap<String, KeyStore.ProtectionParameter>() {{
+ put("policy_keystore",
+ new KeyStore.PasswordProtection(
+ "wrong".toCharArray()));
+ put("pw_keystore",
+ new KeyStore.PasswordProtection("wrong".toCharArray()));
+ put("eckeystore1",
+ new KeyStore.PasswordProtection("wrong".toCharArray()));
+ put("eckeystore2",
+ new KeyStore.PasswordProtection("wrong".toCharArray()));
+ }};
+
public static void main(String[] args) throws Exception {
/*
+ * domain keystore: keystores with wrong passwords
+ */
+ try {
+ URI config = new URI(CONFIG + "#keystores");
+ KeyStore ks = KeyStore.getInstance("DKS");
+ ks.load(new DomainLoadStoreParameter(config, WRONG_PASSWORDS));
+ throw new RuntimeException("Expected exception not thrown");
+ } catch (IOException e) {
+ System.out.println("Expected exception: " + e);
+ if (!causedBy(e, UnrecoverableKeyException.class)) {
+ e.printStackTrace(System.out);
+ throw new RuntimeException("Unexpected cause");
+ }
+ System.out.println("Expected cause: " + e);
+ }
+
+ /*
* domain keystore: system
*/
URI config = new URI(CONFIG + "#system");
@@ -182,4 +212,15 @@
return factory.generateCertificate(certStream);
}
}
+
+ // checks if an exception was caused by specified exception class
+ private static boolean causedBy(Exception e, Class klass) {
+ Throwable cause = e;
+ while ((cause = cause.getCause()) != null) {
+ if (cause.getClass().equals(klass)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
--- a/langtools/.hgtags Thu Sep 10 14:55:20 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
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Sep 10 14:55:20 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);
--- /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;
+ }
+ }
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Thu Sep 10 14:55:20 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);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Thu Sep 10 14:55:20 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; i<numCompiles; ++i) {
- final int ii = i;
- final CompileChunk cc = compileChunks[i];
-
- // Pass the num_cores and the id (appended with the chunk number) to the server.
- Object lock = new Object();
- requests[i] = new Thread() {
- @Override
- public void run() {
- rn[ii] = sjavac.compile("n/a",
- id + "-" + ii,
- args.prepJavacArgs(),
- Collections.<File>emptyList(),
- 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<URI> 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<Callable<CompilationSubResult>> 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.<File>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<CompilationSubResult> subResults = new ArrayList<>();
+ List<Future<CompilationSubResult>> futs = new ArrayList<>();
+ ExecutorService exec = Executors.newFixedThreadPool(concurrentCompiles ? compilationCalls.size() : 1);
+ for (Callable<CompilationSubResult> compilationCall : compilationCalls) {
+ futs.add(exec.submit(compilationCall));
+ }
+ for (Future<CompilationSubResult> 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<numCompiles; ++i) {
- try { requests[i].join(); } catch (InterruptedException e) { }
+ exec.shutdownNow();
+
+ // Process each sub result
+ for (CompilationSubResult subResult : subResults) {
+ for (String pkg : subResult.packageArtifacts.keySet()) {
+ Set<URI> 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<numCompiles; ++i) {
- if (compileChunks[i].srcs.size() > 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!
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Thu Sep 10 14:55:20 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);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Thu Sep 10 14:55:20 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;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Thu Sep 10 14:55:20 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;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java Thu Sep 10 14:55:20 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.</b>
*/
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) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Thu Sep 10 14:55:20 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);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Thu Sep 10 14:55:20 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;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java Thu Sep 10 14:55:20 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;
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Thu Sep 10 14:55:20 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();
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Thu Sep 10 14:55:20 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;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Thu Sep 10 14:55:20 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;
-
-/**
- * <p><b>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.</b>
- */
-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;
- }
-}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java Thu Sep 10 14:55:20 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();
}
--- /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;
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java Thu Sep 10 14:55:20 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);
- }
- }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Thu Sep 10 14:55:20 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) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java Thu Sep 10 14:55:20 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.</b>
*/
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();
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java Thu Sep 10 14:55:20 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;
--- a/langtools/test/tools/javac/lib/combo/ReusableContext.java Thu Sep 10 14:55:20 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<Void, Void>() {
- @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<Void, Symtab> pollutionScanner = new TreeScanner<Void, Symtab>() {
+ @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) {
--- a/langtools/test/tools/javac/sym/ElementStructureTest.java Thu Sep 10 14:55:20 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<String> options = Arrays.asList("-release", version, "-classpath", "");
+ List<ToolBox.JavaSource> 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);
--- a/langtools/test/tools/sjavac/IdleShutdown.java Thu Sep 10 14:55:20 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;
}
}
}
--- a/langtools/test/tools/sjavac/PooledExecution.java Thu Sep 10 14:55:20 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
--- a/make/CompileJavaModules.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/make/CompileJavaModules.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -534,8 +534,7 @@
## Service types are required in the classpath when compiing module-info
$1_CLASSPATH := $$($1_CLASSPATH) $$(addprefix $(JDK_OUTPUTDIR)/modules/,jdk.hotspot.agent)
endif
- $1_CLASSPATH := $$(subst $$(SPACE),$$(PATH_SEP),$$($1_CLASSPATH))
- $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_DIR) -extdirs $(EMPTY_DIR) -endorseddirs $(EMPTY_DIR) -classpath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
+ $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_DIR) -extdirs $(EMPTY_DIR) -endorseddirs $(EMPTY_DIR) $$($1_ADD_JAVAC_FLAGS)
$$(eval $$(call SetupJavaCompilation,$1, \
SETUP := $$(if $$($1_SETUP), $$($1_SETUP), GENERATE_JDKBYTECODE), \
@@ -543,6 +542,7 @@
INCLUDES := $(JDK_USER_DEFINED_FILTER),\
BIN := $$(if $$($1_BIN), $$($1_BIN), $(JDK_OUTPUTDIR)/modules/$1), \
HEADERS := $(SUPPORT_OUTPUTDIR)/headers/$1, \
+ CLASSPATH := $$($1_CLASSPATH), \
ADD_JAVAC_FLAGS := $$($1_ADD_JAVAC_FLAGS) $$($1_JAVAC_FLAGS)))
$1: $$($1) $$($1_COPY_EXTRA)
--- a/make/Init.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/make/Init.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -50,7 +50,7 @@
include $(topdir)/make/Help.gmk
# Targets provided by Init.gmk.
- ALL_INIT_TARGETS := print-modules print-targets reconfigure
+ ALL_INIT_TARGETS := print-modules print-targets print-configuration reconfigure
# CALLED_TARGETS is the list of targets that the user provided,
# or "default" if unspecified.
@@ -228,6 +228,9 @@
$(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \
NO_RECIPES=true print-targets )
+ print-configuration:
+ $(ECHO) $(CONFIGURE_COMMAND_LINE)
+
reconfigure:
ifneq ($(CONFIGURE_COMMAND_LINE), )
$(ECHO) "Re-running configure using arguments '$(CONFIGURE_COMMAND_LINE)'"
--- a/make/common/JavaCompilation.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/make/common/JavaCompilation.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -403,6 +403,7 @@
# SRC:=one or more directories to search for sources. The order of the source roots
# is significant. The first found file of a certain name has priority.
# BIN:=store classes here
+# CLASSPATH:=a list of additional entries to set as classpath to javac
# INCLUDES:=myapp.foo means will only compile java files in myapp.foo or any of its sub-packages.
# EXCLUDES:=myapp.foo means will do not compile java files in myapp.foo or any of its sub-packages.
# COPY:=.prp means copy all prp files to the corresponding package in BIN.
@@ -428,6 +429,9 @@
$1_JVM := $$($$($1_SETUP)_JVM)
$1_JAVAC := $$($$($1_SETUP)_JAVAC)
$1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
+ ifneq ($$($1_CLASSPATH), )
+ $1_FLAGS += -cp $$(call PathList, $$($1_CLASSPATH))
+ endif
ifeq ($$($1_JAVAC),)
$$(error The Java compilation $1 refers to a non-existant java compiler setup $$($1_SETUP))
endif
@@ -482,7 +486,7 @@
$$(addprefix -i ,$$(addsuffix /*,$$($1_INCLUDES))) \
$$(addprefix -xf *,$$(strip $$($1_EXCLUDE_FILES) $$($1_SJAVAC_EXCLUDE_FILES))) \
$$(addprefix -if *,$$(strip $$($1_INCLUDE_FILES))) \
- -src "$$(subst $$(SPACE),$$(PATH_SEP),$$(strip $$($1_SRC)))"
+ -src $$(call PathList, $$($1_SRC))
# All files below META-INF are always copied.
$1_ALL_COPIES := $$(filter $$(addsuffix /META-INF%,$$($1_SRC)),$$($1_ALL_SRCS))
--- a/make/common/MakeBase.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/make/common/MakeBase.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -41,6 +41,29 @@
# next make invocation.
.DELETE_ON_ERROR:
+################################################################################
+# Definitions for special characters
+################################################################################
+
+# When calling macros, the spaces between arguments are
+# often semantically important! Sometimes we need to subst
+# spaces and commas, therefore we need the following macros.
+X:=
+SPACE:=$(X) $(X)
+COMMA:=,
+DOLLAR:=$$
+HASH:=\#
+LEFT_PAREN:=(
+RIGHT_PAREN:=)
+SQUOTE:='
+#'
+DQUOTE:="
+#"
+define NEWLINE
+
+
+endef
+
##############################
# Functions
##############################
@@ -780,6 +803,14 @@
endif
################################################################################
+# Return a string suitable for use after a -classpath option. It will correct and safe to use
+# on all platforms. Arguments are given as space separate classpath entries.
+# param 1 : A space separated list of classpath entries
+# The surrounding strip is needed to keep additional whitespace out
+PathList = \
+ "$(subst $(SPACE),$(PATH_SEP),$(strip $1))"
+
+################################################################################
# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, , common/MakeBase.gmk))
--- a/make/common/NativeCompilation.gmk Thu Sep 10 14:55:20 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) \
--- a/make/common/SetupJavaCompilers.gmk Thu Sep 10 14:55:20 2015 -0700
+++ b/make/common/SetupJavaCompilers.gmk Tue Sep 15 07:47:44 2015 -0700
@@ -78,7 +78,7 @@
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
-JDK_BOOTCLASSPATH := $(subst $(SPACE),$(PATH_SEP),\
+JDK_BOOTCLASSPATH := $(call PathList, \
$(filter-out $(JDK_OUTPUTDIR)/modules/_%, $(wildcard $(JDK_OUTPUTDIR)/modules/*)))
# After the jdk is built, we want to build demos using only the recently
@@ -88,7 +88,7 @@
$(eval $(call SetupJavaCompiler,GENERATE_USINGJDKBYTECODE, \
JVM := $(JAVA_SMALL), \
JAVAC := $(NEW_JAVAC), \
- FLAGS := -bootclasspath "$(JDK_BOOTCLASSPATH)" $(DISABLE_WARNINGS), \
+ FLAGS := -bootclasspath $(JDK_BOOTCLASSPATH) $(DISABLE_WARNINGS), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
--- a/make/common/TestFilesCompilation.gmk Thu Sep 10 14:55:20 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,
--- a/nashorn/.hgtags Thu Sep 10 14:55:20 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
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Thu Sep 10 14:55:20 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) {
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Thu Sep 10 14:55:20 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.<init>
- 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);
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Thu Sep 10 14:55:20 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
--- a/nashorn/make/BuildNashorn.gmk Thu Sep 10 14:55:20 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) $@
--- /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)");
+ }
+}
--- /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)");
+ }
+}
--- /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, String>) String::toUpperCase);
+
+ // call lambda as though it is a normal script function
+ System.out.println(e.eval("upper('hello')"));
+ }
+}
--- /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 <asmtools.jar> 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 "<init>":"()V"
+ stack 1 locals 1
+{
+ aload_0;
+ invokespecial Method java/lang/Object."<init>":"()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."<init>":"()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
Binary file nashorn/samples/Main.class has changed
--- /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());
+ }
+}
--- /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);
--- /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);
--- /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);
--- /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;
+ }
+}
--- /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);
--- /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 -- <java class name>");
+ 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);
+}
--- /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);
--- /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))
+
+
--- /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"));
--- /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))
--- /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);
+}
--- /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)));
--- /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("")));
--- /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)));
+}
--- /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))
--- /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)" ]);
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Thu Sep 10 14:55:20 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;
+ }
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Thu Sep 10 14:55:20 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)));
* }
* }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java Thu Sep 10 14:55:20 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);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java Thu Sep 10 14:55:20 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 {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java Thu Sep 10 14:55:20 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
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java Thu Sep 10 14:55:20 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;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java Thu Sep 10 14:55:20 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));
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Thu Sep 10 14:55:20 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;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java Thu Sep 10 14:55:20 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 @@
* <dt>"-strict"</dt><dd>enable ECMAScript strict mode</dd>
* </dl>
*
- * @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.
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java Thu Sep 10 14:55:20 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();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java Thu Sep 10 14:55:20 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;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Sep 10 14:55:20 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();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java Thu Sep 10 14:55:20 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<ScriptEnvironment> codeInstaller = compiler.getCodeInstaller();
- final Map<String, byte[]> bytecode = compiler.getBytecode();
+ final CodeInstaller codeInstaller = compiler.getCodeInstaller();
+ final Map<String, byte[]> bytecode = compiler.getBytecode();
for (final Entry<String, byte[]> 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.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Thu Sep 10 14:55:20 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<ScriptEnvironment> 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<ScriptEnvironment> 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<Integer, Type> 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<ScriptEnvironment> 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<Integer, Type>() : 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<ScriptEnvironment> 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<ScriptEnvironment> getCodeInstaller() {
+ CodeInstaller getCodeInstaller() {
return installer;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java Thu Sep 10 14:55:20 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<String> 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
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Thu Sep 10 14:55:20 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.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Thu Sep 10 14:55:20 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
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java Thu Sep 10 14:55:20 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".
*
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java Thu Sep 10 14:55:20 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 {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java Thu Sep 10 14:55:20 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
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java Thu Sep 10 14:55:20 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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Thu Sep 10 14:55:20 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 {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Thu Sep 10 14:55:20 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<ClassHistogramElement> getClassHistogram() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java Thu Sep 10 14:55:20 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
*
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java Thu Sep 10 14:55:20 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;
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Thu Sep 10 14:55:20 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());
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java Thu Sep 10 14:55:20 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;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java Thu Sep 10 14:55:20 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()));
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java Thu Sep 10 14:55:20 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));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java Thu Sep 10 14:55:20 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);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Thu Sep 10 14:55:20 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].
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/PrototypeObject.java Thu Sep 10 14:55:20 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<Property> 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));
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Thu Sep 10 14:55:20 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<Property> 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);
- }
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Sep 10 14:55:20 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());
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java Thu Sep 10 14:55:20 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<Statement> 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);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java Thu Sep 10 14:55:20 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 <T> owner class type for this code installer
*
*/
-public interface CodeInstaller<T> {
+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<T> 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<T> other);
+ public boolean isCompatibleWith(CodeInstaller other);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Thu Sep 10 14:55:20 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);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu Sep 10 14:55:20 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<String, SwitchPoint> 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<ScriptEnvironment> {
+ 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<ScriptEnvironment> 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<ScriptEnvironment> 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<ScriptEnvironment> 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Thu Sep 10 14:55:20 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 @@
}
}
-
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java Thu Sep 10 14:55:20 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;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Thu Sep 10 14:55:20 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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java Thu Sep 10 14:55:20 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;
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java Thu Sep 10 14:55:20 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<String, WeakPropertyMapSet> 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();
+ }
}
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Thu Sep 10 14:55:20 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();
}
}
--- /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<Property> 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));
+ }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Thu Sep 10 14:55:20 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<ScriptEnvironment> installer;
+ private transient CodeInstaller installer;
private final Map<Integer, RecompilableScriptFunctionData> nestedFunctions;
@@ -153,7 +153,7 @@
*/
public RecompilableScriptFunctionData(
final FunctionNode functionNode,
- final CodeInstaller<ScriptEnvironment> installer,
+ final CodeInstaller installer,
final AllocationStrategy allocationStrategy,
final Map<Integer, RecompilableScriptFunctionData> nestedFunctions,
final Map<String, Integer> externalScopeDepths,
@@ -285,7 +285,7 @@
* @param src source
* @param inst code installer
*/
- public void initTransients(final Source src, final CodeInstaller<ScriptEnvironment> 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<ScriptEnvironment> 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<ScriptEnvironment> 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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Thu Sep 10 14:55:20 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();
+ }
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Thu Sep 10 14:55:20 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<Property> 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<? extends LinkLogic> 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));
}
}
-
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Thu Sep 10 14:55:20 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.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Sep 10 14:55:20 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();
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java Thu Sep 10 14:55:20 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<String, Class<?>> installClasses(final Source source, final CodeInstaller<ScriptEnvironment> installer) {
+ private Map<String, Class<?>> installClasses(final Source source, final CodeInstaller installer) {
final Map<String, Class<?>> 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<ScriptEnvironment> installer) {
+ FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller installer) {
final Map<String, Class<?>> 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<ScriptEnvironment> installer) {
+ Class<?> installScript(final Source source, final CodeInstaller installer) {
final Map<String, Class<?>> installedClasses = installClasses(source, installer);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Sep 10 14:55:20 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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Thu Sep 10 14:55:20 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
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Thu Sep 10 14:55:20 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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Thu Sep 10 14:55:20 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)) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java Thu Sep 10 14:55:20 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<String, AtomicInteger> 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();
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Thu Sep 10 14:55:20 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;
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java Thu Sep 10 14:55:20 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;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js Thu Sep 10 14:55:20 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;
}
});
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Thu Sep 10 14:55:20 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);
--- /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);
--- /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
--- /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());
--- /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
--- a/nashorn/test/script/trusted/JDK-8006529.js Thu Sep 10 14:55:20 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);
};