--- a/.hgtags Thu Mar 22 11:09:50 2018 -0700
+++ b/.hgtags Thu Mar 22 11:34:38 2018 -0700
@@ -475,3 +475,4 @@
4f96cf952e71cb8a127334494faf28880c26181b jdk-10+45
1fd4d6068f54561cfc67d54fc9ca84af7212c4f8 jdk-11+3
e59941f7247d451fa7df9eaef3fce0f492f8420c jdk-11+4
+d5c43e9f08fb9a7c74aae0d48daf17f2ad2afaef jdk-11+5
--- a/make/common/MakeBase.gmk Thu Mar 22 11:09:50 2018 -0700
+++ b/make/common/MakeBase.gmk Thu Mar 22 11:34:38 2018 -0700
@@ -67,6 +67,7 @@
# In GNU Make 4.0 and higher, there is a file function for writing to files.
ifeq (4.0, $(firstword $(sort 4.0 $(MAKE_VERSION))))
HAS_FILE_FUNCTION := true
+ CORRECT_FUNCTION_IN_RECIPE_EVALUATION := true
endif
##############################
--- a/make/common/NativeCompilation.gmk Thu Mar 22 11:09:50 2018 -0700
+++ b/make/common/NativeCompilation.gmk Thu Mar 22 11:34:38 2018 -0700
@@ -827,7 +827,9 @@
$$(shell $(RM) $$($1_TARGET))
endif
$$($1_DEBUGINFO_FILES): $$($1_TARGET)
- $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<))
+ $$(if $$(CORRECT_FUNCTION_IN_RECIPE_EVALUATION), \
+ $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) \
+ )
$(TOUCH) $$@
$1 += $$($1_DEBUGINFO_FILES)
@@ -875,7 +877,9 @@
$$(shell $(RM) $$($1_TARGET))
endif
$$($1_IMPORT_LIBRARY): $$($1_TARGET)
- $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<))
+ $$(if $$(CORRECT_FUNCTION_IN_RECIPE_EVALUATION), \
+ $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) \
+ )
$(TOUCH) $$@
endif
--- a/make/lib/Lib-jdk.hotspot.agent.gmk Thu Mar 22 11:09:50 2018 -0700
+++ b/make/lib/Lib-jdk.hotspot.agent.gmk Thu Mar 22 11:34:38 2018 -0700
@@ -29,17 +29,15 @@
################################################################################
-ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx windows), )
- DISABLE_MAPFILES := true
-endif
-
SA_TOPDIR := $(TOPDIR)/src/jdk.hotspot.agent
-# Defaults for most platforms
-SA_TOOLCHAIN := TOOLCHAIN_DEFAULT
-SA_NAME := saproc
-SA_SRC += $(SA_TOPDIR)/share/native/libsaproc $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc
+SA_SRC += \
+ $(SA_TOPDIR)/share/native/libsaproc \
+ $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc \
+ #
+
SA_MAPFILE := $(TOPDIR)/make/mapfiles/libsaproc/mapfile-$(OPENJDK_TARGET_OS)
+
SA_INCLUDES := \
$(addprefix -I, $(SA_SRC)) \
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.hotspot.agent \
@@ -47,59 +45,40 @@
#
ifeq ($(OPENJDK_TARGET_OS), linux)
- SA_CFLAGS := $(CFLAGS_JDKLIB) -D_FILE_OFFSET_BITS=64
- ifeq ($(OPENJDK_TARGET_CPU), x86)
- SA_LDFLAGS := -march=i586
- endif
-
- SA_LIBS := -lthread_db $(LIBDL)
+ SA_CFLAGS := -D_FILE_OFFSET_BITS=64
else ifeq ($(OPENJDK_TARGET_OS), solaris)
- SA_TOOLCHAIN := TOOLCHAIN_LINK_CXX
- SA_CFLAGS := $(CFLAGS_JDKLIB)
- SA_CXXFLAGS := $(CXXFLAGS_JDKLIB)
- SA_LDFLAGS := -mt $(LDFLAGS_CXX_JDK)
- SA_LIBS := -ldl -ldemangle -lthread -lproc
+ SA_LDFLAGS := -mt
else ifeq ($(OPENJDK_TARGET_OS), macosx)
- SA_EXCLUDE_FILES := BsdDebuggerLocal.c ps_proc.c salibelf.c StubDebuggerLocal.c
- SA_CFLAGS := $(CFLAGS_JDKLIB) \
- -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
+ SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
-mstack-alignment=16 -fPIC
- SA_LIBS := -framework Foundation -framework JavaNativeFoundation \
- -framework JavaRuntimeSupport -framework Security -framework CoreFoundation
-
else ifeq ($(OPENJDK_TARGET_OS), windows)
- SA_NAME := sawindbg
- COMMON_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc
- SA_CFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CFLAGS_JDKLIB)) \
- $(COMMON_CFLAGS)
- SA_CXXFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CXXFLAGS_JDKLIB)) \
- $(COMMON_CFLAGS)
- SA_LDFLAGS := -manifest
- SA_LIBS := dbgeng.lib
+ SA_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc
ifeq ($(OPENJDK_TARGET_CPU), x86_64)
- SA_CXXFLAGS += -DWIN64
+ SA_CXXFLAGS := -DWIN64
else
- SA_CXXFLAGS += -RTC1
+ SA_CXXFLAGS := -RTC1
endif
endif
################################################################################
$(eval $(call SetupJdkLibrary, BUILD_LIBSA, \
- NAME := $(SA_NAME), \
- TOOLCHAIN := $(SA_TOOLCHAIN), \
+ NAME := saproc, \
OPTIMIZATION := NONE, \
DISABLED_WARNINGS_microsoft := 4267, \
DISABLED_WARNINGS_gcc := sign-compare, \
DISABLED_WARNINGS_CXX_solstudio := truncwarn unknownpragma, \
SRC := $(SA_SRC), \
- EXCLUDE_FILES := test.c saproc_audit.cpp $(SA_EXCLUDE_FILES), \
- CFLAGS := $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \
- CXXFLAGS := $(SA_INCLUDES) $(SA_CXXFLAGS) $(SA_CUSTOM_CXXFLAGS), \
+ CFLAGS := $(CFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \
+ CXXFLAGS := $(CXXFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CXXFLAGS), \
LDFLAGS := $(LDFLAGS_JDKLIB) $(SA_LDFLAGS), \
- LIBS := $(SA_LIBS), \
+ LIBS_linux := -lthread_db $(LIBDL), \
+ LIBS_solaris := -ldl -ldemangle -lthread -lproc, \
+ LIBS_macosx := -framework Foundation -framework JavaNativeFoundation \
+ -framework JavaRuntimeSupport -framework Security -framework CoreFoundation, \
+ LIBS_windows := dbgeng.lib, \
MAPFILE := $(SA_MAPFILE), \
))
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86 Thu Mar 22 11:09:50 2018 -0700
+++ b/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86 Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, 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,6 +28,7 @@
SUNWprivate_1.1 {
global:
# These are needed by the c runtime in SS12u4
+ environ;
_environ;
__environ_lock;
___Argv;
--- a/src/java.base/share/classes/java/lang/reflect/Constructor.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Constructor.java Thu Mar 22 11:34:38 2018 -0700
@@ -253,6 +253,11 @@
return parameterTypes;
}
+ @Override
+ Class<?>[] getSharedExceptionTypes() {
+ return exceptionTypes;
+ }
+
/**
* {@inheritDoc}
*/
--- a/src/java.base/share/classes/java/lang/reflect/Executable.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Executable.java Thu Mar 22 11:34:38 2018 -0700
@@ -226,6 +226,10 @@
// to the untrusted code...
abstract Class<?>[] getSharedParameterTypes();
+ // returns shared array of exception types - must never give it out
+ // to the untrusted code...
+ abstract Class<?>[] getSharedExceptionTypes();
+
/**
* Returns an array of {@code Class} objects that represent the formal
* parameter types, in declaration order, of the executable
--- a/src/java.base/share/classes/java/lang/reflect/Method.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Method.java Thu Mar 22 11:34:38 2018 -0700
@@ -301,6 +301,11 @@
return parameterTypes;
}
+ @Override
+ Class<?>[] getSharedExceptionTypes() {
+ return exceptionTypes;
+ }
+
/**
* {@inheritDoc}
*/
--- a/src/java.base/share/classes/java/lang/reflect/Proxy.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java Thu Mar 22 11:34:38 2018 -0700
@@ -708,24 +708,32 @@
*/
private static Set<Class<?>> referencedTypes(ClassLoader loader,
List<Class<?>> interfaces) {
- return interfaces.stream()
- .flatMap(intf -> Stream.of(intf.getMethods())
- .filter(m -> !Modifier.isStatic(m.getModifiers()))
- .flatMap(ProxyBuilder::methodRefTypes)
- .map(ProxyBuilder::getElementType)
- .filter(t -> !t.isPrimitive()))
- .collect(Collectors.toSet());
+ var types = new HashSet<Class<?>>();
+ for (var intf : interfaces) {
+ for (Method m : intf.getMethods()) {
+ if (!Modifier.isStatic(m.getModifiers())) {
+ addElementType(types, m.getReturnType());
+ addElementTypes(types, m.getSharedParameterTypes());
+ addElementTypes(types, m.getSharedExceptionTypes());
+ }
+ }
+ }
+ return types;
}
- /*
- * Extracts all types referenced on a method signature including
- * its return type, parameter types, and exception types.
- */
- private static Stream<Class<?>> methodRefTypes(Method m) {
- return Stream.of(new Class<?>[] { m.getReturnType() },
- m.getParameterTypes(),
- m.getExceptionTypes())
- .flatMap(Stream::of);
+ private static void addElementTypes(HashSet<Class<?>> types,
+ Class<?> ... classes) {
+ for (var cls : classes) {
+ addElementType(types, cls);
+ }
+ }
+
+ private static void addElementType(HashSet<Class<?>> types,
+ Class<?> cls) {
+ var type = getElementType(cls);
+ if (!type.isPrimitive()) {
+ types.add(type);
+ }
}
/**
--- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java Thu Mar 22 11:34:38 2018 -0700
@@ -1726,7 +1726,7 @@
* This map is used to look up the index of an existing entry for
* values of all types.
*/
- private Map<Object,Short> map = new HashMap<>(16);
+ private Map<Object,Integer> map = new HashMap<>(16);
/** true if no new constant pool entries may be added */
private boolean readOnly = false;
@@ -1878,7 +1878,7 @@
* java.lang.Double CONSTANT_DOUBLE
*/
private short getValue(Object key) {
- Short index = map.get(key);
+ Integer index = map.get(key);
if (index != null) {
return index.shortValue();
} else {
@@ -1887,7 +1887,7 @@
"late constant pool addition: " + key);
}
short i = addEntry(new ValueEntry(key));
- map.put(key, i);
+ map.put(key, (int)i);
return i;
}
}
@@ -1897,7 +1897,7 @@
* references to other constant pool entries.
*/
private short getIndirect(IndirectEntry e) {
- Short index = map.get(e);
+ Integer index = map.get(e);
if (index != null) {
return index.shortValue();
} else {
@@ -1905,7 +1905,7 @@
throw new InternalError("late constant pool addition");
}
short i = addEntry(e);
- map.put(e, i);
+ map.put(e, (int)i);
return i;
}
}
--- a/src/java.base/share/classes/java/nio/StringCharBuffer.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/nio/StringCharBuffer.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, 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
@@ -149,7 +149,7 @@
that, that.position(),
Math.min(this.remaining(), that.remaining()));
if (i >= 0) {
- return Character.compare(this.get(this.position() + i), that.get(this.position() + i));
+ return Character.compare(this.get(this.position() + i), that.get(that.position() + i));
}
return this.remaining() - that.remaining();
}
--- a/src/java.base/share/classes/java/nio/X-Buffer.java.template Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/nio/X-Buffer.java.template Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, 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
@@ -1337,7 +1337,7 @@
that, that.position(),
Math.min(this.remaining(), that.remaining()));
if (i >= 0) {
- return compare(this.get(this.position() + i), that.get(this.position() + i));
+ return compare(this.get(this.position() + i), that.get(that.position() + i));
}
return this.remaining() - that.remaining();
}
--- a/src/java.base/share/classes/java/util/Formatter.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/util/Formatter.java Thu Mar 22 11:34:38 2018 -0700
@@ -47,6 +47,7 @@
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
+import java.text.spi.NumberFormatProvider;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Objects;
@@ -62,6 +63,8 @@
import jdk.internal.math.DoubleConsts;
import jdk.internal.math.FormattedFloatingDecimal;
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.ResourceBundleBasedAdapter;
/**
* An interpreter for printf-style format strings. This class provides support
@@ -4476,8 +4479,33 @@
} else {
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(l);
grpSep = dfs.getGroupingSeparator();
- DecimalFormat df = (DecimalFormat) NumberFormat.getIntegerInstance(l);
+ DecimalFormat df = null;
+ NumberFormat nf = NumberFormat.getNumberInstance(l);
+ if (nf instanceof DecimalFormat) {
+ df = (DecimalFormat) nf;
+ } else {
+
+ // Use DecimalFormat constructor to obtain the instance,
+ // in case NumberFormat.getNumberInstance(l)
+ // returns instance other than DecimalFormat
+ LocaleProviderAdapter adapter = LocaleProviderAdapter
+ .getAdapter(NumberFormatProvider.class, l);
+ if (!(adapter instanceof ResourceBundleBasedAdapter)) {
+ adapter = LocaleProviderAdapter.getResourceBundleBased();
+ }
+ String[] all = adapter.getLocaleResources(l)
+ .getNumberPatterns();
+ df = new DecimalFormat(all[0], dfs);
+ }
grpSize = df.getGroupingSize();
+ // Some locales do not use grouping (the number
+ // pattern for these locales does not contain group, e.g.
+ // ("#0.###")), but specify a grouping separator.
+ // To avoid unnecessary identification of the position of
+ // grouping separator, reset its value with null character
+ if (!df.isGroupingUsed() || grpSize == 0) {
+ grpSep = '\0';
+ }
}
}
--- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java Thu Mar 22 11:34:38 2018 -0700
@@ -50,7 +50,7 @@
slash = props.getProperty("file.separator").charAt(0);
semicolon = props.getProperty("path.separator").charAt(0);
altSlash = (this.slash == '\\') ? '/' : '\\';
- userDir = props.getProperty("user.dir");
+ userDir = normalize(props.getProperty("user.dir"));
}
private boolean isSlash(char c) {
--- a/src/java.instrument/share/native/libinstrument/Reentrancy.c Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.instrument/share/native/libinstrument/Reentrancy.c Thu Mar 22 11:34:38 2018 -0700
@@ -90,7 +90,7 @@
jthread thread,
const void * expected) {
jvmtiError error;
- void * test = (void *) 0x99999999;
+ void * test = (void *) 0x99999999UL;
/* now check if we do a fetch we get what we wrote */
error = (*jvmtienv)->GetThreadLocalStorage(
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,42 +1,28 @@
/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
* Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
- * The contents of this file are subject to the terms of either the GNU
- * General Public License Version 2 only ("GPL") or the Common Development
- * and Distribution License("CDDL") (collectively, the "License"). You
- * may not use this file except in compliance with the License. You can
- * obtain a copy of the License at
- * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
- * or packager/legal/LICENSE.txt. See the License for the specific
- * language governing permissions and limitations under the License.
- *
- * When distributing the software, include this License Header Notice in each
- * file and include the License file at packager/legal/LICENSE.txt.
+ * 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.
*
- * GPL Classpath Exception:
- * Oracle designates this particular file as subject to the "Classpath"
- * exception as provided by Oracle in the GPL Version 2 section of the License
- * file that accompanied this code.
- *
- * Modifications:
- * If applicable, add the following below the License Header, with the fields
- * enclosed by brackets [] replaced by your own identifying information:
- * "Portions Copyright [year] [name of copyright owner]"
+ * 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).
*
- * Contributor(s):
- * If you wish your version of this file to be governed by only the CDDL or
- * only the GPL Version 2, indicate your decision by adding "[Contributor]
- * elects to include this software in this distribution under the [CDDL or GPL
- * Version 2] license." If you don't indicate a single choice of license, a
- * recipient has the option to distribute your version of this file under
- * either the CDDL, the GPL Version 2 or to extend the choice of license to
- * its licensees as provided above. However, if you add GPL Version 2 code
- * and therefore, elected the GPL Version 2 license, then the option applies
- * only if the new code is made subject to such option by the copyright
- * holder.
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
*/
+
package com.sun.org.apache.xerces.internal.utils;
import com.sun.org.apache.xerces.internal.impl.Constants;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java Thu Mar 22 11:34:38 2018 -0700
@@ -216,6 +216,7 @@
} catch (RuntimeException ex) {
throw new PropagatedException(ex);
}
+ break;
}
}
}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java Thu Mar 22 11:34:38 2018 -0700
@@ -313,6 +313,12 @@
*/
public static final long ANONCONSTR_BASED = 1L<<57;
+ /**
+ * Flag that marks finalize block as body-only, should not be copied into catch clauses.
+ * Used to implement try-with-resources.
+ */
+ public static final long BODY_ONLY_FINALIZE = 1L<<17; //blocks only
+
/** Modifier masks.
*/
public static final int
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Thu Mar 22 11:34:38 2018 -0700
@@ -1519,26 +1519,22 @@
*
* {
* final VariableModifiers_minus_final R #resource = Expression;
- * Throwable #primaryException = null;
*
* try ResourceSpecificationtail
* Block
- * catch (Throwable #t) {
- * #primaryException = t;
- * throw #t;
- * } finally {
- * if (#resource != null) {
- * if (#primaryException != null) {
- * try {
- * #resource.close();
- * } catch(Throwable #suppressedException) {
- * #primaryException.addSuppressed(#suppressedException);
- * }
- * } else {
+ * } body-only-finally {
+ * if (#resource != null) //nullcheck skipped if Expression is provably non-null
* #resource.close();
- * }
- * }
+ * } catch (Throwable #primaryException) {
+ * if (#resource != null) //nullcheck skipped if Expression is provably non-null
+ * try {
+ * #resource.close();
+ * } catch (Throwable #suppressedException) {
+ * #primaryException.addSuppressed(#suppressedException);
+ * }
+ * throw #primaryException;
* }
+ * }
*
* @param tree The try statement to inspect.
* @return A a desugared try-with-resources tree, or the original
@@ -1547,8 +1543,7 @@
JCTree makeTwrTry(JCTry tree) {
make_at(tree.pos());
twrVars = twrVars.dup();
- JCBlock twrBlock = makeTwrBlock(tree.resources, tree.body,
- tree.finallyCanCompleteNormally, 0);
+ JCBlock twrBlock = makeTwrBlock(tree.resources, tree.body, 0);
if (tree.catchers.isEmpty() && tree.finalizer == null)
result = translate(twrBlock);
else
@@ -1557,19 +1552,18 @@
return result;
}
- private JCBlock makeTwrBlock(List<JCTree> resources, JCBlock block,
- boolean finallyCanCompleteNormally, int depth) {
+ private JCBlock makeTwrBlock(List<JCTree> resources, JCBlock block, int depth) {
if (resources.isEmpty())
return block;
// Add resource declaration or expression to block statements
ListBuffer<JCStatement> stats = new ListBuffer<>();
JCTree resource = resources.head;
- JCExpression expr = null;
+ JCExpression resourceUse;
boolean resourceNonNull;
if (resource instanceof JCVariableDecl) {
JCVariableDecl var = (JCVariableDecl) resource;
- expr = make.Ident(var.sym).setType(resource.type);
+ resourceUse = make.Ident(var.sym).setType(resource.type);
resourceNonNull = var.init != null && TreeInfo.skipParens(var.init).hasTag(NEWCLASS);
stats.add(var);
} else {
@@ -1584,164 +1578,82 @@
twrVars.enter(syntheticTwrVar);
JCVariableDecl syntheticTwrVarDecl =
make.VarDef(syntheticTwrVar, (JCExpression)resource);
- expr = (JCExpression)make.Ident(syntheticTwrVar);
- resourceNonNull = TreeInfo.skipParens(resource).hasTag(NEWCLASS);
+ resourceUse = (JCExpression)make.Ident(syntheticTwrVar);
+ resourceNonNull = false;
stats.add(syntheticTwrVarDecl);
}
- // Add primaryException declaration
+ //create (semi-) finally block that will be copied into the main try body:
+ int oldPos = make.pos;
+ make.at(TreeInfo.endPos(block));
+
+ // if (#resource != null) { #resource.close(); }
+ JCStatement bodyCloseStatement = makeResourceCloseInvocation(resourceUse);
+
+ if (!resourceNonNull) {
+ bodyCloseStatement = make.If(makeNonNullCheck(resourceUse),
+ bodyCloseStatement,
+ null);
+ }
+
+ JCBlock finallyClause = make.Block(BODY_ONLY_FINALIZE, List.of(bodyCloseStatement));
+ make.at(oldPos);
+
+ // Create catch clause that saves exception, closes the resource and then rethrows the exception:
VarSymbol primaryException =
- new VarSymbol(SYNTHETIC,
- makeSyntheticName(names.fromString("primaryException" +
- depth), twrVars),
- syms.throwableType,
- currentMethodSym);
- twrVars.enter(primaryException);
- JCVariableDecl primaryExceptionTreeDecl = make.VarDef(primaryException, makeNull());
- stats.add(primaryExceptionTreeDecl);
-
- // Create catch clause that saves exception and then rethrows it
- VarSymbol param =
new VarSymbol(FINAL|SYNTHETIC,
names.fromString("t" +
target.syntheticNameChar()),
syms.throwableType,
currentMethodSym);
- JCVariableDecl paramTree = make.VarDef(param, null);
- JCStatement assign = make.Assignment(primaryException, make.Ident(param));
- JCStatement rethrowStat = make.Throw(make.Ident(param));
- JCBlock catchBlock = make.Block(0L, List.of(assign, rethrowStat));
- JCCatch catchClause = make.Catch(paramTree, catchBlock);
-
- int oldPos = make.pos;
- make.at(TreeInfo.endPos(block));
- JCBlock finallyClause = makeTwrFinallyClause(primaryException, expr, resourceNonNull);
- make.at(oldPos);
- JCTry outerTry = make.Try(makeTwrBlock(resources.tail, block,
- finallyCanCompleteNormally, depth + 1),
- List.of(catchClause),
- finallyClause);
- outerTry.finallyCanCompleteNormally = finallyCanCompleteNormally;
- stats.add(outerTry);
- JCBlock newBlock = make.Block(0L, stats.toList());
- return newBlock;
- }
-
- /**If the estimated number of copies the close resource code in a single class is above this
- * threshold, generate and use a method for the close resource code, leading to smaller code.
- * As generating a method has overhead on its own, generating the method for cases below the
- * threshold could lead to an increase in code size.
- */
- public static final int USE_CLOSE_RESOURCE_METHOD_THRESHOLD = 4;
-
- private JCBlock makeTwrFinallyClause(Symbol primaryException, JCExpression resource,
- boolean resourceNonNull) {
- MethodSymbol closeResource = (MethodSymbol)lookupSynthetic(dollarCloseResource,
- currentClass.members());
-
- if (closeResource == null && shouldUseCloseResourceMethod()) {
- closeResource = new MethodSymbol(
- PRIVATE | STATIC | SYNTHETIC,
- dollarCloseResource,
- new MethodType(
- List.of(syms.throwableType, syms.autoCloseableType),
- syms.voidType,
- List.nil(),
- syms.methodClass),
- currentClass);
- enterSynthetic(resource.pos(), closeResource, currentClass.members());
-
- JCMethodDecl md = make.MethodDef(closeResource, null);
- List<JCVariableDecl> params = md.getParameters();
- md.body = make.Block(0, List.of(makeTwrCloseStatement(params.get(0).sym,
- make.Ident(params.get(1)))));
-
- JCClassDecl currentClassDecl = classDef(currentClass);
- currentClassDecl.defs = currentClassDecl.defs.prepend(md);
- }
-
- JCStatement closeStatement;
-
- if (closeResource != null) {
- //$closeResource(#primaryException, #resource)
- closeStatement = make.Exec(make.Apply(List.nil(),
- make.Ident(closeResource),
- List.of(make.Ident(primaryException),
- resource)
- ).setType(syms.voidType));
- } else {
- closeStatement = makeTwrCloseStatement(primaryException, resource);
- }
-
- JCStatement finallyStatement;
-
- if (resourceNonNull) {
- finallyStatement = closeStatement;
- } else {
- // if (#resource != null) { $closeResource(...); }
- finallyStatement = make.If(makeNonNullCheck(resource),
- closeStatement,
- null);
- }
-
- return make.Block(0L,
- List.of(finallyStatement));
- }
- //where:
- private boolean shouldUseCloseResourceMethod() {
- class TryFinder extends TreeScanner {
- int closeCount;
- @Override
- public void visitTry(JCTry tree) {
- boolean empty = tree.body.stats.isEmpty();
-
- for (JCTree r : tree.resources) {
- closeCount += empty ? 1 : 2;
- empty = false; //with multiple resources, only the innermost try can be empty.
- }
- super.visitTry(tree);
- }
- @Override
- public void scan(JCTree tree) {
- if (useCloseResourceMethod())
- return;
- super.scan(tree);
- }
- boolean useCloseResourceMethod() {
- return closeCount >= USE_CLOSE_RESOURCE_METHOD_THRESHOLD;
- }
- }
- TryFinder tryFinder = new TryFinder();
- tryFinder.scan(classDef(currentClass));
- return tryFinder.useCloseResourceMethod();
- }
-
- private JCStatement makeTwrCloseStatement(Symbol primaryException, JCExpression resource) {
- // primaryException.addSuppressed(catchException);
- VarSymbol catchException =
+ JCVariableDecl primaryExceptionDecl = make.VarDef(primaryException, null);
+
+ // close resource:
+ // try {
+ // #resource.close();
+ // } catch (Throwable #suppressedException) {
+ // #primaryException.addSuppressed(#suppressedException);
+ // }
+ VarSymbol suppressedException =
new VarSymbol(SYNTHETIC, make.paramName(2),
syms.throwableType,
currentMethodSym);
- JCStatement addSuppressionStatement =
+ JCStatement addSuppressedStatement =
make.Exec(makeCall(make.Ident(primaryException),
names.addSuppressed,
- List.of(make.Ident(catchException))));
-
- // try { resource.close(); } catch (e) { primaryException.addSuppressed(e); }
- JCBlock tryBlock =
- make.Block(0L, List.of(makeResourceCloseInvocation(resource)));
- JCVariableDecl catchExceptionDecl = make.VarDef(catchException, null);
- JCBlock catchBlock = make.Block(0L, List.of(addSuppressionStatement));
- List<JCCatch> catchClauses = List.of(make.Catch(catchExceptionDecl, catchBlock));
- JCTry tryTree = make.Try(tryBlock, catchClauses, null);
- tryTree.finallyCanCompleteNormally = true;
-
- // if (primaryException != null) {try...} else resourceClose;
- JCIf closeIfStatement = make.If(makeNonNullCheck(make.Ident(primaryException)),
- tryTree,
- makeResourceCloseInvocation(resource));
-
- return closeIfStatement;
+ List.of(make.Ident(suppressedException))));
+ JCBlock closeResourceTryBlock =
+ make.Block(0L, List.of(makeResourceCloseInvocation(resourceUse)));
+ JCVariableDecl catchSuppressedDecl = make.VarDef(suppressedException, null);
+ JCBlock catchSuppressedBlock = make.Block(0L, List.of(addSuppressedStatement));
+ List<JCCatch> catchSuppressedClauses =
+ List.of(make.Catch(catchSuppressedDecl, catchSuppressedBlock));
+ JCTry closeResourceTry = make.Try(closeResourceTryBlock, catchSuppressedClauses, null);
+ closeResourceTry.finallyCanCompleteNormally = true;
+
+ JCStatement exceptionalCloseStatement = closeResourceTry;
+
+ if (!resourceNonNull) {
+ // if (#resource != null) { }
+ exceptionalCloseStatement = make.If(makeNonNullCheck(resourceUse),
+ exceptionalCloseStatement,
+ null);
+ }
+
+ JCStatement exceptionalRethrow = make.Throw(make.Ident(primaryException));
+ JCBlock exceptionalCloseBlock = make.Block(0L, List.of(exceptionalCloseStatement, exceptionalRethrow));
+ JCCatch exceptionalCatchClause = make.Catch(primaryExceptionDecl, exceptionalCloseBlock);
+
+ //create the main try statement with the close:
+ JCTry outerTry = make.Try(makeTwrBlock(resources.tail, block, depth + 1),
+ List.of(exceptionalCatchClause),
+ finallyClause);
+
+ outerTry.finallyCanCompleteNormally = true;
+ stats.add(outerTry);
+
+ JCBlock newBlock = make.Block(0L, stats.toList());
+ return newBlock;
}
private JCStatement makeResourceCloseInvocation(JCExpression resource) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Thu Mar 22 11:34:38 2018 -0700
@@ -1342,6 +1342,16 @@
boolean hasFinalizer() {
return tree.finalizer != null;
}
+
+ @Override
+ void afterBody() {
+ if (tree.finalizer != null && (tree.finalizer.flags & BODY_ONLY_FINALIZE) != 0) {
+ //for body-only finally, remove the GenFinalizer after try body
+ //so that the finally is not generated to catch bodies:
+ tryEnv.info.finalize = null;
+ }
+ }
+
};
tryEnv.info.gaps = new ListBuffer<>();
genTry(tree.body, tree.catchers, tryEnv);
@@ -1358,15 +1368,16 @@
Code.State stateTry = code.state.dup();
genStat(body, env, CRT_BLOCK);
int endpc = code.curCP();
- boolean hasFinalizer =
- env.info.finalize != null &&
- env.info.finalize.hasFinalizer();
List<Integer> gaps = env.info.gaps.toList();
code.statBegin(TreeInfo.endPos(body));
genFinalizer(env);
code.statBegin(TreeInfo.endPos(env.tree));
Chain exitChain = code.branch(goto_);
endFinalizerGap(env);
+ env.info.finalize.afterBody();
+ boolean hasFinalizer =
+ env.info.finalize != null &&
+ env.info.finalize.hasFinalizer();
if (startpc != endpc) for (List<JCCatch> l = catchers; l.nonEmpty(); l = l.tail) {
// start off with exception on stack
code.entryPoint(stateTry, l.head.param.sym.type);
@@ -2219,6 +2230,9 @@
/** Does this finalizer have some nontrivial cleanup to perform? */
boolean hasFinalizer() { return true; }
+
+ /** Should be invoked after the try's body has been visited. */
+ void afterBody() {}
}
/** code generation contexts,
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java Thu Mar 22 11:34:38 2018 -0700
@@ -836,9 +836,7 @@
String checkPackages = options.get(Option.XDOCLINT_PACKAGE);
if (checkPackages != null) {
- for (String s : checkPackages.split("\\s+")) {
- doclintOpts.add(DocLint.XCHECK_PACKAGE + s);
- }
+ doclintOpts.add(DocLint.XCHECK_PACKAGE + checkPackages);
}
String format = options.get(Option.DOCLINT_FORMAT);
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Thu Mar 22 11:34:38 2018 -0700
@@ -134,9 +134,9 @@
}
@Override
- public void process(OptionHelper helper, String option) {
+ public void process(OptionHelper helper, String option, String arg) {
String prev = helper.get(XDOCLINT_CUSTOM);
- String next = (prev == null) ? option : (prev + " " + option);
+ String next = (prev == null) ? arg : (prev + " " + arg);
helper.put(XDOCLINT_CUSTOM.primaryName, next);
}
},
@@ -149,9 +149,9 @@
}
@Override
- public void process(OptionHelper helper, String option) {
+ public void process(OptionHelper helper, String option, String arg) {
String prev = helper.get(XDOCLINT_PACKAGE);
- String next = (prev == null) ? option : (prev + " " + option);
+ String next = (prev == null) ? arg : (prev + "," + arg);
helper.put(XDOCLINT_PACKAGE.primaryName, next);
}
},
@@ -512,8 +512,7 @@
PLUGIN("-Xplugin:", "opt.arg.plugin", "opt.plugin", EXTENDED, BASIC) {
@Override
- public void process(OptionHelper helper, String option) {
- String p = option.substring(option.indexOf(':') + 1).trim();
+ public void process(OptionHelper helper, String option, String p) {
String prev = helper.get(PLUGIN);
helper.put(PLUGIN.primaryName, (prev == null) ? p : prev + '\0' + p);
}
--- a/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, 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
@@ -30,10 +30,6 @@
#include <stdint.h>
#include "proc_service.h"
-#ifdef ALT_SASRCDIR
-#include "libproc_md.h"
-#endif
-
#include <sys/ptrace.h>
/************************************************************************************
--- a/src/jdk.hotspot.agent/linux/native/libsaproc/test.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, 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.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "libproc.h"
-
-int main(int argc, char** argv) {
- struct ps_prochandle* ph;
-
- init_libproc(true);
- switch (argc) {
- case 2: {
- // process
- ph = Pgrab(atoi(argv[1]));
- break;
- }
-
- case 3: {
- // core
- ph = Pgrab_core(argv[1], argv[2]);
- break;
- }
-
- default: {
- printf("usage %s <pid> or %s <exec file> <core file>\n");
- return 1;
- }
- }
-
- if (ph) {
- Prelease(ph);
- return 0;
- } else {
- printf("can't connect to debuggee\n");
- return 1;
- }
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/BsdDebuggerLocal.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-/*
- * Copyright (c) 2002, 2017, 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.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-#include "libproc.h"
-
-#if defined(x86_64) && !defined(amd64)
-#define amd64 1
-#endif
-
-#ifdef i386
-#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
-#endif
-
-#ifdef amd64
-#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
-#endif
-
-#if defined(sparc) || defined(sparcv9)
-#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
-#endif
-
-static jfieldID p_ps_prochandle_ID = 0;
-static jfieldID threadList_ID = 0;
-static jfieldID loadObjectList_ID = 0;
-
-static jmethodID createClosestSymbol_ID = 0;
-static jmethodID createLoadObject_ID = 0;
-static jmethodID getThreadForThreadId_ID = 0;
-static jmethodID listAdd_ID = 0;
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
- (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
- jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
- return (struct ps_prochandle*)(intptr_t)ptr;
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
- (JNIEnv *env, jclass cls) {
- jclass listClass;
-
- if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
- THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
- }
-
- // fields we use
- p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
- CHECK_EXCEPTION;
- threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
- CHECK_EXCEPTION;
- loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
- CHECK_EXCEPTION;
-
- // methods we use
- createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
- "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
- CHECK_EXCEPTION;
- createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
- "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
- CHECK_EXCEPTION;
- getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
- "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
- CHECK_EXCEPTION;
- // java.util.List method we call
- listClass = (*env)->FindClass(env, "java/util/List");
- CHECK_EXCEPTION;
- listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
- CHECK_EXCEPTION;
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
- (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-
-static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
- int n = 0, i = 0;
-
- // add threads
- n = get_num_threads(ph);
- for (i = 0; i < n; i++) {
- jobject thread;
- jobject threadList;
- lwpid_t lwpid;
-
- lwpid = get_lwp_id(ph, i);
- thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
- (jlong)lwpid);
- CHECK_EXCEPTION;
- threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
- CHECK_EXCEPTION;
- (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
- CHECK_EXCEPTION;
- }
-
- // add load objects
- n = get_num_libs(ph);
- for (i = 0; i < n; i++) {
- uintptr_t base;
- const char* name;
- jobject loadObject;
- jobject loadObjectList;
-
- base = get_lib_base(ph, i);
- name = get_lib_name(ph, i);
- loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
- (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
- CHECK_EXCEPTION;
- loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
- CHECK_EXCEPTION;
- (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
- CHECK_EXCEPTION;
- }
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
- (JNIEnv *env, jobject this_obj, jint jpid) {
-
- struct ps_prochandle* ph;
- if ( (ph = Pgrab(jpid)) == NULL) {
- THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
- }
- (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
- fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
- (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
- const char *execName_cstr;
- const char *coreName_cstr;
- jboolean isCopy;
- struct ps_prochandle* ph;
-
- execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
- CHECK_EXCEPTION;
- coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
- CHECK_EXCEPTION;
-
- if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
- (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
- (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
- THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
- }
- (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
- (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
- (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
- fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
- (JNIEnv *env, jobject this_obj) {
- struct ps_prochandle* ph = get_proc_handle(env, this_obj);
- if (ph != NULL) {
- Prelease(ph);
- }
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
- (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
- const char *objectName_cstr, *symbolName_cstr;
- jlong addr;
- jboolean isCopy;
- struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-
- objectName_cstr = NULL;
- if (objectName != NULL) {
- objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
- CHECK_EXCEPTION_(0);
- }
- symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
- CHECK_EXCEPTION_(0);
-
- addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
-
- if (objectName_cstr != NULL) {
- (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
- }
- (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
- return addr;
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
- (JNIEnv *env, jobject this_obj, jlong addr) {
- uintptr_t offset;
- const char* sym = NULL;
-
- struct ps_prochandle* ph = get_proc_handle(env, this_obj);
- sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
- if (sym == NULL) return 0;
- return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
- (*env)->NewStringUTF(env, sym), (jlong)offset);
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
- (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
-
- jboolean isCopy;
- jbyteArray array;
- jbyte *bufPtr;
- ps_err_e err;
-
- array = (*env)->NewByteArray(env, numBytes);
- CHECK_EXCEPTION_(0);
- bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
- CHECK_EXCEPTION_(0);
-
- err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
- (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
- return (err == PS_OK)? array : 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
- (JNIEnv *env, jobject this_obj, jint lwp_id) {
-
- struct reg gregs;
- jboolean isCopy;
- jlongArray array;
- jlong *regs;
-
- struct ps_prochandle* ph = get_proc_handle(env, this_obj);
- if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
- THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
- }
-
-#undef NPRGREG
-#ifdef i386
-#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
-#endif
-#ifdef amd64
-#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
-#endif
-#if defined(sparc) || defined(sparcv9)
-#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
-#endif
-
- array = (*env)->NewLongArray(env, NPRGREG);
- CHECK_EXCEPTION_(0);
- regs = (*env)->GetLongArrayElements(env, array, &isCopy);
-
-#undef REG_INDEX
-
-#ifdef i386
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
-
- regs[REG_INDEX(GS)] = (uintptr_t) gregs.r_gs;
- regs[REG_INDEX(FS)] = (uintptr_t) gregs.r_fs;
- regs[REG_INDEX(ES)] = (uintptr_t) gregs.r_es;
- regs[REG_INDEX(DS)] = (uintptr_t) gregs.r_ds;
- regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi;
- regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi;
- regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp;
- regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp;
- regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx;
- regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx;
- regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx;
- regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax;
- regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip;
- regs[REG_INDEX(CS)] = (uintptr_t) gregs.r_cs;
- regs[REG_INDEX(SS)] = (uintptr_t) gregs.r_ss;
-
-#endif /* i386 */
-
-#ifdef amd64
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
-
- regs[REG_INDEX(R15)] = gregs.r_r15;
- regs[REG_INDEX(R14)] = gregs.r_r14;
- regs[REG_INDEX(R13)] = gregs.r_r13;
- regs[REG_INDEX(R12)] = gregs.r_r12;
- regs[REG_INDEX(RBP)] = gregs.r_rbp;
- regs[REG_INDEX(RBX)] = gregs.r_rbx;
- regs[REG_INDEX(R11)] = gregs.r_r11;
- regs[REG_INDEX(R10)] = gregs.r_r10;
- regs[REG_INDEX(R9)] = gregs.r_r9;
- regs[REG_INDEX(R8)] = gregs.r_r8;
- regs[REG_INDEX(RAX)] = gregs.r_rax;
- regs[REG_INDEX(RCX)] = gregs.r_rcx;
- regs[REG_INDEX(RDX)] = gregs.r_rdx;
- regs[REG_INDEX(RSI)] = gregs.r_rsi;
- regs[REG_INDEX(RDI)] = gregs.r_rdi;
- regs[REG_INDEX(RIP)] = gregs.r_rip;
- regs[REG_INDEX(CS)] = gregs.r_cs;
- regs[REG_INDEX(RSP)] = gregs.r_rsp;
- regs[REG_INDEX(SS)] = gregs.r_ss;
-// regs[REG_INDEX(FSBASE)] = gregs.fs_base;
-// regs[REG_INDEX(GSBASE)] = gregs.gs_base;
-// regs[REG_INDEX(DS)] = gregs.ds;
-// regs[REG_INDEX(ES)] = gregs.es;
-// regs[REG_INDEX(FS)] = gregs.fs;
-// regs[REG_INDEX(GS)] = gregs.gs;
-
-#endif /* amd64 */
-
-#if defined(sparc) || defined(sparcv9)
-
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
-
-#ifdef _LP64
- regs[REG_INDEX(R_PSR)] = gregs.tstate;
- regs[REG_INDEX(R_PC)] = gregs.tpc;
- regs[REG_INDEX(R_nPC)] = gregs.tnpc;
- regs[REG_INDEX(R_Y)] = gregs.y;
-#else
- regs[REG_INDEX(R_PSR)] = gregs.psr;
- regs[REG_INDEX(R_PC)] = gregs.pc;
- regs[REG_INDEX(R_nPC)] = gregs.npc;
- regs[REG_INDEX(R_Y)] = gregs.y;
-#endif
- regs[REG_INDEX(R_G0)] = 0 ;
- regs[REG_INDEX(R_G1)] = gregs.u_regs[0];
- regs[REG_INDEX(R_G2)] = gregs.u_regs[1];
- regs[REG_INDEX(R_G3)] = gregs.u_regs[2];
- regs[REG_INDEX(R_G4)] = gregs.u_regs[3];
- regs[REG_INDEX(R_G5)] = gregs.u_regs[4];
- regs[REG_INDEX(R_G6)] = gregs.u_regs[5];
- regs[REG_INDEX(R_G7)] = gregs.u_regs[6];
- regs[REG_INDEX(R_O0)] = gregs.u_regs[7];
- regs[REG_INDEX(R_O1)] = gregs.u_regs[8];
- regs[REG_INDEX(R_O2)] = gregs.u_regs[ 9];
- regs[REG_INDEX(R_O3)] = gregs.u_regs[10];
- regs[REG_INDEX(R_O4)] = gregs.u_regs[11];
- regs[REG_INDEX(R_O5)] = gregs.u_regs[12];
- regs[REG_INDEX(R_O6)] = gregs.u_regs[13];
- regs[REG_INDEX(R_O7)] = gregs.u_regs[14];
-#endif /* sparc */
-
-
- (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
- return array;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/StubDebuggerLocal.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
- (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
- (JNIEnv *env, jclass cls) {
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
- (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
- (JNIEnv *env, jobject this_obj, jint jpid) {
-
- THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
- (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
- THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
- (JNIEnv *env, jobject this_obj) {
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
- (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
- return 0;
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
- (JNIEnv *env, jobject this_obj, jlong addr) {
- return 0;
-}
-
-/*
- * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method: readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
- (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
- return 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
- (JNIEnv *env, jobject this_obj, jint lwp_id) {
- return 0;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_proc.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-/*
- * Copyright (c) 2003, 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.
- *
- */
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/ptrace.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <elf.h>
-#include <sys/elf_common.h>
-#include <sys/link_elf.h>
-#include <libutil.h>
-#include "libproc_impl.h"
-#include "elfmacros.h"
-
-// This file has the libproc implementation specific to live process
-// For core files, refer to ps_core.c
-
-static inline uintptr_t align(uintptr_t ptr, size_t size) {
- return (ptr & ~(size - 1));
-}
-
-// ---------------------------------------------
-// ptrace functions
-// ---------------------------------------------
-
-// read "size" bytes of data from "addr" within the target process.
-// unlike the standard ptrace() function, process_read_data() can handle
-// unaligned address - alignment check, if required, should be done
-// before calling process_read_data.
-
-static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
- int rslt;
- size_t i, words;
- uintptr_t end_addr = addr + size;
- uintptr_t aligned_addr = align(addr, sizeof(int));
-
- if (aligned_addr != addr) {
- char *ptr = (char *)&rslt;
- errno = 0;
- rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
- print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
- for (; aligned_addr != addr; aligned_addr++, ptr++);
- for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
- aligned_addr++)
- *(buf++) = *(ptr++);
- }
-
- words = (end_addr - aligned_addr) / sizeof(int);
-
- // assert((intptr_t)aligned_addr % sizeof(int) == 0);
- for (i = 0; i < words; i++) {
- errno = 0;
- rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
- print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
- *(int *)buf = rslt;
- buf += sizeof(int);
- aligned_addr += sizeof(int);
- }
-
- if (aligned_addr != end_addr) {
- char *ptr = (char *)&rslt;
- errno = 0;
- rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
- print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
- for (; aligned_addr != end_addr; aligned_addr++)
- *(buf++) = *(ptr++);
- }
- return true;
-}
-
-// null implementation for write
-static bool process_write_data(struct ps_prochandle* ph,
- uintptr_t addr, const char *buf , size_t size) {
- return false;
-}
-
-// "user" should be a pointer to a reg
-static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) {
- // we have already attached to all thread 'pid's, just use ptrace call
- // to get regset now. Note that we don't cache regset upfront for processes.
- if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) {
- print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
- return false;
- }
- return true;
-}
-
-// fill in ptrace_lwpinfo for lid
-static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
- errno = 0;
- ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo));
-
- return (errno == 0)? true: false;
-}
-
-static bool ptrace_continue(pid_t pid, int signal) {
- // pass the signal to the process so we don't swallow it
- if (ptrace(PT_CONTINUE, pid, NULL, signal) < 0) {
- print_debug("ptrace(PTRACE_CONT, ..) failed for %d\n", pid);
- return false;
- }
- return true;
-}
-
-// waits until the ATTACH has stopped the process
-// by signal SIGSTOP
-static bool ptrace_waitpid(pid_t pid) {
- int ret;
- int status;
- do {
- // Wait for debuggee to stop.
- ret = waitpid(pid, &status, 0);
- if (ret >= 0) {
- if (WIFSTOPPED(status)) {
- // Any signal will stop the thread, make sure it is SIGSTOP. Otherwise SIGSTOP
- // will still be pending and delivered when the process is DETACHED and the process
- // will go to sleep.
- if (WSTOPSIG(status) == SIGSTOP) {
- // Debuggee stopped by SIGSTOP.
- return true;
- }
- if (!ptrace_continue(pid, WSTOPSIG(status))) {
- print_error("Failed to correctly attach to VM. VM might HANG! [PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status));
- return false;
- }
- } else {
- print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
- return false;
- }
- } else {
- switch (errno) {
- case EINTR:
- continue;
- break;
- case ECHILD:
- print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
- break;
- case EINVAL:
- print_debug("waitpid() failed. Invalid options argument.\n");
- break;
- default:
- print_debug("waitpid() failed. Unexpected error %d\n",errno);
- }
- return false;
- }
- } while(true);
-}
-
-// attach to a process/thread specified by "pid"
-static bool ptrace_attach(pid_t pid) {
- if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) {
- print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
- return false;
- } else {
- return ptrace_waitpid(pid);
- }
-}
-
-// -------------------------------------------------------
-// functions for obtaining library information
-// -------------------------------------------------------
-
-// callback for read_thread_info
-static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
- return add_thread_info(ph, pthread_id, lwp_id) != NULL;
-}
-
-#if defined(__FreeBSD__) && __FreeBSD_version < 701000
-/*
- * TEXT_START_ADDR from binutils/ld/emulparams/<arch_spec>.sh
- * Not the most robust but good enough.
- */
-
-#if defined(amd64) || defined(x86_64)
-#define TEXT_START_ADDR 0x400000
-#elif defined(i386)
-#define TEXT_START_ADDR 0x8048000
-#else
-#error TEXT_START_ADDR not defined
-#endif
-
-#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
-
-uintptr_t linkmap_addr(struct ps_prochandle *ph) {
- uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr;
- ELF_EHDR ehdr;
- ELF_PHDR *phdrs, *phdr;
- ELF_DYN *dyns, *dyn;
- struct r_debug dmap;
- unsigned long hdrs_size;
- unsigned int i;
-
- /* read ELF_EHDR at TEXT_START_ADDR and validate */
-
- ehdr_addr = (uintptr_t)TEXT_START_ADDR;
-
- if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) {
- print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr);
- return (0);
- }
-
- if (!IS_ELF(ehdr) ||
- ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS ||
- ehdr.e_ident[EI_DATA] != ELF_TARG_DATA ||
- ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
- ehdr.e_phentsize != sizeof(ELF_PHDR) ||
- ehdr.e_version != ELF_TARG_VER ||
- ehdr.e_machine != ELF_TARG_MACH) {
- print_debug("not an ELF_EHDR at %p\n", ehdr_addr);
- return (0);
- }
-
- /* allocate space for all ELF_PHDR's and read */
-
- phdr_addr = ehdr_addr + ehdr.e_phoff;
- hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR);
-
- if ((phdrs = malloc(hdrs_size)) == NULL)
- return (0);
-
- if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) {
- print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr);
- return (0);
- }
-
- /* find PT_DYNAMIC section */
-
- for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) {
- if (phdr->p_type == PT_DYNAMIC)
- break;
- }
-
- if (i >= ehdr.e_phnum) {
- print_debug("PT_DYNAMIC section not found!\n");
- free(phdrs);
- return (0);
- }
-
- /* allocate space and read in ELF_DYN headers */
-
- dyn_addr = phdr->p_vaddr;
- hdrs_size = phdr->p_memsz;
- free(phdrs);
-
- if ((dyns = malloc(hdrs_size)) == NULL)
- return (0);
-
- if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) {
- print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr);
- free(dyns);
- return (0);
- }
-
- /* find DT_DEBUG */
-
- dyn = dyns;
- while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) {
- dyn++;
- }
-
- if (dyn->d_tag != DT_DEBUG) {
- print_debug("failed to find DT_DEBUG\n");
- free(dyns);
- return (0);
- }
-
- /* read struct r_debug into dmap */
-
- dmap_addr = (uintptr_t)dyn->d_un.d_ptr;
- free(dyns);
-
- if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) {
- print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr);
- return (0);
- }
-
- lmap_addr = (uintptr_t)dmap.r_map;
-
- return (lmap_addr);
-}
-#endif // __FreeBSD__ && __FreeBSD_version < 701000
-
-static bool read_lib_info(struct ps_prochandle* ph) {
-#if defined(__FreeBSD__) && __FreeBSD_version >= 701000
- struct kinfo_vmentry *freep, *kve;
- int i, cnt;
-
- freep = kinfo_getvmmap(ph->pid, &cnt);
- if (freep == NULL) {
- print_debug("can't get vm map for pid\n", ph->pid);
- return false;
- }
-
- for (i = 0; i < cnt; i++) {
- kve = &freep[i];
- if ((kve->kve_flags & KVME_FLAG_COW) &&
- kve->kve_path != NULL &&
- strlen(kve->kve_path) > 0) {
-
- if (find_lib(ph, kve->kve_path) == false) {
- lib_info* lib;
- if ((lib = add_lib_info(ph, kve->kve_path,
- (uintptr_t) kve->kve_start)) == NULL)
- continue; // ignore, add_lib_info prints error
-
- // we don't need to keep the library open, symtab is already
- // built. Only for core dump we need to keep the fd open.
- close(lib->fd);
- lib->fd = -1;
- }
- }
- }
-
- free(freep);
-
- return true;
-#else
- char *l_name;
- struct link_map *lmap;
- uintptr_t lmap_addr;
-
- if ((l_name = malloc(BUF_SIZE)) == NULL)
- return false;
-
- if ((lmap = malloc(sizeof(*lmap))) == NULL) {
- free(l_name);
- return false;
- }
-
- lmap_addr = linkmap_addr(ph);
-
- if (lmap_addr == 0) {
- free(l_name);
- free(lmap);
- return false;
- }
-
- do {
- if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) {
- print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr);
- free (l_name);
- free (lmap);
- return false;
- }
-
- if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name,
- BUF_SIZE) != true) {
- print_debug("process_read_data failed for lmap->l_name %p\n",
- lmap->l_name);
- free (l_name);
- free (lmap);
- return false;
- }
-
- if (find_lib(ph, l_name) == false) {
- lib_info* lib;
- if ((lib = add_lib_info(ph, l_name,
- (uintptr_t) lmap->l_addr)) == NULL)
- continue; // ignore, add_lib_info prints error
-
- // we don't need to keep the library open, symtab is already
- // built. Only for core dump we need to keep the fd open.
- close(lib->fd);
- lib->fd = -1;
- }
- lmap_addr = (uintptr_t)lmap->l_next;
- } while (lmap->l_next != NULL);
-
- free (l_name);
- free (lmap);
-
- return true;
-#endif
-}
-
-// detach a given pid
-static bool ptrace_detach(pid_t pid) {
- if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) {
- print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
- return false;
- } else {
- return true;
- }
-}
-
-static void process_cleanup(struct ps_prochandle* ph) {
- ptrace_detach(ph->pid);
-}
-
-static ps_prochandle_ops process_ops = {
- .release= process_cleanup,
- .p_pread= process_read_data,
- .p_pwrite= process_write_data,
- .get_lwp_regs= process_get_lwp_regs,
- .get_lwp_info= process_get_lwp_info
-};
-
-// attach to the process. One and only one exposed stuff
-struct ps_prochandle* Pgrab(pid_t pid) {
- struct ps_prochandle* ph = NULL;
-
- if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) {
- print_debug("can't allocate memory for ps_prochandle\n");
- return NULL;
- }
-
- if (ptrace_attach(pid) != true) {
- free(ph);
- return NULL;
- }
-
- // initialize ps_prochandle
- ph->pid = pid;
-
- // initialize vtable
- ph->ops = &process_ops;
-
- // read library info and symbol tables, must do this before attaching threads,
- // as the symbols in the pthread library will be used to figure out
- // the list of threads within the same process.
- if (read_lib_info(ph) != true) {
- ptrace_detach(pid);
- free(ph);
- return NULL;
- }
-
- // read thread info
- read_thread_info(ph, add_new_thread);
-
- return ph;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/salibelf.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2003, 2006, 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.
- *
- */
-
-#include "salibelf.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-extern void print_debug(const char*,...);
-
-// ELF file parsing helpers. Note that we do *not* use libelf here.
-int read_elf_header(int fd, ELF_EHDR* ehdr) {
- if (pread(fd, ehdr, sizeof (ELF_EHDR), 0) != sizeof (ELF_EHDR) ||
- memcmp(&ehdr->e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 ||
- ehdr->e_version != EV_CURRENT) {
- return 0;
- }
- return 1;
-}
-
-bool is_elf_file(int fd) {
- ELF_EHDR ehdr;
- return read_elf_header(fd, &ehdr);
-}
-
-// read program header table of an ELF file
-ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr) {
- ELF_PHDR* phbuf = 0;
- // allocate memory for program header table
- size_t nbytes = hdr->e_phnum * hdr->e_phentsize;
-
- if ((phbuf = (ELF_PHDR*) malloc(nbytes)) == NULL) {
- print_debug("can't allocate memory for reading program header table\n");
- return NULL;
- }
-
- if (pread(fd, phbuf, nbytes, hdr->e_phoff) != nbytes) {
- print_debug("ELF file is truncated! can't read program header table\n");
- free(phbuf);
- return NULL;
- }
-
- return phbuf;
-}
-
-// read section header table of an ELF file
-ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr) {
- ELF_SHDR* shbuf = 0;
- // allocate memory for section header table
- size_t nbytes = hdr->e_shnum * hdr->e_shentsize;
-
- if ((shbuf = (ELF_SHDR*) malloc(nbytes)) == NULL) {
- print_debug("can't allocate memory for reading section header table\n");
- return NULL;
- }
-
- if (pread(fd, shbuf, nbytes, hdr->e_shoff) != nbytes) {
- print_debug("ELF file is truncated! can't read section header table\n");
- free(shbuf);
- return NULL;
- }
-
- return shbuf;
-}
-
-// read a particular section's data
-void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr) {
- void *buf = NULL;
- if (shdr->sh_type == SHT_NOBITS || shdr->sh_size == 0) {
- return buf;
- }
- if ((buf = calloc(shdr->sh_size, 1)) == NULL) {
- print_debug("can't allocate memory for reading section data\n");
- return NULL;
- }
- if (pread(fd, buf, shdr->sh_size, shdr->sh_offset) != shdr->sh_size) {
- free(buf);
- print_debug("section data read failed\n");
- return NULL;
- }
- return buf;
-}
-
-uintptr_t find_base_address(int fd, ELF_EHDR* ehdr) {
- uintptr_t baseaddr = (uintptr_t)-1;
- int cnt;
- ELF_PHDR *phbuf, *phdr;
-
- // read program header table
- if ((phbuf = read_program_header_table(fd, ehdr)) == NULL) {
- goto quit;
- }
-
- // the base address of a shared object is the lowest vaddr of
- // its loadable segments (PT_LOAD)
- for (phdr = phbuf, cnt = 0; cnt < ehdr->e_phnum; cnt++, phdr++) {
- if (phdr->p_type == PT_LOAD && phdr->p_vaddr < baseaddr) {
- baseaddr = phdr->p_vaddr;
- }
- }
-
-quit:
- if (phbuf) free(phbuf);
- return baseaddr;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/test.c Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, 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.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "libproc.h"
-
-int main(int argc, char** argv) {
- struct ps_prochandle* ph;
-
- init_libproc(true);
- switch (argc) {
- case 2: {
- // process
- ph = Pgrab(atoi(argv[1]));
- break;
- }
-
- case 3: {
- // core
- ph = Pgrab_core(argv[1], argv[2]);
- break;
- }
-
- default: {
- fprintf(stderr, "usage %s <pid> or %s <exec file> <core file>\n", argv[0], argv[0]);
- return 1;
- }
- }
-
- if (ph) {
- Prelease(ph);
- return 0;
- } else {
- printf("can't connect to debuggee\n");
- return 1;
- }
-}
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -510,7 +510,7 @@
static {
/*
- * sawindbg.dll depends on dbgeng.dll which itself depends on
+ * saproc.dll depends on dbgeng.dll which itself depends on
* dbghelp.dll. We have to make sure that the dbgeng.dll and
* dbghelp.dll that we load are compatible with each other. We
* load both of those libraries from the same directory based
@@ -538,18 +538,18 @@
String dbgengPath = null;
String dbghelpPath = null;
- String sawindbgPath = null;
+ String saprocPath = null;
List searchList = new ArrayList();
boolean loadLibraryDEBUG =
System.getProperty("sun.jvm.hotspot.loadLibrary.DEBUG") != null;
{
- // First place to search is co-located with sawindbg.dll in
+ // First place to search is co-located with saproc.dll in
// $JAVA_HOME/jre/bin (java.home property is set to $JAVA_HOME/jre):
searchList.add(System.getProperty("java.home") + File.separator + "bin");
- sawindbgPath = (String) searchList.get(0) + File.separator +
- "sawindbg.dll";
+ saprocPath = (String) searchList.get(0) + File.separator +
+ "saproc.dll";
// second place to search is specified by an environment variable:
String DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS");
@@ -646,11 +646,11 @@
}
System.load(dbgengPath);
- // Now, load sawindbg.dll
+ // Now, load saproc.dll
if (loadLibraryDEBUG) {
- System.err.println("DEBUG: loading '" + sawindbgPath + "'.");
+ System.err.println("DEBUG: loading '" + saprocPath + "'.");
}
- System.load(sawindbgPath);
+ System.load(saprocPath);
// where do I find '.exe', '.dll' files?
imagePath = System.getProperty("sun.jvm.hotspot.debugger.windbg.imagePath");
--- a/src/jdk.hotspot.agent/solaris/native/libsaproc/saproc_audit.cpp Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- *
- */
-
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <varargs.h>
-
-// This class sets up an interposer on open calls from libproc.so to
-// support a pathmap facility in the SA.
-
-static uintptr_t* libproc_cookie;
-static uintptr_t* libc_cookie;
-static uintptr_t* libsaproc_cookie;
-
-
-uint_t
-la_version(uint_t version)
-{
- return (LAV_CURRENT);
-}
-
-
-uint_t
-la_objopen(Link_map * lmp, Lmid_t lmid, uintptr_t * cookie)
-{
- if (strstr(lmp->l_name, "/libproc.so") != NULL) {
- libproc_cookie = cookie;
- return LA_FLG_BINDFROM;
- }
- if (strstr(lmp->l_name, "/libc.so") != NULL) {
- libc_cookie = cookie;
- return LA_FLG_BINDTO;
- }
- if (strstr(lmp->l_name, "/libsaproc.so") != NULL) {
- libsaproc_cookie = cookie;
- return LA_FLG_BINDTO | LA_FLG_BINDFROM;
- }
- return 0;
-}
-
-
-#if defined(_LP64)
-uintptr_t
-la_symbind64(Elf64_Sym *symp, uint_t symndx, uintptr_t *refcook,
- uintptr_t *defcook, uint_t *sb_flags, const char *sym_name)
-#else
-uintptr_t
-la_symbind32(Elf32_Sym *symp, uint_t symndx, uintptr_t *refcook,
- uintptr_t *defcook, uint_t *sb_flags)
-#endif
-{
-#if !defined(_LP64)
- const char *sym_name = (const char *)symp->st_name;
-#endif
- if (strcmp(sym_name, "open") == 0 && refcook == libproc_cookie) {
- // redirect all open calls from libproc.so through libsaproc_open which will
- // try the alternate library locations first.
- void* handle = dlmopen(LM_ID_BASE, "libsaproc.so", RTLD_NOLOAD);
- if (handle == NULL) {
- fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc.so during linking\n");
- } else {
- uintptr_t libsaproc_open = (uintptr_t)dlsym(handle, "libsaproc_open");
- if (libsaproc_open == 0) {
- fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc_open during linking\n");
- } else {
- return libsaproc_open;
- }
- }
- }
- return symp->st_value;
-}
--- a/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -43,10 +43,6 @@
#include <limits.h>
#include <windows.h>
-#ifndef STDMETHODV
-#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method
-#endif
-
#define DEBUG_NO_IMPLEMENTATION
#include <dbgeng.h>
#include <dbghelp.h>
--- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java Thu Mar 22 11:34:38 2018 -0700
@@ -407,7 +407,7 @@
}
handle (chan, conn);
} else {
- assert false;
+ assert false : "Unexpected non-readable key:" + key;
}
} catch (CancelledKeyException e) {
handleException(key, null);
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LengthNotWritableFilter.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LengthNotWritableFilter.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,3 +1,28 @@
+/*
+ * Copyright (c) 2014, 2018, 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.arrays;
import java.util.Iterator;
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NonExtensibleArrayFilter.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NonExtensibleArrayFilter.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,3 +1,28 @@
+/*
+ * Copyright (c) 2014, 2018, 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.arrays;
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
--- a/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,6 @@
import sun.nio.ch.DirectBuffer;
import java.lang.reflect.Field;
-import java.security.ProtectionDomain;
/**
@@ -811,25 +810,6 @@
/// random trusted operations from JNI:
/**
- * Tells the VM to define a class, without security checks. By default, the
- * class loader and protection domain come from the caller's class.
- *
- * @deprecated Use {@link java.lang.invoke.MethodHandles.Lookup#defineClass MethodHandles.Lookup#defineClass}
- * to define a class to the same class loader and in the same runtime package
- * and {@linkplain java.security.ProtectionDomain protection domain} of a
- * given {@code Lookup}'s {@linkplain java.lang.invoke.MethodHandles.Lookup#lookupClass() lookup class}.
- *
- * @see java.lang.invoke.MethodHandles.Lookup#defineClass(byte[])
- */
- @Deprecated(since="9", forRemoval=true)
- @ForceInline
- public Class<?> defineClass(String name, byte[] b, int off, int len,
- ClassLoader loader,
- ProtectionDomain protectionDomain) {
- return theInternalUnsafe.defineClass(name, b, off, len, loader, protectionDomain);
- }
-
- /**
* Defines a class but does not make it known to the class loader or system dictionary.
* <p>
* For each CP entry, the corresponding CP patch must either be null or have
--- a/test/jdk/java/nio/Buffer/EqualsCompareTest.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/jdk/java/nio/Buffer/EqualsCompareTest.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
/*
* @test
- * @bug 8193085
+ * @bug 8193085 8199773
* @summary tests for buffer equals and compare
* @run testng EqualsCompareTest
*/
@@ -120,8 +120,9 @@
abstract T construct(int length, ByteOrder bo);
@SuppressWarnings("unchecked")
- T slice(T a, int from, int to) {
- return (T) a.position(from).limit(to).slice();
+ T slice(T a, int from, int to, boolean dupOtherwiseSlice) {
+ a = (T) a.position(from).limit(to);
+ return (T) (dupOtherwiseSlice ? a.duplicate() : a.slice());
}
@SuppressWarnings("unchecked")
@@ -607,60 +608,62 @@
BiFunction<BT, Integer, B> bConstructor) {
int n = arraySizeFor(bt.elementType);
- for (int s : ranges(0, n)) {
- B a = aConstructor.apply(bt, s);
- B b = bConstructor.apply(bt, s);
+ for (boolean dupOtherwiseSlice : new boolean[]{ false, true }) {
+ for (int s : ranges(0, n)) {
+ B a = aConstructor.apply(bt, s);
+ B b = bConstructor.apply(bt, s);
- for (int aFrom : ranges(0, s)) {
- for (int aTo : ranges(aFrom, s)) {
- int aLength = aTo - aFrom;
+ for (int aFrom : ranges(0, s)) {
+ for (int aTo : ranges(aFrom, s)) {
+ int aLength = aTo - aFrom;
- B as = aLength != s
- ? bt.slice(a, aFrom, aTo)
- : a;
+ B as = aLength != s
+ ? bt.slice(a, aFrom, aTo, dupOtherwiseSlice)
+ : a;
- for (int bFrom : ranges(0, s)) {
- for (int bTo : ranges(bFrom, s)) {
- int bLength = bTo - bFrom;
+ for (int bFrom : ranges(0, s)) {
+ for (int bTo : ranges(bFrom, s)) {
+ int bLength = bTo - bFrom;
+
+ B bs = bLength != s
+ ? bt.slice(b, bFrom, bTo, dupOtherwiseSlice)
+ : b;
- B bs = bLength != s
- ? bt.slice(b, bFrom, bTo)
- : b;
+ boolean eq = bt.pairWiseEquals(as, bs);
+ Assert.assertEquals(bt.equals(as, bs), eq);
+ Assert.assertEquals(bt.equals(bs, as), eq);
+ if (eq) {
+ Assert.assertEquals(bt.compare(as, bs), 0);
+ Assert.assertEquals(bt.compare(bs, as), 0);
+ }
+ else {
+ int aCb = bt.compare(as, bs);
+ int bCa = bt.compare(bs, as);
+ int v = Integer.signum(aCb) * Integer.signum(bCa);
+ Assert.assertTrue(v == -1);
+ }
+ }
+ }
- boolean eq = bt.pairWiseEquals(as, bs);
- Assert.assertEquals(bt.equals(as, bs), eq);
- Assert.assertEquals(bt.equals(bs, as), eq);
- if (eq) {
- Assert.assertEquals(bt.compare(as, bs), 0);
- Assert.assertEquals(bt.compare(bs, as), 0);
- }
- else {
- int aCb = bt.compare(as, bs);
- int bCa = bt.compare(bs, as);
- int v = Integer.signum(aCb) * Integer.signum(bCa);
+ if (aLength > 0 && !a.isReadOnly()) {
+ for (int i = aFrom; i < aTo; i++) {
+ B c = aConstructor.apply(bt, a.capacity());
+ B cs = aLength != s
+ ? bt.slice(c, aFrom, aTo, dupOtherwiseSlice)
+ : c;
+
+ // Create common prefix with a length of i - aFrom
+ bt.set(c, i, -1);
+
+ Assert.assertFalse(bt.equals(c, a));
+
+ int cCa = bt.compare(cs, as);
+ int aCc = bt.compare(as, cs);
+ int v = Integer.signum(cCa) * Integer.signum(aCc);
Assert.assertTrue(v == -1);
}
}
}
-
- if (aLength > 0 && !a.isReadOnly()) {
- for (int i = aFrom; i < aTo; i++) {
- B c = aConstructor.apply(bt, a.capacity());
- B cs = aLength != s
- ? bt.slice(c, aFrom, aTo)
- : c;
-
- // Create common prefix with a length of i - aFrom
- bt.set(c, i, -1);
-
- Assert.assertFalse(bt.equals(c, a));
-
- int cCa = bt.compare(cs, as);
- int aCc = bt.compare(as, cs);
- int v = Integer.signum(cCa) * Integer.signum(aCc);
- Assert.assertTrue(v == -1);
- }
- }
}
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/NoGroupingUsed.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * @test
+ * @bug 8196399
+ * @summary test Formatter if any ArithmeticException is thrown while
+ * formatting a number in the locale which does not use any
+ * grouping, but specifies a grouping separator e.g. hy_AM.
+ * @modules jdk.localedata
+ */
+import java.util.Formatter;
+import java.util.Locale;
+
+public class NoGroupingUsed {
+
+ public static void main(String[] args) {
+
+ Locale locale = new Locale("hy", "AM");
+ String number = "1234567";
+ String formatString = "%,d";
+
+ try {
+ testGrouping(locale, formatString, number);
+ } catch (ArithmeticException ex) {
+ throw new RuntimeException("[FAILED: ArithmeticException occurred"
+ + " while formatting the number: " + number + ", with"
+ + " format string: " + formatString + ", in locale: "
+ + locale, ex);
+ }
+
+ }
+
+ private static void testGrouping(Locale locale, String formatString, String number) {
+
+ // test using String.format
+ String result = String.format(locale, formatString, Integer.parseInt(number));
+ if (!number.equals(result)) {
+ throw new RuntimeException("[FAILED: Incorrect formatting"
+ + " of number: " + number + " using String.format with format"
+ + " string: " + formatString + " in locale: " + locale
+ + ". Actual: " + result + ", Expected: " + number + "]");
+ }
+
+ // test using Formatter's format
+ StringBuilder sb = new StringBuilder();
+ Formatter formatter = new Formatter(sb, locale);
+ formatter.format(formatString, Integer.parseInt(number));
+ if (!number.equals(sb.toString())) {
+ throw new RuntimeException("[FAILED: Incorrect formatting"
+ + " of number: " + number + "using Formatter.format with"
+ + " format string: " + formatString + " in locale: " + locale
+ + ". Actual: " + sb.toString() + ", Expected: " + number + "]");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/FormatterWithProvider.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018, 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 8199672
+ * @summary test the Formatter.format() method with java.locale.providers=SPI,
+ * COMPAT. It should not throw ClassCastException if an SPI is
+ * used and NumberFormat.getInstance() does not return a
+ * DecimalFormat object.
+ * @modules jdk.localedata
+ * @library provider
+ * @build provider/module-info provider/test.NumberFormatProviderImpl
+ * @run main/othervm -Djava.locale.providers=SPI,COMPAT FormatterWithProvider
+ */
+
+import java.util.Formatter;
+import java.util.Locale;
+
+public class FormatterWithProvider {
+
+ public static void main(String[] args) {
+
+ Integer number = 1234567;
+ String formatString = "%,d";
+
+ try {
+ testFormatter(Locale.JAPANESE, formatString, number);
+ testFormatter(Locale.FRENCH, formatString, number);
+ testFormatter(new Locale("hi", "IN"), formatString, number);
+
+ } catch (ClassCastException ex) {
+ throw new RuntimeException("[FAILED: A ClassCastException is" +
+ " thrown while using Formatter.format() with VM" +
+ " argument java.locale.providers=SPI,COMPAT]", ex);
+ }
+ }
+
+ private static void testFormatter(Locale locale, String formatString,
+ Integer number) {
+
+ // test using String.format
+ String.format(locale, formatString, number);
+ // test using Formatter's format
+ Formatter formatter = new Formatter(locale);
+ formatter.format(formatString, number);
+ }
+
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/provider/module-info.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018, 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.
+*/
+module provider {
+ exports test;
+ provides java.text.spi.NumberFormatProvider with test.NumberFormatProviderImpl;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/provider/test/NumberFormatProviderImpl.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+package test;
+
+import java.text.FieldPosition;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.text.spi.NumberFormatProvider;
+import java.util.Locale;
+
+public class NumberFormatProviderImpl extends NumberFormatProvider {
+
+ private static final Locale[] locales = {Locale.FRENCH, Locale.JAPANESE,
+ new Locale("hi", "IN")};
+
+ @Override
+ public NumberFormat getCurrencyInstance(Locale locale) {
+ return null;
+ }
+
+ @Override
+ public NumberFormat getIntegerInstance(Locale locale) {
+ return null;
+ }
+
+ @Override
+ public NumberFormat getNumberInstance(Locale locale) {
+ return null;
+ }
+
+ @Override
+ public NumberFormat getPercentInstance(Locale locale) {
+ return null;
+ }
+
+ @Override
+ public Locale[] getAvailableLocales() {
+ return locales;
+ }
+}
+
--- a/test/jdk/sun/security/krb5/auto/KdcPolicy.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/jdk/sun/security/krb5/auto/KdcPolicy.java Thu Mar 22 11:34:38 2018 -0700
@@ -100,9 +100,11 @@
System.setProperty("java.security.krb5.conf", "alternative-krb5.conf");
// Check default timeout is 30s. Use real KDC only, otherwise too
- // slow to wait for timeout.
+ // slow to wait for timeout. Each request (without preauth and with
+ // preauth) might be retried 3 times, and could fail if one fails for
+ // all 3 times.
writeConf(-1, -1, p3);
- test("c30000c30000");
+ test("(c30000){2,6}|(c30000){3,6}-");
// 1. Default policy is tryLast
//Security.setProperty("krb5.kdc.bad.policy", "tryLast");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/MultipleDocLintOptionsTest.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,12 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8198552
+ * @summary Check that -Xdoclint: option can be specified multiple times
+ * @compile/fail/ref=MultipleDocLintOptionsTest.out -Xdoclint:html -Xdoclint:syntax -XDrawDiagnostics MultipleDocLintOptionsTest.java
+ */
+
+/** <html> */
+public class MultipleDocLintOptionsTest {
+ /** @return */
+ int emptyReturn() { return -1; }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/MultipleDocLintOptionsTest.out Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+MultipleDocLintOptionsTest.java:8:5: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+MultipleDocLintOptionsTest.java:8:5: compiler.err.proc.messager: element not closed: html
+MultipleDocLintOptionsTest.java:10:9: compiler.warn.proc.messager: no description for @return
+2 errors
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/MultiPackage.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2018, 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 8198552
+ * @summary Check that -Xdoclint/package: option can be specified multiple times
+ * @compile/fail/ref=MultiPackage.out -Xdoclint:html -Xdoclint/package:p1 -Xdoclint/package:p2 -XDrawDiagnostics p1/Test1.java p2/Test2.java
+ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/MultiPackage.out Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+Test1.java:4:4: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+Test1.java:4:4: compiler.err.proc.messager: element not closed: html
+Test2.java:4:4: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+Test2.java:4:4: compiler.err.proc.messager: element not closed: html
+4 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/p1/Test1.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+/*/nodynamiccopyright/*/
+package p1;
+
+/**<html>*/
+public class Test1 {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/p2/Test2.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+/*/nodynamiccopyright/*/
+package p2;
+
+/**<html>*/
+public class Test2 {}
--- a/test/langtools/tools/javac/TryWithResources/TwrClose.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/TryWithResources/TwrClose.java Thu Mar 22 11:34:38 2018 -0700
@@ -27,7 +27,6 @@
* @summary Verify that the close resource code works properly in all cases
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
- * jdk.compiler/com.sun.tools.javac.comp
* jdk.compiler/com.sun.tools.javac.main
* @build toolbox.ToolBox TwrClose
* @run main TwrClose
@@ -37,15 +36,14 @@
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
-import com.sun.tools.javac.comp.Lower;
-
import toolbox.JavacTask;
import toolbox.ToolBox;
public class TwrClose {
+ private static final int MAX_RESOURCES = 5;
public static void main(String... args) throws Exception {
- for (int i = 1; i < Lower.USE_CLOSE_RESOURCE_METHOD_THRESHOLD * 2; i++) {
+ for (int i = 1; i < MAX_RESOURCES * 2; i++) {
new TwrClose().compile(i);
}
}
--- a/test/langtools/tools/javac/TryWithResources/TwrShareCloseCode.java Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 7020499
- * @summary Verify that the code that closes the resources is shared by among try-with-resources
- * @library /tools/lib
- * @modules jdk.compiler/com.sun.tools.javac.api
- * jdk.compiler/com.sun.tools.javac.code
- * jdk.compiler/com.sun.tools.javac.comp
- * jdk.compiler/com.sun.tools.javac.tree
- * jdk.compiler/com.sun.tools.javac.util
- * @build toolbox.ToolBox TwrShareCloseCode
- * @run main TwrShareCloseCode
- */
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import com.sun.source.util.JavacTask;
-import com.sun.tools.javac.api.JavacTool;
-import com.sun.tools.javac.comp.AttrContext;
-import com.sun.tools.javac.comp.Env;
-import com.sun.tools.javac.comp.Lower;
-import com.sun.tools.javac.tree.JCTree;
-import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
-import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
-import com.sun.tools.javac.tree.TreeInfo;
-import com.sun.tools.javac.tree.TreeMaker;
-import com.sun.tools.javac.tree.TreeScanner;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.Context.Factory;
-import com.sun.tools.javac.util.List;
-
-import toolbox.ToolBox;
-
-public class TwrShareCloseCode {
- public static void main(String... args) throws IOException {
- new TwrShareCloseCode().run();
- }
-
- void run() throws IOException {
- run("try (Test t1 = new Test()) { }", true);
- run("try (Test t1 = new Test()) { }\n" +
- "try (Test t2 = new Test()) { }", true);
- run("try (Test t1 = new Test();\n" +
- " Test t2 = new Test()) { }", true);
- run("try (Test t1 = new Test()) { }\n" +
- "try (Test t2 = new Test()) { }\n" +
- "try (Test t3 = new Test()) { }", true);
- run("try (Test t1 = new Test();\n" +
- " Test t2 = new Test();\n" +
- " Test t3 = new Test()) { }", false);
- run("try (Test t1 = new Test()) { }\n" +
- "try (Test t2 = new Test()) { }\n" +
- "try (Test t3 = new Test()) { }\n" +
- "try (Test t4 = new Test()) { }", false);
-
- run("try (Test t1 = new Test()) { i++; }", true);
- run("try (Test t1 = new Test()) { i++; }\n" +
- "try (Test t2 = new Test()) { i++; }", false);
-
- run("try (Test t1 = new Test(); Test t2 = new Test()) { i++; }", false);
-
- run("try (Test t1 = new Test()) { i++; }\n" +
- "try (Test t2 = new Test()) { }", true);
-
- run("try (Test t1 = new Test()) { i++; }\n" +
- "try (Test t2 = new Test()) { }\n" +
- "try (Test t3 = new Test()) { }", false);
-
- run("try (Test t1 = new Test()) { i++; }\n" +
- "try (Test t2 = new Test()) { i++; }\n" +
- "try (Test t3 = new Test()) { }", false);
- }
- void run(String trySpec, boolean expected) throws IOException {
- String template = "public class Test implements AutoCloseable {\n" +
- " void t(int i) {\n" +
- " TRY\n" +
- " }\n" +
- " public void close() { }\n" +
- "}\n";
- String code = template.replace("TRY", trySpec);
- Context ctx = new Context();
- DumpLower.preRegister(ctx);
- Iterable<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource(code));
- JavacTask task = JavacTool.create().getTask(null, null, null, null, null, files, ctx);
- task.call();
- boolean actual = ((DumpLower) DumpLower.instance(ctx)).closeSeen;
-
- if (expected != actual) {
- throw new IllegalStateException("expected: " + expected + "; actual: " + actual + "; code:\n" + code);
- }
- }
-
- static class DumpLower extends Lower {
-
- public static void preRegister(Context ctx) {
- ctx.put(lowerKey, new Factory<Lower>() {
- @Override
- public Lower make(Context c) {
- return new DumpLower(c);
- }
- });
- }
-
- public DumpLower(Context context) {
- super(context);
- }
-
- boolean closeSeen;
-
- @Override
- public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMaker make) {
- List<JCTree> result = super.translateTopLevelClass(env, cdef, make);
-
- new TreeScanner() {
- @Override
- public void visitMethodDef(JCMethodDecl tree) {
- if (!tree.name.contentEquals("t"))
- return;
-
- super.visitMethodDef(tree);
- }
-
- @Override
- public void visitApply(JCMethodInvocation tree) {
- closeSeen |= TreeInfo.symbol(tree.meth).name.contentEquals("close");
- super.visitApply(tree);
- }
- }.scan(result);
-
- return result;
- }
-
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/TryWithResources/TwrSimpleClose.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2018, 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 8194978
+ * @summary Verify than an appropriate number of close method invocations is generated.
+ * @library /tools/lib
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ * @build toolbox.ToolBox TwrSimpleClose
+ * @run main TwrSimpleClose
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.tools.FileObject;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+
+import com.sun.source.util.JavacTask;
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.Code_attribute;
+import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info;
+import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info;
+import com.sun.tools.classfile.Instruction;
+import com.sun.tools.classfile.Method;
+import com.sun.tools.classfile.Opcode;
+
+import toolbox.ToolBox;
+
+public class TwrSimpleClose {
+
+ private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+
+ public static void main(String... args) throws Exception {
+ new TwrSimpleClose().run();
+ }
+
+ void run() throws Exception {
+ run("try (Test t = new Test()) { System.err.println(0); }", 2);
+ run("try (Test t = new Test()) {\n" +
+ " if (t.hashCode() == 42)\n" +
+ " return;\n" +
+ " System.err.println(0);\n" +
+ "}\n", 3);
+ }
+
+ void run(String trySpec, int expectedCloseCount) throws Exception {
+ String template = "public class Test implements AutoCloseable {\n" +
+ " void t(int i) {\n" +
+ " TRY\n" +
+ " }\n" +
+ " public void close() { }\n" +
+ "}\n";
+ String code = template.replace("TRY", trySpec);
+ int closeCount = 0;
+
+ try (StandardJavaFileManager sfm = compiler.getStandardFileManager(null, null, null);
+ JFMImpl fm = new JFMImpl(sfm)) {
+ Iterable<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource(code));
+ JavacTask task = (JavacTask) compiler.getTask(null, fm, null, null, null, files);
+ task.call();
+
+ if (fm.classBytes.size() != 1) {
+ throw new AssertionError();
+ }
+
+ byte[] data = fm.classBytes.values().iterator().next();
+ ClassFile cf = ClassFile.read(new ByteArrayInputStream(data));
+
+ for (Method m : cf.methods) {
+ Code_attribute codeAttr = (Code_attribute) m.attributes.map.get(Attribute.Code);
+ for (Instruction i : codeAttr.getInstructions()) {
+ if (i.getOpcode() == Opcode.INVOKEVIRTUAL) {
+ CONSTANT_Methodref_info method =
+ (CONSTANT_Methodref_info) cf.constant_pool.get(i.getShort(1));
+ CONSTANT_NameAndType_info nameAndType =
+ cf.constant_pool.getNameAndTypeInfo(method.name_and_type_index);
+ if ("close".equals(nameAndType.getName())) {
+ closeCount++;
+ }
+ }
+ }
+ }
+ if (expectedCloseCount != closeCount) {
+ throw new IllegalStateException("expected close count: " + expectedCloseCount +
+ "; actual: " + closeCount + "; code:\n" + code);
+ }
+ }
+ }
+
+ private static final class JFMImpl extends ForwardingJavaFileManager<JavaFileManager> {
+
+ private final Map<String, byte[]> classBytes = new HashMap<>();
+
+ public JFMImpl(JavaFileManager fileManager) {
+ super(fileManager);
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind,
+ FileObject sibling) throws IOException {
+ try {
+ return new SimpleJavaFileObject(new URI("mem://" + className + ".class"), kind) {
+ @Override
+ public OutputStream openOutputStream() throws IOException {
+ return new ByteArrayOutputStream() {
+ @Override
+ public void close() throws IOException {
+ super.close();
+ classBytes.put(className, toByteArray());
+ }
+ };
+ }
+ };
+ } catch (URISyntaxException ex) {
+ throw new IOException(ex);
+ }
+ }
+ }
+
+}
--- a/test/langtools/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java Thu Mar 22 11:34:38 2018 -0700
@@ -36,9 +36,9 @@
public class ResourceVariable {
@TADescription(annotation = "TA", type = RESOURCE_VARIABLE,
- lvarOffset = {10}, lvarLength = {106}, lvarIndex = {1})
+ lvarOffset = {10}, lvarLength = {37}, lvarIndex = {1})
@TADescription(annotation = "TB", type = RESOURCE_VARIABLE,
- lvarOffset = {22}, lvarLength = {31}, lvarIndex = {3})
+ lvarOffset = {20}, lvarLength = {4}, lvarIndex = {2})
public String testResourceVariable() {
return
"public void f() throws IOException {" + lineSeparator() +
@@ -49,7 +49,7 @@
}
@TADescription(annotation = "RTAs", type = RESOURCE_VARIABLE,
- lvarOffset = {10}, lvarLength = {26}, lvarIndex = {1})
+ lvarOffset = {10}, lvarLength = {4}, lvarIndex = {1})
public String testRepeatedAnnotation1() {
return
"public void f() throws IOException {" + lineSeparator() +
@@ -58,7 +58,7 @@
}
@TADescription(annotation = "RTAs", type = RESOURCE_VARIABLE,
- lvarOffset = {10}, lvarLength = {26}, lvarIndex = {1})
+ lvarOffset = {10}, lvarLength = {4}, lvarIndex = {1})
public String testRepeatedAnnotation2() {
return
"public void f() throws IOException {" + lineSeparator() +
@@ -67,9 +67,9 @@
}
@TADescription(annotation = "TA", type = RESOURCE_VARIABLE,
- lvarOffset = {10}, lvarLength = {106}, lvarIndex = {1})
+ lvarOffset = {10}, lvarLength = {37}, lvarIndex = {1})
@TADescription(annotation = "TB", type = RESOURCE_VARIABLE,
- lvarOffset = {22}, lvarLength = {31}, lvarIndex = {3})
+ lvarOffset = {20}, lvarLength = {4}, lvarIndex = {2})
public String testSeveralVariablesInTryWithResources() {
return
"public void f() throws IOException {" + lineSeparator() +
--- a/test/langtools/tools/javac/flow/tests/TestCaseTry.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/flow/tests/TestCaseTry.java Thu Mar 22 11:34:38 2018 -0700
@@ -52,9 +52,9 @@
o = "";
}
- @AliveRange(varName="o", bytecodeStart=22, bytecodeLength=13)
- @AliveRange(varName="o", bytecodeStart=53, bytecodeLength=3)
- @AliveRange(varName="o", bytecodeStart=60, bytecodeLength=1)
+ @AliveRange(varName="o", bytecodeStart=20, bytecodeLength=12)
+ @AliveRange(varName="o", bytecodeStart=50, bytecodeLength=3)
+ @AliveRange(varName="o", bytecodeStart=57, bytecodeLength=1)
void m3() {
Object o;
try (BufferedReader br =
@@ -65,8 +65,8 @@
o = "";
}
- @AliveRange(varName="o", bytecodeStart=12, bytecodeLength=46)
- @AliveRange(varName="o", bytecodeStart=62, bytecodeLength=1)
+ @AliveRange(varName="o", bytecodeStart=12, bytecodeLength=43)
+ @AliveRange(varName="o", bytecodeStart=59, bytecodeLength=1)
void m4() {
String o;
try (BufferedReader br =
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/plugin/MultiplePlugins.java Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2018, 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 8198552
+ * @summary Check that multiple plugins can be specified when starting javac
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.jdeps/com.sun.tools.javap
+ * @build toolbox.ToolBox toolbox.JavacTask toolbox.JarTask
+ * @run main MultiplePlugins
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.tools.JavaCompiler;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+import toolbox.JarTask;
+import toolbox.JavacTask;
+import toolbox.Task;
+import toolbox.ToolBox;
+
+public class MultiplePlugins {
+ public static void main(String... args) throws Exception {
+ new MultiplePlugins().run();
+ }
+
+ final File pluginClasses;
+ final File pluginModuleClasses;
+ final File pluginJar;
+ final JavaCompiler compiler;
+ final ToolBox tb = new ToolBox();
+
+ MultiplePlugins() throws Exception {
+ pluginClasses = new File("plugin");
+ tb.createDirectories(pluginClasses.toPath());
+ pluginModuleClasses = new File("plugin-modules");
+ pluginJar = new File("plugin.jar");
+ compiler = ToolProvider.getSystemJavaCompiler();
+ }
+
+ void run() throws Exception {
+ // compile the plugins:
+ new JavacTask(tb)
+ .options("-d", pluginClasses.getPath())
+ .sources(PLUGIN1, PLUGIN2)
+ .run();
+
+ File plugin = new File(pluginClasses.getPath(), "META-INF/services/com.sun.source.util.Plugin");
+ tb.writeFile(plugin.getPath(), "p1.Plugin1\np2.Plugin2\n");
+ new JarTask(tb)
+ .run("cf", pluginJar.getPath(), "-C", pluginClasses.getPath(), ".");
+
+ testCommandLine(EXPECTED, "--processor-path", pluginJar.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+ testAPI(EXPECTED, "--processor-path", pluginJar.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+
+ // compile the plugins as modules:
+ File m1 = new File(pluginModuleClasses, "m1");
+ tb.createDirectories(m1.toPath());
+ new JavacTask(tb)
+ .options("-d", m1.getPath())
+ .sources(MODULE1, PLUGIN1)
+ .run();
+
+ File m2 = new File(pluginModuleClasses, "m2");
+ tb.createDirectories(m2.toPath());
+ new JavacTask(tb)
+ .options("-d", m2.getPath())
+ .sources(MODULE2, PLUGIN2)
+ .run();
+
+ testCommandLine(EXPECTED, "--processor-module-path", pluginModuleClasses.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+ testAPI(EXPECTED, "--processor-module-path", pluginModuleClasses.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+
+ if (errors > 0)
+ throw new Exception(errors + " errors occurred");
+ }
+
+ void testAPI(List<String> ref, String... opts) throws Exception {
+ try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+ fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+
+ System.err.println("test api: " + List.of(opts));
+ Task.Result result = new JavacTask(tb, Task.Mode.API)
+ .fileManager(fm)
+ .options(opts)
+ .sources(TEST)
+ .run(Task.Expect.SUCCESS)
+ .writeAll();
+ List<String> out = result.getOutputLines(Task.OutputKind.STDERR);
+ checkOutput(out, ref);
+ }
+ }
+
+ void testCommandLine(List<String> ref,String... opt) throws IOException {
+ Path testJavaFile = Paths.get("Test.java");
+
+ tb.writeFile(testJavaFile, TEST);
+
+ List<String> args = new ArrayList<>();
+
+ args.add("-d"); args.add(".");
+ args.addAll(List.of(opt));
+
+ System.err.println("test command line: " + Arrays.asList(args));
+ Task.Result result = new JavacTask(tb, Task.Mode.CMDLINE)
+ .options(args)
+ .files(testJavaFile)
+ .run(Task.Expect.SUCCESS)
+ .writeAll();
+ List<String> out = result.getOutputLines(Task.OutputKind.STDERR);
+ checkOutput(out, ref);
+ }
+
+ private void checkOutput(List<String> lines, List<String> ref) {
+ if (!lines.equals(ref)) {
+ error("unexpected output");
+ }
+ }
+
+ private void error(String msg) {
+ System.err.println(msg);
+ errors++;
+ }
+
+ int errors;
+
+ private static final String MODULE1 =
+ "module m1 {\n" +
+ " requires jdk.compiler;\n" +
+ " provides com.sun.source.util.Plugin with p1.Plugin1;\n" +
+ "}\n";
+ private static final String PLUGIN1 =
+ "package p1;\n" +
+ "import com.sun.source.util.*;\n" +
+ "public class Plugin1 implements Plugin {\n" +
+ " public String getName() {\n" +
+ " return \"plugin1\";\n" +
+ " }\n" +
+ " public void init(JavacTask task, String... args) {\n" +
+ " System.err.println(\"plugin1\");\n" +
+ " }\n" +
+ "}";
+ private static final String MODULE2 =
+ "module m2 {\n" +
+ " requires jdk.compiler;\n" +
+ " provides com.sun.source.util.Plugin with p2.Plugin2;\n" +
+ "}\n";
+ private static final String PLUGIN2 =
+ "package p2;\n" +
+ "import com.sun.source.util.*;\n" +
+ "public class Plugin2 implements Plugin {\n" +
+ " public String getName() {\n" +
+ " return \"plugin2\";\n" +
+ " }\n" +
+ " public void init(JavacTask task, String... args) {\n" +
+ " System.err.println(\"plugin2\");\n" +
+ " }\n" +
+ "}";
+ private static final String TEST =
+ "public class Test {}";
+ private static final List<String> EXPECTED = List.of(
+ "plugin1",
+ "plugin2"
+ );
+
+}
--- a/test/lib/jdk/test/lib/compiler/CompilerUtils.java Thu Mar 22 11:09:50 2018 -0700
+++ b/test/lib/jdk/test/lib/compiler/CompilerUtils.java Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, 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
@@ -47,8 +47,14 @@
* {@code <destination>/**}. The destination directory will be created if
* it doesn't exist.
*
+ * Equivalent to calling {@code compile(source, destination, true, options);}.
+ *
* All warnings/errors emitted by the compiler are output to System.out/err.
*
+ * @param source Path to the source directory
+ * @param destination Path to the destination directory
+ * @param options Any options to pass to the compiler
+ *
* @return true if the compilation is successful
*
* @throws IOException
@@ -60,6 +66,36 @@
public static boolean compile(Path source, Path destination, String... options)
throws IOException
{
+ return compile(source, destination, true, options);
+ }
+
+ /**
+ * Compile all the java sources in {@code <source>} and optionally its
+ * subdirectories, to
+ * {@code <destination>}. The destination directory will be created if
+ * it doesn't exist.
+ *
+ * All warnings/errors emitted by the compiler are output to System.out/err.
+ *
+ * @param source Path to the source directory
+ * @param destination Path to the destination directory
+ * @param recurse If {@code true} recurse into any {@code source} subdirectories
+ * to compile all java source files; else only compile those directly in
+ * {@code source}.
+ * @param options Any options to pass to the compiler
+ *
+ * @return true if the compilation is successful
+ *
+ * @throws IOException
+ * if there is an I/O error scanning the source tree or
+ * creating the destination directory
+ * @throws UnsupportedOperationException
+ * if there is no system java compiler
+ */
+
+ public static boolean compile(Path source, Path destination, boolean recurse, String... options)
+ throws IOException
+ {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null) {
// no compiler available
@@ -69,7 +105,7 @@
StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null);
List<Path> sources
- = Files.find(source, Integer.MAX_VALUE,
+ = Files.find(source, (recurse ? Integer.MAX_VALUE : 1),
(file, attrs) -> (file.toString().endsWith(".java")))
.collect(Collectors.toList());