mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 20:18:48 +00:00
Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5140f2a16 | ||
|
|
09f0076ef7 | ||
|
|
d0a3ba9db5 | ||
|
|
93675e6e04 | ||
|
|
32134656df | ||
|
|
ebe8974556 | ||
|
|
3103fa08bb | ||
|
|
25462ba45d | ||
|
|
a07e0771c7 | ||
|
|
46025e45c0 | ||
|
|
d8a1c1d04c | ||
|
|
6950503dcf | ||
|
|
646037dd92 | ||
|
|
535e8bea1a | ||
|
|
3db9a5affe | ||
|
|
cece06f1aa | ||
|
|
8e0d736b13 | ||
|
|
6d9e91f886 | ||
|
|
d5dde3fc90 | ||
|
|
1ec4ff54ae | ||
|
|
2dc6c491bf | ||
|
|
17b6eb45e5 | ||
|
|
a611399a3f | ||
|
|
fb7d25d73f | ||
|
|
d4cf30517e | ||
|
|
509ca63371 | ||
|
|
a2111b0ca6 | ||
|
|
fb8365e75e | ||
|
|
d94b2a1181 | ||
|
|
248519db4a | ||
|
|
b8b4493117 | ||
|
|
c46e6350aa | ||
|
|
d9bc822168 | ||
|
|
85eb6b752e | ||
|
|
b0ad331809 | ||
|
|
7dc8f786fe | ||
|
|
15b5789f55 | ||
|
|
1de6f4f2b6 | ||
|
|
42fc4fe7b1 | ||
|
|
ec6beaa20a | ||
|
|
bf0bc37924 | ||
|
|
22fe70770a | ||
|
|
de686f8a38 |
@ -185,77 +185,30 @@ endif
|
||||
|
||||
ifneq ($(filter product-bundles% legacy-bundles, $(MAKECMDGOALS)), )
|
||||
|
||||
SYMBOLS_EXCLUDE_PATTERN := %.debuginfo %.diz %.map
|
||||
|
||||
# There may be files with spaces in the names, so use ShellFindFiles
|
||||
# explicitly.
|
||||
# There may be files with spaces in the names, so use ShellFindFiles explicitly.
|
||||
ALL_JDK_FILES := $(call ShellFindFiles, $(JDK_IMAGE_DIR))
|
||||
ifneq ($(JDK_IMAGE_DIR), $(JDK_SYMBOLS_IMAGE_DIR))
|
||||
ALL_JDK_SYMBOLS_FILES := $(call ShellFindFiles, $(JDK_SYMBOLS_IMAGE_DIR))
|
||||
else
|
||||
ALL_JDK_SYMBOLS_FILES := $(ALL_JDK_FILES)
|
||||
endif
|
||||
ifneq ($(JDK_IMAGE_DIR), $(JDK_DEMOS_IMAGE_DIR))
|
||||
ALL_JDK_DEMOS_FILES := $(call ShellFindFiles, $(JDK_DEMOS_IMAGE_DIR))
|
||||
else
|
||||
ALL_JDK_DEMOS_FILES := $(ALL_JDK_FILES)
|
||||
endif
|
||||
|
||||
# Create special filter rules when dealing with unzipped .dSYM directories on
|
||||
# macosx
|
||||
ifeq ($(call isTargetOs, macosx), true)
|
||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
|
||||
JDK_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
|
||||
$(call containing, .dSYM/, $(patsubst $(JDK_IMAGE_DIR)/%, %, \
|
||||
$(ALL_JDK_SYMBOLS_FILES))))
|
||||
endif
|
||||
endif
|
||||
|
||||
# Create special filter rules when dealing with debug symbols on windows
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||
JDK_SYMBOLS_EXCLUDE_PATTERN := %.pdb
|
||||
endif
|
||||
endif
|
||||
|
||||
JDK_BUNDLE_FILES := \
|
||||
$(filter-out \
|
||||
$(JDK_SYMBOLS_EXCLUDE_PATTERN) \
|
||||
$(JDK_EXTRA_EXCLUDES) \
|
||||
$(SYMBOLS_EXCLUDE_PATTERN) \
|
||||
$(JDK_IMAGE_HOMEDIR)/demo/% \
|
||||
, \
|
||||
$(ALL_JDK_FILES) \
|
||||
)
|
||||
|
||||
JDK_SYMBOLS_BUNDLE_FILES := \
|
||||
$(call FindFiles, $(SYMBOLS_IMAGE_DIR))
|
||||
JDK_SYMBOLS_BUNDLE_FILES := $(call FindFiles, $(SYMBOLS_IMAGE_DIR))
|
||||
|
||||
TEST_DEMOS_BUNDLE_FILES := $(filter $(JDK_DEMOS_IMAGE_HOMEDIR)/demo/%, \
|
||||
$(ALL_JDK_DEMOS_FILES))
|
||||
|
||||
ALL_JRE_FILES := $(call ShellFindFiles, $(JRE_IMAGE_DIR))
|
||||
|
||||
# Create special filter rules when dealing with unzipped .dSYM directories on
|
||||
# macosx
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
|
||||
JRE_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
|
||||
$(call containing, .dSYM/, $(patsubst $(JRE_IMAGE_DIR)/%, %, $(ALL_JRE_FILES))))
|
||||
endif
|
||||
endif
|
||||
|
||||
# Create special filter rules when dealing with debug symbols on windows
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||
JRE_SYMBOLS_EXCLUDE_PATTERN := %.pdb
|
||||
endif
|
||||
endif
|
||||
|
||||
JRE_BUNDLE_FILES := $(filter-out \
|
||||
$(JRE_SYMBOLS_EXCLUDE_PATTERN) \
|
||||
$(SYMBOLS_EXCLUDE_PATTERN), \
|
||||
$(ALL_JRE_FILES))
|
||||
JRE_BUNDLE_FILES := $(ALL_JRE_FILES)
|
||||
|
||||
ifeq ($(MACOSX_CODESIGN_MODE), hardened)
|
||||
# Macosx release build and code signing available.
|
||||
|
||||
@ -218,10 +218,14 @@ ifeq ($(call isTargetOs, windows), true)
|
||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.pdb,*.map}'
|
||||
else
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.map}'
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.map}'
|
||||
endif
|
||||
else
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
||||
else
|
||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*}'
|
||||
endif
|
||||
endif
|
||||
|
||||
# Unless we are creating a very large module, use the small tool JVM options
|
||||
|
||||
@ -93,16 +93,19 @@ JAVADOC_DISABLED_DOCLINT_WARNINGS := missing
|
||||
JAVADOC_DISABLED_DOCLINT_PACKAGES := org.w3c.* javax.smartcardio
|
||||
|
||||
# The initial set of options for javadoc
|
||||
# -XDaccessInternalAPI is a temporary workaround, see 8373909
|
||||
JAVADOC_OPTIONS := -use -keywords -notimestamp \
|
||||
-serialwarn -encoding utf-8 -docencoding utf-8 -breakiterator \
|
||||
-splitIndex --system none -javafx --expand-requires transitive \
|
||||
--override-methods=summary
|
||||
--override-methods=summary \
|
||||
-XDaccessInternalAPI
|
||||
|
||||
# The reference options must stay stable to allow for comparisons across the
|
||||
# development cycle.
|
||||
REFERENCE_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
|
||||
-serialwarn -encoding utf-8 -breakiterator -splitIndex --system none \
|
||||
-html5 -javafx --expand-requires transitive
|
||||
-html5 -javafx --expand-requires transitive \
|
||||
-XDaccessInternalAPI
|
||||
|
||||
# Should we add DRAFT stamps to the generated javadoc?
|
||||
ifeq ($(VERSION_IS_GA), true)
|
||||
|
||||
@ -316,23 +316,36 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_DEBUG_SYMBOLS],
|
||||
AC_MSG_CHECKING([if we should add external native debug symbols to the shipped bundles])
|
||||
AC_ARG_WITH([external-symbols-in-bundles],
|
||||
[AS_HELP_STRING([--with-external-symbols-in-bundles],
|
||||
[which type of external native debug symbol information shall be shipped in product bundles (none, public, full)
|
||||
(e.g. ship full/stripped pdbs on Windows) @<:@none@:>@])])
|
||||
[which type of external native debug symbol information shall be shipped with bundles/images (none, public, full).
|
||||
@<:@none in release builds, full otherwise. --with-native-debug-symbols=external/zipped is a prerequisite. public is only supported on Windows@:>@])],
|
||||
[],
|
||||
[with_external_symbols_in_bundles=default])
|
||||
|
||||
if test "x$with_external_symbols_in_bundles" = x || test "x$with_external_symbols_in_bundles" = xnone ; then
|
||||
AC_MSG_RESULT([no])
|
||||
elif test "x$with_external_symbols_in_bundles" = xfull || test "x$with_external_symbols_in_bundles" = xpublic ; then
|
||||
if test "x$OPENJDK_TARGET_OS" != xwindows ; then
|
||||
AC_MSG_ERROR([--with-external-symbols-in-bundles currently only works on windows!])
|
||||
elif test "x$COPY_DEBUG_SYMBOLS" != xtrue ; then
|
||||
AC_MSG_ERROR([--with-external-symbols-in-bundles only works when --with-native-debug-symbols=external is used!])
|
||||
elif test "x$with_external_symbols_in_bundles" = xfull ; then
|
||||
if test "x$COPY_DEBUG_SYMBOLS" != xtrue ; then
|
||||
AC_MSG_ERROR([--with-external-symbols-in-bundles only works when --with-native-debug-symbols=external/zipped is used!])
|
||||
elif test "x$with_external_symbols_in_bundles" = xpublic && test "x$OPENJDK_TARGET_OS" != xwindows ; then
|
||||
AC_MSG_ERROR([--with-external-symbols-in-bundles=public is only supported on Windows!])
|
||||
fi
|
||||
|
||||
if test "x$with_external_symbols_in_bundles" = xfull ; then
|
||||
AC_MSG_RESULT([full])
|
||||
SHIP_DEBUG_SYMBOLS=full
|
||||
else
|
||||
AC_MSG_RESULT([public])
|
||||
SHIP_DEBUG_SYMBOLS=public
|
||||
fi
|
||||
elif test "x$with_external_symbols_in_bundles" = xdefault ; then
|
||||
if test "x$DEBUG_LEVEL" = xrelease ; then
|
||||
AC_MSG_RESULT([no (default)])
|
||||
elif test "x$COPY_DEBUG_SYMBOLS" = xtrue ; then
|
||||
AC_MSG_RESULT([full (default)])
|
||||
SHIP_DEBUG_SYMBOLS=full
|
||||
else
|
||||
AC_MSG_RESULT([no (default, native debug symbols are not external/zipped)])
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([$with_external_symbols_in_bundles is an unknown value for --with-external-symbols-in-bundles])
|
||||
fi
|
||||
|
||||
@ -234,6 +234,9 @@ define SetupLinkerFlags
|
||||
ifeq ($(call isTargetOs, macosx), true)
|
||||
$1_EXTRA_LDFLAGS += -Wl,-object_path_lto,$$($1_OBJECT_DIR)/$$($1_NAME)_lto_helper.o
|
||||
endif
|
||||
ifeq ($(TOOLCHAIN_TYPE), microsoft)
|
||||
$1_EXTRA_LDFLAGS += -LTCGOUT:$$($1_OBJECT_DIR)/$$($1_NAME).iobj
|
||||
endif
|
||||
endif
|
||||
|
||||
$1_EXTRA_LDFLAGS += $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) \
|
||||
|
||||
@ -31,10 +31,9 @@ import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.PackageElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
|
||||
import com.sun.source.doctree.DocTree;
|
||||
import com.sun.source.doctree.LiteralTree;
|
||||
@ -160,9 +159,10 @@ public class JSpec implements Taglet {
|
||||
if (m.find()) {
|
||||
String chapter = m.group("chapter");
|
||||
String section = m.group("section");
|
||||
String rootParent = currentPath().replaceAll("[^/]+", "..");
|
||||
|
||||
String url = String.format("%1$s/../specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
|
||||
docRoot(elem), idPrefix, chapter, section);
|
||||
String url = String.format("%1$s/specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
|
||||
rootParent, idPrefix, chapter, section);
|
||||
|
||||
sb.append("<a href=\"")
|
||||
.append(url)
|
||||
@ -183,6 +183,22 @@ public class JSpec implements Taglet {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static ThreadLocal<String> CURRENT_PATH = null;
|
||||
|
||||
private String currentPath() {
|
||||
if (CURRENT_PATH == null) {
|
||||
try {
|
||||
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
|
||||
.getField("CURRENT_PATH");
|
||||
@SuppressWarnings("unchecked")
|
||||
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
|
||||
CURRENT_PATH = tl;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
throw new RuntimeException("Cannot determine current path", e);
|
||||
}
|
||||
}
|
||||
return CURRENT_PATH.get();
|
||||
}
|
||||
|
||||
private String expand(List<? extends DocTree> trees) {
|
||||
return (new SimpleDocTreeVisitor<StringBuilder, StringBuilder>() {
|
||||
@ -209,34 +225,4 @@ public class JSpec implements Taglet {
|
||||
}).visit(trees, new StringBuilder()).toString();
|
||||
}
|
||||
|
||||
private String docRoot(Element elem) {
|
||||
switch (elem.getKind()) {
|
||||
case MODULE:
|
||||
return "..";
|
||||
|
||||
case PACKAGE:
|
||||
PackageElement pe = (PackageElement)elem;
|
||||
String pkgPart = pe.getQualifiedName()
|
||||
.toString()
|
||||
.replace('.', '/')
|
||||
.replaceAll("[^/]+", "..");
|
||||
return pe.getEnclosingElement() != null
|
||||
? "../" + pkgPart
|
||||
: pkgPart;
|
||||
|
||||
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
|
||||
TypeElement te = (TypeElement)elem;
|
||||
return te.getQualifiedName()
|
||||
.toString()
|
||||
.replace('.', '/')
|
||||
.replaceAll("[^/]+", "..");
|
||||
|
||||
default:
|
||||
var enclosing = elem.getEnclosingElement();
|
||||
if (enclosing == null)
|
||||
throw new IllegalArgumentException(elem.getKind().toString());
|
||||
return docRoot(enclosing);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -31,10 +31,9 @@ import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.PackageElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
|
||||
import com.sun.source.doctree.DocTree;
|
||||
import com.sun.source.doctree.UnknownBlockTagTree;
|
||||
@ -68,7 +67,7 @@ public class ToolGuide implements Taglet {
|
||||
|
||||
static final String TAG_NAME = "toolGuide";
|
||||
|
||||
static final String BASE_URL = "../specs/man";
|
||||
static final String BASE_URL = "specs/man";
|
||||
|
||||
static final Pattern TAG_PATTERN = Pattern.compile("(?s)(?<name>[A-Za-z0-9]+)\\s*(?<label>.*)$");
|
||||
|
||||
@ -119,9 +118,10 @@ public class ToolGuide implements Taglet {
|
||||
if (label.isEmpty()) {
|
||||
label = name;
|
||||
}
|
||||
String rootParent = currentPath().replaceAll("[^/]+", "..");
|
||||
|
||||
String url = String.format("%s/%s/%s.html",
|
||||
docRoot(elem), BASE_URL, name);
|
||||
rootParent, BASE_URL, name);
|
||||
|
||||
if (needComma) {
|
||||
sb.append(",\n");
|
||||
@ -142,33 +142,21 @@ public class ToolGuide implements Taglet {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String docRoot(Element elem) {
|
||||
switch (elem.getKind()) {
|
||||
case MODULE:
|
||||
return "..";
|
||||
private static ThreadLocal<String> CURRENT_PATH = null;
|
||||
|
||||
case PACKAGE:
|
||||
PackageElement pe = (PackageElement)elem;
|
||||
String pkgPart = pe.getQualifiedName()
|
||||
.toString()
|
||||
.replace('.', '/')
|
||||
.replaceAll("[^/]+", "..");
|
||||
return pe.getEnclosingElement() != null
|
||||
? "../" + pkgPart
|
||||
: pkgPart;
|
||||
|
||||
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
|
||||
TypeElement te = (TypeElement)elem;
|
||||
return te.getQualifiedName()
|
||||
.toString()
|
||||
.replace('.', '/')
|
||||
.replaceAll("[^/]+", "..");
|
||||
|
||||
default:
|
||||
var enclosing = elem.getEnclosingElement();
|
||||
if (enclosing == null)
|
||||
throw new IllegalArgumentException(elem.getKind().toString());
|
||||
return docRoot(enclosing);
|
||||
private String currentPath() {
|
||||
if (CURRENT_PATH == null) {
|
||||
try {
|
||||
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
|
||||
.getField("CURRENT_PATH");
|
||||
@SuppressWarnings("unchecked")
|
||||
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
|
||||
CURRENT_PATH = tl;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
throw new RuntimeException("Cannot determine current path", e);
|
||||
}
|
||||
}
|
||||
return CURRENT_PATH.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -346,8 +346,14 @@ source %{
|
||||
}
|
||||
|
||||
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||
// Only SVE has partial vector operations
|
||||
if (UseSVE == 0) {
|
||||
// 1. Only SVE requires partial vector operations.
|
||||
// 2. The vector size in bytes must be smaller than MaxVectorSize.
|
||||
// 3. Predicated vectors have a mask input, which guarantees that
|
||||
// out-of-bounds lanes remain inactive.
|
||||
int length_in_bytes = vt->length_in_bytes();
|
||||
if (UseSVE == 0 ||
|
||||
length_in_bytes == MaxVectorSize ||
|
||||
node->is_predicated_vector()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -370,21 +376,22 @@ source %{
|
||||
return !node->in(1)->is_Con();
|
||||
case Op_LoadVector:
|
||||
case Op_StoreVector:
|
||||
// We use NEON load/store instructions if the vector length is <= 128 bits.
|
||||
return vt->length_in_bytes() > 16;
|
||||
case Op_AddReductionVI:
|
||||
case Op_AddReductionVL:
|
||||
// We may prefer using NEON instructions rather than SVE partial operations.
|
||||
return !VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
||||
// For these ops, we prefer using NEON instructions rather than SVE
|
||||
// predicated instructions for better performance.
|
||||
return !VM_Version::use_neon_for_vector(length_in_bytes);
|
||||
case Op_MinReductionV:
|
||||
case Op_MaxReductionV:
|
||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we may prefer using NEON
|
||||
// instructions rather than SVE partial operations.
|
||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we prefer using NEON
|
||||
// instructions rather than SVE predicated instructions for
|
||||
// better performance.
|
||||
return vt->element_basic_type() == T_LONG ||
|
||||
!VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
||||
!VM_Version::use_neon_for_vector(length_in_bytes);
|
||||
default:
|
||||
// For other ops whose vector size is smaller than the max vector size, a
|
||||
// full-sized unpredicated operation does not impact the final vector result.
|
||||
// For other ops whose vector size is smaller than the max vector
|
||||
// size, a full-sized unpredicated operation does not impact the
|
||||
// vector result.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -336,8 +336,14 @@ source %{
|
||||
}
|
||||
|
||||
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||
// Only SVE has partial vector operations
|
||||
if (UseSVE == 0) {
|
||||
// 1. Only SVE requires partial vector operations.
|
||||
// 2. The vector size in bytes must be smaller than MaxVectorSize.
|
||||
// 3. Predicated vectors have a mask input, which guarantees that
|
||||
// out-of-bounds lanes remain inactive.
|
||||
int length_in_bytes = vt->length_in_bytes();
|
||||
if (UseSVE == 0 ||
|
||||
length_in_bytes == MaxVectorSize ||
|
||||
node->is_predicated_vector()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -360,21 +366,22 @@ source %{
|
||||
return !node->in(1)->is_Con();
|
||||
case Op_LoadVector:
|
||||
case Op_StoreVector:
|
||||
// We use NEON load/store instructions if the vector length is <= 128 bits.
|
||||
return vt->length_in_bytes() > 16;
|
||||
case Op_AddReductionVI:
|
||||
case Op_AddReductionVL:
|
||||
// We may prefer using NEON instructions rather than SVE partial operations.
|
||||
return !VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
||||
// For these ops, we prefer using NEON instructions rather than SVE
|
||||
// predicated instructions for better performance.
|
||||
return !VM_Version::use_neon_for_vector(length_in_bytes);
|
||||
case Op_MinReductionV:
|
||||
case Op_MaxReductionV:
|
||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we may prefer using NEON
|
||||
// instructions rather than SVE partial operations.
|
||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we prefer using NEON
|
||||
// instructions rather than SVE predicated instructions for
|
||||
// better performance.
|
||||
return vt->element_basic_type() == T_LONG ||
|
||||
!VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
||||
!VM_Version::use_neon_for_vector(length_in_bytes);
|
||||
default:
|
||||
// For other ops whose vector size is smaller than the max vector size, a
|
||||
// full-sized unpredicated operation does not impact the final vector result.
|
||||
// For other ops whose vector size is smaller than the max vector
|
||||
// size, a full-sized unpredicated operation does not impact the
|
||||
// vector result.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -310,7 +310,18 @@ static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registe
|
||||
__ add(sp, sp, 32 * wordSize);
|
||||
}
|
||||
|
||||
#ifdef R18_RESERVED
|
||||
/*
|
||||
Do not modify r18_tls when restoring registers if it is a reserved register. On Windows,
|
||||
for example, r18_tls is used to store the pointer to the current thread's TEB (where TLS
|
||||
variables are stored). Therefore, modifying r18_tls would corrupt the TEB pointer.
|
||||
*/
|
||||
__ pop(RegSet::range(r0, r17), sp);
|
||||
__ ldp(zr, r19, Address(__ post(sp, 2 * wordSize)));
|
||||
__ pop(RegSet::range(r20, r29), sp);
|
||||
#else
|
||||
__ pop(RegSet::range(r0, r29), sp);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void restore_live_registers_except_r0(StubAssembler* sasm, bool restore_fpu_registers = true) {
|
||||
@ -323,8 +334,20 @@ static void restore_live_registers_except_r0(StubAssembler* sasm, bool restore_f
|
||||
__ add(sp, sp, 32 * wordSize);
|
||||
}
|
||||
|
||||
#ifdef R18_RESERVED
|
||||
/*
|
||||
Do not modify r18_tls when restoring registers if it is a reserved register. On Windows,
|
||||
for example, r18_tls is used to store the pointer to the current thread's TEB (where TLS
|
||||
variables are stored). Therefore, modifying r18_tls would corrupt the TEB pointer.
|
||||
*/
|
||||
__ ldp(zr, r1, Address(__ post(sp, 2 * wordSize)));
|
||||
__ pop(RegSet::range(r2, r17), sp);
|
||||
__ ldp(zr, r19, Address(__ post(sp, 2 * wordSize)));
|
||||
__ pop(RegSet::range(r20, r29), sp);
|
||||
#else
|
||||
__ ldp(zr, r1, Address(__ post(sp, 16)));
|
||||
__ pop(RegSet::range(r2, r29), sp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -5379,7 +5379,6 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
|
||||
assert (UseCompressedClassPointers, "should only be used for compressed headers");
|
||||
assert (oop_recorder() != nullptr, "this assembler needs an OopRecorder");
|
||||
int index = oop_recorder()->find_index(k);
|
||||
assert(! Universe::heap()->is_in(k), "should not be an oop");
|
||||
|
||||
InstructionMark im(this);
|
||||
RelocationHolder rspec = metadata_Relocation::spec(index);
|
||||
|
||||
@ -6335,8 +6335,36 @@ instruct loadConD_Ex(regD dst, immD src) %{
|
||||
// Prefetch instructions.
|
||||
// Must be safe to execute with invalid address (cannot fault).
|
||||
|
||||
// Special prefetch versions which use the dcbz instruction.
|
||||
instruct prefetch_alloc_zero(indirectMemory mem, iRegLsrc src) %{
|
||||
match(PrefetchAllocation (AddP mem src));
|
||||
predicate(AllocatePrefetchStyle == 3);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
|
||||
format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many with zero" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ dcbz($src$$Register, $mem$$base$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
|
||||
instruct prefetch_alloc_zero_no_offset(indirectMemory mem) %{
|
||||
match(PrefetchAllocation mem);
|
||||
predicate(AllocatePrefetchStyle == 3);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
|
||||
format %{ "PREFETCH $mem, 2 \t// Prefetch write-many with zero" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ dcbz($mem$$base$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
|
||||
instruct prefetch_alloc(indirectMemory mem, iRegLsrc src) %{
|
||||
match(PrefetchAllocation (AddP mem src));
|
||||
predicate(AllocatePrefetchStyle != 3);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
|
||||
format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many" %}
|
||||
@ -6349,6 +6377,7 @@ instruct prefetch_alloc(indirectMemory mem, iRegLsrc src) %{
|
||||
|
||||
instruct prefetch_alloc_no_offset(indirectMemory mem) %{
|
||||
match(PrefetchAllocation mem);
|
||||
predicate(AllocatePrefetchStyle != 3);
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
|
||||
format %{ "PREFETCH $mem, 2 \t// Prefetch write-many" %}
|
||||
|
||||
@ -4933,7 +4933,6 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
|
||||
assert (UseCompressedClassPointers, "should only be used for compressed headers");
|
||||
assert (oop_recorder() != nullptr, "this assembler needs an OopRecorder");
|
||||
int index = oop_recorder()->find_index(k);
|
||||
assert(!Universe::heap()->is_in(k), "should not be an oop");
|
||||
|
||||
narrowKlass nk = CompressedKlassPointers::encode(k);
|
||||
relocate(metadata_Relocation::spec(index), [&] {
|
||||
|
||||
@ -96,6 +96,7 @@
|
||||
#include "runtime/vmOperations.hpp"
|
||||
#include "runtime/vmThread.hpp"
|
||||
#include "sanitizers/leak.hpp"
|
||||
#include "services/management.hpp"
|
||||
#include "utilities/align.hpp"
|
||||
#include "utilities/bitMap.inline.hpp"
|
||||
#include "utilities/defaultStream.hpp"
|
||||
|
||||
@ -127,10 +127,8 @@ ResolutionErrorEntry::~ResolutionErrorEntry() {
|
||||
}
|
||||
|
||||
void ResolutionErrorEntry::set_nest_host_error(const char* message) {
|
||||
// If a message is already set, free it.
|
||||
if (nest_host_error() != nullptr) {
|
||||
FREE_C_HEAP_ARRAY(char, _nest_host_error);
|
||||
}
|
||||
assert(_nest_host_error == nullptr, "caller should have checked");
|
||||
assert_lock_strong(SystemDictionary_lock);
|
||||
_nest_host_error = message;
|
||||
}
|
||||
|
||||
|
||||
@ -1859,7 +1859,7 @@ Symbol* SystemDictionary::find_resolution_error(const constantPoolHandle& pool,
|
||||
|
||||
void SystemDictionary::add_nest_host_error(const constantPoolHandle& pool,
|
||||
int which,
|
||||
const char* message) {
|
||||
const stringStream& message) {
|
||||
{
|
||||
MutexLocker ml(Thread::current(), SystemDictionary_lock);
|
||||
ResolutionErrorEntry* entry = ResolutionErrorTable::find_entry(pool, which);
|
||||
@ -1868,14 +1868,19 @@ void SystemDictionary::add_nest_host_error(const constantPoolHandle& pool,
|
||||
// constant pool index. In this case resolution succeeded but there's an error in this nest host
|
||||
// that we use the table to record.
|
||||
assert(pool->resolved_klass_at(which) != nullptr, "klass should be resolved if there is no entry");
|
||||
ResolutionErrorTable::add_entry(pool, which, message);
|
||||
ResolutionErrorTable::add_entry(pool, which, message.as_string(true /* on C-heap */));
|
||||
} else {
|
||||
// An existing entry means we had a true resolution failure (LinkageError) with our nest host, but we
|
||||
// still want to add the error message for the higher-level access checks to report. We should
|
||||
// only reach here under the same error condition, so we can ignore the potential race with setting
|
||||
// the message, and set it again.
|
||||
assert(entry->nest_host_error() == nullptr || strcmp(entry->nest_host_error(), message) == 0, "should be the same message");
|
||||
entry->set_nest_host_error(message);
|
||||
// the message.
|
||||
const char* nhe = entry->nest_host_error();
|
||||
if (nhe == nullptr) {
|
||||
entry->set_nest_host_error(message.as_string(true /* on C-heap */));
|
||||
} else {
|
||||
DEBUG_ONLY(const char* msg = message.base();)
|
||||
assert(strcmp(nhe, msg) == 0, "New message %s, differs from original %s", msg, nhe);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ public:
|
||||
|
||||
// Record a nest host resolution/validation error
|
||||
static void add_nest_host_error(const constantPoolHandle& pool, int which,
|
||||
const char* message);
|
||||
const stringStream& message);
|
||||
static const char* find_nest_host_error(const constantPoolHandle& pool, int which);
|
||||
|
||||
static void add_to_initiating_loader(JavaThread* current, InstanceKlass* k,
|
||||
|
||||
@ -630,6 +630,14 @@ bool SerialHeap::requires_barriers(stackChunkOop obj) const {
|
||||
|
||||
// Returns "TRUE" iff "p" points into the committed areas of the heap.
|
||||
bool SerialHeap::is_in(const void* p) const {
|
||||
// precondition
|
||||
verify_not_in_native_if_java_thread();
|
||||
|
||||
if (!is_in_reserved(p)) {
|
||||
// If it's not even in reserved.
|
||||
return false;
|
||||
}
|
||||
|
||||
return _young_gen->is_in(p) || _old_gen->is_in(p);
|
||||
}
|
||||
|
||||
@ -797,3 +805,12 @@ void SerialHeap::gc_epilogue(bool full) {
|
||||
|
||||
MetaspaceCounters::update_performance_counters();
|
||||
};
|
||||
|
||||
#ifdef ASSERT
|
||||
void SerialHeap::verify_not_in_native_if_java_thread() {
|
||||
if (Thread::current()->is_Java_thread()) {
|
||||
JavaThread* thread = JavaThread::current();
|
||||
assert(thread->thread_state() != _thread_in_native, "precondition");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -111,6 +111,8 @@ private:
|
||||
void print_tracing_info() const override;
|
||||
void stop() override {};
|
||||
|
||||
static void verify_not_in_native_if_java_thread() NOT_DEBUG_RETURN;
|
||||
|
||||
public:
|
||||
// Returns JNI_OK on success
|
||||
jint initialize() override;
|
||||
|
||||
@ -37,6 +37,7 @@
|
||||
#include "utilities/copy.hpp"
|
||||
|
||||
size_t ThreadLocalAllocBuffer::_max_size = 0;
|
||||
int ThreadLocalAllocBuffer::_reserve_for_allocation_prefetch = 0;
|
||||
unsigned int ThreadLocalAllocBuffer::_target_refills = 0;
|
||||
|
||||
ThreadLocalAllocBuffer::ThreadLocalAllocBuffer() :
|
||||
@ -224,6 +225,30 @@ void ThreadLocalAllocBuffer::startup_initialization() {
|
||||
// abort during VM initialization.
|
||||
_target_refills = MAX2(_target_refills, 2U);
|
||||
|
||||
#ifdef COMPILER2
|
||||
// If the C2 compiler is present, extra space is needed at the end of
|
||||
// TLABs, otherwise prefetching instructions generated by the C2
|
||||
// compiler will fault (due to accessing memory outside of heap).
|
||||
// The amount of space is the max of the number of lines to
|
||||
// prefetch for array and for instance allocations. (Extra space must be
|
||||
// reserved to accommodate both types of allocations.)
|
||||
//
|
||||
// Only SPARC-specific BIS instructions are known to fault. (Those
|
||||
// instructions are generated if AllocatePrefetchStyle==3 and
|
||||
// AllocatePrefetchInstr==1). To be on the safe side, however,
|
||||
// extra space is reserved for all combinations of
|
||||
// AllocatePrefetchStyle and AllocatePrefetchInstr.
|
||||
//
|
||||
// If the C2 compiler is not present, no space is reserved.
|
||||
|
||||
// +1 for rounding up to next cache line, +1 to be safe
|
||||
if (CompilerConfig::is_c2_or_jvmci_compiler_enabled()) {
|
||||
int lines = MAX2(AllocatePrefetchLines, AllocateInstancePrefetchLines) + 2;
|
||||
_reserve_for_allocation_prefetch = (AllocatePrefetchDistance + AllocatePrefetchStepSize * lines) /
|
||||
(int)HeapWordSize;
|
||||
}
|
||||
#endif
|
||||
|
||||
// During jvm startup, the main thread is initialized
|
||||
// before the heap is initialized. So reinitialize it now.
|
||||
guarantee(Thread::current()->is_Java_thread(), "tlab initialization thread not Java thread");
|
||||
@ -429,7 +454,8 @@ void ThreadLocalAllocStats::publish() {
|
||||
}
|
||||
|
||||
size_t ThreadLocalAllocBuffer::end_reserve() {
|
||||
return CollectedHeap::lab_alignment_reserve();
|
||||
size_t reserve_size = CollectedHeap::lab_alignment_reserve();
|
||||
return MAX2(reserve_size, (size_t)_reserve_for_allocation_prefetch);
|
||||
}
|
||||
|
||||
const HeapWord* ThreadLocalAllocBuffer::start_relaxed() const {
|
||||
|
||||
@ -58,6 +58,7 @@ private:
|
||||
size_t _allocated_before_last_gc; // total bytes allocated up until the last gc
|
||||
|
||||
static size_t _max_size; // maximum size of any TLAB
|
||||
static int _reserve_for_allocation_prefetch; // Reserve at the end of the TLAB
|
||||
static unsigned _target_refills; // expected number of refills between GCs
|
||||
|
||||
unsigned _number_of_refills;
|
||||
|
||||
@ -1394,7 +1394,7 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) {
|
||||
}
|
||||
if (addr->Opcode() == Op_AddP) {
|
||||
Node* orig_base = addr->in(AddPNode::Base);
|
||||
Node* base = new CheckCastPPNode(ctrl, orig_base, orig_base->bottom_type(), ConstraintCastNode::StrongDependency);
|
||||
Node* base = new CheckCastPPNode(ctrl, orig_base, orig_base->bottom_type(), ConstraintCastNode::DependencyType::NonFloatingNarrowing);
|
||||
phase->register_new_node(base, ctrl);
|
||||
if (addr->in(AddPNode::Base) == addr->in((AddPNode::Address))) {
|
||||
// Field access
|
||||
|
||||
@ -128,8 +128,8 @@ public:
|
||||
void write_ref_array(HeapWord* start, size_t count);
|
||||
|
||||
private:
|
||||
template <class T>
|
||||
inline void arraycopy_marking(T* dst, size_t count);
|
||||
template <bool IS_GENERATIONAL, class T>
|
||||
void arraycopy_marking(T* dst, size_t count);
|
||||
template <class T>
|
||||
inline void arraycopy_evacuation(T* src, size_t count);
|
||||
template <class T>
|
||||
|
||||
@ -429,7 +429,11 @@ void ShenandoahBarrierSet::arraycopy_barrier(T* src, T* dst, size_t count) {
|
||||
// If marking old or young, we must evaluate the SATB barrier. This will be the only
|
||||
// action if we are not marking old. If we are marking old, we must still evaluate the
|
||||
// load reference barrier for a young collection.
|
||||
arraycopy_marking(dst, count);
|
||||
if (_heap->mode()->is_generational()) {
|
||||
arraycopy_marking<true>(dst, count);
|
||||
} else {
|
||||
arraycopy_marking<false>(dst, count);
|
||||
}
|
||||
}
|
||||
|
||||
if ((gc_state & ShenandoahHeap::EVACUATION) != 0) {
|
||||
@ -441,11 +445,12 @@ void ShenandoahBarrierSet::arraycopy_barrier(T* src, T* dst, size_t count) {
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
template <bool IS_GENERATIONAL, class T>
|
||||
void ShenandoahBarrierSet::arraycopy_marking(T* dst, size_t count) {
|
||||
assert(_heap->is_concurrent_mark_in_progress(), "only during marking");
|
||||
if (ShenandoahSATBBarrier) {
|
||||
if (!_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst))) {
|
||||
if (!_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst)) ||
|
||||
(IS_GENERATIONAL && _heap->heap_region_containing(dst)->is_old() && _heap->is_concurrent_young_mark_in_progress())) {
|
||||
arraycopy_work<T, false, false, true>(dst, count);
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,6 +87,9 @@ JVM_InternString(JNIEnv *env, jstring str);
|
||||
/*
|
||||
* java.lang.System
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL
|
||||
JVM_AOTEndRecording(JNIEnv *env);
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored);
|
||||
|
||||
|
||||
@ -125,20 +125,6 @@ static traceid get_source(const InstanceKlass* ik, JavaThread* jt) {
|
||||
return source_id;
|
||||
}
|
||||
|
||||
static traceid get_source(const AOTClassLocation* cl, JavaThread* jt) {
|
||||
assert(cl != nullptr, "invariant");
|
||||
assert(!cl->is_modules_image(), "invariant");
|
||||
const char* const path = cl->path();
|
||||
assert(path != nullptr, "invariant");
|
||||
size_t len = strlen(path);
|
||||
const char* file_type = cl->file_type_string();
|
||||
assert(file_type != nullptr, "invariant");
|
||||
len += strlen(file_type) + 3; // ":/" + null
|
||||
char* const url = NEW_RESOURCE_ARRAY_IN_THREAD(jt, char, len);
|
||||
jio_snprintf(url, len, "%s%s%s", file_type, ":/", path);
|
||||
return JfrSymbolTable::add(url);
|
||||
}
|
||||
|
||||
static inline void send_event(const InstanceKlass* ik, traceid source_id) {
|
||||
EventClassDefine event;
|
||||
event.set_definedClass(ik);
|
||||
@ -172,6 +158,20 @@ void JfrClassDefineEvent::on_creation(const InstanceKlass* ik, const ClassFilePa
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS
|
||||
static traceid get_source(const AOTClassLocation* cl, JavaThread* jt) {
|
||||
assert(cl != nullptr, "invariant");
|
||||
assert(!cl->is_modules_image(), "invariant");
|
||||
const char* const path = cl->path();
|
||||
assert(path != nullptr, "invariant");
|
||||
size_t len = strlen(path);
|
||||
const char* file_type = cl->file_type_string();
|
||||
assert(file_type != nullptr, "invariant");
|
||||
len += strlen(file_type) + 3; // ":/" + null
|
||||
char* const url = NEW_RESOURCE_ARRAY_IN_THREAD(jt, char, len);
|
||||
jio_snprintf(url, len, "%s%s%s", file_type, ":/", path);
|
||||
return JfrSymbolTable::add(url);
|
||||
}
|
||||
|
||||
void JfrClassDefineEvent::on_restoration(const InstanceKlass* ik, JavaThread* jt) {
|
||||
assert(ik != nullptr, "invariant");
|
||||
assert(ik->trace_id() != 0, "invariant");
|
||||
|
||||
@ -312,12 +312,11 @@ InstanceKlass* InstanceKlass::nest_host(TRAPS) {
|
||||
ss.print("Nest host resolution of %s with host %s failed: ",
|
||||
this->external_name(), target_host_class);
|
||||
java_lang_Throwable::print(PENDING_EXCEPTION, &ss);
|
||||
const char* msg = ss.as_string(true /* on C-heap */);
|
||||
constantPoolHandle cph(THREAD, constants());
|
||||
SystemDictionary::add_nest_host_error(cph, _nest_host_index, msg);
|
||||
SystemDictionary::add_nest_host_error(cph, _nest_host_index, ss);
|
||||
CLEAR_PENDING_EXCEPTION;
|
||||
|
||||
log_trace(class, nestmates)("%s", msg);
|
||||
log_trace(class, nestmates)("%s", ss.base());
|
||||
} else {
|
||||
// A valid nest-host is an instance class in the current package that lists this
|
||||
// class as a nest member. If any of these conditions are not met the class is
|
||||
@ -356,10 +355,9 @@ InstanceKlass* InstanceKlass::nest_host(TRAPS) {
|
||||
k->external_name(),
|
||||
k->class_loader_data()->loader_name_and_id(),
|
||||
error);
|
||||
const char* msg = ss.as_string(true /* on C-heap */);
|
||||
constantPoolHandle cph(THREAD, constants());
|
||||
SystemDictionary::add_nest_host_error(cph, _nest_host_index, msg);
|
||||
log_trace(class, nestmates)("%s", msg);
|
||||
SystemDictionary::add_nest_host_error(cph, _nest_host_index, ss);
|
||||
log_trace(class, nestmates)("%s", ss.base());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -1598,8 +1598,10 @@ static Node* fold_subI_no_underflow_pattern(Node* n, PhaseGVN* phase) {
|
||||
Node* x = add2->in(1);
|
||||
Node* con2 = add2->in(2);
|
||||
if (is_sub_con(con2)) {
|
||||
// The graph could be dying (i.e. x is top) in which case type(x) is not a long.
|
||||
const TypeLong* x_long = phase->type(x)->isa_long();
|
||||
// Collapsed graph not equivalent if potential over/underflow -> bailing out (*)
|
||||
if (can_overflow(phase->type(x)->is_long(), con1->get_long() + con2->get_long())) {
|
||||
if (x_long == nullptr || can_overflow(x_long, con1->get_long() + con2->get_long())) {
|
||||
return nullptr;
|
||||
}
|
||||
Node* new_con = phase->transform(new AddLNode(con1, con2));
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "castnode.hpp"
|
||||
#include "opto/addnode.hpp"
|
||||
#include "opto/callnode.hpp"
|
||||
#include "opto/castnode.hpp"
|
||||
@ -35,12 +34,22 @@
|
||||
#include "opto/type.hpp"
|
||||
#include "utilities/checkedCast.hpp"
|
||||
|
||||
const ConstraintCastNode::DependencyType ConstraintCastNode::DependencyType::FloatingNarrowing(true, true, "floating narrowing dependency"); // not pinned, narrows type
|
||||
const ConstraintCastNode::DependencyType ConstraintCastNode::DependencyType::FloatingNonNarrowing(true, false, "floating non-narrowing dependency"); // not pinned, doesn't narrow type
|
||||
const ConstraintCastNode::DependencyType ConstraintCastNode::DependencyType::NonFloatingNarrowing(false, true, "non-floating narrowing dependency"); // pinned, narrows type
|
||||
const ConstraintCastNode::DependencyType ConstraintCastNode::DependencyType::NonFloatingNonNarrowing(false, false, "non-floating non-narrowing dependency"); // pinned, doesn't narrow type
|
||||
|
||||
//=============================================================================
|
||||
// If input is already higher or equal to cast type, then this is an identity.
|
||||
Node* ConstraintCastNode::Identity(PhaseGVN* phase) {
|
||||
if (_dependency == UnconditionalDependency) {
|
||||
if (!_dependency.narrows_type()) {
|
||||
// If this cast doesn't carry a type dependency (i.e. not used for type narrowing), we cannot optimize it.
|
||||
return this;
|
||||
}
|
||||
|
||||
// This cast node carries a type dependency. We can remove it if:
|
||||
// - Its input has a narrower type
|
||||
// - There's a dominating cast with same input but narrower type
|
||||
Node* dom = dominating_cast(phase, phase);
|
||||
if (dom != nullptr) {
|
||||
return dom;
|
||||
@ -109,7 +118,7 @@ Node* ConstraintCastNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
}
|
||||
|
||||
uint ConstraintCastNode::hash() const {
|
||||
return TypeNode::hash() + (int)_dependency + (_extra_types != nullptr ? _extra_types->hash() : 0);
|
||||
return TypeNode::hash() + _dependency.hash() + (_extra_types != nullptr ? _extra_types->hash() : 0);
|
||||
}
|
||||
|
||||
bool ConstraintCastNode::cmp(const Node &n) const {
|
||||
@ -117,7 +126,7 @@ bool ConstraintCastNode::cmp(const Node &n) const {
|
||||
return false;
|
||||
}
|
||||
ConstraintCastNode& cast = (ConstraintCastNode&) n;
|
||||
if (cast._dependency != _dependency) {
|
||||
if (!cast._dependency.cmp(_dependency)) {
|
||||
return false;
|
||||
}
|
||||
if (_extra_types == nullptr || cast._extra_types == nullptr) {
|
||||
@ -130,7 +139,7 @@ uint ConstraintCastNode::size_of() const {
|
||||
return sizeof(*this);
|
||||
}
|
||||
|
||||
Node* ConstraintCastNode::make_cast_for_basic_type(Node* c, Node* n, const Type* t, DependencyType dependency, BasicType bt) {
|
||||
Node* ConstraintCastNode::make_cast_for_basic_type(Node* c, Node* n, const Type* t, const DependencyType& dependency, BasicType bt) {
|
||||
switch(bt) {
|
||||
case T_INT:
|
||||
return new CastIINode(c, n, t, dependency);
|
||||
@ -143,9 +152,9 @@ Node* ConstraintCastNode::make_cast_for_basic_type(Node* c, Node* n, const Type*
|
||||
}
|
||||
|
||||
TypeNode* ConstraintCastNode::dominating_cast(PhaseGVN* gvn, PhaseTransform* pt) const {
|
||||
if (_dependency == UnconditionalDependency) {
|
||||
return nullptr;
|
||||
}
|
||||
// See discussion at definition of ConstraintCastNode::DependencyType: replacing this cast with a dominating one is
|
||||
// not safe if _dependency.narrows_type() is not true.
|
||||
assert(_dependency.narrows_type(), "cast can't be replaced by dominating one");
|
||||
Node* val = in(1);
|
||||
Node* ctl = in(0);
|
||||
int opc = Opcode();
|
||||
@ -205,30 +214,21 @@ void ConstraintCastNode::dump_spec(outputStream *st) const {
|
||||
st->print(" extra types: ");
|
||||
_extra_types->dump_on(st);
|
||||
}
|
||||
if (_dependency != RegularDependency) {
|
||||
st->print(" %s dependency", _dependency == StrongDependency ? "strong" : "unconditional");
|
||||
}
|
||||
st->print(" ");
|
||||
_dependency.dump_on(st);
|
||||
}
|
||||
#endif
|
||||
|
||||
const Type* CastIINode::Value(PhaseGVN* phase) const {
|
||||
const Type *res = ConstraintCastNode::Value(phase);
|
||||
if (res == Type::TOP) {
|
||||
return Type::TOP;
|
||||
}
|
||||
assert(res->isa_int(), "res must be int");
|
||||
|
||||
// Similar to ConvI2LNode::Value() for the same reasons
|
||||
// see if we can remove type assertion after loop opts
|
||||
res = widen_type(phase, res, T_INT);
|
||||
|
||||
return res;
|
||||
CastIINode* CastIINode::make_with(Node* parent, const TypeInteger* type, const DependencyType& dependency) const {
|
||||
return new CastIINode(in(0), parent, type, dependency, _range_check_dependency, _extra_types);
|
||||
}
|
||||
|
||||
Node* ConstraintCastNode::find_or_make_integer_cast(PhaseIterGVN* igvn, Node* parent, const TypeInteger* type) const {
|
||||
Node* n = clone();
|
||||
n->set_req(1, parent);
|
||||
n->as_ConstraintCast()->set_type(type);
|
||||
CastLLNode* CastLLNode::make_with(Node* parent, const TypeInteger* type, const DependencyType& dependency) const {
|
||||
return new CastLLNode(in(0), parent, type, dependency, _extra_types);
|
||||
}
|
||||
|
||||
Node* ConstraintCastNode::find_or_make_integer_cast(PhaseIterGVN* igvn, Node* parent, const TypeInteger* type, const DependencyType& dependency) const {
|
||||
Node* n = make_with(parent, type, dependency);
|
||||
Node* existing = igvn->hash_find_insert(n);
|
||||
if (existing != nullptr) {
|
||||
n->destruct(igvn);
|
||||
@ -242,14 +242,13 @@ Node *CastIINode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
if (progress != nullptr) {
|
||||
return progress;
|
||||
}
|
||||
if (can_reshape && !phase->C->post_loop_opts_phase()) {
|
||||
// makes sure we run ::Value to potentially remove type assertion after loop opts
|
||||
if (!phase->C->post_loop_opts_phase()) {
|
||||
// makes sure we run widen_type() to potentially common type assertions after loop opts
|
||||
phase->C->record_for_post_loop_opts_igvn(this);
|
||||
}
|
||||
if (!_range_check_dependency || phase->C->post_loop_opts_phase()) {
|
||||
return optimize_integer_cast(phase, T_INT);
|
||||
}
|
||||
phase->C->record_for_post_loop_opts_igvn(this);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -279,9 +278,9 @@ void CastIINode::dump_spec(outputStream* st) const {
|
||||
#endif
|
||||
|
||||
CastIINode* CastIINode::pin_array_access_node() const {
|
||||
assert(_dependency == RegularDependency, "already pinned");
|
||||
assert(_dependency.is_floating(), "already pinned");
|
||||
if (has_range_check()) {
|
||||
return new CastIINode(in(0), in(1), bottom_type(), StrongDependency, has_range_check());
|
||||
return new CastIINode(in(0), in(1), bottom_type(), _dependency.with_pinned_dependency(), has_range_check());
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@ -315,16 +314,6 @@ void CastIINode::remove_range_check_cast(Compile* C) {
|
||||
}
|
||||
|
||||
|
||||
const Type* CastLLNode::Value(PhaseGVN* phase) const {
|
||||
const Type* res = ConstraintCastNode::Value(phase);
|
||||
if (res == Type::TOP) {
|
||||
return Type::TOP;
|
||||
}
|
||||
assert(res->isa_long(), "res must be long");
|
||||
|
||||
return widen_type(phase, res, T_LONG);
|
||||
}
|
||||
|
||||
bool CastLLNode::is_inner_loop_backedge(ProjNode* proj) {
|
||||
if (proj != nullptr) {
|
||||
Node* ctrl_use = proj->unique_ctrl_out_or_null();
|
||||
@ -392,7 +381,7 @@ Node* CastLLNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
return progress;
|
||||
}
|
||||
if (!phase->C->post_loop_opts_phase()) {
|
||||
// makes sure we run ::Value to potentially remove type assertion after loop opts
|
||||
// makes sure we run widen_type() to potentially common type assertions after loop opts
|
||||
phase->C->record_for_post_loop_opts_igvn(this);
|
||||
}
|
||||
// transform (CastLL (ConvI2L ..)) into (ConvI2L (CastII ..)) if the type of the CastLL is narrower than the type of
|
||||
@ -543,7 +532,7 @@ Node* CastP2XNode::Identity(PhaseGVN* phase) {
|
||||
return this;
|
||||
}
|
||||
|
||||
Node* ConstraintCastNode::make_cast_for_type(Node* c, Node* in, const Type* type, DependencyType dependency,
|
||||
Node* ConstraintCastNode::make_cast_for_type(Node* c, Node* in, const Type* type, const DependencyType& dependency,
|
||||
const TypeTuple* types) {
|
||||
if (type->isa_int()) {
|
||||
return new CastIINode(c, in, type, dependency, false, types);
|
||||
@ -564,7 +553,7 @@ Node* ConstraintCastNode::make_cast_for_type(Node* c, Node* in, const Type* type
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node* ConstraintCastNode::optimize_integer_cast(PhaseGVN* phase, BasicType bt) {
|
||||
Node* ConstraintCastNode::optimize_integer_cast_of_add(PhaseGVN* phase, BasicType bt) {
|
||||
PhaseIterGVN *igvn = phase->is_IterGVN();
|
||||
const TypeInteger* this_type = this->type()->isa_integer(bt);
|
||||
if (this_type == nullptr) {
|
||||
@ -586,8 +575,42 @@ Node* ConstraintCastNode::optimize_integer_cast(PhaseGVN* phase, BasicType bt) {
|
||||
Node* x = z->in(1);
|
||||
Node* y = z->in(2);
|
||||
|
||||
Node* cx = find_or_make_integer_cast(igvn, x, rx);
|
||||
Node* cy = find_or_make_integer_cast(igvn, y, ry);
|
||||
const TypeInteger* tx = phase->type(x)->is_integer(bt);
|
||||
const TypeInteger* ty = phase->type(y)->is_integer(bt);
|
||||
|
||||
// (Cast (Add x y) tz) is transformed into (Add (Cast x rx) (Cast y ry))
|
||||
//
|
||||
// tz = [tzlo, tzhi]
|
||||
// rx = [rxlo, rxhi]
|
||||
// ry = [rylo, ryhi]
|
||||
// with type of x, tx = [txlo, txhi]
|
||||
// with type of y, ty = [tylo, tyhi]
|
||||
//
|
||||
// From Compile::push_thru_add():
|
||||
// rxlo = max(tzlo - tyhi, txlo)
|
||||
// rxhi = min(tzhi - tylo, txhi)
|
||||
// rylo = max(tzlo - txhi, tylo)
|
||||
// ryhi = min(tzhi - txlo, tyhi)
|
||||
//
|
||||
// If x is a constant, then txlo = txhi
|
||||
// rxlo = txlo, rxhi = txhi
|
||||
// The bounds of the type of the Add after transformation then is:
|
||||
// rxlo + rylo >= txlo + tzlo - txhi >= tzlo
|
||||
// rxhi + ryhi <= txhi + tzhi - txlo <= tzhi
|
||||
// The resulting type is not wider than the type of the Cast
|
||||
// before transformation
|
||||
//
|
||||
// If neither x nor y are constant then the type of the resulting
|
||||
// Add can be wider than the type of the type of the Cast before
|
||||
// transformation.
|
||||
// For instance, tx = [0, 10], ty = [0, 10], tz = [0, 10]
|
||||
// then rx = [0, 10], ry = [0, 10]
|
||||
// and rx + ry = [0, 20] which is wider than tz
|
||||
//
|
||||
// Same reasoning applies to (Cast (Sub x y) tz)
|
||||
const DependencyType& dependency = (!tx->is_con() && !ty->is_con()) ? _dependency.with_non_narrowing() : _dependency;
|
||||
Node* cx = find_or_make_integer_cast(igvn, x, rx, dependency);
|
||||
Node* cy = find_or_make_integer_cast(igvn, y, ry, dependency);
|
||||
if (op == Op_Add(bt)) {
|
||||
return AddNode::make(cx, cy, bt);
|
||||
} else {
|
||||
@ -599,11 +622,26 @@ Node* ConstraintCastNode::optimize_integer_cast(PhaseGVN* phase, BasicType bt) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Type* ConstraintCastNode::widen_type(const PhaseGVN* phase, const Type* res, BasicType bt) const {
|
||||
if (!phase->C->post_loop_opts_phase()) {
|
||||
Node* ConstraintCastNode::optimize_integer_cast(PhaseGVN* phase, BasicType bt) {
|
||||
Node* res = optimize_integer_cast_of_add(phase, bt);
|
||||
if (res != nullptr) {
|
||||
return res;
|
||||
}
|
||||
const Type* t = Value(phase);
|
||||
if (t != Type::TOP && phase->C->post_loop_opts_phase()) {
|
||||
const Type* bottom_t = bottom_type();
|
||||
const TypeInteger* wide_t = widen_type(phase, bottom_t, bt);
|
||||
if (wide_t != bottom_t) {
|
||||
// Widening the type of the Cast (to allow some commoning) causes the Cast to change how it can be optimized (if
|
||||
// type of its input is narrower than the Cast's type, we can't remove it to not loose the control dependency).
|
||||
return make_with(in(1), wide_t, _dependency.with_non_narrowing());
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const TypeInteger* ConstraintCastNode::widen_type(const PhaseGVN* phase, const Type* res, BasicType bt) const {
|
||||
const TypeInteger* this_type = res->is_integer(bt);
|
||||
// At VerifyConstraintCasts == 1, we verify the ConstraintCastNodes that are present during code
|
||||
// emission. This allows us detecting possible mis-scheduling due to these nodes being pinned at
|
||||
// the wrong control nodes.
|
||||
@ -612,10 +650,9 @@ const Type* ConstraintCastNode::widen_type(const PhaseGVN* phase, const Type* re
|
||||
// mis-transformations that may happen due to these nodes being pinned at the wrong control
|
||||
// nodes.
|
||||
if (VerifyConstraintCasts > 1) {
|
||||
return res;
|
||||
return this_type;
|
||||
}
|
||||
|
||||
const TypeInteger* this_type = res->is_integer(bt);
|
||||
const TypeInteger* in_type = phase->type(in(1))->isa_integer(bt);
|
||||
if (in_type != nullptr &&
|
||||
(in_type->lo_as_long() != this_type->lo_as_long() ||
|
||||
@ -636,5 +673,5 @@ const Type* ConstraintCastNode::widen_type(const PhaseGVN* phase, const Type* re
|
||||
MIN2(in_type->hi_as_long(), hi1),
|
||||
MAX2((int)in_type->_widen, w1), bt);
|
||||
}
|
||||
return res;
|
||||
return this_type;
|
||||
}
|
||||
|
||||
@ -33,21 +33,119 @@
|
||||
// cast to a different range
|
||||
class ConstraintCastNode: public TypeNode {
|
||||
public:
|
||||
enum DependencyType {
|
||||
RegularDependency, // if cast doesn't improve input type, cast can be removed
|
||||
StrongDependency, // leave cast in even if _type doesn't improve input type, can be replaced by stricter dominating cast if one exist
|
||||
UnconditionalDependency // leave cast in unconditionally
|
||||
// Cast nodes are subject to a few optimizations:
|
||||
//
|
||||
// 1- if the type carried by the Cast doesn't narrow the type of its input, the cast can be replaced by its input.
|
||||
// Similarly, if a dominating Cast with the same input and a narrower type constraint is found, it can replace the
|
||||
// current cast.
|
||||
//
|
||||
// 2- if the condition that the Cast is control dependent is hoisted, the Cast is hoisted as well
|
||||
//
|
||||
// 1- and 2- are not always applied depending on what constraint are applied to the Cast: there are cases where 1-
|
||||
// and 2- apply, where neither 1- nor 2- apply and where one or the other apply. This class abstract away these
|
||||
// details.
|
||||
//
|
||||
// If _narrows_type is true, the cast carries a type dependency: "after" the control the cast is dependent on, its data
|
||||
// input is known to have a narrower type (stored in the cast node itself). Optimizations 1- above only apply to cast
|
||||
// nodes for which _narrows_type is true.
|
||||
// if _floating is true, the cast only depends on a single control: its control input. Otherwise, it is pinned at its
|
||||
// current location. Optimizations 2- only apply to cast nodes for which _floating is true.
|
||||
// _floating here is similar to Node::depends_only_on_test().
|
||||
// The 4 combinations of _narrows_types/_floating true/false have some use. See below, at the end of this class
|
||||
// definition, for examples.
|
||||
class DependencyType {
|
||||
private:
|
||||
const bool _floating; // Does this Cast depends on its control input or is it pinned?
|
||||
const bool _narrows_type; // Does this Cast narrows the type i.e. if input type is narrower can it be removed?
|
||||
const char* _desc;
|
||||
DependencyType(bool depends_on_test, bool narrows_type, const char* desc)
|
||||
: _floating(depends_on_test),
|
||||
_narrows_type(narrows_type),
|
||||
_desc(desc) {
|
||||
}
|
||||
NONCOPYABLE(DependencyType);
|
||||
|
||||
public:
|
||||
|
||||
bool is_floating() const {
|
||||
return _floating;
|
||||
}
|
||||
|
||||
bool narrows_type() const {
|
||||
return _narrows_type;
|
||||
}
|
||||
|
||||
void dump_on(outputStream *st) const {
|
||||
st->print("%s", _desc);
|
||||
}
|
||||
|
||||
uint hash() const {
|
||||
return (_floating ? 1 : 0) + (_narrows_type ? 2 : 0);
|
||||
}
|
||||
|
||||
bool cmp(const DependencyType& other) const {
|
||||
return _floating == other._floating && _narrows_type == other._narrows_type;
|
||||
}
|
||||
|
||||
const DependencyType& with_non_narrowing() const {
|
||||
if (_floating) {
|
||||
return FloatingNonNarrowing;
|
||||
}
|
||||
return NonFloatingNonNarrowing;
|
||||
}
|
||||
|
||||
const DependencyType& with_pinned_dependency() const {
|
||||
if (_narrows_type) {
|
||||
return NonFloatingNarrowing;
|
||||
}
|
||||
return NonFloatingNonNarrowing;
|
||||
}
|
||||
|
||||
// All the possible combinations of floating/narrowing with example use cases:
|
||||
|
||||
// Use case example: Range Check CastII
|
||||
// Floating: The Cast is only dependent on the single range check. If the range check was ever to be hoisted it
|
||||
// would be safe to let the Cast float to where the range check is hoisted up to.
|
||||
// Narrowing: The Cast narrows the type to a positive index. If the input to the Cast is narrower, we can safely
|
||||
// remove the cast because the array access will be safe.
|
||||
static const DependencyType FloatingNarrowing;
|
||||
// Use case example: Widening Cast nodes' types after loop opts: We want to common Casts with slightly different types.
|
||||
// Floating: These Casts only depend on the single control.
|
||||
// NonNarrowing: Even when the input type is narrower, we are not removing the Cast. Otherwise, the dependency
|
||||
// to the single control is lost, and an array access could float above its range check because we
|
||||
// just removed the dependency to the range check by removing the Cast. This could lead to an
|
||||
// out-of-bounds access.
|
||||
static const DependencyType FloatingNonNarrowing;
|
||||
// Use case example: An array accesses that is no longer dependent on a single range check (e.g. range check smearing).
|
||||
// NonFloating: The array access must be pinned below all the checks it depends on. If the check it directly depends
|
||||
// on with a control input is hoisted, we do not hoist the Cast as well. If we allowed the Cast to float,
|
||||
// we risk that the array access ends up above another check it depends on (we cannot model two control
|
||||
// dependencies for a node in the IR). This could lead to an out-of-bounds access.
|
||||
// Narrowing: If the Cast does not narrow the input type, then it's safe to remove the cast because the array access
|
||||
// will be safe.
|
||||
static const DependencyType NonFloatingNarrowing;
|
||||
// Use case example: Sinking nodes out of a loop
|
||||
// Non-Floating & Non-Narrowing: We don't want the Cast that forces the node to be out of loop to be removed in any
|
||||
// case. Otherwise, the sunk node could float back into the loop, undoing the sinking.
|
||||
// This Cast is only used for pinning without caring about narrowing types.
|
||||
static const DependencyType NonFloatingNonNarrowing;
|
||||
|
||||
};
|
||||
|
||||
protected:
|
||||
const DependencyType _dependency;
|
||||
protected:
|
||||
const DependencyType& _dependency;
|
||||
virtual bool cmp( const Node &n ) const;
|
||||
virtual uint size_of() const;
|
||||
virtual uint hash() const; // Check the type
|
||||
const Type* widen_type(const PhaseGVN* phase, const Type* res, BasicType bt) const;
|
||||
Node* find_or_make_integer_cast(PhaseIterGVN* igvn, Node* parent, const TypeInteger* type) const;
|
||||
const TypeInteger* widen_type(const PhaseGVN* phase, const Type* res, BasicType bt) const;
|
||||
|
||||
virtual ConstraintCastNode* make_with(Node* parent, const TypeInteger* type, const DependencyType& dependency) const {
|
||||
ShouldNotReachHere(); // Only implemented for CastII and CastLL
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node* find_or_make_integer_cast(PhaseIterGVN* igvn, Node* parent, const TypeInteger* type, const DependencyType& dependency) const;
|
||||
|
||||
private:
|
||||
// PhiNode::Ideal() transforms a Phi that merges a single uncasted value into a single cast pinned at the region.
|
||||
// The types of cast nodes eliminated as a consequence of this transformation are collected and stored here so the
|
||||
// type dependencies carried by the cast are known. The cast can then be eliminated if the type of its input is
|
||||
@ -55,7 +153,7 @@ public:
|
||||
const TypeTuple* _extra_types;
|
||||
|
||||
public:
|
||||
ConstraintCastNode(Node* ctrl, Node* n, const Type* t, ConstraintCastNode::DependencyType dependency,
|
||||
ConstraintCastNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency,
|
||||
const TypeTuple* extra_types)
|
||||
: TypeNode(t,2), _dependency(dependency), _extra_types(extra_types) {
|
||||
init_class_id(Class_ConstraintCast);
|
||||
@ -67,18 +165,21 @@ public:
|
||||
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
|
||||
virtual int Opcode() const;
|
||||
virtual uint ideal_reg() const = 0;
|
||||
virtual bool depends_only_on_test() const { return _dependency == RegularDependency; }
|
||||
bool carry_dependency() const { return _dependency != RegularDependency; }
|
||||
bool carry_dependency() const { return !_dependency.cmp(DependencyType::FloatingNarrowing); }
|
||||
// A cast node depends_only_on_test if and only if it is floating
|
||||
virtual bool depends_only_on_test() const { return _dependency.is_floating(); }
|
||||
const DependencyType& dependency() const { return _dependency; }
|
||||
TypeNode* dominating_cast(PhaseGVN* gvn, PhaseTransform* pt) const;
|
||||
static Node* make_cast_for_basic_type(Node* c, Node* n, const Type* t, DependencyType dependency, BasicType bt);
|
||||
static Node* make_cast_for_basic_type(Node* c, Node* n, const Type* t, const DependencyType& dependency, BasicType bt);
|
||||
|
||||
#ifndef PRODUCT
|
||||
virtual void dump_spec(outputStream *st) const;
|
||||
#endif
|
||||
|
||||
static Node* make_cast_for_type(Node* c, Node* in, const Type* type, DependencyType dependency,
|
||||
static Node* make_cast_for_type(Node* c, Node* in, const Type* type, const DependencyType& dependency,
|
||||
const TypeTuple* types);
|
||||
|
||||
Node* optimize_integer_cast_of_add(PhaseGVN* phase, BasicType bt);
|
||||
Node* optimize_integer_cast(PhaseGVN* phase, BasicType bt);
|
||||
|
||||
bool higher_equal_types(PhaseGVN* phase, const Node* other) const;
|
||||
@ -102,7 +203,7 @@ class CastIINode: public ConstraintCastNode {
|
||||
virtual uint size_of() const;
|
||||
|
||||
public:
|
||||
CastIINode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, bool range_check_dependency = false, const TypeTuple* types = nullptr)
|
||||
CastIINode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, bool range_check_dependency = false, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types), _range_check_dependency(range_check_dependency) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastII);
|
||||
@ -110,7 +211,7 @@ class CastIINode: public ConstraintCastNode {
|
||||
virtual int Opcode() const;
|
||||
virtual uint ideal_reg() const { return Op_RegI; }
|
||||
virtual Node* Identity(PhaseGVN* phase);
|
||||
virtual const Type* Value(PhaseGVN* phase) const;
|
||||
|
||||
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
|
||||
bool has_range_check() const {
|
||||
#ifdef _LP64
|
||||
@ -122,6 +223,7 @@ class CastIINode: public ConstraintCastNode {
|
||||
}
|
||||
|
||||
CastIINode* pin_array_access_node() const;
|
||||
CastIINode* make_with(Node* parent, const TypeInteger* type, const DependencyType& dependency) const;
|
||||
void remove_range_check_cast(Compile* C);
|
||||
|
||||
#ifndef PRODUCT
|
||||
@ -131,14 +233,12 @@ class CastIINode: public ConstraintCastNode {
|
||||
|
||||
class CastLLNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastLLNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastLLNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastLL);
|
||||
}
|
||||
|
||||
virtual const Type* Value(PhaseGVN* phase) const;
|
||||
|
||||
static bool is_inner_loop_backedge(ProjNode* proj);
|
||||
|
||||
static bool cmp_used_at_inner_loop_exit_test(CmpNode* cmp);
|
||||
@ -147,11 +247,12 @@ public:
|
||||
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
|
||||
virtual int Opcode() const;
|
||||
virtual uint ideal_reg() const { return Op_RegL; }
|
||||
CastLLNode* make_with(Node* parent, const TypeInteger* type, const DependencyType& dependency) const;
|
||||
};
|
||||
|
||||
class CastHHNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastHHNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastHHNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastHH);
|
||||
@ -162,7 +263,7 @@ public:
|
||||
|
||||
class CastFFNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastFFNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastFFNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastFF);
|
||||
@ -173,7 +274,7 @@ public:
|
||||
|
||||
class CastDDNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastDDNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastDDNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastDD);
|
||||
@ -184,7 +285,7 @@ public:
|
||||
|
||||
class CastVVNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastVVNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastVVNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CastVV);
|
||||
@ -198,7 +299,7 @@ public:
|
||||
// cast pointer to pointer (different type)
|
||||
class CastPPNode: public ConstraintCastNode {
|
||||
public:
|
||||
CastPPNode (Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CastPPNode (Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
init_class_id(Class_CastPP);
|
||||
}
|
||||
@ -210,7 +311,7 @@ class CastPPNode: public ConstraintCastNode {
|
||||
// for _checkcast, cast pointer to pointer (different type), without JOIN,
|
||||
class CheckCastPPNode: public ConstraintCastNode {
|
||||
public:
|
||||
CheckCastPPNode(Node* ctrl, Node* n, const Type* t, DependencyType dependency = RegularDependency, const TypeTuple* types = nullptr)
|
||||
CheckCastPPNode(Node* ctrl, Node* n, const Type* t, const DependencyType& dependency = DependencyType::FloatingNarrowing, const TypeTuple* types = nullptr)
|
||||
: ConstraintCastNode(ctrl, n, t, dependency, types) {
|
||||
assert(ctrl != nullptr, "control must be set");
|
||||
init_class_id(Class_CheckCastPP);
|
||||
|
||||
@ -1483,18 +1483,9 @@ Node* PhiNode::Identity(PhaseGVN* phase) {
|
||||
Node* phi_reg = region();
|
||||
for (DUIterator_Fast imax, i = phi_reg->fast_outs(imax); i < imax; i++) {
|
||||
Node* u = phi_reg->fast_out(i);
|
||||
if (u->is_Phi() && u->as_Phi()->type() == Type::MEMORY &&
|
||||
u->adr_type() == TypePtr::BOTTOM && u->in(0) == phi_reg &&
|
||||
u->req() == phi_len) {
|
||||
for (uint j = 1; j < phi_len; j++) {
|
||||
if (in(j) != u->in(j)) {
|
||||
u = nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (u != nullptr) {
|
||||
return u;
|
||||
}
|
||||
assert(!u->is_Phi() || u->in(0) == phi_reg, "broken Phi/Region subgraph");
|
||||
if (u->is_Phi() && u->req() == phi_len && can_be_replaced_by(u->as_Phi())) {
|
||||
return u;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2192,7 +2183,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
if (phi_type->isa_ptr()) {
|
||||
const Type* uin_type = phase->type(uin);
|
||||
if (!phi_type->isa_oopptr() && !uin_type->isa_oopptr()) {
|
||||
cast = new CastPPNode(r, uin, phi_type, ConstraintCastNode::StrongDependency, extra_types);
|
||||
cast = new CastPPNode(r, uin, phi_type, ConstraintCastNode::DependencyType::NonFloatingNarrowing, extra_types);
|
||||
} else {
|
||||
// Use a CastPP for a cast to not null and a CheckCastPP for
|
||||
// a cast to a new klass (and both if both null-ness and
|
||||
@ -2202,7 +2193,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
// null, uin's type must be casted to not null
|
||||
if (phi_type->join(TypePtr::NOTNULL) == phi_type->remove_speculative() &&
|
||||
uin_type->join(TypePtr::NOTNULL) != uin_type->remove_speculative()) {
|
||||
cast = new CastPPNode(r, uin, TypePtr::NOTNULL, ConstraintCastNode::StrongDependency, extra_types);
|
||||
cast = new CastPPNode(r, uin, TypePtr::NOTNULL, ConstraintCastNode::DependencyType::NonFloatingNarrowing, extra_types);
|
||||
}
|
||||
|
||||
// If the type of phi and uin, both casted to not null,
|
||||
@ -2214,14 +2205,14 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
cast = phase->transform(cast);
|
||||
n = cast;
|
||||
}
|
||||
cast = new CheckCastPPNode(r, n, phi_type, ConstraintCastNode::StrongDependency, extra_types);
|
||||
cast = new CheckCastPPNode(r, n, phi_type, ConstraintCastNode::DependencyType::NonFloatingNarrowing, extra_types);
|
||||
}
|
||||
if (cast == nullptr) {
|
||||
cast = new CastPPNode(r, uin, phi_type, ConstraintCastNode::StrongDependency, extra_types);
|
||||
cast = new CastPPNode(r, uin, phi_type, ConstraintCastNode::DependencyType::NonFloatingNarrowing, extra_types);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cast = ConstraintCastNode::make_cast_for_type(r, uin, phi_type, ConstraintCastNode::StrongDependency, extra_types);
|
||||
cast = ConstraintCastNode::make_cast_for_type(r, uin, phi_type, ConstraintCastNode::DependencyType::NonFloatingNarrowing, extra_types);
|
||||
}
|
||||
assert(cast != nullptr, "cast should be set");
|
||||
cast = phase->transform(cast);
|
||||
@ -2551,7 +2542,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
}
|
||||
Node* phi = mms.memory();
|
||||
assert(made_new_phi || phi->in(i) == n, "replace the i-th merge by a slice");
|
||||
phi->set_req(i, mms.memory2());
|
||||
phi->set_req_X(i, mms.memory2(), phase);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2560,7 +2551,9 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
for (MergeMemStream mms(result); mms.next_non_empty(); ) {
|
||||
Node* phi = mms.memory();
|
||||
for (uint i = 1; i < req(); ++i) {
|
||||
if (phi->in(i) == this) phi->set_req(i, phi);
|
||||
if (phi->in(i) == this) {
|
||||
phi->set_req_X(i, phi, phase);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2582,7 +2575,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
Node *ii = in(i);
|
||||
Node *new_in = MemNode::optimize_memory_chain(ii, at, nullptr, phase);
|
||||
if (ii != new_in ) {
|
||||
set_req(i, new_in);
|
||||
set_req_X(i, new_in, phase);
|
||||
progress = this;
|
||||
}
|
||||
}
|
||||
@ -2690,6 +2683,25 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
progress = merge_through_phi(this, phase->is_IterGVN());
|
||||
}
|
||||
|
||||
// PhiNode::Identity replaces a non-bottom memory phi with a bottom memory phi with the same inputs, if it exists.
|
||||
// If the bottom memory phi's inputs are changed (so it can now replace the non-bottom memory phi) or if it's created
|
||||
// only after the non-bottom memory phi is processed by igvn, PhiNode::Identity doesn't run and the transformation
|
||||
// doesn't happen.
|
||||
// Look for non-bottom Phis that should be transformed and enqueue them for igvn so that PhiNode::Identity executes for
|
||||
// them.
|
||||
if (can_reshape && type() == Type::MEMORY && adr_type() == TypePtr::BOTTOM) {
|
||||
PhaseIterGVN* igvn = phase->is_IterGVN();
|
||||
uint phi_len = req();
|
||||
Node* phi_reg = region();
|
||||
for (DUIterator_Fast imax, i = phi_reg->fast_outs(imax); i < imax; i++) {
|
||||
Node* u = phi_reg->fast_out(i);
|
||||
assert(!u->is_Phi() || (u->in(0) == phi_reg && u->req() == phi_len), "broken Phi/Region subgraph");
|
||||
if (u->is_Phi() && u->as_Phi()->can_be_replaced_by(this)) {
|
||||
igvn->_worklist.push(u);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return progress; // Return any progress
|
||||
}
|
||||
|
||||
@ -2739,6 +2751,11 @@ const TypeTuple* PhiNode::collect_types(PhaseGVN* phase) const {
|
||||
return TypeTuple::make(types.length(), flds);
|
||||
}
|
||||
|
||||
bool PhiNode::can_be_replaced_by(const PhiNode* other) const {
|
||||
return type() == Type::MEMORY && other->type() == Type::MEMORY && adr_type() != TypePtr::BOTTOM &&
|
||||
other->adr_type() == TypePtr::BOTTOM && has_same_inputs_as(other);
|
||||
}
|
||||
|
||||
Node* PhiNode::clone_through_phi(Node* root_phi, const Type* t, uint c, PhaseIterGVN* igvn) {
|
||||
Node_Stack stack(1);
|
||||
VectorSet visited;
|
||||
|
||||
@ -271,6 +271,7 @@ public:
|
||||
#endif //ASSERT
|
||||
|
||||
const TypeTuple* collect_types(PhaseGVN* phase) const;
|
||||
bool can_be_replaced_by(const PhiNode* other) const;
|
||||
};
|
||||
|
||||
//------------------------------GotoNode---------------------------------------
|
||||
|
||||
@ -4578,7 +4578,7 @@ Node* Compile::constrained_convI2L(PhaseGVN* phase, Node* value, const TypeInt*
|
||||
// node from floating above the range check during loop optimizations. Otherwise, the
|
||||
// ConvI2L node may be eliminated independently of the range check, causing the data path
|
||||
// to become TOP while the control path is still there (although it's unreachable).
|
||||
value = new CastIINode(ctrl, value, itype, carry_dependency ? ConstraintCastNode::StrongDependency : ConstraintCastNode::RegularDependency, true /* range check dependency */);
|
||||
value = new CastIINode(ctrl, value, itype, carry_dependency ? ConstraintCastNode::DependencyType::NonFloatingNarrowing : ConstraintCastNode::DependencyType::FloatingNarrowing, true /* range check dependency */);
|
||||
value = phase->transform(value);
|
||||
}
|
||||
const TypeLong* ltype = TypeLong::make(itype->_lo, itype->_hi, itype->_widen);
|
||||
|
||||
@ -748,7 +748,7 @@ Node* ConnectionGraph::specialize_castpp(Node* castpp, Node* base, Node* current
|
||||
_igvn->_worklist.push(current_control);
|
||||
_igvn->_worklist.push(control_successor);
|
||||
|
||||
return _igvn->transform(ConstraintCastNode::make_cast_for_type(not_eq_control, base, _igvn->type(castpp), ConstraintCastNode::UnconditionalDependency, nullptr));
|
||||
return _igvn->transform(ConstraintCastNode::make_cast_for_type(not_eq_control, base, _igvn->type(castpp), ConstraintCastNode::DependencyType::NonFloatingNonNarrowing, nullptr));
|
||||
}
|
||||
|
||||
Node* ConnectionGraph::split_castpp_load_through_phi(Node* curr_addp, Node* curr_load, Node* region, GrowableArray<Node*>* bases_for_loads, GrowableArray<Node *> &alloc_worklist) {
|
||||
@ -1235,7 +1235,7 @@ bool ConnectionGraph::reduce_phi_on_safepoints_helper(Node* ophi, Node* cast, No
|
||||
Node* nsr_merge_pointer = ophi;
|
||||
if (cast != nullptr) {
|
||||
const Type* new_t = merge_t->meet(TypePtr::NULL_PTR);
|
||||
nsr_merge_pointer = _igvn->transform(ConstraintCastNode::make_cast_for_type(cast->in(0), cast->in(1), new_t, ConstraintCastNode::RegularDependency, nullptr));
|
||||
nsr_merge_pointer = _igvn->transform(ConstraintCastNode::make_cast_for_type(cast->in(0), cast->in(1), new_t, ConstraintCastNode::DependencyType::FloatingNarrowing, nullptr));
|
||||
}
|
||||
|
||||
for (uint spi = 0; spi < safepoints.size(); spi++) {
|
||||
@ -1376,7 +1376,7 @@ void ConnectionGraph::reset_scalar_replaceable_entries(PhiNode* ophi) {
|
||||
}
|
||||
|
||||
if (change) {
|
||||
Node* new_cast = ConstraintCastNode::make_cast_for_type(out->in(0), out->in(1), out_new_t, ConstraintCastNode::StrongDependency, nullptr);
|
||||
Node* new_cast = ConstraintCastNode::make_cast_for_type(out->in(0), out->in(1), out_new_t, ConstraintCastNode::DependencyType::NonFloatingNarrowing, nullptr);
|
||||
_igvn->replace_node(out, new_cast);
|
||||
_igvn->register_new_node_with_optimizer(new_cast);
|
||||
}
|
||||
|
||||
@ -1183,7 +1183,7 @@ bool LibraryCallKit::inline_preconditions_checkIndex(BasicType bt) {
|
||||
jlong upper_bound = _gvn.type(length)->is_integer(bt)->hi_as_long();
|
||||
Node* casted_length = ConstraintCastNode::make_cast_for_basic_type(
|
||||
control(), length, TypeInteger::make(0, upper_bound, Type::WidenMax, bt),
|
||||
ConstraintCastNode::RegularDependency, bt);
|
||||
ConstraintCastNode::DependencyType::FloatingNarrowing, bt);
|
||||
casted_length = _gvn.transform(casted_length);
|
||||
replace_in_map(length, casted_length);
|
||||
length = casted_length;
|
||||
@ -1213,7 +1213,7 @@ bool LibraryCallKit::inline_preconditions_checkIndex(BasicType bt) {
|
||||
// index is now known to be >= 0 and < length, cast it
|
||||
Node* result = ConstraintCastNode::make_cast_for_basic_type(
|
||||
control(), index, TypeInteger::make(0, upper_bound, Type::WidenMax, bt),
|
||||
ConstraintCastNode::RegularDependency, bt);
|
||||
ConstraintCastNode::DependencyType::FloatingNarrowing, bt);
|
||||
result = _gvn.transform(result);
|
||||
set_result(result);
|
||||
replace_in_map(index, result);
|
||||
|
||||
@ -1366,7 +1366,7 @@ Node *PhaseIdealLoop::clone_up_backedge_goo(Node *back_ctrl, Node *preheader_ctr
|
||||
// the backedge of the main or post loop is removed, a Div node won't be able to float above the zero trip guard of the
|
||||
// loop and can't execute even if the loop is not reached.
|
||||
void PhaseIdealLoop::cast_incr_before_loop(Node* incr, Node* ctrl, CountedLoopNode* loop) {
|
||||
Node* castii = new CastIINode(ctrl, incr, TypeInt::INT, ConstraintCastNode::UnconditionalDependency);
|
||||
Node* castii = new CastIINode(ctrl, incr, TypeInt::INT, ConstraintCastNode::DependencyType::NonFloatingNonNarrowing);
|
||||
register_new_node(castii, ctrl);
|
||||
Node* phi = loop->phi();
|
||||
assert(phi->in(LoopNode::EntryControl) == incr, "replacing wrong input?");
|
||||
@ -3262,7 +3262,7 @@ bool IdealLoopTree::do_remove_empty_loop(PhaseIdealLoop *phase) {
|
||||
Node* cast_ii = ConstraintCastNode::make_cast_for_basic_type(
|
||||
cl->in(LoopNode::EntryControl), exact_limit,
|
||||
phase->_igvn.type(exact_limit),
|
||||
ConstraintCastNode::UnconditionalDependency, T_INT);
|
||||
ConstraintCastNode::DependencyType::NonFloatingNonNarrowing, T_INT);
|
||||
phase->register_new_node(cast_ii, cl->in(LoopNode::EntryControl));
|
||||
|
||||
Node* final_iv = new SubINode(cast_ii, cl->stride());
|
||||
|
||||
@ -1001,7 +1001,7 @@ bool PhaseIdealLoop::create_loop_nest(IdealLoopTree* loop, Node_List &old_new) {
|
||||
// a negative stride). We add a CastII here to guarantee that, when the counted loop is created in a subsequent loop
|
||||
// opts pass, an accurate range of values for the limits is found.
|
||||
const TypeInt* inner_iters_actual_int_range = TypeInt::make(0, iters_limit, Type::WidenMin);
|
||||
inner_iters_actual_int = new CastIINode(outer_head, inner_iters_actual_int, inner_iters_actual_int_range, ConstraintCastNode::UnconditionalDependency);
|
||||
inner_iters_actual_int = new CastIINode(outer_head, inner_iters_actual_int, inner_iters_actual_int_range, ConstraintCastNode::DependencyType::NonFloatingNonNarrowing);
|
||||
_igvn.register_new_node_with_optimizer(inner_iters_actual_int);
|
||||
} else {
|
||||
inner_iters_actual_int = inner_iters_actual;
|
||||
@ -1315,7 +1315,7 @@ bool PhaseIdealLoop::try_make_short_running_loop(IdealLoopTree* loop, jint strid
|
||||
register_new_node(bol, iff->in(0));
|
||||
new_limit = ConstraintCastNode::make_cast_for_basic_type(new_predicate_proj, new_limit,
|
||||
TypeInteger::make(1, iters_limit_long, Type::WidenMin, bt),
|
||||
ConstraintCastNode::UnconditionalDependency, bt);
|
||||
ConstraintCastNode::DependencyType::NonFloatingNonNarrowing, bt);
|
||||
register_new_node(new_limit, new_predicate_proj);
|
||||
|
||||
#ifndef PRODUCT
|
||||
@ -1334,7 +1334,7 @@ bool PhaseIdealLoop::try_make_short_running_loop(IdealLoopTree* loop, jint strid
|
||||
const TypeLong* new_limit_t = new_limit->Value(&_igvn)->is_long();
|
||||
new_limit = ConstraintCastNode::make_cast_for_basic_type(predicates.entry(), new_limit,
|
||||
TypeLong::make(0, new_limit_t->_hi, new_limit_t->_widen),
|
||||
ConstraintCastNode::UnconditionalDependency, bt);
|
||||
ConstraintCastNode::DependencyType::NonFloatingNonNarrowing, bt);
|
||||
register_new_node(new_limit, predicates.entry());
|
||||
} else {
|
||||
assert(bt == T_INT && known_short_running_loop, "only CountedLoop statically known to be short running");
|
||||
|
||||
@ -1174,7 +1174,7 @@ Node *PhaseIdealLoop::split_if_with_blocks_pre( Node *n ) {
|
||||
if ( nn ) return nn;
|
||||
}
|
||||
|
||||
if (n->is_ConstraintCast()) {
|
||||
if (n->is_ConstraintCast() && n->as_ConstraintCast()->dependency().narrows_type()) {
|
||||
Node* dom_cast = n->as_ConstraintCast()->dominating_cast(&_igvn, this);
|
||||
// ConstraintCastNode::dominating_cast() uses node control input to determine domination.
|
||||
// Node control inputs don't necessarily agree with loop control info (due to
|
||||
@ -1837,7 +1837,7 @@ void PhaseIdealLoop::try_sink_out_of_loop(Node* n) {
|
||||
if (in != nullptr && ctrl_is_member(n_loop, in)) {
|
||||
const Type* in_t = _igvn.type(in);
|
||||
cast = ConstraintCastNode::make_cast_for_type(x_ctrl, in, in_t,
|
||||
ConstraintCastNode::UnconditionalDependency, nullptr);
|
||||
ConstraintCastNode::DependencyType::NonFloatingNonNarrowing, nullptr);
|
||||
}
|
||||
if (cast != nullptr) {
|
||||
Node* prev = _igvn.hash_find_insert(cast);
|
||||
|
||||
@ -1914,7 +1914,8 @@ Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false,
|
||||
transform_later(cache_adr);
|
||||
cache_adr = new CastP2XNode(needgc_false, cache_adr);
|
||||
transform_later(cache_adr);
|
||||
// Address is aligned to execute prefetch to the beginning of cache line size.
|
||||
// Address is aligned to execute prefetch to the beginning of cache line size
|
||||
// (it is important when BIS instruction is used on SPARC as prefetch).
|
||||
Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1));
|
||||
cache_adr = new AndXNode(cache_adr, mask);
|
||||
transform_later(cache_adr);
|
||||
|
||||
@ -233,7 +233,7 @@ void PhaseMacroExpand::generate_partial_inlining_block(Node** ctrl, MergeMemNode
|
||||
Node* inline_block = generate_guard(ctrl, bol_le, nullptr, PROB_FAIR);
|
||||
Node* stub_block = *ctrl;
|
||||
|
||||
Node* casted_length = new CastLLNode(inline_block, length, inline_range, ConstraintCastNode::RegularDependency);
|
||||
Node* casted_length = new CastLLNode(inline_block, length, inline_range, ConstraintCastNode::DependencyType::FloatingNarrowing);
|
||||
transform_later(casted_length);
|
||||
Node* mask_gen = VectorMaskGenNode::make(casted_length, type);
|
||||
transform_later(mask_gen);
|
||||
|
||||
@ -329,6 +329,10 @@ public:
|
||||
|
||||
static bool match_rule_supported_vector_masked(int opcode, int vlen, BasicType bt);
|
||||
|
||||
// Determines if a vector operation needs to be partially implemented with a mask
|
||||
// controlling only the lanes in range [0, vector_length) are processed. This applies
|
||||
// to operations whose vector length is less than the hardware-supported maximum
|
||||
// vector length. Returns true if the operation requires masking, false otherwise.
|
||||
static bool vector_needs_partial_operations(Node* node, const TypeVect* vt);
|
||||
|
||||
static bool vector_rearrange_requires_load_shuffle(BasicType elem_bt, int vlen);
|
||||
|
||||
@ -2875,16 +2875,9 @@ Node* Node::find_similar(int opc) {
|
||||
Node* use = def->fast_out(i);
|
||||
if (use != this &&
|
||||
use->Opcode() == opc &&
|
||||
use->req() == req()) {
|
||||
uint j;
|
||||
for (j = 0; j < use->req(); j++) {
|
||||
if (use->in(j) != in(j)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == use->req()) {
|
||||
return use;
|
||||
}
|
||||
use->req() == req() &&
|
||||
has_same_inputs_as(use)) {
|
||||
return use;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2892,6 +2885,16 @@ Node* Node::find_similar(int opc) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Node::has_same_inputs_as(const Node* other) const {
|
||||
assert(req() == other->req(), "should have same number of inputs");
|
||||
for (uint j = 0; j < other->req(); j++) {
|
||||
if (in(j) != other->in(j)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Node* Node::unique_multiple_edges_out_or_null() const {
|
||||
Node* use = nullptr;
|
||||
for (DUIterator_Fast kmax, k = fast_outs(kmax); k < kmax; k++) {
|
||||
|
||||
@ -1179,6 +1179,7 @@ public:
|
||||
// Return a node with opcode "opc" and same inputs as "this" if one can
|
||||
// be found; Otherwise return null;
|
||||
Node* find_similar(int opc);
|
||||
bool has_same_inputs_as(const Node* other) const;
|
||||
|
||||
// Return the unique control out if only one. Null if none or more than one.
|
||||
Node* unique_ctrl_out_or_null() const;
|
||||
|
||||
@ -1060,6 +1060,29 @@ bool VPointer::can_make_speculative_aliasing_check_with(const VPointer& other) c
|
||||
return false;
|
||||
}
|
||||
|
||||
// The speculative check also needs to create the pointer expressions for both
|
||||
// VPointers. We must check that we can do that, i.e. that all variables of the
|
||||
// VPointers are available at the speculative check (and not just pre-loop invariant).
|
||||
if (!this->can_make_pointer_expression_at_speculative_check()) {
|
||||
#ifdef ASSERT
|
||||
if (_vloop.is_trace_speculative_aliasing_analysis()) {
|
||||
tty->print_cr("VPointer::can_make_speculative_aliasing_check_with: not all variables of VPointer are avaialbe at speculative check!");
|
||||
this->print_on(tty);
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!other.can_make_pointer_expression_at_speculative_check()) {
|
||||
#ifdef ASSERT
|
||||
if (_vloop.is_trace_speculative_aliasing_analysis()) {
|
||||
tty->print_cr("VPointer::can_make_speculative_aliasing_check_with: not all variables of VPointer are avaialbe at speculative check!");
|
||||
other.print_on(tty);
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1147,6 +1170,8 @@ BoolNode* VPointer::make_speculative_aliasing_check_with(const VPointer& other,
|
||||
Node* main_init = new ConvL2INode(main_initL);
|
||||
phase->register_new_node_with_ctrl_of(main_init, pre_init);
|
||||
|
||||
assert(vp1.can_make_pointer_expression_at_speculative_check(), "variables must be available early enough to avoid cycles");
|
||||
assert(vp2.can_make_pointer_expression_at_speculative_check(), "variables must be available early enough to avoid cycles");
|
||||
Node* p1_init = vp1.make_pointer_expression(main_init, ctrl);
|
||||
Node* p2_init = vp2.make_pointer_expression(main_init, ctrl);
|
||||
Node* size1 = igvn.longcon(vp1.size());
|
||||
|
||||
@ -1188,6 +1188,22 @@ private:
|
||||
return true;
|
||||
}
|
||||
|
||||
// We already know that all non-iv summands are pre loop invariant.
|
||||
// See init_are_non_iv_summands_pre_loop_invariant
|
||||
// That is good enough for alignment computations in the pre-loop limit. But it is not
|
||||
// sufficient if we want to use the variables of the VPointer at the speculative check,
|
||||
// which is further up before the pre-loop.
|
||||
bool can_make_pointer_expression_at_speculative_check() const {
|
||||
bool success = true;
|
||||
mem_pointer().for_each_non_empty_summand([&] (const MemPointerSummand& s) {
|
||||
Node* variable = s.variable();
|
||||
if (variable != _vloop.iv() && !_vloop.is_available_for_speculative_check(variable)) {
|
||||
success = false;
|
||||
}
|
||||
});
|
||||
return success;
|
||||
}
|
||||
|
||||
// In the pointer analysis, and especially the AlignVector analysis, we assume that
|
||||
// stride and scale are not too large. For example, we multiply "iv_scale * iv_stride",
|
||||
// and assume that this does not overflow the int range. We also take "abs(iv_scale)"
|
||||
|
||||
@ -936,28 +936,26 @@ bool VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(int op
|
||||
}
|
||||
}
|
||||
|
||||
// Idealize vector operations whose vector size is less than the hardware supported
|
||||
// max vector size. Generate a vector mask for the operation. Lanes with indices
|
||||
// inside of the vector size are set to true, while the remaining lanes are set to
|
||||
// false. Returns the corresponding masked vector node.
|
||||
static Node* ideal_partial_operations(PhaseGVN* phase, Node* node, const TypeVect* vt) {
|
||||
if (!Matcher::vector_needs_partial_operations(node, vt)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node* VectorNode::try_to_gen_masked_vector(PhaseGVN* gvn, Node* node, const TypeVect* vt) {
|
||||
int vopc = node->Opcode();
|
||||
uint vlen = vt->length();
|
||||
BasicType bt = vt->element_basic_type();
|
||||
assert(Matcher::match_rule_supported_vector_masked(vopc, vlen, bt),
|
||||
"The masked feature is required for the vector operation");
|
||||
assert(Matcher::match_rule_supported_vector(Op_VectorMaskGen, vlen, bt),
|
||||
"'VectorMaskGen' is required to generate a vector mask");
|
||||
|
||||
// Predicated vectors do not need to add another mask input
|
||||
if (node->is_predicated_vector() || !Matcher::has_predicated_vectors() ||
|
||||
!Matcher::match_rule_supported_vector_masked(vopc, vlen, bt) ||
|
||||
!Matcher::match_rule_supported_vector(Op_VectorMaskGen, vlen, bt)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node* mask = nullptr;
|
||||
// Generate a vector mask for vector operation whose vector length is lower than the
|
||||
// hardware supported max vector length.
|
||||
if (vt->length_in_bytes() < (uint)MaxVectorSize) {
|
||||
Node* length = gvn->transform(new ConvI2LNode(gvn->makecon(TypeInt::make(vlen))));
|
||||
mask = gvn->transform(VectorMaskGenNode::make(length, bt, vlen));
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
// Generate a vector mask, with lanes inside of the vector length set to true.
|
||||
Node* length = phase->transform(new ConvI2LNode(phase->makecon(TypeInt::make(vlen))));
|
||||
Node* mask = phase->transform(VectorMaskGenNode::make(length, bt, vlen));
|
||||
|
||||
// Generate the related masked op for vector load/store/load_gather/store_scatter.
|
||||
// Or append the mask to the vector op's input list by default.
|
||||
@ -1037,8 +1035,9 @@ bool VectorNode::should_swap_inputs_to_help_global_value_numbering() {
|
||||
}
|
||||
|
||||
Node* VectorNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
if (Matcher::vector_needs_partial_operations(this, vect_type())) {
|
||||
return try_to_gen_masked_vector(phase, this, vect_type());
|
||||
Node* n = ideal_partial_operations(phase, this, vect_type());
|
||||
if (n != nullptr) {
|
||||
return n;
|
||||
}
|
||||
|
||||
// Sort inputs of commutative non-predicated vector operations to help value numbering.
|
||||
@ -1119,9 +1118,9 @@ LoadVectorNode* LoadVectorNode::make(int opc, Node* ctl, Node* mem,
|
||||
}
|
||||
|
||||
Node* LoadVectorNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
const TypeVect* vt = vect_type();
|
||||
if (Matcher::vector_needs_partial_operations(this, vt)) {
|
||||
return VectorNode::try_to_gen_masked_vector(phase, this, vt);
|
||||
Node* n = ideal_partial_operations(phase, this, vect_type());
|
||||
if (n != nullptr) {
|
||||
return n;
|
||||
}
|
||||
return LoadNode::Ideal(phase, can_reshape);
|
||||
}
|
||||
@ -1133,9 +1132,9 @@ StoreVectorNode* StoreVectorNode::make(int opc, Node* ctl, Node* mem, Node* adr,
|
||||
}
|
||||
|
||||
Node* StoreVectorNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
const TypeVect* vt = vect_type();
|
||||
if (Matcher::vector_needs_partial_operations(this, vt)) {
|
||||
return VectorNode::try_to_gen_masked_vector(phase, this, vt);
|
||||
Node* n = ideal_partial_operations(phase, this, vect_type());
|
||||
if (n != nullptr) {
|
||||
return n;
|
||||
}
|
||||
return StoreNode::Ideal(phase, can_reshape);
|
||||
}
|
||||
@ -1411,11 +1410,11 @@ ReductionNode* ReductionNode::make(int opc, Node* ctrl, Node* n1, Node* n2, Basi
|
||||
}
|
||||
|
||||
Node* ReductionNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
const TypeVect* vt = vect_type();
|
||||
if (Matcher::vector_needs_partial_operations(this, vt)) {
|
||||
return VectorNode::try_to_gen_masked_vector(phase, this, vt);
|
||||
Node* n = ideal_partial_operations(phase, this, vect_type());
|
||||
if (n != nullptr) {
|
||||
return n;
|
||||
}
|
||||
return nullptr;
|
||||
return Node::Ideal(phase, can_reshape);
|
||||
}
|
||||
|
||||
// Convert fromLong to maskAll if the input sets or unsets all lanes.
|
||||
@ -1893,11 +1892,11 @@ Node* VectorMaskOpNode::make(Node* mask, const Type* ty, int mopc) {
|
||||
}
|
||||
|
||||
Node* VectorMaskOpNode::Ideal(PhaseGVN* phase, bool can_reshape) {
|
||||
const TypeVect* vt = vect_type();
|
||||
if (Matcher::vector_needs_partial_operations(this, vt)) {
|
||||
return VectorNode::try_to_gen_masked_vector(phase, this, vt);
|
||||
Node* n = ideal_partial_operations(phase, this, vect_type());
|
||||
if (n != nullptr) {
|
||||
return n;
|
||||
}
|
||||
return nullptr;
|
||||
return TypeNode::Ideal(phase, can_reshape);
|
||||
}
|
||||
|
||||
Node* VectorMaskCastNode::Identity(PhaseGVN* phase) {
|
||||
|
||||
@ -117,7 +117,6 @@ class VectorNode : public TypeNode {
|
||||
static bool is_vector_bitwise_not_pattern(Node* n);
|
||||
static Node* degenerate_vector_rotate(Node* n1, Node* n2, bool is_rotate_left, int vlen,
|
||||
BasicType bt, PhaseGVN* phase);
|
||||
static Node* try_to_gen_masked_vector(PhaseGVN* gvn, Node* node, const TypeVect* vt);
|
||||
|
||||
// [Start, end) half-open range defining which operands are vectors
|
||||
static void vector_operands(Node* n, uint* start, uint* end);
|
||||
|
||||
@ -229,6 +229,19 @@ extern void trace_class_resolution(Klass* to_class) {
|
||||
|
||||
// java.lang.System //////////////////////////////////////////////////////////////////////
|
||||
|
||||
JVM_ENTRY(jboolean, JVM_AOTEndRecording(JNIEnv *env))
|
||||
#if INCLUDE_CDS
|
||||
if (CDSConfig::is_dumping_preimage_static_archive()) {
|
||||
if (!AOTMetaspace::preimage_static_archive_dumped()) {
|
||||
AOTMetaspace::dump_static_archive(THREAD);
|
||||
return JNI_TRUE;
|
||||
}
|
||||
}
|
||||
return JNI_FALSE;
|
||||
#else
|
||||
return JNI_FALSE;
|
||||
#endif // INCLUDE_CDS
|
||||
JVM_END
|
||||
|
||||
JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
|
||||
return os::javaTimeMillis();
|
||||
|
||||
@ -199,6 +199,10 @@ WB_ENTRY(jint, WB_TakeLockAndHangInSafepoint(JNIEnv* env, jobject wb))
|
||||
return 0;
|
||||
WB_END
|
||||
|
||||
WB_ENTRY(jlong, WB_GetMinimumJavaStackSize(JNIEnv* env, jobject o))
|
||||
return os::get_minimum_java_stack_size();
|
||||
WB_END
|
||||
|
||||
class WBIsKlassAliveClosure : public LockedClassesDo {
|
||||
Symbol* _name;
|
||||
int _count;
|
||||
@ -3133,7 +3137,8 @@ static JNINativeMethod methods[] = {
|
||||
{CC"cleanMetaspaces", CC"()V", (void*)&WB_CleanMetaspaces},
|
||||
{CC"rss", CC"()J", (void*)&WB_Rss},
|
||||
{CC"printString", CC"(Ljava/lang/String;I)Ljava/lang/String;", (void*)&WB_PrintString},
|
||||
{CC"lockAndStuckInSafepoint", CC"()V", (void*)&WB_TakeLockAndHangInSafepoint},
|
||||
{CC"lockAndStuckInSafepoint", CC"()V", (void*)&WB_TakeLockAndHangInSafepoint},
|
||||
{CC"getMinimumJavaStackSize", CC"()J", (void*)&WB_GetMinimumJavaStackSize},
|
||||
{CC"wordSize", CC"()J", (void*)&WB_WordSize},
|
||||
{CC"rootChunkWordSize", CC"()J", (void*)&WB_RootChunkWordSize},
|
||||
{CC"isStatic", CC"()Z", (void*)&WB_IsStaticallyLinked},
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include "prims/jvmtiThreadState.inline.hpp"
|
||||
#include "runtime/handles.inline.hpp"
|
||||
#include "runtime/javaThread.hpp"
|
||||
#include "runtime/jniHandles.hpp"
|
||||
#include "runtime/mountUnmountDisabler.hpp"
|
||||
#include "runtime/threadSMR.hpp"
|
||||
|
||||
@ -193,6 +194,13 @@ void MountUnmountDisabler::end_transition(JavaThread* current, oop vthread, bool
|
||||
}
|
||||
}
|
||||
|
||||
// disable transitions for one virtual thread
|
||||
// disable transitions for all threads if thread is nullptr or a platform thread
|
||||
MountUnmountDisabler::MountUnmountDisabler(jthread thread)
|
||||
: MountUnmountDisabler(JNIHandles::resolve_external_guard(thread))
|
||||
{
|
||||
}
|
||||
|
||||
// disable transitions for one virtual thread
|
||||
// disable transitions for all threads if thread is nullptr or a platform thread
|
||||
MountUnmountDisabler::MountUnmountDisabler(oop thread_oop)
|
||||
@ -367,7 +375,7 @@ MountUnmountDisabler::enable_transition_for_all() {
|
||||
OrderAccess::release();
|
||||
|
||||
MonitorLocker ml(VThreadTransition_lock);
|
||||
if (exclusive_operation_ongoing()) {
|
||||
if (_is_exclusive) {
|
||||
set_exclusive_operation_ongoing(false);
|
||||
}
|
||||
dec_active_disablers();
|
||||
|
||||
@ -58,6 +58,7 @@ class MountUnmountDisabler : public AnyObj {
|
||||
public:
|
||||
MountUnmountDisabler(bool exlusive = false);
|
||||
MountUnmountDisabler(oop thread_oop);
|
||||
MountUnmountDisabler(jthread thread);
|
||||
~MountUnmountDisabler();
|
||||
|
||||
static int global_vthread_transition_disable_count();
|
||||
|
||||
@ -2577,6 +2577,10 @@ jint os::set_minimum_stack_sizes() {
|
||||
return JNI_OK;
|
||||
}
|
||||
|
||||
jlong os::get_minimum_java_stack_size() {
|
||||
return static_cast<jlong>(_java_thread_min_stack_allowed);
|
||||
}
|
||||
|
||||
// Builds a platform dependent Agent_OnLoad_<lib_name> function name
|
||||
// which is used to find statically linked in agents.
|
||||
// Parameters:
|
||||
|
||||
@ -390,6 +390,8 @@ class os: AllStatic {
|
||||
static jint set_minimum_stack_sizes();
|
||||
|
||||
public:
|
||||
// get allowed minimum java stack size
|
||||
static jlong get_minimum_java_stack_size();
|
||||
// Find committed memory region within specified range (start, start + size),
|
||||
// return true if found any
|
||||
static bool committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size);
|
||||
|
||||
@ -3362,7 +3362,7 @@ JRT_LEAF(intptr_t*, SharedRuntime::OSR_migration_begin( JavaThread *current) )
|
||||
RegisterMap::WalkContinuation::skip);
|
||||
frame sender = fr.sender(&map);
|
||||
if (sender.is_interpreted_frame()) {
|
||||
current->push_cont_fastpath(sender.sp());
|
||||
current->push_cont_fastpath(sender.unextended_sp());
|
||||
}
|
||||
|
||||
return buf;
|
||||
|
||||
@ -353,6 +353,7 @@
|
||||
nonstatic_field(ThreadLocalAllocBuffer, _pf_top, HeapWord*) \
|
||||
nonstatic_field(ThreadLocalAllocBuffer, _desired_size, size_t) \
|
||||
nonstatic_field(ThreadLocalAllocBuffer, _refill_waste_limit, size_t) \
|
||||
static_field(ThreadLocalAllocBuffer, _reserve_for_allocation_prefetch, int) \
|
||||
static_field(ThreadLocalAllocBuffer, _target_refills, unsigned) \
|
||||
nonstatic_field(ThreadLocalAllocBuffer, _number_of_refills, unsigned) \
|
||||
nonstatic_field(ThreadLocalAllocBuffer, _refill_waste, unsigned) \
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018, 2026, 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
|
||||
@ -89,15 +89,19 @@ final class VirtualThread extends BaseVirtualThread {
|
||||
*
|
||||
* RUNNING -> PARKING // Thread parking with LockSupport.park
|
||||
* PARKING -> PARKED // cont.yield successful, parked indefinitely
|
||||
* PARKING -> PINNED // cont.yield failed, parked indefinitely on carrier
|
||||
* PARKED -> UNPARKED // unparked, may be scheduled to continue
|
||||
* PINNED -> RUNNING // unparked, continue execution on same carrier
|
||||
* UNPARKED -> RUNNING // continue execution after park
|
||||
*
|
||||
* PARKING -> RUNNING // cont.yield failed, need to park on carrier
|
||||
* RUNNING -> PINNED // park on carrier
|
||||
* PINNED -> RUNNING // unparked, continue execution on same carrier
|
||||
*
|
||||
* RUNNING -> TIMED_PARKING // Thread parking with LockSupport.parkNanos
|
||||
* TIMED_PARKING -> TIMED_PARKED // cont.yield successful, timed-parked
|
||||
* TIMED_PARKING -> TIMED_PINNED // cont.yield failed, timed-parked on carrier
|
||||
* TIMED_PARKED -> UNPARKED // unparked, may be scheduled to continue
|
||||
*
|
||||
* TIMED_PARKING -> RUNNING // cont.yield failed, need to park on carrier
|
||||
* RUNNING -> TIMED_PINNED // park on carrier
|
||||
* TIMED_PINNED -> RUNNING // unparked, continue execution on same carrier
|
||||
*
|
||||
* RUNNING -> BLOCKING // blocking on monitor enter
|
||||
@ -108,7 +112,7 @@ final class VirtualThread extends BaseVirtualThread {
|
||||
* RUNNING -> WAITING // transitional state during wait on monitor
|
||||
* WAITING -> WAIT // waiting on monitor
|
||||
* WAIT -> BLOCKED // notified, waiting to be unblocked by monitor owner
|
||||
* WAIT -> UNBLOCKED // timed-out/interrupted
|
||||
* WAIT -> UNBLOCKED // interrupted
|
||||
*
|
||||
* RUNNING -> TIMED_WAITING // transition state during timed-waiting on monitor
|
||||
* TIMED_WAITING -> TIMED_WAIT // timed-waiting on monitor
|
||||
@ -856,16 +860,20 @@ final class VirtualThread extends BaseVirtualThread {
|
||||
* Re-enables this virtual thread for scheduling. If this virtual thread is parked
|
||||
* then its task is scheduled to continue, otherwise its next call to {@code park} or
|
||||
* {@linkplain #parkNanos(long) parkNanos} is guaranteed not to block.
|
||||
* @param lazySubmit to use lazySubmit if possible
|
||||
* @throws RejectedExecutionException if the scheduler cannot accept a task
|
||||
*/
|
||||
@Override
|
||||
void unpark() {
|
||||
private void unpark(boolean lazySubmit) {
|
||||
if (!getAndSetParkPermit(true) && currentThread() != this) {
|
||||
int s = state();
|
||||
|
||||
// unparked while parked
|
||||
if ((s == PARKED || s == TIMED_PARKED) && compareAndSetState(s, UNPARKED)) {
|
||||
submitRunContinuation();
|
||||
if (lazySubmit) {
|
||||
lazySubmitRunContinuation();
|
||||
} else {
|
||||
submitRunContinuation();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -888,6 +896,11 @@ final class VirtualThread extends BaseVirtualThread {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void unpark() {
|
||||
unpark(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked by unblocker thread to unblock this virtual thread.
|
||||
*/
|
||||
@ -904,11 +917,7 @@ final class VirtualThread extends BaseVirtualThread {
|
||||
*/
|
||||
private void parkTimeoutExpired() {
|
||||
assert !VirtualThread.currentThread().isVirtual();
|
||||
if (!getAndSetParkPermit(true)
|
||||
&& (state() == TIMED_PARKED)
|
||||
&& compareAndSetState(TIMED_PARKED, UNPARKED)) {
|
||||
lazySubmitRunContinuation();
|
||||
}
|
||||
unpark(true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -64,9 +64,12 @@ package java.lang.runtime;
|
||||
* floating-point type is considered exact.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @jls 5.7.1 Exact Testing Conversions
|
||||
* @jls 5.7.2 Unconditionally Exact Testing Conversions
|
||||
* @jls 15.20.2 The instanceof Operator
|
||||
* @see <a href="../../../../../specs/primitive-types-in-patterns-instanceof-switch-jls.html#jls-5.7.1">
|
||||
* JLS 5.7.1 Exact Testing Conversions</a>
|
||||
* @see <a href="../../../../../specs/primitive-types-in-patterns-instanceof-switch-jls.html#jls-5.7.2">
|
||||
* JLS 5.7.2 Unconditionally Exact Testing Conversions</a>
|
||||
* @see <a href="../../../../../specs/primitive-types-in-patterns-instanceof-switch-jls.html#jls-15.20.2">
|
||||
* JLS 15.20.2 The instanceof Operator</a>
|
||||
*
|
||||
* @implNote Some exactness checks describe a test which can be redirected
|
||||
* safely through one of the existing methods. Those are omitted too (i.e.,
|
||||
|
||||
@ -32,12 +32,11 @@ import jdk.internal.access.SharedSecrets;
|
||||
import jdk.internal.util.ByteArrayLittleEndian;
|
||||
|
||||
/**
|
||||
* A class that represents an immutable universally unique identifier (UUID).
|
||||
* A class that represents an immutable Universally Unique IDentifier (UUID).
|
||||
* A UUID represents a 128-bit value.
|
||||
*
|
||||
* <p> There exist different variants of these global identifiers. The methods
|
||||
* of this class are for manipulating the Leach-Salz variant, although the
|
||||
* constructors allow the creation of any variant of UUID (described below).
|
||||
* <p> This class is primarily designed for manipulating Leach-Salz variant UUIDs,
|
||||
* but it also supports the creation of UUIDs of other variants.
|
||||
*
|
||||
* <p> The layout of a variant 2 (Leach-Salz) UUID is as follows:
|
||||
*
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2026, 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
|
||||
@ -1081,10 +1081,9 @@ public sealed interface StructuredTaskScope<T, R>
|
||||
* does not throw then the {@code Joiner}'s {@code result()} method is invoked to
|
||||
* get the result or throw.
|
||||
*
|
||||
* <p> This method may only be invoked by the scope owner. Once the result or
|
||||
* exception outcome is obtained, this method may not be invoked again. The only
|
||||
* case where the method may be called again is where {@code InterruptedException}
|
||||
* is thrown while waiting.
|
||||
* <p> This method may only be invoked by the scope owner. It may only be invoked once
|
||||
* to get the result, exception or timeout outcome, unless the previous invocation
|
||||
* resulted in an {@code InterruptedException} being thrown.
|
||||
*
|
||||
* @return the result
|
||||
* @throws WrongThreadException if the current thread is not the scope owner
|
||||
@ -1093,8 +1092,11 @@ public sealed interface StructuredTaskScope<T, R>
|
||||
* exception from {@link Joiner#result() Joiner.result()} as the cause
|
||||
* @throws TimeoutException if a timeout is set, the timeout expires before or while
|
||||
* waiting, and {@link Joiner#onTimeout() Joiner.onTimeout()} throws this exception
|
||||
* @throws InterruptedException if interrupted while waiting
|
||||
* @throws InterruptedException if the current thread is interrupted before or
|
||||
* while waiting. The current thread's interrupted status is cleared when this
|
||||
* exception is thrown.
|
||||
* @since 25
|
||||
* @see Thread##thread-interruption Thread Interruption
|
||||
*/
|
||||
R join() throws InterruptedException;
|
||||
|
||||
|
||||
@ -30,8 +30,8 @@ java.launcher.opt.vmselect =\ {0}\t zur Auswahl der "{1}" VM\n
|
||||
java.launcher.opt.hotspot =\ {0}\t ist ein Synonym für die "{1}" VM [verworfen]\n
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.opt.footer = \ -cp <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n --class-path <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch "{0}" getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven, in denen nach Klassendateien gesucht wird.\n -p <Modulpfad>\n --module-path <Modulpfad>...\n Eine durch "{0}" getrennte Liste mit Elementen, von denen jedes Element ein Dateipfad ist\n zu einem Modul oder einem Verzeichnis mit Modulen ist. Jedes Modul ist entweder\n ein modulares JAR oder ein entpacktes Modulverzeichnis.\n --upgrade-module-path <Modulpfad>...\n Eine durch "{0}" getrennte Liste mit Elementen, von denen jedes Element ein Dateipfad ist\n zu einem Modul oder einem Verzeichnis mit Modulen ist,\n um upgradefähige Module im Laufzeitimage zu ersetzen. Jedes Modul ist entweder\n ein modulares JAR oder ein entpacktes Modulverzeichnis.\n --add-modules <Modulname>[,<Modulname>...]\n Root-Module, die zusätzlich zum anfänglichen Modul aufgelöst werden sollen.\n <Modulname> kann auch wie folgt lauten: ALL-DEFAULT, ALL-SYSTEM,\n ALL-MODULE-PATH.\n --enable-native-access <Modulname>[,<Modulname>...]\n Damit kann der Code in Modulen auf Code und Daten außerhalb der JRE zugreifen.\n <Modulname> kann auch ALL-UNNAMED sein, um den Code im Classpath anzugeben.\n --illegal-native-access=<Wert>\n Zugriff auf Code und Daten außerhalb der JRE\n durch Code in Modulen zulassen oder verweigern, für die der native Zugriff nicht explizit aktiviert ist.\n <Wert> ist "deny", "warn" oder "allow". Der Standardwert ist "warn".\n Diese Option wird in einem zukünftigen Release entfernt.\n --list-modules\n Listet beobachtbare Module auf und beendet den Vorgang\n -d <Modulname>\n --describe-module <Modulname>\n Beschreibt ein Modul und beendet den Vorgang\n --dry-run Erstellt eine VM und lädt die Hauptklasse, führt aber nicht die Hauptmethode aus.\n Die Option "--dry-run" kann nützlich sein, um die\n Befehlszeilenoptionen, wie die Modulsystemkonfiguration, zu validieren.\n --validate-modules\n Validiert alle Module und beendet den Vorgang\n Die Option "--validate-modules" kann nützlich sein, um\n Konflikte und andere Fehler mit Modulen auf dem Modulpfad zu ermitteln.\n -D<Name>=<Wert>\n Legt eine Systemeigenschaft fest\n -verbose:[class|module|gc|jni]\n Aktiviert die Verbose-Ausgabe für das angegebene Subsystem\n -version Gibt die Produktversion an den Fehlerstream aus und beendet den Vorgang\n --version Gibt die Produktversion an den Outputstream aus und beendet den Vorgang\n -showversion Gibt die Produktversion an den Fehlerstream aus und setzt den Vorgang fort\n --show-version\n Gibt die Produktversion an den Outputstream aus und setzt den Vorgang fort\n --show-module-resolution\n Zeigt die Modulauflösungsausgabe beim Start an\n -? -h -help\n Gibt diese Hilfemeldung an den Fehlerstream aus\n --help Gibt diese Hilfemeldung an den Outputstream aus\n -X Gibt Hilfe zu zusätzlichen Optionen an den Fehlerstream aus\n --help-extra Gibt Hilfe zu zusätzlichen Optionen an den Outputstream aus\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertions mit angegebener \
|
||||
Granularität\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertions mit angegebener Granularität\n -esa | -enablesystemassertions\n Aktiviert System-Assertions\n -dsa | -disablesystemassertions\n Deaktiviert System-Assertions\n -agentlib:<libname>[=<options>]\n Lädt die native Agent Library <libname>. Beispiel: -agentlib:jdwp\n siehe auch -agentlib:jdwp=help\n -agentpath:<pathname>[=<options>]\n Lädt die native Agent Library mit dem vollständigen Pfadnamen\n -javaagent:<jarpath>[=<options>]\n Lädt den Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt den Startbildschirm mit einem angegebenen Bild an\n Skalierte HiDPI-Bilder werden automatisch unterstützt und verwendet,\n falls verfügbar. Der nicht skalierte Bilddateiname (Beispiel: image.ext)\n muss immer als Argument an die Option "-splash" übergeben werden.\n Das am besten geeignete angegebene skalierte Bild wird\n automatisch ausgewählt.\n Weitere Informationen finden Sie in der Dokumentation zur SplashScreen-API\n @argument files\n Eine oder mehrere Argumentdateien mit Optionen\n --disable-@files\n Verhindert die weitere Erweiterung von Argumentdateien\n --enable-preview\n Lässt zu, das Klassen von Vorschaufeatures dieses Release abhängig sind\nUm ein Argument für eine lange Option anzugeben, können Sie --<Name>=<Wert> oder\n--<Name> <Wert> verwenden.\n
|
||||
java.launcher.opt.footer = \ -cp <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n --class-path <Klassensuchpfad mit Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch "{0}" getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven, in denen nach Klassendateien gesucht wird.\n -p <Modulpfad>\n --module-path <Modulpfad>...\n Eine durch "{0}" getrennte Liste mit Elementen, von denen jedes Element ein Dateipfad ist\n zu einem Modul oder einem Verzeichnis mit Modulen ist. Jedes Modul ist entweder\n ein modulares JAR oder ein entpacktes Modulverzeichnis.\n --upgrade-module-path <Modulpfad>...\n Eine durch "{0}" getrennte Liste mit Elementen, von denen jedes Element ein Dateipfad ist\n zu einem Modul oder einem Verzeichnis mit Modulen ist,\n um upgradefähige Module im Laufzeitimage zu ersetzen. Jedes Modul ist entweder\n ein modulares JAR oder ein entpacktes Modulverzeichnis.\n --add-modules <Modulname>[,<Modulname>...]\n Root-Module, die zusätzlich zum anfänglichen Modul aufgelöst werden sollen.\n <Modulname> kann auch wie folgt lauten: ALL-DEFAULT, ALL-SYSTEM,\n ALL-MODULE-PATH.\n --enable-native-access <Modulname>[,<Modulname>...]\n Damit kann der Code in Modulen auf Code und Daten außerhalb der JRE zugreifen.\n <Modulname> kann auch ALL-UNNAMED sein, um den Code im Classpath anzugeben.\n --illegal-native-access=<Wert>\n Zugriff auf Code und Daten außerhalb der JRE\n durch Code in Modulen zulassen oder verweigern, für die der native Zugriff nicht explizit aktiviert ist.\n <Wert> ist "deny", "warn" oder "allow". Der Standardwert ist "warn".\n Diese Option wird in einem zukünftigen Release entfernt.\n --enable-final-field-mutation <Modulname>[,<Modulname>...]\n Zulassen, dass die endgültigen Instanzfelder durch Code in den angegebenen Modulen mutiert werden.\n <Modulname> kann auch ALL-UNNAMED sein, um den Code im Classpath anzugeben.\n --illegal-final-field-mutation=<Wert>\n Erlauben oder verweigern Sie die Mutation von endgültigen Feldern durch Code in Modulen, für die die Mutation\n von endgültigen Feldern nicht explizit aktiviert ist.\n <Wert> ist "deny", "warn", "debug" oder "allow". Der Standardwert ist "warn".\n Diese Option wird in einem zukünftigen Release entfernt.\n --list-modules\n Listet beobachtbare Module auf und beendet den Vorgang\n -d <Modulname>\n --describe-module <Modulname>\n Beschreibt ein Modul und beendet den Vorgang\n --dry-run Erstellt eine VM und lädt die Hauptklasse, führt aber nicht die Hauptmethode aus.\n Die Option "--dry-run" kann nützlich sein, um die\n Befehlszeilenoptionen, wie die Modulsystemkonfiguration, zu validieren.\n --validate-modules\n Validiert alle Module und beendet den Vorgang\n Die Option "--validate-modules" kann nützlich sein, um\n Konflikte und andere Fehler mit Modulen auf dem Modulpfad zu ermitteln.\n -D<Name>=<Wert>\n Legt eine Systemeigenschaft fest\n -verbose:[class|module|gc|jni]\n Aktiviert die Verbose-Ausgabe für das angegebene Subsystem\n -version Gibt die Produktversion an den Fehlerstream aus und beendet den Vorgang\n --version Gibt die Produktversion an den Outputstream aus und beendet den Vorgang\n -showversion Gibt die Produktversion an den Fehlerstream aus und \
|
||||
setzt den Vorgang fort\n --show-version\n Gibt die Produktversion an den Outputstream aus und setzt den Vorgang fort\n --show-module-resolution\n Zeigt die Modulauflösungsausgabe beim Start an\n -? -h -help\n Gibt diese Hilfemeldung an den Fehlerstream aus\n --help Gibt diese Hilfemeldung an den Outputstream aus\n -X Gibt Hilfe zu zusätzlichen Optionen an den Fehlerstream aus\n --help-extra Gibt Hilfe zu zusätzlichen Optionen an den Outputstream aus\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertions mit angegebener Granularität\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertions mit angegebener Granularität\n -esa | -enablesystemassertions\n Aktiviert System-Assertions\n -dsa | -disablesystemassertions\n Deaktiviert System-Assertions\n -agentlib:<libname>[=<options>]\n Lädt die native Agent Library <libname>. Beispiel: -agentlib:jdwp\n siehe auch -agentlib:jdwp=help\n -agentpath:<pathname>[=<options>]\n Lädt die native Agent Library mit dem vollständigen Pfadnamen\n -javaagent:<jarpath>[=<options>]\n Lädt den Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt den Startbildschirm mit einem angegebenen Bild an\n Skalierte HiDPI-Bilder werden automatisch unterstützt und verwendet,\n falls verfügbar. Der nicht skalierte Bilddateiname (Beispiel: image.ext)\n muss immer als Argument an die Option "-splash" übergeben werden.\n Das am besten geeignete angegebene skalierte Bild wird\n automatisch ausgewählt.\n Weitere Informationen finden Sie in der Dokumentation zur SplashScreen-API\n @argument files\n Eine oder mehrere Argumentdateien mit Optionen\n --disable-@files\n Verhindert die weitere Erweiterung von Argumentdateien\n --enable-preview\n Lässt zu, das Klassen von Vorschaufeatures dieses Release abhängig sind\nUm ein Argument für eine lange Option anzugeben, können Sie --<Name>=<Wert> oder\n--<Name> <Wert> verwenden.\n
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.X.usage=\n -Xbatch Deaktiviert die Hintergrundkompilierung\n -Xbootclasspath/a:<durch {0} getrennte Verzeichnisse und ZIP-/JAR-Dateien>\n An das Ende des Bootstrap Classpaths anhängen\n -Xcheck:jni Führt zusätzliche Prüfungen für JNI-Funktionen aus\n -Xcomp Erzwingt die Kompilierung von Methoden beim ersten Aufruf\n -Xdebug Führt keine Aktion aus. Ist veraltet und wird in einem zukünftigen Release entfernt.\n -Xdiag Zeigt zusätzliche Diagnosemeldungen an\n -Xint Nur Ausführung im interpretierten Modus\n -Xinternalversion\n Zeigt detailliertere JVM-Versionsinformationen an als die\n Option -version\n -Xlog:<Optionen> Konfiguriert oder aktiviert Logging mit dem einheitlichen Java Virtual\n Machine-(JVM-)Logging-Framework. Verwenden Sie -Xlog:help\n für weitere Einzelheiten.\n -Xloggc:<Datei> Protokolliert den GC-Status in einer Datei mit Zeitstempeln.\n Diese Option ist veraltet und kann in einem\n zukünftigen Release entfernt werden. Wird durch -Xlog:gc:<Datei> ersetzt.\n -Xmixed Ausführung im gemischten Modus (Standard)\n -Xmn<Größe> Legt die anfängliche und maximale Größe (in Byte) des Heaps\n für die Young Generation (Nursery) fest\n -Xms<size> Legt die minimale und die anfängliche Java-Heap-Größe fest\n -Xmx<Größe> Legt die maximale Java-Heap-Größe fest\n -Xnoclassgc Deaktiviert die Klassen-Garbage Collection\n -Xrs Reduziert die Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xshare:auto Verwendet freigegebene Klassendaten, wenn möglich (Standard)\n -Xshare:off Versucht nicht, freigegebene Klassendaten zu verwenden\n -Xshare:on Erfordert die Verwendung freigegebener Klassendaten, verläuft sonst nicht erfolgreich.\n Diese Testoption kann zeitweise zu\n Fehlern führen. Sie darf nicht in Produktionsumgebungen verwendet werden.\n -XshowSettings Zeigt alle Einstellungen an und fährt fort\n -XshowSettings:all\n Zeigt alle Einstellungen als Verbose-Ausgabe an und fährt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen an und fährt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen an und fährt fort\n -XshowSettings:vm\n Zeigt alle VM-bezogenen Einstellungen an und fährt fort\n -XshowSettings:security\n Zeigt alle Sicherheitseinstellungen an und fährt fort\n -XshowSettings:security:all\n Zeigt alle Sicherheitseinstellungen an und fährt fort\n -XshowSettings:security:properties\n Zeigt Sicherheitseigenschaften an und fährt fort\n -XshowSettings:security:providers\n Zeigt statische Sicherheitsprovidereinstellungen an und fährt fort\n -XshowSettings:security:tls\n Zeigt TLS-bezogene Sicherheitseinstellungen an und fährt fort\n -XshowSettings:system\n (Nur Linux) Zeigt die Konfiguration des Hostsystems oder Containers an\n und fährt fort\n -Xss<Größe> Legt die Stackgröße des Java-Threads fest\n Die tatsächliche Größe kann auf ein Vielfaches der\n Systemseitengröße aufgerundet werden, wenn für das Betriebssystem erforderlich.\n -Xverify Legt den Modus der Bytecodeverifizierung fest\n \
|
||||
@ -58,6 +58,7 @@ java.launcher.jar.error3=kein Hauptmanifestattribut, in {0}
|
||||
java.launcher.jar.error4=Fehler beim Laden des Java-Agents in {0}
|
||||
java.launcher.jar.error5=Fehler: Beim Versuch, Datei {0} zu schließen, ist ein unerwarteter Fehler aufgetreten
|
||||
java.launcher.jar.error.illegal.ena.value=Fehler: Ungültiger Wert "{0}" für das Manifestattribut "Enable-Native-Access". Nur ''ALL-UNNAMED'' ist zulässig
|
||||
java.launcher.jar.error.illegal.effm.value=Fehler: Ungültiger Wert "{0}" für das Manifestattribut "Enable-Final-Field-Mutation". Nur "ALL-UNNAMED" ist zulässig
|
||||
java.launcher.init.error=Initialisierungsfehler
|
||||
java.launcher.javafx.error1=Fehler: Die JavaFX-Methode launchApplication hat die falsche Signatur, sie\nmuss als statisch deklariert werden und einen Wert vom Typ VOID zurückgeben
|
||||
java.launcher.module.error1=Modul {0} weist kein ModuleMainClass-Attribut auf. Verwenden Sie -m <module>/<main-class>
|
||||
|
||||
@ -31,8 +31,9 @@ java.launcher.opt.hotspot =\ {0}\t は"{1}" VMのシノニムです [非
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.opt.footer = \ -cp <ディレクトリおよびzip/jarファイルのクラス検索パス>\n -classpath <ディレクトリおよびzip/jarファイルのクラス検索パス>\n --class-path <ディレクトリおよびzip/jarファイルのクラス検索パス>\n "{0}"区切りリスト(ディレクトリ、JARアーカイブ、\n ZIPアーカイブ)で、クラス・ファイルの検索用。\n -p <module path>\n --module-path <module path>...\n 要素を"{0}"で区切ったリストで、各要素は次へのファイル・パスです:\n モジュール、またはモジュールが格納されているディレクトリ。各モジュールは次のいずれかです:\n モジュラJARまたは展開形式のモジュール・ディレクトリ。\n --upgrade-module-path <module path>...\n 要素を"{0}"で区切ったリストで、各要素は次へのファイル・パスです:\n モジュール、またはモジュールが格納されているディレクトリで、次のものを置き換えます:\n ランタイム・イメージのアップグレード可能なモジュール。各モジュールは次のいずれかです:\n モジュラJARまたは展開形式のモジュール・ディレクトリ。\n --add-modules <module name>[,<module name>...]\n 初期モジュールに加えて解決するルート・モジュール。\n <module name>には次も指定できます: ALL-DEFAULT、ALL-SYSTEM、\n ALL-MODULE-PATH.\n --enable-native-access <module name>[,<module name>...]\n モジュール内のコードをJavaランタイムの外のコードおよびデータにアクセスさせることができます。\n <module name>は、クラス・パス上のコードを指定するためにALL-UNNAMEDにもできます。\n --illegal-native-access=<value>\n Javaランタイムの外のコードおよびデータへのアクセスを許可または拒否します\n (ネイティブ・アクセスが明示的に有効化されていないモジュール内のコードによる)。\n \
|
||||
<value>は、"deny"、"warn"または"allow"のいずれかです。デフォルト値は"warn"です。\n このオプションは、将来のリリースで削除される予定です。\n --list-modules\n 参照可能なモジュールをリストし終了します\n -d <module name>\n --describe-module <module name>\n モジュールを説明し終了します\n --dry-run VMを作成しメイン・クラスをロードしますが、メイン・メソッドは実行しません。\n --dry-runオプションは、次の検証に役立つ場合があります:\n モジュール・システム構成などのコマンド行オプション。\n --validate-modules\n すべてのモジュールを検証し終了します\n --validate-modulesオプションは、次の検索に役立つ場合があります:\n モジュール・パス上のモジュールでの競合およびその他のエラー。\n -D<name>=<value>\n システム・プロパティを設定します\n -verbose:[class|module|gc|jni]\n 特定のサブシステムで詳細出力を有効にする\n -version 製品バージョンをエラー・ストリームに出力して終了します\n --version 製品バージョンを出力ストリームに出力して終了します\n -showversion 製品バージョンをエラー・ストリームに出力して続行します\n --show-version\n 製品バージョンを出力ストリームに出力して続行します\n --show-module-resolution\n 起動時にモジュール解決出力を表示します\n -? -h -help\n このヘルプ・メッセージをエラー・ストリームに出力します\n --help このヘルプ・メッセージを出力ストリームに出力します\n -X 追加オプションのヘルプをエラー・ストリームに出力します\n --help-extra 追加オプションのヘルプを出力ストリームに出力します\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n 指定した粒度でアサーションを有効にします\n -da[:<packagename>...|:<classname>]\n \
|
||||
-disableassertions[:<packagename>...|:<classname>]\n 指定した粒度でアサーションを無効にします\n -esa | -enablesystemassertions\n システム・アサーションを有効にします\n -dsa | -disablesystemassertions\n システム・アサーションを無効にします\n -agentlib:<libname>[=<options>]\n ネイティブ・エージェント・ライブラリ<libname>をロードします。例: -agentlib:jdwp\n -agentlib:jdwp=helpも参照してください\n -agentpath:<pathname>[=<options>]\n フルパス名を使用して、ネイティブ・エージェント・ライブラリをロードします\n -javaagent:<jarpath>[=<options>]\n Javaプログラミング言語エージェントをロードします。java.lang.instrumentを参照してください\n -splash:<imagepath>\n 指定されたイメージを含むスプラッシュ画面を表示します\n HiDPIスケールのイメージが自動的にサポートされて使用されます\n (可能な場合)。スケーリングされないイメージのファイル名(image.extなど)を\n 引数として-splashオプションに必ず渡す必要があります。\n 指定された最も適切なスケーリング済イメージが選択されます\n (自動的)。\n 詳細は、SplashScreen APIのドキュメントを参照してください\n @argumentファイル\n オプションを含む1つ以上の引数ファイル\n --disable-@files\n さらなる引数ファイル拡張を無効にします\n --enable-preview\n クラスをこのリリースのプレビュー機能に依存させることができます\n長いオプションの引数を指定する場合、--<name>=<value>または\n--<name> <value>を使用できます。\n
|
||||
<value>は、"deny"、"warn"または"allow"のいずれかです。デフォルト値は"warn"です。\n このオプションは、将来のリリースで削除される予定です。\n --enable-final-field-mutation <module name>[,<module name>...]\n 指定されたモジュールのコードで、finalインスタンス・フィールドを変更できます。\n <module name>は、クラス・パス上のコードを指定するためにALL-UNNAMEDにもできます。\n --illegal-final-field-mutation=<value>\n finalのモジュール内のコードによるfinalフィールド変更を許可または拒否します\n フィールド変更は明示的に有効化されていません。\n <value>は、"deny"、"warn"、"debug"または"allow"のいずれかです。デフォルト値は"warn"です。\n このオプションは、将来のリリースで削除される予定です。\n --list-modules\n 参照可能なモジュールをリストし終了します\n -d <module name>\n --describe-module <module name>\n モジュールを説明し終了します\n --dry-run VMを作成しメイン・クラスをロードしますが、メイン・メソッドは実行しません。\n --dry-runオプションは、次の検証に役立つ場合があります:\n モジュール・システム構成などのコマンド行オプション。\n --validate-modules\n すべてのモジュールを検証し終了します\n --validate-modulesオプションは、次の検索に役立つ場合があります:\n モジュール・パス上のモジュールでの競合およびその他のエラー。\n -D<name>=<value>\n システム・プロパティを設定します\n -verbose:[class|module|gc|jni]\n 特定のサブシステムで詳細出力を有効にする\n -version 製品バージョンをエラー・ストリームに出力して終了します\n --version 製品バージョンを出力ストリームに出力して終了します\n -showversion 製品バージョンをエラー・ストリームに出力して続行します\n --show-version\n \
|
||||
製品バージョンを出力ストリームに出力して続行します\n --show-module-resolution\n 起動時にモジュール解決出力を表示します\n -? -h -help\n このヘルプ・メッセージをエラー・ストリームに出力します\n --help このヘルプ・メッセージを出力ストリームに出力します\n -X 追加オプションのヘルプをエラー・ストリームに出力します\n --help-extra 追加オプションのヘルプを出力ストリームに出力します\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n 指定した粒度でアサーションを有効にします\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n 指定した粒度でアサーションを無効にします\n -esa | -enablesystemassertions\n システム・アサーションを有効にします\n -dsa | -disablesystemassertions\n システム・アサーションを無効にします\n -agentlib:<libname>[=<options>]\n ネイティブ・エージェント・ライブラリ<libname>をロードします。例: -agentlib:jdwp\n -agentlib:jdwp=helpも参照してください\n -agentpath:<pathname>[=<options>]\n フルパス名を使用して、ネイティブ・エージェント・ライブラリをロードします\n -javaagent:<jarpath>[=<options>]\n Javaプログラミング言語エージェントをロードします。java.lang.instrumentを参照してください\n -splash:<imagepath>\n 指定されたイメージを含むスプラッシュ画面を表示します\n HiDPIスケールのイメージが自動的にサポートされて使用されます\n (可能な場合)。スケーリングされないイメージのファイル名(image.extなど)を\n 引数として-splashオプションに必ず渡す必要があります。\n 指定された最も適切なスケーリング済イメージが選択されます\n (自動的)。\n 詳細は、SplashScreen APIのドキュメントを参照してください\n @argumentファイル\n \
|
||||
オプションを含む1つ以上の引数ファイル\n --disable-@files\n さらなる引数ファイル拡張を無効にします\n --enable-preview\n クラスをこのリリースのプレビュー機能に依存させることができます\n長いオプションの引数を指定する場合、--<name>=<value>または\n--<name> <value>を使用できます。\n
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.X.usage=\n -Xbatch バックグラウンド・コンパイルを無効にします\n -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n ブートストラップ・クラス・パスの最後に追加します\n -Xcheck:jni JNI関数に対する追加のチェックを実行します\n -Xcomp 初回呼出し時にメソッドのコンパイルを強制します\n -Xdebug 何も実行されません。将来のリリースで削除されるため、非推奨になりました。\n -Xdiag 追加の診断メッセージを表示します\n -Xint インタプリタ・モードの実行のみ\n -Xinternalversion\n -versionオプションより詳細なJVMバージョン情報を\n 表示します\n -Xlog:<opts> Java Virtual Machine (JVM)統合ロギング・フレームワークでの\n ロギングを構成または有効化します。詳細は、-Xlog:helpを\n 使用してください。\n -Xloggc:<file> タイムスタンプが付いたファイルにGCステータスのログを記録します\n このオプションは非推奨であり、将来のリリースで削除される\n 可能性があります。-Xlog:gc:<file>で置換されています。\n -Xmixed 混合モードの実行(デフォルト)\n -Xmn<size> 若い世代(ナーサリ)のヒープの初期サイズおよび最大サイズ\n (バイト単位)を設定します\n -Xms<size> Javaの最小および初期のヒープ・サイズを設定します\n -Xmx<size> Javaの最大ヒープ・サイズを設定します\n -Xnoclassgc クラスのガベージ・コレクションを無効にします\n -Xrs Java/VMによるOSシグナルの使用を削減します(ドキュメントを参照)\n -Xshare:auto 可能であれば共有クラス・データを使用します(デフォルト)\n -Xshare:off 共有クラス・データの使用を試みません\n -Xshare:on 共有クラス・データの使用を必須にし、できなければ失敗します。\n \
|
||||
@ -60,6 +61,7 @@ java.launcher.jar.error3={0}にメイン・マニフェスト属性がありま
|
||||
java.launcher.jar.error4={0}内のJavaエージェントのロード中にエラーが発生しました
|
||||
java.launcher.jar.error5=エラー: ファイル{0}を閉じるときに、予期しないエラーが発生しました
|
||||
java.launcher.jar.error.illegal.ena.value=エラー: Enable-Native-Accessマニフェスト属性の値"{0}"が不正です。''ALL-UNNAMED''のみ許可されます
|
||||
java.launcher.jar.error.illegal.effm.value=エラー: Enable-Final-Field-Mutationマニフェスト属性の値"{0}"が不正です。''ALL-UNNAMED''のみ許可されます
|
||||
java.launcher.init.error=初期化エラー
|
||||
java.launcher.javafx.error1=エラー: JavaFX launchApplicationメソッドに誤ったシグネチャがあり、\nstaticを宣言してvoid型の値を返す必要があります
|
||||
java.launcher.module.error1=モジュール{0}にModuleMainClass属性がありません。-m <module>/<main-class>を使用してください
|
||||
|
||||
@ -30,8 +30,9 @@ java.launcher.opt.vmselect =\ {0}\t 选择 "{1}" VM\n
|
||||
java.launcher.opt.hotspot =\ {0}\t 是 "{1}" VM 的同义词 [已过时]\n
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.opt.footer = \ -cp <目录和 zip/jar 文件的类搜索路径>\n -classpath <目录和 zip/jar 文件的类搜索路径>\n --class-path <目录和 zip/jar 文件的类搜索路径>\n 以 "{0}" 分隔的用于搜索类文件的目录、JAR 档案\n 和 ZIP 档案列表。\n -p <模块路径>\n --module-path <模块路径>...\n 以 "{0}" 分隔的元素列表,每个元素都是\n 模块或包含模块的目录的文件路径。每个模块都是\n 模块化 JAR 或展开的模块目录。\n --upgrade-module-path <模块路径>...\n 以 "{0}" 分隔的元素列表,每个元素都是\n 模块或包含模块(用于替换运行时映像中的\n 可升级模块)的目录的文件路径。每个模块都是\n 模块化 JAR 或展开的模块目录。\n --add-modules <模块名称>[,<模块名称>...]\n 除了初始模块之外要解析的根模块。\n <模块名称> 还可以为 ALL-DEFAULT, ALL-SYSTEM,\n ALL-MODULE-PATH.\n --enable-native-access <module name>[,<module name>...]\n 允许模块中的代码访问 Java 运行时之外的代码和数据。\n <module name> 也可以是 ALL-UNNAMED,以指示类路径上的代码。\n --illegal-native-access=<value>\n 允许或拒绝模块中没有明确为其启用本机访问的\n 代码访问 Java 运行时之外的代码和数据。\n <value> 为 "deny"、"warn" 或 "allow" 之一。默认值为 "warn"。\n 此选项将在未来发行版中删除。\n --list-modules\n 列出可观察模块并退出\n -d <module name>\n --describe-module <模块名称>\n 描述模块并退出\n --dry-run 创建 VM 并加载主类, 但不执行 main 方法。\n 此 --dry-run 选项对于验证诸如\n 模块系统配置这样的命令行选项可能非常有用。\n --validate-modules\n 验证所有模块并退出\n --validate-modules 选项对于查找\n 模块路径中模块的冲突及其他错误可能非常有用。\n -D<名称>=<值>\n 设置系统属性\n -verbose:[class|module|gc|jni]\n 为给定子系统启用详细输出\n -version 将产品版本输出到错误流并退出\n --version \
|
||||
将产品版本输出到输出流并退出\n -showversion 将产品版本输出到错误流并继续\n --show-version\n 将产品版本输出到输出流并继续\n --show-module-resolution\n 在启动过程中显示模块解析输出\n -? -h -help\n 将此帮助消息输出到错误流\n --help 将此帮助消息输出到输出流\n -X 将额外选项的帮助输出到错误流\n --help-extra 将额外选项的帮助输出到输出流\n -ea[:<程序包名称>...|:<类名>]\n -enableassertions[:<程序包名称>...|:<类名>]\n 按指定的粒度启用断言\n -da[:<程序包名称>...|:<类名>]\n -disableassertions[:<程序包名称>...|:<类名>]\n 按指定的粒度禁用断言\n -esa | -enablesystemassertions\n 启用系统断言\n -dsa | -disablesystemassertions\n 禁用系统断言\n -agentlib:<库名>[=<选项>]\n 加载本机代理库 <库名>, 例如 -agentlib:jdwp\n 另请参阅 -agentlib:jdwp=help\n -agentpath:<路径名>[=<选项>]\n 按完整路径名加载本机代理库\n -javaagent:<jar 路径>[=<选项>]\n 加载 Java 编程语言代理, 请参阅 java.lang.instrument\n -splash:<图像路径>\n 使用指定的图像显示启动屏幕\n 自动支持和使用 HiDPI 缩放图像\n (如果可用)。应始终将未缩放的图像文件名 (例如, image.ext)\n 作为参数传递给 -splash 选项。\n 将自动选取提供的最合适的缩放\n 图像。\n 有关详细信息, 请参阅 SplashScreen API 文档\n @argument 文件\n 一个或多个包含选项的参数文件\n --disable-@files\n 阻止进一步扩展参数文件\n --enable-preview\n 允许类依赖于此发行版的预览功能\n要为长选项指定参数, 可以使用 --<名称>=<值> 或\n--<名称> <值>。\n
|
||||
java.launcher.opt.footer = \ -cp <目录和 zip/jar 文件的类搜索路径>\n -classpath <目录和 zip/jar 文件的类搜索路径>\n --class-path <目录和 zip/jar 文件的类搜索路径>\n 以 "{0}" 分隔的用于搜索类文件的目录、JAR 档案\n 和 ZIP 档案列表。\n -p <模块路径>\n --module-path <模块路径>...\n 以 "{0}" 分隔的元素列表,每个元素都是\n 模块或包含模块的目录的文件路径。每个模块都是\n 模块化 JAR 或展开的模块目录。\n --upgrade-module-path <模块路径>...\n 以 "{0}" 分隔的元素列表,每个元素都是\n 模块或包含模块(用于替换运行时映像中的\n 可升级模块)的目录的文件路径。每个模块都是\n 模块化 JAR 或展开的模块目录。\n --add-modules <模块名称>[,<模块名称>...]\n 除了初始模块之外要解析的根模块。\n <模块名称> 还可以为 ALL-DEFAULT, ALL-SYSTEM,\n ALL-MODULE-PATH.\n --enable-native-access <module name>[,<module name>...]\n 允许模块中的代码访问 Java 运行时之外的代码和数据。\n <module name> 也可以是 ALL-UNNAMED,以指示类路径上的代码。\n --illegal-native-access=<value>\n 允许或拒绝模块中没有明确为其启用本机访问的\n 代码访问 Java 运行时之外的代码和数据。\n <value> 为 "deny"、"warn" 或 "allow" 之一。默认值为 "warn"。\n 此选项将在未来发行版中删除。\n --enable-final-field-mutation <module name>[,<module name>...]\n 允许指定模块中的代码变更最终实例字段。\n <module name> 也可以是 ALL-UNNAMED,以指示类路径上的代码。\n --illegal-final-field-mutation=<value>\n 允许或拒绝模块中的代码在未明确启用最终字段变更时\n 变更最终字段。\n <value> 为 "deny"、"warn"、"debug" 或 "allow" 之一。默认值为 "warn"。\n 此选项将在未来发行版中删除。\n --list-modules\n 列出可观察模块并退出\n -d <module name>\n --describe-module <模块名称>\n 描述模块并退出\n --dry-run 创建 VM 并加载主类, 但不执行 main 方法。\n 此 --dry-run \
|
||||
选项对于验证诸如\n 模块系统配置这样的命令行选项可能非常有用。\n --validate-modules\n 验证所有模块并退出\n --validate-modules 选项对于查找\n 模块路径中模块的冲突及其他错误可能非常有用。\n -D<名称>=<值>\n 设置系统属性\n -verbose:[class|module|gc|jni]\n 为给定子系统启用详细输出\n -version 将产品版本输出到错误流并退出\n --version 将产品版本输出到输出流并退出\n -showversion 将产品版本输出到错误流并继续\n --show-version\n 将产品版本输出到输出流并继续\n --show-module-resolution\n 在启动过程中显示模块解析输出\n -? -h -help\n 将此帮助消息输出到错误流\n --help 将此帮助消息输出到输出流\n -X 将额外选项的帮助输出到错误流\n --help-extra 将额外选项的帮助输出到输出流\n -ea[:<程序包名称>...|:<类名>]\n -enableassertions[:<程序包名称>...|:<类名>]\n 按指定的粒度启用断言\n -da[:<程序包名称>...|:<类名>]\n -disableassertions[:<程序包名称>...|:<类名>]\n 按指定的粒度禁用断言\n -esa | -enablesystemassertions\n 启用系统断言\n -dsa | -disablesystemassertions\n 禁用系统断言\n -agentlib:<库名>[=<选项>]\n 加载本机代理库 <库名>, 例如 -agentlib:jdwp\n 另请参阅 -agentlib:jdwp=help\n -agentpath:<路径名>[=<选项>]\n 按完整路径名加载本机代理库\n -javaagent:<jar 路径>[=<选项>]\n 加载 Java 编程语言代理, 请参阅 java.lang.instrument\n -splash:<图像路径>\n 使用指定的图像显示启动屏幕\n 自动支持和使用 HiDPI 缩放图像\n (如果可用)。应始终将未缩放的图像文件名 (例如, image.ext)\n 作为参数传递给 -splash 选项。\n 将自动选取提供的最合适的缩放\n 图像。\n 有关详细信息, 请参阅 SplashScreen API 文档\n @argument 文件\n 一个或多个包含选项的参数文件\n --disable-@files\n 阻止进一步扩展参数文件\n --enable-preview\n \
|
||||
允许类依赖于此发行版的预览功能\n要为长选项指定参数, 可以使用 --<名称>=<值> 或\n--<名称> <值>。\n
|
||||
|
||||
# Translators please note do not translate the options themselves
|
||||
java.launcher.X.usage=\n -Xbatch 禁用后台编译\n -Xbootclasspath/a:<以 {0} 分隔的目录和 zip/jar 文件>\n 附加在引导类路径末尾\n -Xcheck:jni 对 JNI 函数执行其他检查\n -Xcomp 强制在首次调用时编译方法\n -Xdebug 不执行任何操作;已过时,将在未来发行版中删除。\n -Xdiag 显示附加诊断消息\n -Xint 仅解释模式执行\n -Xinternalversion\n 显示比 -version 选项更详细的\n JVM 版本信息\n -Xlog:<opts> 配置或启用采用 Java 虚拟\n 机 (Java Virtual Machine, JVM) 统一记录框架进行事件记录。使用 -Xlog:help\n 可了解详细信息。\n -Xloggc:<file> 将 GC 状态记录在文件中(带时间戳)。\n 此选项已过时,可能会在\n 将来的发行版中删除。它将替换为 -Xlog:gc:<file>。\n -Xmixed 混合模式执行(默认值)\n -Xmn<size> 为年轻代(新生代)设置初始和最大堆大小\n (以字节为单位)\n -Xms<size> 设置最小和初始 Java 堆大小\n -Xmx<size> 设置最大 Java 堆大小\n -Xnoclassgc 禁用类垃圾收集\n -Xrs 减少 Java/VM 对操作系统信号的使用(请参见文档)\n -Xshare:auto 在可能的情况下使用共享类数据(默认值)\n -Xshare:off 不尝试使用共享类数据\n -Xshare:on 要求使用共享类数据,否则将失败。\n 这是一个测试选项,可能导致间歇性\n 故障。不应在生产环境中使用它。\n -XshowSettings 显示所有设置并继续\n -XshowSettings:all\n 详细显示所有设置并继续\n -XshowSettings:locale\n 显示所有与区域设置相关的设置并继续\n -XshowSettings:properties\n 显示所有属性设置并继续\n -XshowSettings:vm\n 显示所有与 vm 相关的设置并继续\n -XshowSettings:security\n 显示所有安全设置并继续\n -XshowSettings:security:all\n 显示所有安全设置并继续\n -XshowSettings:security:properties\n 显示安全属性并继续\n -XshowSettings:security:providers\n 显示静态安全提供方设置并继续\n -XshowSettings:security:tls\n 显示与 TLS \
|
||||
@ -49,7 +50,7 @@ java.launcher.cls.error2=错误: 在类 {0} 中找不到 main 方法, 请将 mai
|
||||
java.launcher.cls.error3=错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
|
||||
java.launcher.cls.error4=错误: 加载主类 {0} 时出现 LinkageError\n\t{1}
|
||||
java.launcher.cls.error5=错误: 无法初始化主类 {0}\n原因: {1}: {2}
|
||||
java.launcher.cls.error6=错误:在类 {0} 中未找到非专用零参数构造器\n请从现有构造器中删除专用,或者定义为:\n public {0}()
|
||||
java.launcher.cls.error6=错误:在类 {0} 中未找到非专用零参数构造器\n请从现有构造器中删除 private,或者定义为:\n public {0}()
|
||||
java.launcher.cls.error7=错误:无法调用非静态内部类 {0} 构造器\n请将内部类设为静态或将内部类移出到单独的源文件
|
||||
java.launcher.cls.error8=错误:无法实例化抽象类 {0}\n请使用具体类
|
||||
java.launcher.jar.error1=错误: 尝试打开文件{0}时出现意外错误
|
||||
@ -58,6 +59,7 @@ java.launcher.jar.error3={0}中没有主清单属性
|
||||
java.launcher.jar.error4=在 {0} 中加载 Java 代理时出错
|
||||
java.launcher.jar.error5=错误:尝试关闭文件 {0} 时出现意外错误
|
||||
java.launcher.jar.error.illegal.ena.value=错误:Enable-Native-Access 清单属性的值 "{0}" 非法。仅允许使用 ''ALL-UNNAMED''
|
||||
java.launcher.jar.error.illegal.effm.value=错误:Enable-Final-Field-Mutation 清单属性的值 "{0}" 非法。仅允许使用 ''ALL-UNNAMED''
|
||||
java.launcher.init.error=初始化错误
|
||||
java.launcher.javafx.error1=错误: JavaFX launchApplication 方法具有错误的签名, 必须\n将方法声明为静态方法并返回空类型的值
|
||||
java.launcher.module.error1=模块 {0} 不具有 ModuleMainClass 属性,请使用 -m <模块>/<主类>
|
||||
|
||||
@ -313,7 +313,7 @@ Unable.to.parse.denyAfter.string.in.exception.message=denyAfter-Datumszeichenfol
|
||||
whose.sigalg.weak=%1$s verwendet den Signaturalgorithmus %2$s. Dies gilt als Sicherheitsrisiko.
|
||||
whose.key.disabled=%1$s verwendet %2$s. Dies gilt als Sicherheitsrisiko und ist deaktiviert.
|
||||
whose.key.weak=%1$s verwendet %2$s. Das gilt als Sicherheitsrisiko. Dieser Schlüssel wird in einem zukünftigen Update deaktiviert.
|
||||
jks.storetype.warning=Der %1$s-Keystore verwendet ein proprietäres Format. Es wird empfohlen, auf PKCS12 zu migrieren, das ein Industriestandardformat mit "keytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12" ist.
|
||||
jks.storetype.warning=%1$s verwendet veraltete kryptografische Algorithmen und wird in einer zukünftigen Version entfernt. Migrieren Sie zu PKCS12 mit:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
migrate.keystore.warning="%1$s" zu %4$s migriert. Der %2$s-Keystore wurde als "%3$s" gesichert.
|
||||
backup.keystore.warning=Der ursprüngliche Keystore "%1$s" wird als "%3$s" gesichert...
|
||||
importing.keystore.status=Keystore %1$s wird in %2$s importiert...
|
||||
|
||||
@ -313,7 +313,7 @@ Unable.to.parse.denyAfter.string.in.exception.message=例外メッセージのde
|
||||
whose.sigalg.weak=%1$sは%2$s署名アルゴリズムを使用しており、これはセキュリティ・リスクとみなされます。
|
||||
whose.key.disabled=%1$sは%2$sを使用しており、これはセキュリティ・リスクとみなされ、無効化されています。
|
||||
whose.key.weak=%1$sは%2$sを使用しており、これはセキュリティ・リスクとみなされます。これは将来の更新で無効化されます。
|
||||
jks.storetype.warning=%1$sキーストアは独自の形式を使用しています。"keytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12"を使用する業界標準の形式であるPKCS12に移行することをお薦めします。
|
||||
jks.storetype.warning=%1$sは古い暗号化アルゴリズムを使用しているため、将来のリリースで削除されます。次を使用してPKCS12に移行します:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
migrate.keystore.warning="%1$s"が%4$sに移行されました。%2$sキーストアは"%3$s"としてバックアップされます。
|
||||
backup.keystore.warning=元のキーストア"%1$s"は"%3$s"としてバックアップされます...
|
||||
importing.keystore.status=キーストア%1$sを%2$sにインポートしています...
|
||||
|
||||
@ -313,7 +313,7 @@ Unable.to.parse.denyAfter.string.in.exception.message=无法解析异常错误
|
||||
whose.sigalg.weak=%1$s 使用的 %2$s 签名算法存在安全风险。
|
||||
whose.key.disabled=%1$s 使用的 %2$s 被视为存在安全风险而且被禁用。
|
||||
whose.key.weak=%1$s 使用的 %2$s 被视为存在安全风险。它将在未来的更新中被禁用。
|
||||
jks.storetype.warning=%1$s 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
|
||||
jks.storetype.warning=%1$s 使用的加密算法已过时,将在未来发行版中删除。请使用以下命令迁移到 PKCS12:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
migrate.keystore.warning=已将 "%1$s" 迁移到 %4$s。将 %2$s 密钥库作为 "%3$s" 进行了备份。
|
||||
backup.keystore.warning=已将原始密钥库 "%1$s" 备份为 "%3$s"...
|
||||
importing.keystore.status=正在将密钥库 %1$s 导入到 %2$s...
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,6 +32,7 @@ import java.util.Arrays;
|
||||
|
||||
import jdk.internal.access.SharedSecrets;
|
||||
import jdk.internal.io.JdkConsoleImpl;
|
||||
import jdk.internal.misc.VM;
|
||||
|
||||
/**
|
||||
* A utility class for reading passwords
|
||||
@ -65,7 +66,9 @@ public class Password {
|
||||
}
|
||||
consoleBytes = ConsoleHolder.convertToBytes(consoleEntered);
|
||||
in = new ByteArrayInputStream(consoleBytes);
|
||||
} else if (System.in.available() == 0) {
|
||||
} else if (in == System.in && VM.isBooted()
|
||||
&& System.in.available() == 0) {
|
||||
// Warn if reading password from System.in but it's empty.
|
||||
// This may be running in an IDE Run Window or in JShell,
|
||||
// which acts like an interactive console and echoes the
|
||||
// entered password. In this case, print a warning that
|
||||
@ -73,6 +76,7 @@ public class Password {
|
||||
// it's more likely the input comes from a pipe, such as
|
||||
// "echo password |" or "cat password_file |" where input
|
||||
// will be silently consumed without echoing to the screen.
|
||||
// Warn only if VM is booted and ResourcesMgr is available.
|
||||
System.err.print(ResourcesMgr.getString
|
||||
("warning.input.may.be.visible.on.screen"));
|
||||
}
|
||||
|
||||
@ -43,7 +43,7 @@ provided.null.OID.map=Null-OID-Zuordnung angegeben
|
||||
NEWLINE=\n
|
||||
invalid.null.action.provided=Ungültige Nullaktion angegeben
|
||||
invalid.null.Class.provided=Ungültige Nullklasse angegeben
|
||||
Subject.=Subjekt:\n
|
||||
Subject.=Subject:\n
|
||||
.Principal.=\tPrincipal:\u0020
|
||||
.Public.Credential.=\tÖffentliche Zugangsdaten:\u0020
|
||||
.Private.Credential.=\tPrivate Zugangsdaten:\u0020
|
||||
@ -74,3 +74,6 @@ line.number.expected.expect.found.actual.=Zeile {0}: [{1}] erwartet, [{2}] gefun
|
||||
|
||||
# sun.security.pkcs11.SunPKCS11
|
||||
PKCS11.Token.providerName.Password.=Kennwort für PKCS11-Token [{0}]:\u0020
|
||||
|
||||
# sun.security.util.Password
|
||||
warning.input.may.be.visible.on.screen=[Warnung: Eingabe ist möglicherweise auf dem Bildschirm sichtbar]\u0020
|
||||
|
||||
@ -74,3 +74,6 @@ line.number.expected.expect.found.actual.=行{0}: [{1}]ではなく[{2}]が検
|
||||
|
||||
# sun.security.pkcs11.SunPKCS11
|
||||
PKCS11.Token.providerName.Password.=PKCS11トークン[{0}]パスワード:\u0020
|
||||
|
||||
# sun.security.util.Password
|
||||
warning.input.may.be.visible.on.screen=[警告: 入力が画面に表示される場合があります]\u0020
|
||||
|
||||
@ -74,3 +74,6 @@ line.number.expected.expect.found.actual.=行号 {0}: 应为 [{1}], 找到 [{2}]
|
||||
|
||||
# sun.security.pkcs11.SunPKCS11
|
||||
PKCS11.Token.providerName.Password.=PKCS11 标记 [{0}] 密码:\u0020
|
||||
|
||||
# sun.security.util.Password
|
||||
warning.input.may.be.visible.on.screen=[警告:输入可能显示在屏幕上]\u0020
|
||||
|
||||
@ -452,7 +452,7 @@ public class WindowsAsynchronousFileChannelImpl
|
||||
address = IOUtil.bufferAddress(dst) + pos;
|
||||
} else {
|
||||
buf = Util.getTemporaryDirectBuffer(rem);
|
||||
address = IOUtil.bufferAddress(buf) + pos;
|
||||
address = IOUtil.bufferAddress(buf);
|
||||
}
|
||||
|
||||
boolean pending = false;
|
||||
@ -640,7 +640,7 @@ public class WindowsAsynchronousFileChannelImpl
|
||||
// temporarily restore position as we don't know how many bytes
|
||||
// will be written
|
||||
src.position(pos);
|
||||
address = IOUtil.bufferAddress(buf) + pos;
|
||||
address = IOUtil.bufferAddress(buf);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2025, 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
|
||||
@ -216,11 +216,9 @@ public class SynthProgressBarUI extends BasicProgressBarUI
|
||||
|
||||
SynthLookAndFeel.update(context, g);
|
||||
|
||||
if (((JProgressBar) c).isBorderPainted()) {
|
||||
context.getPainter().paintProgressBarBackground(context,
|
||||
g, 0, 0, c.getWidth(), c.getHeight(),
|
||||
progressBar.getOrientation());
|
||||
}
|
||||
context.getPainter().paintProgressBarBackground(context,
|
||||
g, 0, 0, c.getWidth(), c.getHeight(),
|
||||
progressBar.getOrientation());
|
||||
paint(context, g);
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, 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
|
||||
@ -48,6 +48,9 @@ public interface VMManagement {
|
||||
public boolean isGcNotificationSupported();
|
||||
public boolean isRemoteDiagnosticCommandsSupported();
|
||||
|
||||
// AOT Subsystem
|
||||
public boolean endAOTRecording();
|
||||
|
||||
// Class Loading Subsystem
|
||||
public long getTotalClassCount();
|
||||
public int getLoadedClassCount();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, 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
|
||||
@ -117,6 +117,9 @@ class VMManagementImpl implements VMManagement {
|
||||
public native boolean isThreadCpuTimeEnabled();
|
||||
public native boolean isThreadAllocatedMemoryEnabled();
|
||||
|
||||
// AOT Subsystem
|
||||
public native boolean endAOTRecording();
|
||||
|
||||
// Class Loading Subsystem
|
||||
public int getLoadedClassCount() {
|
||||
long count = getTotalClassCount() - getUnloadedClassCount();
|
||||
|
||||
@ -101,6 +101,13 @@ Java_sun_management_VMManagementImpl_getVmArguments0
|
||||
return JVM_GetVmArguments(env);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_sun_management_VMManagementImpl_endAOTRecording
|
||||
(JNIEnv *env, jobject dummy)
|
||||
{
|
||||
return JVM_AOTEndRecording(env);
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_sun_management_VMManagementImpl_getTotalClassCount
|
||||
(JNIEnv *env, jobject dummy)
|
||||
|
||||
@ -1581,34 +1581,30 @@ public abstract sealed class QuicEndpoint implements AutoCloseable
|
||||
peerIssuedResetTokens.replaceAll((tok, c) -> c == from ? to : c);
|
||||
}
|
||||
|
||||
public void draining(final QuicPacketReceiver connection) {
|
||||
public void draining(final QuicConnectionImpl connection) {
|
||||
// remap the connection to a DrainingConnection
|
||||
if (closed) return;
|
||||
|
||||
final long idleTimeout = connection.peerPtoMs() * 3; // 3 PTO
|
||||
connection.localConnectionIdManager().close();
|
||||
DrainingConnection draining = new DrainingConnection(connection.connectionIds(), idleTimeout);
|
||||
// we can ignore stateless reset in the draining state.
|
||||
remapPeerIssuedResetToken(connection, draining);
|
||||
|
||||
connection.connectionIds().forEach((id) ->
|
||||
connections.compute(id, this::remapDraining));
|
||||
connections.compute(id, (i, r) -> remapDraining(i, r, draining)));
|
||||
draining.startTimer();
|
||||
assert !connections.containsValue(connection) : connection;
|
||||
}
|
||||
|
||||
private DrainingConnection remapDraining(QuicConnectionId id, QuicPacketReceiver conn) {
|
||||
private DrainingConnection remapDraining(QuicConnectionId id, QuicPacketReceiver conn, DrainingConnection draining) {
|
||||
if (closed) return null;
|
||||
var debugOn = debug.on() && !Thread.currentThread().isVirtual();
|
||||
if (conn instanceof ClosingConnection closing) {
|
||||
if (conn instanceof QuicConnectionImpl || conn instanceof ClosingConnection) {
|
||||
if (debugOn) debug.log("remapping %s to DrainingConnection", id);
|
||||
final var draining = closing.toDraining();
|
||||
remapPeerIssuedResetToken(closing, draining);
|
||||
draining.startTimer();
|
||||
return draining;
|
||||
} else if (conn instanceof DrainingConnection draining) {
|
||||
return draining;
|
||||
} else if (conn instanceof QuicConnectionImpl impl) {
|
||||
final long idleTimeout = impl.peerPtoMs() * 3; // 3 PTO
|
||||
impl.localConnectionIdManager().close();
|
||||
if (debugOn) debug.log("remapping %s to DrainingConnection", id);
|
||||
var draining = new DrainingConnection(conn.connectionIds(), idleTimeout);
|
||||
// we can ignore stateless reset in the draining state.
|
||||
remapPeerIssuedResetToken(impl, draining);
|
||||
draining.startTimer();
|
||||
return draining;
|
||||
} else if (conn instanceof DrainingConnection d) {
|
||||
return d;
|
||||
} else if (conn == null) {
|
||||
// connection absent (was probably removed), don't remap to draining
|
||||
if (debugOn) {
|
||||
@ -1623,30 +1619,32 @@ public abstract sealed class QuicEndpoint implements AutoCloseable
|
||||
|
||||
protected void closing(QuicConnectionImpl connection, ByteBuffer datagram) {
|
||||
if (closed) return;
|
||||
ByteBuffer closing = ByteBuffer.allocate(datagram.limit());
|
||||
closing.put(datagram.slice());
|
||||
closing.flip();
|
||||
ByteBuffer closingDatagram = ByteBuffer.allocate(datagram.limit());
|
||||
closingDatagram.put(datagram.slice());
|
||||
closingDatagram.flip();
|
||||
|
||||
final long idleTimeout = connection.peerPtoMs() * 3; // 3 PTO
|
||||
connection.localConnectionIdManager().close();
|
||||
var closingConnection = new ClosingConnection(connection.connectionIds(), idleTimeout, datagram);
|
||||
remapPeerIssuedResetToken(connection, closingConnection);
|
||||
|
||||
connection.connectionIds().forEach((id) ->
|
||||
connections.compute(id, (i, r) -> remapClosing(i, r, closing)));
|
||||
connections.compute(id, (i, r) -> remapClosing(i, r, closingConnection)));
|
||||
closingConnection.startTimer();
|
||||
assert !connections.containsValue(connection) : connection;
|
||||
}
|
||||
|
||||
private ClosedConnection remapClosing(QuicConnectionId id, QuicPacketReceiver conn, ByteBuffer datagram) {
|
||||
private ClosedConnection remapClosing(QuicConnectionId id, QuicPacketReceiver conn, ClosingConnection closingConnection) {
|
||||
if (closed) return null;
|
||||
var debugOn = debug.on() && !Thread.currentThread().isVirtual();
|
||||
if (conn instanceof ClosingConnection closing) {
|
||||
if (conn instanceof QuicConnectionImpl) {
|
||||
if (debugOn) debug.log("remapping %s to ClosingConnection", id);
|
||||
return closingConnection;
|
||||
} else if (conn instanceof ClosingConnection closing) {
|
||||
// we already have a closing datagram, drop the new one
|
||||
return closing;
|
||||
} else if (conn instanceof DrainingConnection draining) {
|
||||
return draining;
|
||||
} else if (conn instanceof QuicConnectionImpl impl) {
|
||||
final long idleTimeout = impl.peerPtoMs() * 3; // 3 PTO
|
||||
impl.localConnectionIdManager().close();
|
||||
if (debugOn) debug.log("remapping %s to ClosingConnection", id);
|
||||
var closing = new ClosingConnection(conn.connectionIds(), idleTimeout, datagram);
|
||||
remapPeerIssuedResetToken(impl, closing);
|
||||
closing.startTimer();
|
||||
return closing;
|
||||
} else if (conn == null) {
|
||||
// connection absent (was probably removed), don't remap to closing
|
||||
if (debugOn) {
|
||||
@ -1896,10 +1894,6 @@ public abstract sealed class QuicEndpoint implements AutoCloseable
|
||||
debug.log("ClosingConnection(%s): dropping %s packet", localConnectionIds, headersType);
|
||||
}
|
||||
}
|
||||
|
||||
private DrainingConnection toDraining() {
|
||||
return new DrainingConnection(localConnectionIds, maxIdleTimeMs);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -292,10 +292,10 @@ compiler.err.annotation.decl.not.allowed.here=Annotationsschnittstellendeklarati
|
||||
compiler.err.cant.inherit.from.final=Erben aus finalem {0}-Element nicht möglich
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.ref.before.ctor.called={0} kann nicht referenziert werden, bevor der Supertypkonstruktor aufgerufen wurde
|
||||
compiler.err.cant.ref.before.ctor.called=Referenz zu {0} darf nur nach einem expliziten Konstruktoraufruf angezeigt werden
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=Initialisiertes Feld "{0}" kann nicht zugewiesen werden, bevor der Supertypkonstruktor aufgerufen wurde
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=Zuweisung zu initialisiertem Feld "{0}" darf nur nach einem expliziten Konstruktoraufruf angezeigt werden
|
||||
|
||||
compiler.err.cant.select.static.class.from.param.type=Statische Klasse kann nicht aus einem parametrisierten Typ ausgewählt werden
|
||||
|
||||
@ -649,11 +649,14 @@ compiler.err.limit.string.overflow=UTF8-Darstellung für Zeichenfolge "{0}..." i
|
||||
|
||||
compiler.err.malformed.fp.lit=Nicht wohlgeformtes Gleitkommaliteral
|
||||
|
||||
compiler.err.method.does.not.override.superclass=Methode überschreibt oder implementiert keine Methode aus einem Supertyp
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.method.does.not.override.superclass={0} in {1} überschreibt oder implementiert keine Methode aus einem Supertyp
|
||||
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override=Statische Methoden können nicht mit @Override-Annotation versehen werden
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override=Statische Methode {0} in {1} kann nicht mit @Override-Annotation versehen werden
|
||||
|
||||
compiler.err.missing.meth.body.or.decl.abstract=Methodenbody fehlt oder als abstrakt deklarieren
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.missing.meth.body.or.decl.abstract=In Methode {0} in {1} fehlt ein Methodenbody, oder sie muss als abstrakt deklariert werden
|
||||
|
||||
compiler.err.missing.ret.stmt=Rückgabeanweisung fehlt
|
||||
|
||||
@ -1139,6 +1142,7 @@ compiler.err.multi-module.outdir.cannot.be.exploded.module=Im Modus für mehrere
|
||||
|
||||
# 0: path
|
||||
# lint: path
|
||||
# flags: default-enabled
|
||||
compiler.warn.outdir.is.in.exploded.module=Das Ausgabeverzeichnis befindet sich in einem entpackten Modul: {0}
|
||||
|
||||
# 0: file object
|
||||
@ -1198,6 +1202,7 @@ compiler.warn.output.file.clash=Ausgabedatei mehrmals geschrieben: {0}
|
||||
## The following string will appear before all messages keyed as:
|
||||
## "compiler.note".
|
||||
|
||||
# flags: mandatory
|
||||
compiler.note.compressed.diags=Einige Meldungen wurden vereinfacht. Wiederholen Sie die Kompilierung mit -Xdiags:verbose, um die vollständige Ausgabe abzurufen
|
||||
|
||||
# 0: boolean, 1: symbol
|
||||
@ -1378,17 +1383,17 @@ compiler.warn.incubating.modules=Inkubatormodul(e) verwendet: {0}
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated={0} in {1} ist veraltet
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal={0} in {1} ist veraltet und wurde zum Entfernen markiert
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview={0} ist eine Vorschau-API, die in einem zukünftigen Release entfernt werden kann.
|
||||
|
||||
# 0: symbol
|
||||
@ -1396,7 +1401,7 @@ compiler.err.is.preview={0} ist eine Vorschau-API, die standardmäßig deaktivie
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview.reflective={0} ist eine reflektive Vorschau-API, die in einem zukünftigen Release entfernt werden kann.
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
@ -1405,12 +1410,12 @@ compiler.warn.restricted.method={0}.{1} ist eine eingeschränkte Methode.\n(Eing
|
||||
|
||||
# 0: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.module=Modul {0} ist veraltet
|
||||
|
||||
# 0: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal.module=Modul {0} ist veraltet und wurde zum Entfernen markiert
|
||||
|
||||
# 0: symbol
|
||||
@ -1583,10 +1588,12 @@ compiler.warn.static.not.qualified.by.type2={0} (statisch) darf nicht als Member
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.bootclasspath=Bootstrap Classpath ist nicht zusammen mit -source {0} festgelegt\n{1}
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.system.modules.path=Systemmodulpfad ist nicht zusammen mit -source {0} festgelegt\n{1}
|
||||
|
||||
# 0: string
|
||||
@ -1603,10 +1610,12 @@ compiler.misc.source.no.system.modules.path.with.target=Wenn Sie den Speicherort
|
||||
|
||||
# 0: string
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.source=Quellwert {0} ist veraltet und wird in einem zukünftigen Release entfernt
|
||||
|
||||
# 0: target
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.target=Zielwert {0} ist veraltet und wird in einem zukünftigen Release entfernt
|
||||
|
||||
# 0: string, 1: string
|
||||
@ -1616,12 +1625,17 @@ compiler.err.option.removed.source=Quelloption {0} wird nicht mehr unterstützt.
|
||||
compiler.err.option.removed.target=Zieloption {0} wird nicht mehr unterstützt. Verwenden Sie {1} oder höher.
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.suppression=Verwenden Sie -Xlint:-options, um Warnungen zu veralteten Optionen zu unterdrücken.
|
||||
|
||||
# 0: name, 1: number, 2: number, 3: number, 4: number
|
||||
# lint: classfile
|
||||
compiler.warn.future.attr={0}-Attribut, das in Klassendateien der Version {1}.{2} eingeführt wurde, wird in Klassendateien der Version {3}.{4} ignoriert
|
||||
|
||||
# 0: symbol, 1: file object
|
||||
# lint: classfile
|
||||
compiler.warn.inconsistent.inner.classes=InnerClasses-Attribut für {0} in {1} inkonsistent mit Quellcode\n({1} muss möglicherweise mit {0} neu kompiliert werden)
|
||||
|
||||
# lint: requires-automatic
|
||||
compiler.warn.requires.automatic=Erfordert Direktive für ein automatisches Modul
|
||||
|
||||
@ -1706,17 +1720,21 @@ compiler.warn.try.resource.not.referenced=Automatisch schließbare Ressource {0}
|
||||
# lint: try
|
||||
compiler.warn.try.resource.throws.interrupted.exc=Automatisch schließbare Ressource {0} umfasst die Mitgliedsmethode close(), die InterruptedException auslösen könnte
|
||||
|
||||
# 0: type
|
||||
# lint: try
|
||||
compiler.warn.try.resource.can.throw.interrupted.exc=close()-Methode kann InterruptedException in automatisch schließbarer Klasse {0} auslösen
|
||||
|
||||
# lint: unchecked
|
||||
compiler.warn.unchecked.assign=Nicht geprüfte Zuweisung: {0} zu {1}
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.assign.to.var=Nicht geprüfte Zuweisung zu Variable {0} als Mitglied des Raw-Typs {1}
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.call.mbr.of.raw.type=Nicht geprüfter Aufruf von {0} als Mitglied des Raw-Typs {1}
|
||||
|
||||
# lint: unchecked
|
||||
@ -1724,17 +1742,17 @@ compiler.warn.unchecked.cast.to.type=Nicht geprüftes Casting zu Typ {0}
|
||||
|
||||
# 0: kind name, 1: name, 2: object, 3: object, 4: kind name, 5: symbol
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.meth.invocation.applied=Nicht geprüfter Methodenaufruf: {0} {1} in {4} {5} wird auf die angegebenen Typen angewendet\nErforderlich: {2}\nErmittelt: {3}
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.generic.array.creation=Nicht geprüfte Erstellung eines generischen Arrays für varargs-Parameter des Typs {0}
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.varargs.non.reifiable.type=Möglich Heap-Beschädigung aus parametrisiertem vararg-Typ {0}
|
||||
|
||||
# 0: symbol
|
||||
@ -1772,6 +1790,10 @@ compiler.err.no.zipfs.for.archive=Kein Dateisystemprovider zur Verarbeitung dies
|
||||
# lint: divzero
|
||||
compiler.warn.div.zero=Division durch Null
|
||||
|
||||
# 0: type, 1: long, 2: number
|
||||
# lint: lossy-conversions
|
||||
compiler.warn.bit.shift.out.of.range=Das Verschieben von {0} um {1} Bit entspricht einer Verschiebung um {2} Bit
|
||||
|
||||
# lint: empty
|
||||
compiler.warn.empty.if=Leere Anweisung nach "if"
|
||||
|
||||
@ -2023,7 +2045,7 @@ compiler.misc.prob.found.req=Inkompatible Typen: {0}
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.prob.found.req={0}\nErforderlich: {2}\nErmittelt: {1}
|
||||
|
||||
# 0: type, 1: type
|
||||
@ -2297,12 +2319,12 @@ compiler.err.override.incompatible.ret={0}\nRückgabetyp {1} ist nicht mit {2} k
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.ret={0}\nRückgabetyp erfordert eine nicht geprüfte Konvertierung von {1} in {2}
|
||||
|
||||
# 0: message segment, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.thrown={0}\nAußer Kraft gesetzte Methode löst nicht {1} aus
|
||||
|
||||
# 0: symbol
|
||||
@ -2377,16 +2399,17 @@ compiler.err.preview.feature.disabled.classfile=Klassendatei für {0} verwendet
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use={0} ist ein Vorschaufeature, das in einem zukünftigen Release entfernt werden kann.
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use.plural={0} sind ein Vorschaufeature, das in einem zukünftigen Release entfernt werden kann.
|
||||
|
||||
# 0: file object (classfile), 1: string (expected version)
|
||||
# lint: preview
|
||||
# flags: mandatory
|
||||
compiler.warn.preview.feature.use.classfile=Klassendatei für {0} verwendet Vorschaufeatures von Java SE {1}.
|
||||
|
||||
compiler.misc.feature.modules=Module
|
||||
@ -2783,6 +2806,7 @@ compiler.err.bad.name.for.option=Ungültiger Name im Wert für {0}-Option: "{1}"
|
||||
|
||||
# 0: option name, 1: symbol
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.module.for.option.not.found=Modulname in {0}-Option nicht gefunden: {1}
|
||||
|
||||
compiler.err.addmods.all.module.path.invalid=--add-modules ALL-MODULE-PATH kann nur beim Kompilieren des unbenannten Moduls oder beim Kompilieren im Kontext eines automatischen Moduls verwendet werden
|
||||
@ -2794,6 +2818,7 @@ compiler.err.add.exports.with.release=Export eines Packages aus Systemmodul {0}
|
||||
compiler.err.add.reads.with.release=Hinzufügen von Lese-Edges für Systemmodul {0} ist mit --release nicht zulässig
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.addopens.ignored=--add-opens hat zur Kompilierungszeit keine Auswirkungen
|
||||
|
||||
compiler.misc.locn.module_source_path=Modulquellpfad
|
||||
@ -3060,7 +3085,7 @@ compiler.err.incorrect.number.of.nested.patterns=Falsche Anzahl verschachtelter
|
||||
|
||||
# 0: kind name, 1: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.declared.using.preview={0} {1} ist mit einem Vorschaufeature deklariert, das in einem zukünftigen Release entfernt werden kann.
|
||||
|
||||
# lint: identity
|
||||
|
||||
@ -292,10 +292,10 @@ compiler.err.annotation.decl.not.allowed.here=ここでは注釈インタフェ
|
||||
compiler.err.cant.inherit.from.final=final {0}からは継承できません
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.ref.before.ctor.called=スーパータイプのコンストラクタの呼出し前は{0}を参照できません
|
||||
compiler.err.cant.ref.before.ctor.called={0}への参照は、明示的なコンストラクタの呼出しの後にのみ表示されます
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=スーパータイプのコンストラクタの呼出し前は、初期化されたフィールド''{0}''を割り当てられません
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=初期化されたフィールド''{0}''への割当ては、明示的なコンストラクタの呼出しの後にのみ表示されます
|
||||
|
||||
compiler.err.cant.select.static.class.from.param.type=パラメータにされた型からstaticクラスを選択することはできません
|
||||
|
||||
@ -649,11 +649,14 @@ compiler.err.limit.string.overflow=文字列"{0}..."のUTF8表現が、定数プ
|
||||
|
||||
compiler.err.malformed.fp.lit=浮動小数点リテラルが不正です
|
||||
|
||||
compiler.err.method.does.not.override.superclass=メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.method.does.not.override.superclass={1}の{0}はスーパータイプのメソッドをオーバーライドまたは実装しません
|
||||
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override=staticメソッドは@Overrideで注釈付けすることはできません
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override={1}のstaticメソッド{0}は@Overrideで注釈付けすることはできません
|
||||
|
||||
compiler.err.missing.meth.body.or.decl.abstract=メソッド本体がないか、abstractとして宣言されています
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.missing.meth.body.or.decl.abstract={1}のメソッド{0}にメソッド本体がないか、abstractを宣言する必要があります
|
||||
|
||||
compiler.err.missing.ret.stmt=return文が指定されていません
|
||||
|
||||
@ -1139,6 +1142,7 @@ compiler.err.multi-module.outdir.cannot.be.exploded.module=複数モジュール
|
||||
|
||||
# 0: path
|
||||
# lint: path
|
||||
# flags: default-enabled
|
||||
compiler.warn.outdir.is.in.exploded.module=出力ディレクトリは展開したモジュール内です: {0}
|
||||
|
||||
# 0: file object
|
||||
@ -1198,6 +1202,7 @@ compiler.warn.output.file.clash=出力ファイルへの書込みが複数回あ
|
||||
## The following string will appear before all messages keyed as:
|
||||
## "compiler.note".
|
||||
|
||||
# flags: mandatory
|
||||
compiler.note.compressed.diags=一部のメッセージは簡略化されています。-Xdiags:verboseで再コンパイルして完全な出力を取得してください
|
||||
|
||||
# 0: boolean, 1: symbol
|
||||
@ -1378,17 +1383,17 @@ compiler.warn.incubating.modules=実験的なモジュールを使用してい
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated={1}の{0}は推奨されません
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal={1}の{0}は推奨されておらず、削除用にマークされています
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview={0}はプレビューAPIであり、今後のリリースで削除される可能性があります。
|
||||
|
||||
# 0: symbol
|
||||
@ -1396,7 +1401,7 @@ compiler.err.is.preview={0}はプレビューAPIであり、デフォルトで
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview.reflective={0}はリフレクティブ・プレビューAPIであり、今後のリリースで削除される可能性があります。
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
@ -1405,12 +1410,12 @@ compiler.warn.restricted.method={0}.{1}は制限されたメソッドです。\n
|
||||
|
||||
# 0: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.module=モジュール{0}は推奨されません
|
||||
|
||||
# 0: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal.module=モジュール{0}は推奨されておらず、削除用にマークされています
|
||||
|
||||
# 0: symbol
|
||||
@ -1583,10 +1588,12 @@ compiler.warn.static.not.qualified.by.type2=static {0}を匿名クラスのメ
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.bootclasspath=ブートストラップ・クラス・パスが-source {0}と一緒に設定されていません\n{1}
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.system.modules.path=システム・モジュールの場所が-source {0}と一緒に設定されていません\n{1}
|
||||
|
||||
# 0: string
|
||||
@ -1603,10 +1610,12 @@ compiler.misc.source.no.system.modules.path.with.target=システム・モジュ
|
||||
|
||||
# 0: string
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.source=ソース値{0}は廃止されていて、今後のリリースで削除される予定です
|
||||
|
||||
# 0: target
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.target=ターゲット値{0}は廃止されていて、今後のリリースで削除される予定です
|
||||
|
||||
# 0: string, 1: string
|
||||
@ -1616,12 +1625,17 @@ compiler.err.option.removed.source=ソース・オプション{0}は現在サポ
|
||||
compiler.err.option.removed.target=ターゲット・オプション{0}は現在サポートされていません。{1}以降を使用してください。
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.suppression=廃止されたオプションについての警告を表示しないようにするには、-Xlint:オプションを使用します。
|
||||
|
||||
# 0: name, 1: number, 2: number, 3: number, 4: number
|
||||
# lint: classfile
|
||||
compiler.warn.future.attr=バージョン{1}.{2}のクラス・ファイルで導入された{0}属性は、バージョン{3}.{4}のクラス・ファイルでは無視されます
|
||||
|
||||
# 0: symbol, 1: file object
|
||||
# lint: classfile
|
||||
compiler.warn.inconsistent.inner.classes={1}の{0}のInnerClasses属性はソース・コードと一貫性がありません\n({1}は{0}で再コンパイルする必要がある場合があります)
|
||||
|
||||
# lint: requires-automatic
|
||||
compiler.warn.requires.automatic=自動モジュールにはディレクティブが必要です
|
||||
|
||||
@ -1706,17 +1720,21 @@ compiler.warn.try.resource.not.referenced=自動クローズ可能なリソー
|
||||
# lint: try
|
||||
compiler.warn.try.resource.throws.interrupted.exc=自動クローズ可能なリソース{0}に、InterruptedExceptionをスローする可能性があるメンバー・メソッドclose()があります
|
||||
|
||||
# 0: type
|
||||
# lint: try
|
||||
compiler.warn.try.resource.can.throw.interrupted.exc=close()メソッドは、自動クローズ可能なクラス{0}でInterruptedExceptionをスローできます
|
||||
|
||||
# lint: unchecked
|
||||
compiler.warn.unchecked.assign={0}から{1}への無検査代入です
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.assign.to.var=raw型{1}のメンバーとして変数{0}への無検査代入です
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.call.mbr.of.raw.type=raw型{1}のメンバーとしての{0}への無検査呼出しです
|
||||
|
||||
# lint: unchecked
|
||||
@ -1724,17 +1742,17 @@ compiler.warn.unchecked.cast.to.type=型{0}への無検査キャストです
|
||||
|
||||
# 0: kind name, 1: name, 2: object, 3: object, 4: kind name, 5: symbol
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.meth.invocation.applied=無検査メソッド呼出し: {4} {5}の{0} {1}は指定された型に適用されます\n期待値: {2}\n検出値: {3}
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.generic.array.creation=型{0}の可変引数パラメータに対する総称型配列の無検査作成です
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.varargs.non.reifiable.type=パラメータ化された可変引数型{0}からのヒープ汚染の可能性があります
|
||||
|
||||
# 0: symbol
|
||||
@ -1772,6 +1790,10 @@ compiler.err.no.zipfs.for.archive=このファイルの処理に使用できる
|
||||
# lint: divzero
|
||||
compiler.warn.div.zero=ゼロで除算
|
||||
|
||||
# 0: type, 1: long, 2: number
|
||||
# lint: lossy-conversions
|
||||
compiler.warn.bit.shift.out.of.range={0}を{1}ビットでシフトすることは、{2}ビットでシフトすることと同等です
|
||||
|
||||
# lint: empty
|
||||
compiler.warn.empty.if=if以降が空の文です
|
||||
|
||||
@ -2023,7 +2045,7 @@ compiler.misc.prob.found.req=不適合な型: {0}
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.prob.found.req={0}\n期待値: {2}\n検出値: {1}
|
||||
|
||||
# 0: type, 1: type
|
||||
@ -2297,12 +2319,12 @@ compiler.err.override.incompatible.ret={0}\n戻り値の型{1}は{2}と互換性
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.ret={0}\n戻り値の型は{1}から{2}への無検査変換が必要です
|
||||
|
||||
# 0: message segment, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.thrown={0}\nオーバーライドされたメソッドは{1}をスローしません
|
||||
|
||||
# 0: symbol
|
||||
@ -2377,16 +2399,17 @@ compiler.err.preview.feature.disabled.classfile={0}のクラス・ファイル
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use={0}はプレビュー機能であり、今後のリリースで削除される可能性があります。
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use.plural={0}はプレビュー機能であり、今後のリリースで削除される可能性があります。
|
||||
|
||||
# 0: file object (classfile), 1: string (expected version)
|
||||
# lint: preview
|
||||
# flags: mandatory
|
||||
compiler.warn.preview.feature.use.classfile={0}のクラス・ファイルはJava SE {1}のプレビュー機能を使用します。
|
||||
|
||||
compiler.misc.feature.modules=モジュール
|
||||
@ -2783,6 +2806,7 @@ compiler.err.bad.name.for.option={0}オプションの値に含まれる名前
|
||||
|
||||
# 0: option name, 1: symbol
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.module.for.option.not.found={0}オプション内にモジュール名が見つかりません: {1}
|
||||
|
||||
compiler.err.addmods.all.module.path.invalid=--add-modules ALL-MODULE-PATHは、名前のないモジュールのコンパイル時または自動モジュールのコンテキストでのコンパイル時のみ使用できます
|
||||
@ -2794,6 +2818,7 @@ compiler.err.add.exports.with.release=システム・モジュール{0}からの
|
||||
compiler.err.add.reads.with.release=システム・モジュール{0}の読取りエッジの追加は--releaseを指定して実行できません
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.addopens.ignored=--add-opensは、コンパイル時には無効です
|
||||
|
||||
compiler.misc.locn.module_source_path=モジュール・ソース・パス
|
||||
@ -3060,7 +3085,7 @@ compiler.err.incorrect.number.of.nested.patterns=ネスト・パターンの数
|
||||
|
||||
# 0: kind name, 1: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.declared.using.preview={0} {1}はプレビュー機能を使用して宣言されており、今後のリリースで削除される可能性があります。
|
||||
|
||||
# lint: identity
|
||||
|
||||
@ -292,10 +292,10 @@ compiler.err.annotation.decl.not.allowed.here=此处不允许批注接口声明
|
||||
compiler.err.cant.inherit.from.final=无法从最终{0}进行继承
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.ref.before.ctor.called=无法在调用超类型构造器之前引用{0}
|
||||
compiler.err.cant.ref.before.ctor.called=对 {0} 的引用只能在显式调用构造器后显示
|
||||
|
||||
# 0: symbol or name
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=无法在调用超类型构造器之前分配初始化字段 ''{0}''
|
||||
compiler.err.cant.assign.initialized.before.ctor.called=对初始化字段 ''{0}'' 的分配只能在显式调用构造器后显示
|
||||
|
||||
compiler.err.cant.select.static.class.from.param.type=无法从参数化的类型中选择静态类
|
||||
|
||||
@ -649,11 +649,14 @@ compiler.err.limit.string.overflow=对于常量池来说, 字符串 "{0}..." 的
|
||||
|
||||
compiler.err.malformed.fp.lit=浮点文字的格式错误
|
||||
|
||||
compiler.err.method.does.not.override.superclass=方法不会覆盖或实现超类型的方法
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.method.does.not.override.superclass={1} 中的 {0} 不会覆盖或实现超类型中的方法
|
||||
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override=不能使用 @Override 对静态方法进行批注
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.static.methods.cannot.be.annotated.with.override=不能使用 @Override 对 {1} 中的静态方法 {0} 进行批注
|
||||
|
||||
compiler.err.missing.meth.body.or.decl.abstract=缺少方法主体, 或声明抽象
|
||||
# 0: symbol, 1: symbol
|
||||
compiler.err.missing.meth.body.or.decl.abstract={1} 中的方法 {0} 缺少方法主体,或者应声明为抽象方法
|
||||
|
||||
compiler.err.missing.ret.stmt=缺少返回语句
|
||||
|
||||
@ -1139,6 +1142,7 @@ compiler.err.multi-module.outdir.cannot.be.exploded.module=在多模块模式下
|
||||
|
||||
# 0: path
|
||||
# lint: path
|
||||
# flags: default-enabled
|
||||
compiler.warn.outdir.is.in.exploded.module=输出目录位于展开的模块中: {0}
|
||||
|
||||
# 0: file object
|
||||
@ -1198,6 +1202,7 @@ compiler.warn.output.file.clash=多次写入输出文件:{0}
|
||||
## The following string will appear before all messages keyed as:
|
||||
## "compiler.note".
|
||||
|
||||
# flags: mandatory
|
||||
compiler.note.compressed.diags=某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
|
||||
|
||||
# 0: boolean, 1: symbol
|
||||
@ -1378,17 +1383,17 @@ compiler.warn.incubating.modules=使用 incubating 模块: {0}
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated={1}中的{0}已过时
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal={1} 中的 {0} 已过时, 且标记为待删除
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview={0} 是预览 API,可能会在未来发行版中删除。
|
||||
|
||||
# 0: symbol
|
||||
@ -1396,7 +1401,7 @@ compiler.err.is.preview={0} 是预览 API,默认情况下处于禁用状态。
|
||||
|
||||
# 0: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.is.preview.reflective={0} 是反射预览 API,可能会在未来发行版中删除。
|
||||
|
||||
# 0: symbol, 1: symbol
|
||||
@ -1405,12 +1410,12 @@ compiler.warn.restricted.method={0}.{1} 是受限制的方法。\n(受限制
|
||||
|
||||
# 0: symbol
|
||||
# lint: deprecation
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.module=模块 {0} 已过时
|
||||
|
||||
# 0: symbol
|
||||
# lint: removal
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.has.been.deprecated.for.removal.module=模块 {0} 已过时, 且标记为待删除
|
||||
|
||||
# 0: symbol
|
||||
@ -1583,10 +1588,12 @@ compiler.warn.static.not.qualified.by.type2=static {0} 不应用作匿名类的
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.bootclasspath=未与 -source {0} 一起设置引导类路径\n{1}
|
||||
|
||||
# 0: string, 1: fragment
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.source.no.system.modules.path=未与 -source {0} 一起设置系统模块的位置\n{1}
|
||||
|
||||
# 0: string
|
||||
@ -1603,10 +1610,12 @@ compiler.misc.source.no.system.modules.path.with.target=不设置系统模块的
|
||||
|
||||
# 0: string
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.source=源值 {0} 已过时,将在未来发行版中删除
|
||||
|
||||
# 0: target
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.target=目标值 {0} 已过时,将在未来发行版中删除
|
||||
|
||||
# 0: string, 1: string
|
||||
@ -1616,12 +1625,17 @@ compiler.err.option.removed.source=不再支持源选项 {0}。请使用 {1} 或
|
||||
compiler.err.option.removed.target=不再支持目标选项 {0}。请使用 {1} 或更高版本。
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.option.obsolete.suppression=要隐藏有关已过时选项的警告, 请使用 -Xlint:-options。
|
||||
|
||||
# 0: name, 1: number, 2: number, 3: number, 4: number
|
||||
# lint: classfile
|
||||
compiler.warn.future.attr={1}.{2} 版类文件中引入的 {0} 属性在 {3}.{4} 版类文件中被忽略
|
||||
|
||||
# 0: symbol, 1: file object
|
||||
# lint: classfile
|
||||
compiler.warn.inconsistent.inner.classes={1} 中 {0} 的 InnerClasses 属性与源代码不一致\n(可能需要使用 {0} 重新编译 {1})
|
||||
|
||||
# lint: requires-automatic
|
||||
compiler.warn.requires.automatic=需要自动模块的指令
|
||||
|
||||
@ -1706,17 +1720,21 @@ compiler.warn.try.resource.not.referenced=不能在相应的 try 语句的正文
|
||||
# lint: try
|
||||
compiler.warn.try.resource.throws.interrupted.exc=可自动关闭的资源{0}包含的成员方法 close() 可能抛出 InterruptedException
|
||||
|
||||
# 0: type
|
||||
# lint: try
|
||||
compiler.warn.try.resource.can.throw.interrupted.exc=在可自动关闭的类 {0} 中,close() 方法可能抛出 InterruptedException
|
||||
|
||||
# lint: unchecked
|
||||
compiler.warn.unchecked.assign=未经检查的分配: 将{0}分配给{1}
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.assign.to.var=对作为原始类型{1}的成员的变量{0}的分配未经过检查
|
||||
|
||||
# 0: symbol, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.call.mbr.of.raw.type=对作为原始类型{1}的成员的{0}的调用未经过检查
|
||||
|
||||
# lint: unchecked
|
||||
@ -1724,17 +1742,17 @@ compiler.warn.unchecked.cast.to.type=向类型{0}的转换未经过检查
|
||||
|
||||
# 0: kind name, 1: name, 2: object, 3: object, 4: kind name, 5: symbol
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.meth.invocation.applied=方法调用未经过检查: 将{4} {5}中的{0} {1}应用到给定的类型\n需要: {2}\n找到: {3}
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.generic.array.creation=对于类型为{0}的 varargs 参数, 泛型数组创建未经过检查
|
||||
|
||||
# 0: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.unchecked.varargs.non.reifiable.type=参数化 vararg 类型{0}的堆可能已受污染
|
||||
|
||||
# 0: symbol
|
||||
@ -1772,6 +1790,10 @@ compiler.err.no.zipfs.for.archive=没有任何文件系统提供方可处理此
|
||||
# lint: divzero
|
||||
compiler.warn.div.zero=除数为零
|
||||
|
||||
# 0: type, 1: long, 2: number
|
||||
# lint: lossy-conversions
|
||||
compiler.warn.bit.shift.out.of.range=按 {1} 位移动 {0} 相当于按 {2} 位移动
|
||||
|
||||
# lint: empty
|
||||
compiler.warn.empty.if=if 之后没有语句
|
||||
|
||||
@ -2023,7 +2045,7 @@ compiler.misc.prob.found.req=不兼容的类型: {0}
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.prob.found.req={0}\n需要: {2}\n找到: {1}
|
||||
|
||||
# 0: type, 1: type
|
||||
@ -2297,12 +2319,12 @@ compiler.err.override.incompatible.ret={0}\n返回类型{1}与{2}不兼容
|
||||
|
||||
# 0: message segment, 1: type, 2: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.ret={0}\n返回类型需要从{1}到{2}的未经检查的转换
|
||||
|
||||
# 0: message segment, 1: type
|
||||
# lint: unchecked
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.override.unchecked.thrown={0}\n被覆盖的方法未抛出{1}
|
||||
|
||||
# 0: symbol
|
||||
@ -2377,16 +2399,17 @@ compiler.err.preview.feature.disabled.classfile={0} 的类文件使用 Java SE {
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use={0} 是预览功能,可能会在未来发行版中删除。
|
||||
|
||||
# 0: message segment (feature)
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.preview.feature.use.plural={0} 是预览功能,可能会在未来发行版中删除。
|
||||
|
||||
# 0: file object (classfile), 1: string (expected version)
|
||||
# lint: preview
|
||||
# flags: mandatory
|
||||
compiler.warn.preview.feature.use.classfile={0} 的类文件使用 Java SE {1} 的预览功能。
|
||||
|
||||
compiler.misc.feature.modules=模块
|
||||
@ -2783,6 +2806,7 @@ compiler.err.bad.name.for.option={0} 选项的值中有错误的名称: ''{1}''
|
||||
|
||||
# 0: option name, 1: symbol
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.module.for.option.not.found=找不到 {0} 选项中的模块名称: {1}
|
||||
|
||||
compiler.err.addmods.all.module.path.invalid=--add-modules ALL-MODULE-PATH 只能在编译未命名模块或在自动模块的上下文中编译时使用
|
||||
@ -2794,6 +2818,7 @@ compiler.err.add.exports.with.release=不允许在使用 --release 时从系统
|
||||
compiler.err.add.reads.with.release=不允许在使用 --release 时为系统模块 {0} 添加读取维边:
|
||||
|
||||
# lint: options
|
||||
# flags: default-enabled
|
||||
compiler.warn.addopens.ignored=--add-opens 在编译时没有任何效果
|
||||
|
||||
compiler.misc.locn.module_source_path=模块源路径
|
||||
@ -3060,7 +3085,7 @@ compiler.err.incorrect.number.of.nested.patterns=嵌套模式数不正确\n需
|
||||
|
||||
# 0: kind name, 1: symbol
|
||||
# lint: preview
|
||||
# flags: aggregate
|
||||
# flags: aggregate, mandatory, default-enabled
|
||||
compiler.warn.declared.using.preview={0} {1} 是使用预览功能声明的,可能会在未来发行版中删除。
|
||||
|
||||
# lint: identity
|
||||
|
||||
@ -60,6 +60,8 @@ javac.opt.target=Generiert Klassendateien, die sich für das angegebene Java SE-
|
||||
javac.opt.release=Kompiliert für das angegebene Java SE-Release.\nUnterstützte Releases: \n {0}
|
||||
javac.opt.source=Liefert Quellkompatibilität mit dem angegebenen Release von Java SE.\nUnterstützte Releases: \n {0}
|
||||
javac.opt.Werror=Kompilierung beenden, wenn Warnungen auftreten
|
||||
javac.opt.arg.Werror=<Schlüssel>(,<Schlüssel>)*
|
||||
javac.opt.Werror.custom=Geben Sie Lint-Kategorien, für die die Kompilierung durch Warnungen beendet werden soll,\ndurch Komma getrennt an. \nStellen Sie einem Schlüssel "-" voran, um die angegebene Kategorie auszuschließen. Verwenden Sie --help-lint, um die unterstützten Schlüssel anzuzeigen.
|
||||
javac.opt.A=Optionen zur Übergabe an die Annotationsprozessoren
|
||||
javac.opt.implicit=Gibt an, ob Klassendateien für implizit referenzierte Dateien generiert werden
|
||||
javac.opt.pkginfo=Gibt an, wie package-info-Dateien behandelt werden sollen
|
||||
@ -97,12 +99,12 @@ javac.opt.arg.pathname=<Pfadname>
|
||||
javac.opt.arg.file=<Dateiname>
|
||||
javac.opt.Xbootclasspath.p=Dem Bootstrap Classpath voranstellen
|
||||
javac.opt.Xbootclasspath.a=An Bootstrap Classpath anhängen
|
||||
javac.opt.Xlint=Empfohlene Warnungskategorien aktivieren
|
||||
javac.opt.Xlint.all=Alle Warnungskategorien aktivieren
|
||||
javac.opt.Xlint.none=Alle Warnungskategorien deaktivieren
|
||||
javac.opt.Xlint=Aktivieren Sie empfohlene Lint-Warnungskategorien. In diesem Release werden alle\nverfügbaren Lint-Warnungskategorien empfohlen.
|
||||
javac.opt.Xlint.all=Alle Lint-Warnungskategorien aktivieren
|
||||
javac.opt.Xlint.none=Alle Lint-Warnungskategorien deaktivieren
|
||||
#L10N: do not localize: -Xlint
|
||||
javac.opt.arg.Xlint=<Schlüssel>(,<Schlüssel>)*
|
||||
javac.opt.Xlint.custom=Durch Komma getrennte Warnungskategorien, die aktiviert oder deaktiviert werden sollen.\nStellen Sie einem Schlüssel "-" voran, um die angegebene Warnung zu deaktivieren.\nVerwenden Sie "--help-lint", um die unterstützten Schlüssel anzuzeigen.
|
||||
javac.opt.Xlint.custom=Lint-Warnungskategorien, die aktiviert oder deaktiviert werden sollen, durch Komma getrennt. \nStellen Sie einem Schlüssel "-" voran, um die angegebene Kategorie zu deaktivieren. Verwenden Sie\n''--help-lint'', um unterstützte Schlüssel und die standardmäßig aktivierten\nKategorien anzuzeigen.
|
||||
javac.opt.Xlint.desc.auxiliaryclass=Warnt vor Auxiliary-Klassen, die in einer Quelldatei verborgen sind und aus anderen Dateien heraus verwendet werden.
|
||||
|
||||
javac.opt.Xlint.desc.cast=Warnt vor unnötigen Umwandlungen mit Cast.
|
||||
@ -129,7 +131,7 @@ javac.opt.Xlint.desc.finally=Warnt vor Finally-Klauseln, die nicht normal beende
|
||||
|
||||
javac.opt.Xlint.desc.incubating=Warnt vor der Verwendung von Inkubatormodulen.
|
||||
|
||||
javac.opt.Xlint.desc.lossy-conversions=Warnung über möglichen Verlust von Konvertierungen in zusammengesetzten Zuweisungen.
|
||||
javac.opt.Xlint.desc.lossy-conversions=Warnung über möglichen Verlust von Konvertierungen in zusammengesetzten Zuweisungen und Bitverschiebungsvorgängen.
|
||||
|
||||
javac.opt.Xlint.desc.module=Warnt vor Problemen im Zusammenhang mit dem Modulsystem.
|
||||
|
||||
@ -175,11 +177,10 @@ javac.opt.Xlint.desc.preview=Warnt vor Verwendung von Vorschausprachfeatures.
|
||||
|
||||
javac.opt.Xlint.desc.restricted=Warnt vor der Verwendung eingeschränkter Methoden.
|
||||
|
||||
# L10N: do not localize: identity synchronization
|
||||
javac.opt.Xlint.desc.synchronization=Warnt vor Synchronisierungsversuchen mit Instanzen wertbasierter Klassen.\n Dieser Schlüssel ist ein veralteter Alias für die Kategorie "identity", die dieselben Verwendungen und\n Effekte hat. Benutzern wird empfohlen, die Kategorie "identity" für alle zukünftigen\n und vorhandenen Verwendungen von "synchronization" zu verwenden.
|
||||
|
||||
javac.opt.Xlint.desc.identity=Warnt vor Verwendungen wertbasierter Klassen, wenn eine Identitätsklasse erwartet wird.
|
||||
|
||||
javac.opt.Xlint.alias.of=Veralteter Alias für "{0}" mit identischem Effekt. Benutzern wird empfohlen,\n "{0}" anstatt "{1}" für alle aktuellen und zukünftigen Verwendungen zu nutzen.
|
||||
|
||||
javac.opt.Xdoclint=Empfohlene Prüfungen für Probleme in javadoc-Kommentaren aktivieren
|
||||
# L10N: do not localize: all none
|
||||
javac.opt.Xdoclint.subopts = (all|none|[-]<Gruppe>)[/<Zugriff>]
|
||||
@ -195,14 +196,17 @@ javac.opt.Xdoclint.package.desc=Aktiviert oder deaktiviert Prüfungen in bestimm
|
||||
javac.opt.Xstdout=Leitet die Standardausgabe um
|
||||
javac.opt.X=Gibt Hilfe zu zusätzlichen Optionen aus
|
||||
javac.opt.help=Gibt diese Hilfemeldung aus
|
||||
javac.opt.help.lint=Gibt die unterstützten Schlüssel für -Xlint aus
|
||||
javac.opt.help.lint=Gibt die unterstützten Schlüssel für -Xlint und -Werror aus
|
||||
javac.opt.help.lint.header=Die unterstützten Schlüssel für -Xlint sind:
|
||||
javac.opt.help.lint.enabled.by.default=Die folgenden Lint-Warnungskategorien sind standardmäßig aktiviert:
|
||||
javac.opt.help.lint.footer=Kategorien und die zugehörigen Aliasnamen können austauschbar verwendet werden. Beispiel: Das Kennzeichen\n"-Xlint:{0},{1}" wäre redundant.
|
||||
javac.opt.print=Gibt eine Textdarstellung der angegebenen Typen aus
|
||||
javac.opt.printRounds=Gibt Informationen zu Durchläufen der Annotationsverarbeitung aus
|
||||
javac.opt.printProcessorInfo=Gibt Informationen dazu aus, welche Annotationen ein Prozessor\nverarbeiten soll
|
||||
javac.opt.userpathsfirst=Durchsucht classpath und sourcepath vor anstatt nach bootclasspath nach Klassen
|
||||
javac.opt.prefer=Gibt an, welche Datei gelesen werden soll, wenn sowohl eine Quell- als auch eine Klassendatei für eine implizit kompilierte Klasse gefunden werden
|
||||
javac.opt.preview=Aktiviert Vorschausprachfeatures.\nWird in Verbindung mit -source oder --release verwendet.
|
||||
# L10N: do not localize: ''preview''
|
||||
javac.opt.preview=Aktiviert Vorschausprachfeatures. \nDeaktiviert auch die Lint-Kategorie ''preview''. \nWird in Verbindung mit -source oder --release verwendet.
|
||||
javac.opt.AT=Liest Optionen und Dateinamen aus Datei
|
||||
javac.opt.diags=Wählt einen Diagnosemodus aus
|
||||
javac.opt.addExports=Gibt an, dass ein Package als aus seinem definierenden Modul in\nweitere Module oder, wenn <Anderes Modul> ALL-UNNAMED lautet, in alle unbenannten Module\nexportiert betrachtet werden soll.
|
||||
|
||||
@ -59,7 +59,9 @@ javac.opt.profile=使用されているAPIが、指定したプロファイル
|
||||
javac.opt.target=指定されたJava SEリリースに適したクラス・ファイルを生成します。サポートされているリリース: \n {0}
|
||||
javac.opt.release=指定されたJava SEリリースに対してコンパイルします。サポートされているリリース: \n {0}
|
||||
javac.opt.source=指定されたJava SEリリースとソースの互換性を保持します。サポートされているリリース: \n {0}
|
||||
javac.opt.Werror=警告が発生した場合にコンパイルを終了する
|
||||
javac.opt.Werror=警告が発生した場合にコンパイルを終了します
|
||||
javac.opt.arg.Werror=<key>(,<key>)*
|
||||
javac.opt.Werror.custom=コンパイルを終了する警告のlintカテゴリを\nコンマで区切って指定します。\n指定したカテゴリを除外するには、キーの前に''-''を指定します。\nサポートされているキーを表示するには--help-lintを使用します。
|
||||
javac.opt.A=注釈プロセッサに渡されるオプション
|
||||
javac.opt.implicit=暗黙的に参照されるファイルについてクラス・ファイルを生成するかどうかを指定する
|
||||
javac.opt.pkginfo=package-infoファイルの処理を指定する
|
||||
@ -97,12 +99,12 @@ javac.opt.arg.pathname=<pathname>
|
||||
javac.opt.arg.file=<filename>
|
||||
javac.opt.Xbootclasspath.p=ブートストラップ・クラス・パスの先頭に付加する
|
||||
javac.opt.Xbootclasspath.a=ブートストラップ・クラス・パスに追加する
|
||||
javac.opt.Xlint=推奨の警告カテゴリを有効にします
|
||||
javac.opt.Xlint.all=すべての警告カテゴリを有効にします
|
||||
javac.opt.Xlint.none=すべての警告カテゴリを無効にします
|
||||
javac.opt.Xlint=推奨lint警告カテゴリを有効にします。このリリースでは、\n使用可能なすべてのlint警告カテゴリが推奨されます。
|
||||
javac.opt.Xlint.all=すべてのlint警告カテゴリを有効にします
|
||||
javac.opt.Xlint.none=すべてのlint警告カテゴリを無効にします
|
||||
#L10N: do not localize: -Xlint
|
||||
javac.opt.arg.Xlint=<key>(,<key>)*
|
||||
javac.opt.Xlint.custom=有効または無効にする警告カテゴリ(カンマ区切り)。\n指定した警告を無効にするには、キーの前に''-''を指定します。\nサポートされているキーを表示するには--help-lintを使用します。
|
||||
javac.opt.Xlint.custom=有効または無効にするLint警告カテゴリ(カンマ区切り)。\n指定されたカテゴリを無効にするには、キーの前に''-''を指定します。サポートされているキーと\nデフォルトで有効になっているカテゴリを表示するには、\n''--help-lint''を使用します。
|
||||
javac.opt.Xlint.desc.auxiliaryclass=ソース・ファイルで非表示になっているが他のファイルから使用されている補助クラスについて警告します。
|
||||
|
||||
javac.opt.Xlint.desc.cast=不要なキャストの使用について警告します。
|
||||
@ -129,7 +131,7 @@ javac.opt.Xlint.desc.finally=正常に完了しないfinally節について警
|
||||
|
||||
javac.opt.Xlint.desc.incubating=実験的なモジュールの使用について警告します。
|
||||
|
||||
javac.opt.Xlint.desc.lossy-conversions=複合代入における精度が失われる可能性がある変換についての警告。
|
||||
javac.opt.Xlint.desc.lossy-conversions=複合代入およびビット・シフト操作における精度が失われている可能性がある変換についての警告。
|
||||
|
||||
javac.opt.Xlint.desc.module=モジュール・システム関連の問題について警告します。
|
||||
|
||||
@ -175,11 +177,10 @@ javac.opt.Xlint.desc.preview=プレビュー言語機能の使用について警
|
||||
|
||||
javac.opt.Xlint.desc.restricted=制限されたメソッドの使用について警告します。
|
||||
|
||||
# L10N: do not localize: identity synchronization
|
||||
javac.opt.Xlint.desc.synchronization=値ベース・クラスのインスタンスでの同期の試行について警告します。\n このキーは、''identity''の非推奨のエイリアスであり、同じ使用方法と効果を\n 持ちます。ユーザーには、今後および既存の''synchronization''の使用に対して''identity''カテゴリを\n 使用することをお薦めします。
|
||||
|
||||
javac.opt.Xlint.desc.identity=アイデンティティ・クラスが必要な場所での値ベース・クラスの使用について警告します。
|
||||
|
||||
javac.opt.Xlint.alias.of=同じ効果を持つ''{0}''の非推奨の別名。ユーザーは現在および将来のすべての使用で\n ''{1}''のかわりに''{0}''の使用が推奨されます。
|
||||
|
||||
javac.opt.Xdoclint=javadocコメントの問題に関する推奨チェックを有効にします
|
||||
# L10N: do not localize: all none
|
||||
javac.opt.Xdoclint.subopts = (all|none|[-]<group>)[/<access>]
|
||||
@ -195,14 +196,17 @@ javac.opt.Xdoclint.package.desc=特定のパッケージのチェックを有効
|
||||
javac.opt.Xstdout=標準出力をリダイレクトする
|
||||
javac.opt.X=追加オプションのヘルプを出力します
|
||||
javac.opt.help=このヘルプ・メッセージを出力します
|
||||
javac.opt.help.lint=-Xlintにサポートされているキーを出力します
|
||||
javac.opt.help.lint=-Xlintおよび-Werrorにサポートされているキーを出力します
|
||||
javac.opt.help.lint.header=-Xlintにサポートされているキーは次のとおりです:
|
||||
javac.opt.help.lint.enabled.by.default=次のlint警告カテゴリはデフォルトで有効になっています:
|
||||
javac.opt.help.lint.footer=カテゴリとその別名は同じ意味で使用できます。たとえば、フラグ\n''-Xlint:{0},{1}''は冗長です。
|
||||
javac.opt.print=指定した型のテキスト表示を出力する
|
||||
javac.opt.printRounds=注釈処理の往復についての情報を印刷する
|
||||
javac.opt.printProcessorInfo=プロセッサが処理を依頼される注釈についての情報を印刷する
|
||||
javac.opt.userpathsfirst=ブート・クラスパスの後ではなく、ブート・クラスパスの前にクラスのクラスパスおよびソース・パスを検索する
|
||||
javac.opt.prefer=暗黙的にコンパイルされるクラスについて、ソース・ファイルとクラス・ファイルの両方が見つかった際どちらを読み込むか指定する
|
||||
javac.opt.preview=プレビュー言語機能を有効にします。-sourceまたは--releaseとともに使用されます。
|
||||
# L10N: do not localize: ''preview''
|
||||
javac.opt.preview=プレビュー言語機能を有効にします。\nまた、''preview'' lintカテゴリも無効にします。\n-sourceまたは--releaseとともに使用されます。
|
||||
javac.opt.AT=ファイルからの読取りオプションおよびファイル名
|
||||
javac.opt.diags=診断モードの選択
|
||||
javac.opt.addExports=<other-module>がALL-UNNAMEDである場合、その定義モジュールから、追加モジュールまたは\n すべての名前のないモジュールにエクスポート済とみなされるようにパッケージを指定します。
|
||||
|
||||
@ -59,7 +59,9 @@ javac.opt.profile=检查使用的 API 在指定的配置文件中是否可用。
|
||||
javac.opt.target=生成适合指定的 Java SE 发行版的类文件。支持的发行版:{0}
|
||||
javac.opt.release=为指定的 Java SE 发行版编译。支持的发行版:{0}
|
||||
javac.opt.source=提供与指定的 Java SE 发行版的源兼容性。支持的发行版:{0}
|
||||
javac.opt.Werror=出现警告时终止编译
|
||||
javac.opt.Werror=出现任何警告时终止编译
|
||||
javac.opt.arg.Werror=<key>(,<key>)*
|
||||
javac.opt.Werror.custom=指定出现警告时应终止编译的 lint 类别,\n以逗号分隔。\n在关键字前面加上 ''-'' 可排除指定的类别。\n使用 --help-lint 可查看支持的关键字。
|
||||
javac.opt.A=传递给批注处理程序的选项
|
||||
javac.opt.implicit=指定是否为隐式引用文件生成类文件
|
||||
javac.opt.pkginfo=指定 package-info 文件的处理
|
||||
@ -97,12 +99,12 @@ javac.opt.arg.pathname=<pathname>
|
||||
javac.opt.arg.file=<filename>
|
||||
javac.opt.Xbootclasspath.p=置于引导类路径之前
|
||||
javac.opt.Xbootclasspath.a=置于引导类路径之后
|
||||
javac.opt.Xlint=启用建议的警告类别
|
||||
javac.opt.Xlint.all=启用所有警告类别
|
||||
javac.opt.Xlint.none=禁用所有警告类别
|
||||
javac.opt.Xlint=启用建议的 lint 警告类别。在此发行版中,\n建议使用所有可用的 lint 警告类别。
|
||||
javac.opt.Xlint.all=启用所有 lint 警告类别
|
||||
javac.opt.Xlint.none=禁用所有 lint 警告类别
|
||||
#L10N: do not localize: -Xlint
|
||||
javac.opt.arg.Xlint=<key>(,<key>)*
|
||||
javac.opt.Xlint.custom=要启用或禁用的警告类别(以逗号分隔)。\n在关键字前面加上 ''-'' 可禁用指定的警告。\n使用 --help-lint 可查看受支持的关键字。
|
||||
javac.opt.Xlint.custom=要启用或禁用的 lint 警告类别(以逗号分隔)。\n在关键字前面加上 ''-'' 可禁用指定的类别。\n使用 ''--help-lint'' 可显示支持的关键字和\n默认情况下启用的类别。
|
||||
javac.opt.Xlint.desc.auxiliaryclass=有关辅助类在源文件中隐藏, 但在其他文件中使用的警告。
|
||||
|
||||
javac.opt.Xlint.desc.cast=有关使用了不必要转换的警告。
|
||||
@ -129,7 +131,7 @@ javac.opt.Xlint.desc.finally=有关 finally 子句未正常终止的警告。
|
||||
|
||||
javac.opt.Xlint.desc.incubating=有关使用 incubating 模块的警告。
|
||||
|
||||
javac.opt.Xlint.desc.lossy-conversions=有关复合赋值中的转换可能会有损失的警告。
|
||||
javac.opt.Xlint.desc.lossy-conversions=有关复合赋值和移位操作中的转换可能会有损失的警告。
|
||||
|
||||
javac.opt.Xlint.desc.module=有关模块系统相关问题的警告。
|
||||
|
||||
@ -175,11 +177,10 @@ javac.opt.Xlint.desc.preview=有关使用预览语言功能的警告。
|
||||
|
||||
javac.opt.Xlint.desc.restricted=有关使用受限制方法的警告。
|
||||
|
||||
# L10N: do not localize: identity synchronization
|
||||
javac.opt.Xlint.desc.synchronization=有关尝试在基于值的类的实例上同步的警告。\n 此密钥是 ''identity'' 的已过时别名,具有相同的用法和\n 效果。建议用户在 ''synchronization'' 的所有未来和现有\n 用法中使用 ''identity'' 类别。
|
||||
|
||||
javac.opt.Xlint.desc.identity=有关在需要身份类的情况下使用基于值的类的警告。
|
||||
|
||||
javac.opt.Xlint.alias.of=具有相同效果的 ''{0}'' 的别名已过时。建议用户当前和将来\n 都使用 ''{0}'' 而不是 ''{1}''。
|
||||
|
||||
javac.opt.Xdoclint=为 javadoc 注释中的问题启用建议的检查
|
||||
# L10N: do not localize: all none
|
||||
javac.opt.Xdoclint.subopts = (all|none|[-]<group>)[/<access>]
|
||||
@ -195,14 +196,17 @@ javac.opt.Xdoclint.package.desc=在特定的程序包中启用或禁用检查。
|
||||
javac.opt.Xstdout=重定向标准输出
|
||||
javac.opt.X=输出额外选项的帮助
|
||||
javac.opt.help=输出此帮助消息
|
||||
javac.opt.help.lint=输出 -Xlint 支持的关键字
|
||||
javac.opt.help.lint=输出 -Xlint 和 -Werror 支持的关键字
|
||||
javac.opt.help.lint.header=-Xlint 支持的关键字包括:
|
||||
javac.opt.help.lint.enabled.by.default=默认情况下会启用以下 lint 警告类别:
|
||||
javac.opt.help.lint.footer=类别及其别名可以互换使用;例如,标记\n''-Xlint:{0},{1}'' 将是冗余的。
|
||||
javac.opt.print=输出指定类型的文本表示
|
||||
javac.opt.printRounds=输出有关批注处理循环的信息
|
||||
javac.opt.printProcessorInfo=输出有关请求处理程序处理哪些批注的信息
|
||||
javac.opt.userpathsfirst=在引导类路径之前而不是之后搜索类的类路径和源路径
|
||||
javac.opt.prefer=指定读取文件, 当同时找到隐式编译类的源文件和类文件时
|
||||
javac.opt.preview=启用预览语言功能。要与 -source 或 --release 一起使用。
|
||||
# L10N: do not localize: ''preview''
|
||||
javac.opt.preview=启用预览语言功能。\n还禁用''preview''lint 类别。\n要与 -source 或 --release 一起使用。
|
||||
javac.opt.AT=从文件读取选项和文件名
|
||||
javac.opt.diags=选择诊断模式
|
||||
javac.opt.addExports=指定被视为已从其定义模块导出到其他模块或者导出到所有\n 未命名模块 (如果 <other-module> 为 ALL-UNNAMED) 的程序包。
|
||||
|
||||
@ -111,6 +111,9 @@ launcher.err.cant.access.main.method=kein Zugriff auf Methode "main" in Klasse:
|
||||
# 0: string
|
||||
launcher.err.cant.find.constructor=No-Argument-Konstruktor nicht gefunden in Klasse: {0}
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.use.private.constructor=Kein nicht privater Null-Argument-Konstruktor in Klasse {0} gefunden\nEntfernen Sie die Eigenschaft "private" aus dem vorhandenen Konstruktor, oder definieren Sie ihn als:\n public {0}()
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.access.constructor=Kein Zugriff auf No-Argument-Konstruktor in Klasse: {0}
|
||||
|
||||
|
||||
@ -111,6 +111,9 @@ launcher.err.cant.access.main.method=クラスのメイン・メソッドにア
|
||||
# 0: string
|
||||
launcher.err.cant.find.constructor=クラスに引数なしのコンストラクタが見つかりません: {0}
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.use.private.constructor=非privateのゼロ引数コンストラクタがクラス{0}に見つかりません\n既存のコンストラクタからprivateを削除するか、次のように定義してください:\n public {0}()
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.access.constructor=クラスの引数なしのコンストラクタにアクセスできません: {0}
|
||||
|
||||
|
||||
@ -111,6 +111,9 @@ launcher.err.cant.access.main.method=无法访问类 {0} 中的 main 方法
|
||||
# 0: string
|
||||
launcher.err.cant.find.constructor=在类 {0} 中找不到无参数构造器
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.use.private.constructor=在类 {0} 中未找到 non-private 零参数构造器\n请从现有构造器中删除 private,或者定义为:\n public {0}()
|
||||
|
||||
# 0: string
|
||||
launcher.err.cant.access.constructor=无法访问类 {0} 中的无参数构造器
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -86,18 +86,22 @@ class BsdCDebugger implements CDebugger {
|
||||
String cpu = dbg.getCPU();
|
||||
if (cpu.equals("amd64") || cpu.equals("x86_64")) {
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
|
||||
Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
|
||||
if (rsp == null) return null;
|
||||
Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP);
|
||||
if (rbp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
|
||||
if (pc == null) return null;
|
||||
return new BsdAMD64CFrame(dbg, rbp, pc);
|
||||
return new BsdAMD64CFrame(dbg, rsp, rbp, pc);
|
||||
} else if (cpu.equals("aarch64")) {
|
||||
AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
|
||||
Address sp = context.getRegisterAsAddress(AARCH64ThreadContext.SP);
|
||||
if (sp == null) return null;
|
||||
Address fp = context.getRegisterAsAddress(AARCH64ThreadContext.FP);
|
||||
if (fp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(AARCH64ThreadContext.PC);
|
||||
if (pc == null) return null;
|
||||
return new BsdAARCH64CFrame(dbg, fp, pc);
|
||||
return new BsdAARCH64CFrame(dbg, sp, fp, pc);
|
||||
} else {
|
||||
throw new DebuggerException(cpu + " is not yet supported");
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, Red Hat Inc.
|
||||
* Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@ -26,15 +26,19 @@
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd.aarch64;
|
||||
|
||||
import sun.jvm.hotspot.code.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.runtime.aarch64.*;
|
||||
|
||||
public final class BsdAARCH64CFrame extends BasicCFrame {
|
||||
public BsdAARCH64CFrame(BsdDebugger dbg, Address fp, Address pc) {
|
||||
public BsdAARCH64CFrame(BsdDebugger dbg, Address sp, Address fp, Address pc) {
|
||||
super(dbg.getCDebugger());
|
||||
this.sp = sp;
|
||||
this.fp = fp;
|
||||
this.pc = pc;
|
||||
this.dbg = dbg;
|
||||
@ -54,28 +58,65 @@ public final class BsdAARCH64CFrame extends BasicCFrame {
|
||||
return fp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CFrame sender(ThreadProxy thread) {
|
||||
AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
|
||||
Address rsp = context.getRegisterAsAddress(AARCH64ThreadContext.SP);
|
||||
return sender(thread, null, null, null);
|
||||
}
|
||||
|
||||
if ((fp == null) || fp.lessThan(rsp)) {
|
||||
@Override
|
||||
public CFrame sender(ThreadProxy thread, Address nextSP, Address nextFP, Address nextPC) {
|
||||
// Check fp
|
||||
// Skip if both nextFP and nextPC are given - do not need to load from fp.
|
||||
if (nextFP == null && nextPC == null) {
|
||||
if (fp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check alignment of fp
|
||||
if (dbg.getAddressValue(fp) % (2 * ADDRESS_SIZE) != 0) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (nextFP == null) {
|
||||
nextFP = fp.getAddressAt(0);
|
||||
}
|
||||
if (nextFP == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check alignment of fp
|
||||
if (dbg.getAddressValue(fp) % (2 * ADDRESS_SIZE) != 0) {
|
||||
return null;
|
||||
if (nextPC == null) {
|
||||
nextPC = fp.getAddressAt(ADDRESS_SIZE);
|
||||
}
|
||||
|
||||
Address nextFP = fp.getAddressAt(0 * ADDRESS_SIZE);
|
||||
if (nextFP == null || nextFP.lessThanOrEqual(fp)) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = fp.getAddressAt(1 * ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAARCH64CFrame(dbg, nextFP, nextPC);
|
||||
|
||||
if (nextSP == null) {
|
||||
CodeCache cc = VM.getVM().getCodeCache();
|
||||
CodeBlob currentBlob = cc.findBlobUnsafe(pc());
|
||||
|
||||
// This case is different from HotSpot. See JDK-8371194 for details.
|
||||
if (currentBlob != null && (currentBlob.isContinuationStub() || currentBlob.isNativeMethod())) {
|
||||
// Use FP since it should always be valid for these cases.
|
||||
// TODO: These should be walked as Frames not CFrames.
|
||||
nextSP = fp.addOffsetTo(2 * ADDRESS_SIZE);
|
||||
} else {
|
||||
CodeBlob codeBlob = cc.findBlobUnsafe(nextPC);
|
||||
boolean useCodeBlob = codeBlob != null && codeBlob.getFrameSize() > 0;
|
||||
nextSP = useCodeBlob ? nextFP.addOffsetTo((2 * ADDRESS_SIZE) - codeBlob.getFrameSize()) : nextFP;
|
||||
}
|
||||
}
|
||||
if (nextSP == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new BsdAARCH64CFrame(dbg, nextSP, nextFP, nextPC);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Frame toFrame() {
|
||||
return new AARCH64Frame(sp, fp, pc);
|
||||
}
|
||||
|
||||
// package/class internals only
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2025, 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
|
||||
@ -29,10 +29,13 @@ import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.runtime.amd64.*;
|
||||
|
||||
public final class BsdAMD64CFrame extends BasicCFrame {
|
||||
public BsdAMD64CFrame(BsdDebugger dbg, Address rbp, Address rip) {
|
||||
public BsdAMD64CFrame(BsdDebugger dbg, Address rsp, Address rbp, Address rip) {
|
||||
super(dbg.getCDebugger());
|
||||
this.rsp = rsp;
|
||||
this.rbp = rbp;
|
||||
this.rip = rip;
|
||||
this.dbg = dbg;
|
||||
@ -52,32 +55,49 @@ public final class BsdAMD64CFrame extends BasicCFrame {
|
||||
return rbp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CFrame sender(ThreadProxy thread) {
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
|
||||
Address rsp = context.getRegisterAsAddress(AMD64ThreadContext.RSP);
|
||||
return sender(thread, null, null, null);
|
||||
}
|
||||
|
||||
if ( (rbp == null) || rbp.lessThan(rsp) ) {
|
||||
return null;
|
||||
@Override
|
||||
public CFrame sender(ThreadProxy thread, Address sp, Address fp, Address pc) {
|
||||
// Check fp
|
||||
// Skip if both fp and pc are given - do not need to load from rbp.
|
||||
if (fp == null && pc == null) {
|
||||
if (rbp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check alignment of rbp
|
||||
if (dbg.getAddressValue(rbp) % ADDRESS_SIZE != 0) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Check alignment of rbp
|
||||
if (dbg.getAddressValue(rbp) % ADDRESS_SIZE != 0) {
|
||||
Address nextRSP = sp != null ? sp : rbp.addOffsetTo(2 * ADDRESS_SIZE);
|
||||
if (nextRSP == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE);
|
||||
if (nextRBP == null || nextRBP.lessThanOrEqual(rbp)) {
|
||||
Address nextRBP = fp != null ? fp : rbp.getAddressAt(0);
|
||||
if (nextRBP == null) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE);
|
||||
Address nextPC = pc != null ? pc : rbp.getAddressAt(ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAMD64CFrame(dbg, nextRBP, nextPC);
|
||||
return new BsdAMD64CFrame(dbg, nextRSP, nextRBP, nextPC);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Frame toFrame() {
|
||||
return new AMD64Frame(rsp, rbp, rip);
|
||||
}
|
||||
|
||||
// package/class internals only
|
||||
private static final int ADDRESS_SIZE = 8;
|
||||
private Address rsp;
|
||||
private Address rip;
|
||||
private Address rbp;
|
||||
private BsdDebugger dbg;
|
||||
|
||||
@ -76,9 +76,10 @@ public class ThreadLocalAllocBuffer extends VMObject {
|
||||
|
||||
private long endReserve() {
|
||||
long labAlignmentReserve = VM.getVM().getLabAlignmentReserve();
|
||||
long reserveForAllocationPrefetch = VM.getVM().getReserveForAllocationPrefetch();
|
||||
long heapWordSize = VM.getVM().getHeapWordSize();
|
||||
|
||||
return labAlignmentReserve * heapWordSize;
|
||||
return Math.max(labAlignmentReserve, reserveForAllocationPrefetch) * heapWordSize;
|
||||
}
|
||||
|
||||
/** Support for iteration over heap -- not sure how this will
|
||||
|
||||
@ -123,6 +123,7 @@ public class VM {
|
||||
private int invocationEntryBCI;
|
||||
private ReversePtrs revPtrs;
|
||||
private VMRegImpl vmregImpl;
|
||||
private int reserveForAllocationPrefetch;
|
||||
private int labAlignmentReserve;
|
||||
|
||||
// System.getProperties from debuggee VM
|
||||
@ -446,6 +447,8 @@ public class VM {
|
||||
boolType = (CIntegerType) db.lookupType("bool");
|
||||
|
||||
Type threadLocalAllocBuffer = db.lookupType("ThreadLocalAllocBuffer");
|
||||
CIntegerField reserveForAllocationPrefetchField = threadLocalAllocBuffer.getCIntegerField("_reserve_for_allocation_prefetch");
|
||||
reserveForAllocationPrefetch = (int)reserveForAllocationPrefetchField.getCInteger(intType);
|
||||
|
||||
Type collectedHeap = db.lookupType("CollectedHeap");
|
||||
CIntegerField labAlignmentReserveField = collectedHeap.getCIntegerField("_lab_alignment_reserve");
|
||||
@ -912,6 +915,10 @@ public class VM {
|
||||
return vmInternalInfo;
|
||||
}
|
||||
|
||||
public int getReserveForAllocationPrefetch() {
|
||||
return reserveForAllocationPrefetch;
|
||||
}
|
||||
|
||||
public int getLabAlignmentReserve() {
|
||||
return labAlignmentReserve;
|
||||
}
|
||||
|
||||
@ -220,3 +220,4 @@ entry.1.is.signed.in.jarinputstream.but.is.not.signed.in.jarfile=Eintrag %s ist
|
||||
jar.contains.internal.inconsistencies.result.in.different.contents.via.jarfile.and.jarinputstream=Diese JAR-Datei enthält interne Inkonsistenzen, die zu anderem Inhalt beim Lesen über JarFile als beim Lesen über JarInputStream führen können:
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarinputstream=Signaturverifizierung war für Eintrag %s beim Lesen über JarInputStream nicht erfolgreich
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarfile=Signaturverifizierung war für Eintrag %s beim Lesen über JarFile nicht erfolgreich
|
||||
jks.storetype.warning=%1$s verwendet veraltete kryptografische Algorithmen und wird in einer zukünftigen Version entfernt. Migrieren Sie zu PKCS12 mit:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
|
||||
@ -220,3 +220,4 @@ entry.1.is.signed.in.jarinputstream.but.is.not.signed.in.jarfile=エントリ%s
|
||||
jar.contains.internal.inconsistencies.result.in.different.contents.via.jarfile.and.jarinputstream=このJARファイルには内部的な不整合があるため、JarFileとJarInputStreamから読み取る場合にコンテンツが異なる可能性があります:
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarinputstream=JarInputStreamを介して読み取るときに署名検証がエントリ%sで失敗しました
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarfile=JarFileを介して読み取るときに署名検証がエントリ%sで失敗しました
|
||||
jks.storetype.warning=%1$sは古い暗号化アルゴリズムを使用しているため、将来のリリースで削除されます。次を使用してPKCS12に移行します:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
|
||||
@ -220,3 +220,4 @@ entry.1.is.signed.in.jarinputstream.but.is.not.signed.in.jarfile=条目 %s 已
|
||||
jar.contains.internal.inconsistencies.result.in.different.contents.via.jarfile.and.jarinputstream=此 JAR 文件包含内部不一致,通过 JarFile 和 JarInputStream 读取时可能会导致内容不同:
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarinputstream=通过 JarInputStream 读取时,条目 %s 的签名验证失败
|
||||
signature.verification.failed.on.entry.1.when.reading.via.jarfile=通过 JarFile 读取时,条目 %s 的签名验证失败
|
||||
jks.storetype.warning=%1$s 使用的加密算法已过时,将在未来发行版中删除。请使用以下命令迁移到 PKCS12:\nkeytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12
|
||||
|
||||
@ -80,6 +80,8 @@ error.validator.info.opens.notequal=module-info.class in einem versionierten Ver
|
||||
error.validator.info.provides.notequal=module-info.class in einem versionierten Verzeichnis enthält unterschiedliche "provides"
|
||||
error.validator.info.version.notequal={0}: module-info.class in einem versionierten Verzeichnis enthält unterschiedlichen "version"-Wert
|
||||
error.validator.info.manclass.notequal={0}: module-info.class in einem versionierten Verzeichnis enthält unterschiedlichen "main-class"-Wert
|
||||
error.validator.metainf.wrong.position=Eintrag META-INF/ an Position 0 erwartet, aber an Position {0} gefunden
|
||||
error.validator.manifest.wrong.position=Eintrag META-INF/MANIFEST.MF an Position 0 oder 1 erwartet, aber an Position {0} gefunden
|
||||
warn.validator.identical.entry=Warnung: Eintrag {0} enthält eine Klasse, die mit\neinem bereits in der JAR-Datei enthaltenen Eintrag identisch ist
|
||||
warn.validator.resources.with.same.name=Warnung: Eintrag {0}, mehrere Ressourcen mit demselben Namen
|
||||
warn.validator.concealed.public.class=Warnung: Eintrag {0} ist eine öffentliche Klasse\nin einem verdeckten Package. Wenn Sie diese JAR-Datei in den Classpath einfügen, kommt es\nzu nicht kompatiblen öffentlichen Schnittstellen
|
||||
|
||||
@ -80,6 +80,8 @@ error.validator.info.opens.notequal=バージョニング・ディレクトリ
|
||||
error.validator.info.provides.notequal=バージョニングされたディレクトリのmodule-info.classに異なる"provides"が含まれています
|
||||
error.validator.info.version.notequal={0}: バージョニングされたディレクトリのmodule-info.classに異なる"version"が含まれています
|
||||
error.validator.info.manclass.notequal={0}: バージョニングされたディレクトリのmodule-info.classに異なる"main-class"が含まれています
|
||||
error.validator.metainf.wrong.position=エントリMETA-INF/は0の位置にある必要がありますが、見つかりました: {0}
|
||||
error.validator.manifest.wrong.position=エントリMETA-INF/MANIFEST.MFは0または1の位置にある必要がありますが、位置: {0}で見つかりました
|
||||
warn.validator.identical.entry=警告 : エントリ{0}には、jarにすでに存在する\nエントリと同じクラスが含まれます
|
||||
warn.validator.resources.with.same.name=警告 : エントリ{0}、同じ名前を持つ複数のリソース
|
||||
warn.validator.concealed.public.class=警告 : エントリ{0}は、隠しパッケージ内のpublicクラスです。\nクラスパスにこのjarを配置すると、互換性のない\npublicインタフェースが生成されます
|
||||
|
||||
@ -80,6 +80,8 @@ error.validator.info.opens.notequal=版本化目录中的 module-info.class 包
|
||||
error.validator.info.provides.notequal=版本化目录中的 module-info.class 包含不同的 "provides"
|
||||
error.validator.info.version.notequal={0}: 版本化目录中的 module-info.class 包含不同的 "version"
|
||||
error.validator.info.manclass.notequal={0}: 版本化目录中的 module-info.class 包含不同的 "main-class"
|
||||
error.validator.metainf.wrong.position=条目 META-INF/ 应位于位置 0 处,但发现:{0}
|
||||
error.validator.manifest.wrong.position=条目 META-INF/MANIFEST.MF 应位于位置 0 或 1 处,但发现该条目位于位置 {0} 处
|
||||
warn.validator.identical.entry=警告: 条目 {0} 包含与 jar 中的\n现有条目相同的类
|
||||
warn.validator.resources.with.same.name=警告: 条目 {0}, 多个资源具有相同名称
|
||||
warn.validator.concealed.public.class=警告: 条目 {0} 是已隐藏程序包中的\n公共类, 将此 jar 放置在类路径中\n将导致公共接口不兼容
|
||||
|
||||
@ -243,8 +243,12 @@ public abstract class HtmlDocletWriter {
|
||||
if (generating) {
|
||||
writeGenerating();
|
||||
}
|
||||
CURRENT_PATH.set(path.getPath());
|
||||
}
|
||||
|
||||
/** Temporary workaround to share current path with taglets, see 8373909 */
|
||||
public static final ThreadLocal<String> CURRENT_PATH = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* The top-level method to generate and write the page represented by this writer.
|
||||
*
|
||||
|
||||
@ -190,6 +190,10 @@ doclet.Window_Help_title=API-Hilfe
|
||||
doclet.references={0} Referenzen
|
||||
doclet.Window_Search_title=Suchen
|
||||
doclet.search.main_heading=Suchen
|
||||
doclet.theme.select_theme=Theme auswählen
|
||||
doclet.theme.light=Hell
|
||||
doclet.theme.dark=Dunkel
|
||||
doclet.theme.system=Systemeinstellung
|
||||
|
||||
# label for link/button element to show the information below
|
||||
doclet.search.show_more=Zusätzliche Ressourcen
|
||||
@ -539,3 +543,5 @@ doclet.NoFrames_specified=Die Option --no-frames wird nicht mehr benötigt und w
|
||||
|
||||
# L10N: do not localize the option name -footer
|
||||
doclet.footer_specified=Die Option -footer wird nicht mehr unterstützt und wird ignoriert.\nSie wird möglicherweise in einem zukünftigen Release entfernt.
|
||||
|
||||
doclet.selectModule=Wählen Sie das Modul aus, in dem gesucht werden soll.
|
||||
|
||||
@ -190,6 +190,10 @@ doclet.Window_Help_title=APIヘルプ
|
||||
doclet.references={0}の参照
|
||||
doclet.Window_Search_title=検索
|
||||
doclet.search.main_heading=検索
|
||||
doclet.theme.select_theme=テーマを選択
|
||||
doclet.theme.light=明るい
|
||||
doclet.theme.dark=暗い
|
||||
doclet.theme.system=システム設定
|
||||
|
||||
# label for link/button element to show the information below
|
||||
doclet.search.show_more=その他のリソース
|
||||
@ -539,3 +543,5 @@ doclet.NoFrames_specified=--no-framesオプションは必須ではなくなり
|
||||
|
||||
# L10N: do not localize the option name -footer
|
||||
doclet.footer_specified=-footerオプションはサポートされなくなったため、無視されます。\n将来のリリースで削除される可能性があります。
|
||||
|
||||
doclet.selectModule=検索するモジュールを選択します。
|
||||
|
||||
@ -190,6 +190,10 @@ doclet.Window_Help_title=API 帮助
|
||||
doclet.references={0} 个引用
|
||||
doclet.Window_Search_title=搜索
|
||||
doclet.search.main_heading=搜索
|
||||
doclet.theme.select_theme=选择主题
|
||||
doclet.theme.light=浅色
|
||||
doclet.theme.dark=深色
|
||||
doclet.theme.system=系统设置
|
||||
|
||||
# label for link/button element to show the information below
|
||||
doclet.search.show_more=其他资源
|
||||
@ -539,3 +543,5 @@ doclet.NoFrames_specified=--no-frames 选项不再是必需的,可能\n会在
|
||||
|
||||
# L10N: do not localize the option name -footer
|
||||
doclet.footer_specified=-footer 选项不再受支持并将被忽略。\n可能会在未来发行版中删除此选项。
|
||||
|
||||
doclet.selectModule=选择要在其中搜索的模块。
|
||||
|
||||
@ -65,6 +65,7 @@ doclet.JavaScript_in_comment=JavaScript in Dokumentationskommentar gefunden.\nVe
|
||||
doclet.JavaScript_in_option=Option {0} enthält JavaScript.\nVerwenden Sie --allow-script-in-comments, um die Verwendung von JavaScript zuzulassen.
|
||||
doclet.Link_icon=Linksymbol
|
||||
doclet.Link_to_section=Link zu diesem Abschnitt
|
||||
doclet.Toggle_member_listing=Zwischen kurzer und detaillierter Listenansicht umschalten
|
||||
doclet.Packages=Packages
|
||||
doclet.All_Packages=Alle Packages
|
||||
doclet.Modules=Module
|
||||
@ -114,7 +115,7 @@ doclet.inheritDocWithinInappropriateTag=@inheritDoc kann in diesem Tag nicht ver
|
||||
doclet.inheritDocNoDoc=überschriebene Methoden dokumentieren Ausnahmetyp {0} nicht
|
||||
doclet.throwsInheritDocUnsupported=@inheritDoc wird für Parameter vom Typ Ausnahme, die nicht von einer Methode deklariert werden, nicht unterstützt. Dokumentieren Sie solche Ausnahmetypen direkt.
|
||||
doclet.noInheritedDoc=@inheritDoc wurde verwendet, aber mit {0} wird keine Methode außer Kraft gesetzt oder implementiert.
|
||||
doclet.tag_misuse=Tag {0} kann nicht in {1}-Dokumentation verwendet werden. Es kann nur in folgenden Dokumentationstypen verwendet werden: {2}.
|
||||
doclet.tag_misuse=Tag {0} kann nicht in Dokumentation {1} verwendet werden. Es kann nur in folgenden Dokumentationstypen verwendet werden: {2}.
|
||||
doclet.Package_Summary=Packageübersicht
|
||||
doclet.Requires_Summary=Erfordernisse
|
||||
doclet.Indirect_Requires_Summary=Indirekte Erfordernisse
|
||||
@ -226,7 +227,7 @@ doclet.search=Suchen
|
||||
doclet.search_placeholder=In Dokumentation suchen ("/" eingeben)
|
||||
doclet.search_in_documentation=In Dokumentation suchen
|
||||
doclet.search_reset=Zurücksetzen
|
||||
doclet.Member=Mitglied
|
||||
doclet.Member=Member
|
||||
doclet.Field=Feld
|
||||
doclet.Property=Eigenschaft
|
||||
doclet.Constructor=Konstruktor
|
||||
@ -240,11 +241,14 @@ doclet.Description=Beschreibung
|
||||
doclet.ConstantField=Konstantenfeld
|
||||
doclet.Value=Wert
|
||||
doclet.table_of_contents=Inhaltsverzeichnis
|
||||
doclet.Sort_lexicographically=Member-Details lexikographisch sortieren
|
||||
doclet.Sort_by_source_order=Member-Details nach Quellreihenfolge sortieren
|
||||
doclet.hide_sidebar=Randleiste ausblenden
|
||||
doclet.show_sidebar=Randleiste einblenden
|
||||
doclet.filter_label=Inhalt filtern ("." eingeben)
|
||||
doclet.filter_table_of_contents=Inhaltsverzeichnis filtern
|
||||
doclet.filter_reset=Zurücksetzen
|
||||
doclet.sort_table_of_contents=Member-Details in lexikographischer Reihenfolge sortieren
|
||||
doclet.linkMismatch_PackagedLinkedtoModule=Der Code, der dokumentiert wird, verwendet Packages im unbenannten Modul, aber die in {0} definierten Packages befinden sich in benannten Modulen.
|
||||
doclet.linkMismatch_ModuleLinkedtoPackage=Der Code, der dokumentiert wird, verwendet Module, aber die in {0} definierten Packages befinden sich im unbenannten Modul.
|
||||
doclet.urlRedirected=URL {0} wurde umgeleitet an {1} - Aktualisieren Sie die Befehlszeilenoptionen, um diese Warnung zu unterdrücken.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user