Merge
This commit is contained in:
commit
3f3cfa8419
@ -99,3 +99,4 @@ a12a9e78df8a9d534da0b4a244ed68f0de0bd58e jdk7-b118
|
||||
f1591eed71f64f6eba79fb7426f5616cc4dfea73 jdk7-b122
|
||||
ed6950da30cf1e8904b4bdb034d471647942271f jdk7-b123
|
||||
024a6755895bf91b5a3c98984c89ee018efbf538 jdk7-b124
|
||||
5c4df7e992775c102f08e9f1c0a124b324641b70 jdk7-b125
|
||||
|
@ -99,3 +99,4 @@ cff5a173ec1e89013359e804a3e31736ef6fb462 jdk7-b120
|
||||
1523a060032c8a5b7840198da8911abeff88118f jdk7-b122
|
||||
a230c142628cea22475ab9dc5cd544266ddf2466 jdk7-b123
|
||||
f90b3e014e831eb4f32ef035a1dad2b8ba87949f jdk7-b124
|
||||
1ce58c72b7892cb813eb920276c7e7f17a1b79fe jdk7-b125
|
||||
|
@ -140,3 +140,4 @@ f5603a6e50422046ebc0d2f1671d55cb8f1bf1e9 jdk7-b120
|
||||
9669f9b284108a9ee0a0ccbe215c37a130c9dcf5 hs20-b04
|
||||
0a8e0d4345b37b71ec49dda08ee03b68c4f1b592 jdk7-b124
|
||||
0a8e0d4345b37b71ec49dda08ee03b68c4f1b592 hs20-b05
|
||||
e24ab3fa6aafad3efabbe7dba9918c5f461a20b1 jdk7-b125
|
||||
|
@ -99,3 +99,4 @@ b2f6d9c4f12ffd307a5de40455b2b61b31a5cb79 jdk7-b118
|
||||
03ff13d19c8fa983cbab6542930a7f352e9b5b33 jdk7-b122
|
||||
e2aedea6495d61557326928de20dbb2d78fdd9aa jdk7-b123
|
||||
57ed1f3bec72924cdad102f9bf90f7449ea7bb83 jdk7-b124
|
||||
6c9bdee0cc3a8912acc5189cc092b8cba6851f9d jdk7-b125
|
||||
|
@ -25,13 +25,13 @@
|
||||
|
||||
drops.master.copy.base=${drops.dir}
|
||||
|
||||
jaxp_src.bundle.name=jaxp-1_4_4.zip
|
||||
jaxp_src.bundle.md5.checksum=2c40a758392c4abf2d59f355240df46a
|
||||
jaxp_src.bundle.name=jaxp-1_4_5-dev.zip
|
||||
jaxp_src.bundle.md5.checksum=84e2c26853262c9144133c6ff7ef5dc9
|
||||
jaxp_src.master.bundle.dir=${drops.master.copy.base}
|
||||
jaxp_src.master.bundle.url.base=https://java.net/downloads/jaxp/jdk7
|
||||
jaxp_src.master.bundle.url.base=http://download.java.net/jaxp/1.4.5/dev
|
||||
|
||||
#jaxp_tests.bundle.name=jaxp-unittests-1_4_4.zip
|
||||
#jaxp_tests.bundle.md5.checksum=51845e38b02920cf5374d0331ab3a4ee
|
||||
#jaxp_tests.master.bundle.dir=${drops.master.copy.base}
|
||||
#jaxp_tests.master.bundle.url.base=https://java.net/downloads/jaxp/jdk7
|
||||
jaxp_tests.bundle.name=jaxp-1_4_5-dev-unittests.zip
|
||||
jaxp_tests.bundle.md5.checksum=0377e715fa21814cb8006768c5967dc5
|
||||
jaxp_tests.master.bundle.dir=${drops.master.copy.base}
|
||||
jaxp_tests.master.bundle.url.base=http://download.java.net/jaxp/1.4.5/dev
|
||||
|
||||
|
@ -99,3 +99,4 @@ a661d8587b5d8986aacae086f5df66af9e1a96b1 jdk7-b121
|
||||
ac311eb325bfc763698219252bf3cee9e091f3af jdk7-b122
|
||||
869190935eedee7750d955019ab2a1b80f0a13a8 jdk7-b123
|
||||
1c72adc9d5f331cb882cf5354ba0dcb118a60b23 jdk7-b124
|
||||
0a56bdd709d01c1663047e55201d19152ffd3d69 jdk7-b125
|
||||
|
@ -155,7 +155,7 @@ ifdef LANGTOOLS_DIST
|
||||
"-Xbootclasspath/p:$(JAVAC_JAR)" \
|
||||
-jar $(JAVAC_JAR) $(JAVACFLAGS)
|
||||
JAVAH_CMD = $(BOOT_JAVA_CMD) \
|
||||
"-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)" \
|
||||
"-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)" \
|
||||
-jar $(JAVAH_JAR) $(JAVAHFLAGS)
|
||||
JAVADOC_CMD = $(BOOT_JAVA_CMD) \
|
||||
"-Xbootclasspath/p:$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)$(CLASSPATH_SEPARATOR)$(DOCLETS_JAR)" \
|
||||
|
@ -42,7 +42,15 @@ ifneq ($(PLATFORM), windows)
|
||||
ifndef OPENJDK
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
ifneq ($(ARCH), amd64)
|
||||
DGA_SUBDIR = jdga
|
||||
# Solaris 11 does not have support for new compilation of DGA code.
|
||||
OS_VERSION = $(shell uname -r)
|
||||
OS_MAJOR_VERSION := $(call MajorVersion,$(OS_VERSION))
|
||||
OS_MINOR_VERSION := $(call MinorVersion,$(OS_VERSION))
|
||||
ifeq ($(shell $(EXPR) $(OS_MAJOR_VERSION) == 5), 1)
|
||||
ifeq ($(shell $(EXPR) $(OS_MINOR_VERSION) \<= 10), 1)
|
||||
DGA_SUBDIR = jdga
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
@ -175,6 +175,10 @@ endif
|
||||
include $(BUILDDIR)/common/Mapfile-vers.gmk
|
||||
include $(BUILDDIR)/common/Library.gmk
|
||||
|
||||
COMPILEFONTCONFIG_FLAGS =
|
||||
ifdef ALT_COMPILEFONTCONFIG_FLAGS
|
||||
COMPILEFONTCONFIG_FLAGS += $(ALT_COMPILEFONTCONFIG_FLAGS)
|
||||
endif
|
||||
build: fontconfigs
|
||||
|
||||
|
||||
@ -406,7 +410,7 @@ COMPILEFONTCONFIG_JARFILE = $(BUILDTOOLJARDIR)/compilefontconfig.jar
|
||||
$(LIBDIR)/%.bfc: $(FONTCONFIGS_SRC)/$(FONTCONFIGS_SRC_PREFIX)%.properties \
|
||||
$(COMPILEFONTCONFIG_JARFILE)
|
||||
$(prep-target)
|
||||
$(BOOT_JAVA_CMD) -jar $(COMPILEFONTCONFIG_JARFILE) $< $@
|
||||
$(BOOT_JAVA_CMD) -jar $(COMPILEFONTCONFIG_JARFILE) $(COMPILEFONTCONFIG_FLAGS) $< $@
|
||||
$(install-module-file)
|
||||
$(call chmod-file, 444)
|
||||
@$(java-vm-cleanup)
|
||||
|
@ -224,7 +224,7 @@ $(OBJDIR)/DllUtil.obj:: ../../../src/windows/native/sun/windows/DllUtil.h
|
||||
|
||||
$(OBJDIR)/DrawLine.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawLine.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/DrawParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawParallelogram.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
$(OBJDIR)/DrawParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawParallelogram.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/DrawPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
@ -232,7 +232,7 @@ $(OBJDIR)/DrawPolygons.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDR
|
||||
|
||||
$(OBJDIR)/DrawRect.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawRect.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/FillParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
$(OBJDIR)/FillParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/FillPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
@ -284,7 +284,7 @@ $(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/sh
|
||||
|
||||
$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
$(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
|
||||
|
||||
$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
|
||||
|
||||
|
@ -118,6 +118,8 @@ SUNWprivate_1.1 {
|
||||
Java_sun_java2d_loops_GraphicsPrimitiveMgr_registerNativeLoops;
|
||||
Java_sun_java2d_loops_MaskBlit_MaskBlit;
|
||||
Java_sun_java2d_loops_MaskFill_MaskFill;
|
||||
Java_sun_java2d_loops_MaskFill_FillAAPgram;
|
||||
Java_sun_java2d_loops_MaskFill_DrawAAPgram;
|
||||
Java_sun_java2d_loops_TransformHelper_Transform;
|
||||
Java_sun_java2d_pipe_Region_initIDs;
|
||||
Java_sun_java2d_pipe_SpanClipRenderer_initIDs;
|
||||
|
@ -115,6 +115,8 @@ SUNWprivate_1.1 {
|
||||
Java_sun_java2d_loops_GraphicsPrimitiveMgr_registerNativeLoops;
|
||||
Java_sun_java2d_loops_MaskBlit_MaskBlit;
|
||||
Java_sun_java2d_loops_MaskFill_MaskFill;
|
||||
Java_sun_java2d_loops_MaskFill_FillAAPgram;
|
||||
Java_sun_java2d_loops_MaskFill_DrawAAPgram;
|
||||
Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans;
|
||||
Java_sun_java2d_pipe_SpanClipRenderer_initIDs;
|
||||
sun_awt_image_GifImageDecoder_initIDs;
|
||||
|
@ -222,6 +222,7 @@ class Zoneinfo {
|
||||
boolean continued = false;
|
||||
Zone zone = null;
|
||||
String l;
|
||||
lineNum = 0;
|
||||
|
||||
try {
|
||||
while ((line = in.readLine()) != null) {
|
||||
|
@ -158,8 +158,9 @@ static jboolean IsWildCardEnabled();
|
||||
* Running Java code in primordial thread caused many problems. We will
|
||||
* create a new thread to invoke JVM. See 6316197 for more information.
|
||||
*/
|
||||
static jlong threadStackSize = 0; /* stack size of the new thread */
|
||||
static jlong heapSize = 0; /* heap size */
|
||||
static jlong threadStackSize = 0; /* stack size of the new thread */
|
||||
static jlong maxHeapSize = 0; /* max heap size */
|
||||
static jlong initialHeapSize = 0; /* inital heap size */
|
||||
|
||||
int JNICALL JavaMain(void * args); /* entry point */
|
||||
|
||||
@ -381,7 +382,7 @@ JavaMain(void * _args)
|
||||
|
||||
if (showSettings != NULL) {
|
||||
ShowSettings(env, showSettings);
|
||||
CHECK_EXCEPTION_LEAVE(0);
|
||||
CHECK_EXCEPTION_LEAVE(1);
|
||||
}
|
||||
/* If the user specified neither a class name nor a JAR file */
|
||||
if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) {
|
||||
@ -689,7 +690,14 @@ AddOption(char *str, void *info)
|
||||
if (JLI_StrCCmp(str, "-Xmx") == 0) {
|
||||
jlong tmp;
|
||||
if (parse_size(str + 4, &tmp)) {
|
||||
heapSize = tmp;
|
||||
maxHeapSize = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
if (JLI_StrCCmp(str, "-Xms") == 0) {
|
||||
jlong tmp;
|
||||
if (parse_size(str + 4, &tmp)) {
|
||||
initialHeapSize = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1506,12 +1514,13 @@ ShowSettings(JNIEnv *env, char *optString)
|
||||
jstring joptString;
|
||||
NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper"));
|
||||
NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
|
||||
"showSettings", "(ZLjava/lang/String;JJZ)V"));
|
||||
"showSettings", "(ZLjava/lang/String;JJJZ)V"));
|
||||
joptString = (*env)->NewStringUTF(env, optString);
|
||||
(*env)->CallStaticVoidMethod(env, cls, showSettingsID,
|
||||
JNI_TRUE,
|
||||
joptString,
|
||||
(jlong)heapSize,
|
||||
(jlong)initialHeapSize,
|
||||
(jlong)maxHeapSize,
|
||||
(jlong)threadStackSize,
|
||||
ServerClassMachine());
|
||||
}
|
||||
|
@ -29,13 +29,14 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Adaptive coding.
|
||||
* See the section "Adaptive Encodings" in the Pack200 spec.
|
||||
* @author John Rose
|
||||
*/
|
||||
class AdaptiveCoding implements Constants, CodingMethod {
|
||||
class AdaptiveCoding implements CodingMethod {
|
||||
CodingMethod headCoding;
|
||||
int headLength;
|
||||
CodingMethod tailCoding;
|
||||
@ -147,7 +148,6 @@ class AdaptiveCoding implements Constants, CodingMethod {
|
||||
}
|
||||
if (KX == KX_MAX) return Integer.MAX_VALUE;
|
||||
KX += 1;
|
||||
int unit2 = 1 << (KX * KX_LG2BASE);
|
||||
int mask2 = KB_MAX << (KX * KX_LG2BASE);
|
||||
K1 |= (mask & ~mask2);
|
||||
K1 += unit;
|
||||
@ -250,7 +250,7 @@ class AdaptiveCoding implements Constants, CodingMethod {
|
||||
return m.toString();
|
||||
}
|
||||
public String toString() {
|
||||
StringBuffer res = new StringBuffer(20);
|
||||
StringBuilder res = new StringBuilder(20);
|
||||
AdaptiveCoding run = this;
|
||||
res.append("run(");
|
||||
for (;;) {
|
||||
|
@ -36,6 +36,7 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Represents an attribute in a class-file.
|
||||
@ -44,7 +45,7 @@ import java.util.Map;
|
||||
* attribute layouts.
|
||||
* @author John Rose
|
||||
*/
|
||||
class Attribute implements Comparable, Constants {
|
||||
class Attribute implements Comparable {
|
||||
// Attribute instance fields.
|
||||
|
||||
Layout def; // the name and format of this attr
|
||||
@ -103,7 +104,6 @@ class Attribute implements Comparable, Constants {
|
||||
return this.def.compareTo(that.def);
|
||||
}
|
||||
|
||||
private static final byte[] noBytes = {};
|
||||
private static final Map<List<Attribute>, List<Attribute>> canonLists = new HashMap<>();
|
||||
private static final Map<Layout, Attribute> attributes = new HashMap<>();
|
||||
private static final Map<Layout, Attribute> standardDefs = new HashMap<>();
|
||||
@ -112,7 +112,7 @@ class Attribute implements Comparable, Constants {
|
||||
// are used by trimToSize, in order to reduce footprint
|
||||
// of some common cases. (Note that Code attributes are
|
||||
// always zero size.)
|
||||
public static List getCanonList(List<Attribute> al) {
|
||||
public static List<Attribute> getCanonList(List<Attribute> al) {
|
||||
synchronized (canonLists) {
|
||||
List<Attribute> cl = canonLists.get(al);
|
||||
if (cl == null) {
|
||||
@ -465,7 +465,9 @@ class Attribute implements Comparable, Constants {
|
||||
return ConstantPool.getUtf8Entry(name());
|
||||
}
|
||||
|
||||
public boolean isEmpty() { return layout == ""; }
|
||||
public boolean isEmpty() {
|
||||
return layout.isEmpty();
|
||||
}
|
||||
|
||||
public Layout(int ctype, String name, String layout) {
|
||||
this.ctype = ctype;
|
||||
@ -479,19 +481,19 @@ class Attribute implements Comparable, Constants {
|
||||
} else {
|
||||
String[] bodies = splitBodies(layout);
|
||||
// Make the callables now, so they can be linked immediately.
|
||||
Element[] elems = new Element[bodies.length];
|
||||
this.elems = elems;
|
||||
for (int i = 0; i < elems.length; i++) {
|
||||
Element[] lelems = new Element[bodies.length];
|
||||
this.elems = lelems;
|
||||
for (int i = 0; i < lelems.length; i++) {
|
||||
Element ce = this.new Element();
|
||||
ce.kind = EK_CBLE;
|
||||
ce.removeBand();
|
||||
ce.bandIndex = NO_BAND_INDEX;
|
||||
ce.layout = bodies[i];
|
||||
elems[i] = ce;
|
||||
lelems[i] = ce;
|
||||
}
|
||||
// Next fill them in.
|
||||
for (int i = 0; i < elems.length; i++) {
|
||||
Element ce = elems[i];
|
||||
for (int i = 0; i < lelems.length; i++) {
|
||||
Element ce = lelems[i];
|
||||
ce.body = tokenizeLayout(this, i, bodies[i]);
|
||||
}
|
||||
//System.out.println(Arrays.asList(elems));
|
||||
@ -525,11 +527,12 @@ class Attribute implements Comparable, Constants {
|
||||
}
|
||||
|
||||
public boolean equals(Object x) {
|
||||
return x instanceof Layout && equals((Layout)x);
|
||||
return ( x != null) && ( x.getClass() == Layout.class ) &&
|
||||
equals((Layout)x);
|
||||
}
|
||||
public boolean equals(Layout that) {
|
||||
return this.name == that.name
|
||||
&& this.layout == that.layout
|
||||
return this.name.equals(that.name)
|
||||
&& this.layout.equals(that.layout)
|
||||
&& this.ctype == that.ctype;
|
||||
}
|
||||
public int hashCode() {
|
||||
@ -589,14 +592,14 @@ class Attribute implements Comparable, Constants {
|
||||
return str;
|
||||
}
|
||||
private String stringForDebug() {
|
||||
Element[] body = this.body;
|
||||
Element[] lbody = this.body;
|
||||
switch (kind) {
|
||||
case EK_CALL:
|
||||
body = null;
|
||||
lbody = null;
|
||||
break;
|
||||
case EK_CASE:
|
||||
if (flagTest(EF_BACK))
|
||||
body = null;
|
||||
lbody = null;
|
||||
break;
|
||||
}
|
||||
return layout
|
||||
@ -604,7 +607,7 @@ class Attribute implements Comparable, Constants {
|
||||
+ "<"+ (flags==0?"":""+flags)+kind+len
|
||||
+ (refKind==0?"":""+refKind) + ">"
|
||||
+ (value==0?"":"("+value+")")
|
||||
+ (body==null?"": ""+Arrays.asList(body));
|
||||
+ (lbody==null?"": ""+Arrays.asList(lbody));
|
||||
}
|
||||
}
|
||||
|
||||
@ -613,16 +616,19 @@ class Attribute implements Comparable, Constants {
|
||||
}
|
||||
static private final Element[] noElems = {};
|
||||
public Element[] getCallables() {
|
||||
if (hasCallables())
|
||||
return elems;
|
||||
else
|
||||
if (hasCallables()) {
|
||||
Element[] nelems = Arrays.copyOf(elems, elems.length);
|
||||
return nelems;
|
||||
} else
|
||||
return noElems; // no callables at all
|
||||
}
|
||||
public Element[] getEntryPoint() {
|
||||
if (hasCallables())
|
||||
return elems[0].body; // body of first callable
|
||||
else
|
||||
return elems; // no callables; whole body
|
||||
else {
|
||||
Element[] nelems = Arrays.copyOf(elems, elems.length);
|
||||
return nelems; // no callables; whole body
|
||||
}
|
||||
}
|
||||
|
||||
/** Return a sequence of tokens from the given attribute bytes.
|
||||
@ -674,7 +680,7 @@ class Attribute implements Comparable, Constants {
|
||||
}
|
||||
}
|
||||
|
||||
void visitRefs(Holder holder, int mode, final Collection refs) {
|
||||
void visitRefs(Holder holder, int mode, final Collection<Entry> refs) {
|
||||
if (mode == VRM_CLASSIC) {
|
||||
refs.add(getNameRef());
|
||||
}
|
||||
@ -720,7 +726,7 @@ class Attribute implements Comparable, Constants {
|
||||
*/
|
||||
static public
|
||||
String normalizeLayoutString(String layout) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
StringBuilder buf = new StringBuilder();
|
||||
for (int i = 0, len = layout.length(); i < len; ) {
|
||||
char ch = layout.charAt(i++);
|
||||
if (ch <= ' ') {
|
||||
@ -832,14 +838,14 @@ class Attribute implements Comparable, Constants {
|
||||
*/
|
||||
static //private
|
||||
Layout.Element[] tokenizeLayout(Layout self, int curCble, String layout) {
|
||||
ArrayList<Layout.Element> col = new ArrayList<>(layout.length());
|
||||
List<Layout.Element> col = new ArrayList<>(layout.length());
|
||||
tokenizeLayout(self, curCble, layout, col);
|
||||
Layout.Element[] res = new Layout.Element[col.size()];
|
||||
col.toArray(res);
|
||||
return res;
|
||||
}
|
||||
static //private
|
||||
void tokenizeLayout(Layout self, int curCble, String layout, ArrayList<Layout.Element> col) {
|
||||
void tokenizeLayout(Layout self, int curCble, String layout, List<Layout.Element> col) {
|
||||
boolean prevBCI = false;
|
||||
for (int len = layout.length(), i = 0; i < len; ) {
|
||||
int start = i;
|
||||
@ -897,7 +903,7 @@ class Attribute implements Comparable, Constants {
|
||||
case 'T': // union: 'T' any_int union_case* '(' ')' '[' body ']'
|
||||
kind = EK_UN;
|
||||
i = tokenizeSInt(e, layout, i);
|
||||
ArrayList<Layout.Element> cases = new ArrayList<>();
|
||||
List<Layout.Element> cases = new ArrayList<>();
|
||||
for (;;) {
|
||||
// Keep parsing cases until we hit the default case.
|
||||
if (layout.charAt(i++) != '(')
|
||||
@ -1051,7 +1057,7 @@ class Attribute implements Comparable, Constants {
|
||||
}
|
||||
static //private
|
||||
String[] splitBodies(String layout) {
|
||||
ArrayList<String> bodies = new ArrayList<>();
|
||||
List<String> bodies = new ArrayList<>();
|
||||
// Parse several independent layout bodies: "[foo][bar]...[baz]"
|
||||
for (int i = 0; i < layout.length(); i++) {
|
||||
if (layout.charAt(i++) != '[')
|
||||
@ -1156,7 +1162,7 @@ class Attribute implements Comparable, Constants {
|
||||
String expandCaseDashNotation(String layout) {
|
||||
int dash = findCaseDash(layout, 0);
|
||||
if (dash < 0) return layout; // no dashes (the common case)
|
||||
StringBuffer result = new StringBuffer(layout.length() * 3);
|
||||
StringBuilder result = new StringBuilder(layout.length() * 3);
|
||||
int sofar = 0; // how far have we processed the layout?
|
||||
for (;;) {
|
||||
// for each dash, collect everything up to the dash
|
||||
|
@ -44,16 +44,17 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.jar.Pack200;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Define the structure and ordering of "bands" in a packed file.
|
||||
* @author John Rose
|
||||
*/
|
||||
abstract
|
||||
class BandStructure implements Constants {
|
||||
class BandStructure {
|
||||
static final int MAX_EFFORT = 9;
|
||||
static final int MIN_EFFORT = 1;
|
||||
static final int DEFAULT_EFFORT = 5;
|
||||
@ -251,18 +252,18 @@ class BandStructure implements Constants {
|
||||
|
||||
null
|
||||
};
|
||||
final private static HashMap basicCodingIndexes;
|
||||
final private static Map<Coding, Integer> basicCodingIndexes;
|
||||
static {
|
||||
assert(basicCodings[_meta_default] == null);
|
||||
assert(basicCodings[_meta_canon_min] != null);
|
||||
assert(basicCodings[_meta_canon_max] != null);
|
||||
HashMap map = new HashMap();
|
||||
Map<Coding, Integer> map = new HashMap<>();
|
||||
for (int i = 0; i < basicCodings.length; i++) {
|
||||
Coding c = basicCodings[i];
|
||||
if (c == null) continue;
|
||||
assert(i >= _meta_canon_min);
|
||||
assert(i <= _meta_canon_max);
|
||||
map.put(c, new Integer(i));
|
||||
map.put(c, i);
|
||||
}
|
||||
basicCodingIndexes = map;
|
||||
}
|
||||
@ -270,12 +271,12 @@ class BandStructure implements Constants {
|
||||
return i < basicCodings.length ? basicCodings[i] : null;
|
||||
}
|
||||
public static int indexOf(Coding c) {
|
||||
Integer i = (Integer) basicCodingIndexes.get(c);
|
||||
Integer i = basicCodingIndexes.get(c);
|
||||
if (i == null) return 0;
|
||||
return i.intValue();
|
||||
}
|
||||
public static Coding[] getBasicCodings() {
|
||||
return (Coding[]) basicCodings.clone();
|
||||
return basicCodings.clone();
|
||||
}
|
||||
|
||||
protected byte[] bandHeaderBytes; // used for input only
|
||||
@ -687,7 +688,6 @@ class BandStructure implements Constants {
|
||||
}
|
||||
bandCoding.writeArrayTo(out, values, 0, length);
|
||||
if (out == outputCounter) {
|
||||
long len1 = outputCounter.getCount();
|
||||
assert(outputSize == outputCounter.getCount() - len0)
|
||||
: (outputSize+" != "+outputCounter.getCount()+"-"+len0);
|
||||
}
|
||||
@ -1050,8 +1050,8 @@ class BandStructure implements Constants {
|
||||
|
||||
// Bootstrap support for CPRefBands. These are needed to record
|
||||
// intended CP indexes, before the CP has been created.
|
||||
private ArrayList allKQBands = new ArrayList();
|
||||
private ArrayList needPredefIndex = new ArrayList();
|
||||
private final List<CPRefBand> allKQBands = new ArrayList<>();
|
||||
private List<Object[]> needPredefIndex = new ArrayList<>();
|
||||
|
||||
|
||||
int encodeRef(Entry e, Index ix) {
|
||||
@ -1078,9 +1078,9 @@ class BandStructure implements Constants {
|
||||
&& this instanceof PackageWriter) {
|
||||
// Twist the random state based on my first file.
|
||||
// This sends each segment off in a different direction.
|
||||
List classes = ((PackageWriter)this).pkg.classes;
|
||||
List<Package.Class> classes = ((PackageWriter)this).pkg.classes;
|
||||
if (!classes.isEmpty()) {
|
||||
Package.Class cls = (Package.Class) classes.get(0);
|
||||
Package.Class cls = classes.get(0);
|
||||
codingChooser.addStressSeed(cls.getName().hashCode());
|
||||
}
|
||||
}
|
||||
@ -1619,8 +1619,7 @@ class BandStructure implements Constants {
|
||||
/** Given CP indexes, distribute tag-specific indexes to bands. */
|
||||
protected void setBandIndexes() {
|
||||
// Handle prior calls to setBandIndex:
|
||||
for (Iterator i = needPredefIndex.iterator(); i.hasNext(); ) {
|
||||
Object[] need = (Object[]) i.next();
|
||||
for (Object[] need : needPredefIndex) {
|
||||
CPRefBand b = (CPRefBand) need[0];
|
||||
Byte which = (Byte) need[1];
|
||||
b.setIndex(getCPIndex(which.byteValue()));
|
||||
@ -1633,7 +1632,7 @@ class BandStructure implements Constants {
|
||||
}
|
||||
|
||||
protected void setBandIndex(CPRefBand b, byte which) {
|
||||
Object[] need = { b, new Byte(which) };
|
||||
Object[] need = { b, Byte.valueOf(which) };
|
||||
if (which == CONSTANT_Literal) {
|
||||
// I.e., attribute layouts KQ (no null) or KQN (null ok).
|
||||
allKQBands.add(b);
|
||||
@ -1645,7 +1644,7 @@ class BandStructure implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
protected void setConstantValueIndex(com.sun.java.util.jar.pack.Package.Class.Field f) {
|
||||
protected void setConstantValueIndex(Field f) {
|
||||
Index ix = null;
|
||||
if (f != null) {
|
||||
byte tag = f.getLiteralTag();
|
||||
@ -1655,8 +1654,7 @@ class BandStructure implements Constants {
|
||||
assert(ix != null);
|
||||
}
|
||||
// Typically, allKQBands is the singleton of field_ConstantValue_KQ.
|
||||
for (Iterator i = allKQBands.iterator(); i.hasNext(); ) {
|
||||
CPRefBand xxx_KQ = (CPRefBand) i.next();
|
||||
for (CPRefBand xxx_KQ : allKQBands) {
|
||||
xxx_KQ.setIndex(ix);
|
||||
}
|
||||
}
|
||||
@ -1688,7 +1686,7 @@ class BandStructure implements Constants {
|
||||
protected int attrClassFileVersionMask;
|
||||
|
||||
// Mapping from Attribute.Layout to Band[] (layout element bands).
|
||||
protected HashMap attrBandTable = new HashMap();
|
||||
protected Map<Attribute.Layout, Band[]> attrBandTable = new HashMap<>();
|
||||
|
||||
// Well-known attributes:
|
||||
protected final Attribute.Layout attrCodeEmpty;
|
||||
@ -1697,15 +1695,18 @@ class BandStructure implements Constants {
|
||||
protected final Attribute.Layout attrConstantValue;
|
||||
|
||||
// Mapping from Attribute.Layout to Integer (inverse of attrDefs)
|
||||
HashMap attrIndexTable = new HashMap();
|
||||
Map<Attribute.Layout, Integer> attrIndexTable = new HashMap<>();
|
||||
|
||||
// Mapping from attribute index (<32 are flag bits) to attributes.
|
||||
protected ArrayList[] attrDefs = new ArrayList[ATTR_CONTEXT_LIMIT];
|
||||
protected List<List<Attribute.Layout>> attrDefs =
|
||||
new FixedList<>(ATTR_CONTEXT_LIMIT);
|
||||
{
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
assert(attrIndexLimit[i] == 0);
|
||||
attrIndexLimit[i] = 32; // just for the sake of predefs.
|
||||
attrDefs[i] = new ArrayList(Collections.nCopies(attrIndexLimit[i], null));
|
||||
attrDefs.set(i, new ArrayList<>(Collections.nCopies(
|
||||
attrIndexLimit[i], (Attribute.Layout)null)));
|
||||
|
||||
}
|
||||
|
||||
// Add predefined attribute definitions:
|
||||
@ -1867,9 +1868,10 @@ class BandStructure implements Constants {
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
assert(attrIndexLimit[i] == 0); // decide on it now!
|
||||
attrIndexLimit[i] = (haveFlagsHi(i)? 63: 32);
|
||||
assert(attrDefs[i].size() == 32); // all predef indexes are <32
|
||||
int addMore = attrIndexLimit[i] - attrDefs[i].size();
|
||||
attrDefs[i].addAll(Collections.nCopies(addMore, null));
|
||||
List<Attribute.Layout> defList = attrDefs.get(i);
|
||||
assert(defList.size() == 32); // all predef indexes are <32
|
||||
int addMore = attrIndexLimit[i] - defList.size();
|
||||
defList.addAll(Collections.nCopies(addMore, (Attribute.Layout) null));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1890,13 +1892,13 @@ class BandStructure implements Constants {
|
||||
return testBit(archiveOptions, mask);
|
||||
}
|
||||
|
||||
protected ArrayList getPredefinedAttrs(int ctype) {
|
||||
protected List getPredefinedAttrs(int ctype) {
|
||||
assert(attrIndexLimit[ctype] != 0);
|
||||
ArrayList res = new ArrayList(attrIndexLimit[ctype]);
|
||||
List<Attribute.Layout> res = new ArrayList<>(attrIndexLimit[ctype]);
|
||||
// Remove nulls and non-predefs.
|
||||
for (int ai = 0; ai < attrIndexLimit[ctype]; ai++) {
|
||||
if (testBit(attrDefSeen[ctype], 1L<<ai)) continue;
|
||||
Attribute.Layout def = (Attribute.Layout) attrDefs[ctype].get(ai);
|
||||
Attribute.Layout def = attrDefs.get(ctype).get(ai);
|
||||
if (def == null) continue; // unused flag bit
|
||||
assert(isPredefinedAttr(ctype, ai));
|
||||
res.add(def);
|
||||
@ -1910,7 +1912,7 @@ class BandStructure implements Constants {
|
||||
if (ai >= attrIndexLimit[ctype]) return false;
|
||||
// If the bit is set, it was explicitly def'd.
|
||||
if (testBit(attrDefSeen[ctype], 1L<<ai)) return false;
|
||||
return (attrDefs[ctype].get(ai) != null);
|
||||
return (attrDefs.get(ctype).get(ai) != null);
|
||||
}
|
||||
|
||||
protected void adjustSpecialAttrMasks() {
|
||||
@ -2050,8 +2052,8 @@ class BandStructure implements Constants {
|
||||
System.out.println("Removing predefined "+ATTR_CONTEXT_NAME[ctype]+
|
||||
" attribute on bit "+index);
|
||||
}
|
||||
List defList = attrDefs[ctype];
|
||||
Attribute.Layout def = (Attribute.Layout) defList.get(index);
|
||||
List<Attribute.Layout> defList = attrDefs.get(ctype);
|
||||
Attribute.Layout def = defList.get(index);
|
||||
assert(def != null);
|
||||
defList.set(index, null);
|
||||
attrIndexTable.put(def, null);
|
||||
@ -2059,7 +2061,7 @@ class BandStructure implements Constants {
|
||||
assert(index < 64);
|
||||
attrDefSeen[ctype] &= ~(1L<<index);
|
||||
attrFlagMask[ctype] &= ~(1L<<index);
|
||||
Band[] ab = (Band[]) attrBandTable.get(def);
|
||||
Band[] ab = attrBandTable.get(def);
|
||||
for (int j = 0; j < ab.length; j++) {
|
||||
ab[j].doneWithUnusedBand();
|
||||
}
|
||||
@ -2085,9 +2087,8 @@ class BandStructure implements Constants {
|
||||
long defSeen = attrDefSeen[ctype];
|
||||
// Note: attrDefSeen is always a subset of attrFlagMask.
|
||||
assert((defSeen & ~attrFlagMask[ctype]) == 0);
|
||||
for (int i = 0; i < attrDefs[ctype].size(); i++) {
|
||||
Attribute.Layout def = (Attribute.Layout)
|
||||
attrDefs[ctype].get(i);
|
||||
for (int i = 0; i < attrDefs.get(ctype).size(); i++) {
|
||||
Attribute.Layout def = attrDefs.get(ctype).get(i);
|
||||
if (def == null) continue; // unused flag bit
|
||||
if (def.bandCount == 0) continue; // empty attr
|
||||
if (i < attrIndexLimit[ctype] && !testBit(defSeen, 1L<<i)) {
|
||||
@ -2102,7 +2103,7 @@ class BandStructure implements Constants {
|
||||
Band[] newAB = makeNewAttributeBands(pfx, def,
|
||||
xxx_attr_bands);
|
||||
assert(newAB.length == def.bandCount);
|
||||
Band[] prevAB = (Band[]) attrBandTable.put(def, newAB);
|
||||
Band[] prevAB = attrBandTable.put(def, newAB);
|
||||
if (prevAB != null) {
|
||||
// We won't be using these predefined bands.
|
||||
for (int j = 0; j < prevAB.length; j++) {
|
||||
@ -2212,14 +2213,14 @@ class BandStructure implements Constants {
|
||||
protected int setAttributeLayoutIndex(Attribute.Layout def, int index) {
|
||||
int ctype = def.ctype;
|
||||
assert(ATTR_INDEX_OVERFLOW <= index && index < attrIndexLimit[ctype]);
|
||||
List defList = attrDefs[ctype];
|
||||
List<Attribute.Layout> defList = attrDefs.get(ctype);
|
||||
if (index == ATTR_INDEX_OVERFLOW) {
|
||||
// Overflow attribute.
|
||||
index = defList.size();
|
||||
defList.add(def);
|
||||
if (verbose > 0)
|
||||
Utils.log.info("Adding new attribute at "+def +": "+index);
|
||||
attrIndexTable.put(def, new Integer(index));
|
||||
attrIndexTable.put(def, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
@ -2240,7 +2241,7 @@ class BandStructure implements Constants {
|
||||
// Remove index binding of any previous fixed attr.
|
||||
attrIndexTable.put(defList.get(index), null);
|
||||
defList.set(index, def);
|
||||
attrIndexTable.put(def, new Integer(index));
|
||||
attrIndexTable.put(def, index);
|
||||
return index;
|
||||
}
|
||||
|
||||
@ -2361,7 +2362,7 @@ class BandStructure implements Constants {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
static int nextSeqForDebug;
|
||||
static File dumpDir;
|
||||
static File dumpDir = null;
|
||||
static OutputStream getDumpStream(Band b, String ext) throws IOException {
|
||||
return getDumpStream(b.name, b.seqForDebug, ext, b);
|
||||
}
|
||||
@ -2512,19 +2513,19 @@ class BandStructure implements Constants {
|
||||
+", "+cstr+", "+ixS+"),");
|
||||
}
|
||||
|
||||
private HashMap prevForAssertMap;
|
||||
private Map<Band, Band> prevForAssertMap;
|
||||
|
||||
// DEBUG ONLY: Record something about the band order.
|
||||
boolean notePrevForAssert(Band b, Band p) {
|
||||
if (prevForAssertMap == null)
|
||||
prevForAssertMap = new HashMap();
|
||||
prevForAssertMap = new HashMap<>();
|
||||
prevForAssertMap.put(b, p);
|
||||
return true;
|
||||
}
|
||||
|
||||
// DEBUG ONLY: Validate next input band.
|
||||
private boolean assertReadyToReadFrom(Band b, InputStream in) throws IOException {
|
||||
Band p = (Band) prevForAssertMap.get(b);
|
||||
Band p = prevForAssertMap.get(b);
|
||||
// Any previous band must be done reading before this one starts.
|
||||
if (p != null && phaseCmp(p.phase(), DISBURSE_PHASE) < 0) {
|
||||
Utils.log.warning("Previous band not done reading.");
|
||||
@ -2536,19 +2537,21 @@ class BandStructure implements Constants {
|
||||
String name = b.name;
|
||||
if (optDebugBands && !name.startsWith("(")) {
|
||||
// Verify synchronization between reader & writer:
|
||||
StringBuffer buf = new StringBuffer();
|
||||
StringBuilder buf = new StringBuilder();
|
||||
int ch;
|
||||
while ((ch = in.read()) > 0)
|
||||
buf.append((char)ch);
|
||||
String inName = buf.toString();
|
||||
if (!inName.equals(name)) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Expected "+name+" but read: ");
|
||||
inName += (char)ch;
|
||||
while (inName.length() < 10)
|
||||
inName += (char)in.read();
|
||||
for (int i = 0; i < inName.length(); i++)
|
||||
while (inName.length() < 10) {
|
||||
inName += (char) in.read();
|
||||
}
|
||||
for (int i = 0; i < inName.length(); i++) {
|
||||
sb.append(inName.charAt(i));
|
||||
}
|
||||
Utils.log.warning(sb.toString());
|
||||
return false;
|
||||
}
|
||||
@ -2573,7 +2576,7 @@ class BandStructure implements Constants {
|
||||
|
||||
// DEBUG ONLY: Maybe write a debugging cookie to next output band.
|
||||
private boolean assertReadyToWriteTo(Band b, OutputStream out) throws IOException {
|
||||
Band p = (Band) prevForAssertMap.get(b);
|
||||
Band p = prevForAssertMap.get(b);
|
||||
// Any previous band must be done writing before this one starts.
|
||||
if (p != null && phaseCmp(p.phase(), DONE_PHASE) < 0) {
|
||||
Utils.log.warning("Previous band not done writing.");
|
||||
@ -2654,7 +2657,7 @@ class BandStructure implements Constants {
|
||||
protected static Object[] realloc(Object[] a) {
|
||||
return realloc(a, Math.max(10, a.length*2));
|
||||
}
|
||||
static private int[] noInts = {};
|
||||
|
||||
protected static int[] realloc(int[] a, int len) {
|
||||
if (len == 0) return noInts;
|
||||
if (a == null) return new int[len];
|
||||
@ -2665,7 +2668,7 @@ class BandStructure implements Constants {
|
||||
protected static int[] realloc(int[] a) {
|
||||
return realloc(a, Math.max(10, a.length*2));
|
||||
}
|
||||
static private byte[] noBytes = {};
|
||||
|
||||
protected static byte[] realloc(byte[] a, int len) {
|
||||
if (len == 0) return noBytes;
|
||||
if (a == null) return new byte[len];
|
||||
|
@ -38,19 +38,20 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Reader for a class file that is being incorporated into a package.
|
||||
* @author John Rose
|
||||
*/
|
||||
class ClassReader implements Constants {
|
||||
class ClassReader {
|
||||
int verbose;
|
||||
|
||||
Package pkg;
|
||||
Class cls;
|
||||
long inPos;
|
||||
DataInputStream in;
|
||||
Map attrDefs;
|
||||
Map<Attribute.Layout, Attribute> attrDefs;
|
||||
Map attrCommands;
|
||||
String unknownAttrCommand = "error";;
|
||||
|
||||
@ -77,7 +78,7 @@ class ClassReader implements Constants {
|
||||
});
|
||||
}
|
||||
|
||||
public void setAttrDefs(Map attrDefs) {
|
||||
public void setAttrDefs(Map<Attribute.Layout, Attribute> attrDefs) {
|
||||
this.attrDefs = attrDefs;
|
||||
}
|
||||
|
||||
@ -211,27 +212,23 @@ class ClassReader implements Constants {
|
||||
break;
|
||||
case CONSTANT_Integer:
|
||||
{
|
||||
Comparable val = new Integer(in.readInt());
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(val);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(in.readInt());
|
||||
}
|
||||
break;
|
||||
case CONSTANT_Float:
|
||||
{
|
||||
Comparable val = new Float(in.readFloat());
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(val);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(in.readFloat());
|
||||
}
|
||||
break;
|
||||
case CONSTANT_Long:
|
||||
{
|
||||
Comparable val = new Long(in.readLong());
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(val);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(in.readLong());
|
||||
cpMap[++i] = null;
|
||||
}
|
||||
break;
|
||||
case CONSTANT_Double:
|
||||
{
|
||||
Comparable val = new Double(in.readDouble());
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(val);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(in.readDouble());
|
||||
cpMap[++i] = null;
|
||||
}
|
||||
break;
|
||||
@ -353,17 +350,18 @@ class ClassReader implements Constants {
|
||||
if (attrCommands != null) {
|
||||
Object lkey = Attribute.keyForLookup(ctype, name);
|
||||
String cmd = (String) attrCommands.get(lkey);
|
||||
if (cmd == "pass") {
|
||||
String message = "passing attribute bitwise in "+h;
|
||||
throw new Attribute.FormatException(message, ctype, name,
|
||||
cmd);
|
||||
} else if (cmd == "error") {
|
||||
String message = "attribute not allowed in "+h;
|
||||
throw new Attribute.FormatException(message, ctype, name,
|
||||
cmd);
|
||||
} else if (cmd == "strip") {
|
||||
skip(length, name+" attribute in "+h);
|
||||
continue;
|
||||
if (cmd != null) {
|
||||
switch (cmd) {
|
||||
case "pass":
|
||||
String message1 = "passing attribute bitwise in " + h;
|
||||
throw new Attribute.FormatException(message1, ctype, name, cmd);
|
||||
case "error":
|
||||
String message2 = "attribute not allowed in " + h;
|
||||
throw new Attribute.FormatException(message2, ctype, name, cmd);
|
||||
case "strip":
|
||||
skip(length, name + " attribute in " + h);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Find canonical instance of the requested attribute.
|
||||
@ -408,7 +406,7 @@ class ClassReader implements Constants {
|
||||
String message = "unsupported StackMap variant in "+h;
|
||||
throw new Attribute.FormatException(message, ctype, name,
|
||||
"pass");
|
||||
} else if (unknownAttrCommand == "strip") {
|
||||
} else if ("strip".equals(unknownAttrCommand)) {
|
||||
// Skip the unknown attribute.
|
||||
skip(length, "unknown "+name+" attribute in "+h);
|
||||
continue;
|
||||
@ -422,7 +420,7 @@ class ClassReader implements Constants {
|
||||
a.layout() == Package.attrInnerClassesEmpty) {
|
||||
// These are hardwired.
|
||||
long pos0 = inPos;
|
||||
if (a.name() == "Code") {
|
||||
if ("Code".equals(a.name())) {
|
||||
Class.Method m = (Class.Method) h;
|
||||
m.code = new Code(m);
|
||||
try {
|
||||
@ -471,7 +469,7 @@ class ClassReader implements Constants {
|
||||
|
||||
void readInnerClasses(Class cls) throws IOException {
|
||||
int nc = readUnsignedShort();
|
||||
ArrayList ics = new ArrayList(nc);
|
||||
ArrayList<InnerClass> ics = new ArrayList<>(nc);
|
||||
for (int i = 0; i < nc; i++) {
|
||||
InnerClass ic =
|
||||
new InnerClass(readClassRef(),
|
||||
|
@ -38,12 +38,12 @@ import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
/**
|
||||
* Writer for a class file that is incorporated into a package.
|
||||
* @author John Rose
|
||||
*/
|
||||
class ClassWriter implements Constants {
|
||||
class ClassWriter {
|
||||
int verbose;
|
||||
|
||||
Package pkg;
|
||||
@ -196,8 +196,7 @@ class ClassWriter implements Constants {
|
||||
return;
|
||||
}
|
||||
writeShort(h.attributes.size());
|
||||
for (Iterator i = h.attributes.iterator(); i.hasNext(); ) {
|
||||
Attribute a = (Attribute) i.next();
|
||||
for (Attribute a : h.attributes) {
|
||||
a.finishRefs(cpIndex);
|
||||
writeRef(a.getNameRef());
|
||||
if (a.layout() == Package.attrCodeEmpty ||
|
||||
@ -207,7 +206,7 @@ class ClassWriter implements Constants {
|
||||
assert(out != bufOut);
|
||||
buf.reset();
|
||||
out = bufOut;
|
||||
if (a.name() == "Code") {
|
||||
if ("Code".equals(a.name())) {
|
||||
Class.Method m = (Class.Method) h;
|
||||
writeCode(m.code);
|
||||
} else {
|
||||
@ -246,10 +245,9 @@ class ClassWriter implements Constants {
|
||||
}
|
||||
|
||||
void writeInnerClasses(Class cls) throws IOException {
|
||||
List ics = cls.getInnerClasses();
|
||||
List<InnerClass> ics = cls.getInnerClasses();
|
||||
writeShort(ics.size());
|
||||
for (Iterator i = ics.iterator(); i.hasNext(); ) {
|
||||
InnerClass ic = (InnerClass) i.next();
|
||||
for (InnerClass ic : ics) {
|
||||
writeRef(ic.thisClass);
|
||||
writeRef(ic.outerClass);
|
||||
writeRef(ic.name);
|
||||
|
@ -29,12 +29,13 @@ import com.sun.java.util.jar.pack.Package.Class;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Represents a chunk of bytecodes.
|
||||
* @author John Rose
|
||||
*/
|
||||
class Code extends Attribute.Holder implements Constants {
|
||||
class Code extends Attribute.Holder {
|
||||
Class.Method m;
|
||||
|
||||
public Code(Class.Method m) {
|
||||
@ -141,15 +142,12 @@ class Code extends Attribute.Holder implements Constants {
|
||||
super.trimToSize();
|
||||
}
|
||||
|
||||
protected void visitRefs(int mode, Collection refs) {
|
||||
protected void visitRefs(int mode, Collection<ConstantPool.Entry> refs) {
|
||||
int verbose = getPackage().verbose;
|
||||
if (verbose > 2)
|
||||
System.out.println("Reference scan "+this);
|
||||
Class cls = thisClass();
|
||||
Package pkg = cls.getPackage();
|
||||
for (int i = 0; i < handler_class.length; i++) {
|
||||
refs.add(handler_class[i]);
|
||||
}
|
||||
refs.addAll(Arrays.asList(handler_class));
|
||||
if (fixups != null) {
|
||||
fixups.visitRefs(refs);
|
||||
} else {
|
||||
@ -196,11 +194,8 @@ class Code extends Attribute.Holder implements Constants {
|
||||
map[mapLen] = (short)(PClimit + Short.MIN_VALUE);
|
||||
return map;
|
||||
} else {
|
||||
int[] map = new int[mapLen+1];
|
||||
for (int i = 0; i < mapLen; i++) {
|
||||
map[i] = (int) insnMap[i];
|
||||
}
|
||||
map[mapLen] = (int) PClimit;
|
||||
int[] map = Arrays.copyOf(insnMap, mapLen + 1);
|
||||
map[mapLen] = PClimit;
|
||||
return map;
|
||||
}
|
||||
}
|
||||
@ -220,10 +215,7 @@ class Code extends Attribute.Holder implements Constants {
|
||||
}
|
||||
} else {
|
||||
int[] map = (int[]) map0;
|
||||
imap = new int[map.length-1];
|
||||
for (int i = 0; i < imap.length; i++) {
|
||||
imap[i] = map[i];
|
||||
}
|
||||
imap = Arrays.copyOfRange(map, 0, map.length - 1);
|
||||
}
|
||||
return imap;
|
||||
}
|
||||
@ -266,7 +258,7 @@ class Code extends Attribute.Holder implements Constants {
|
||||
} else {
|
||||
int[] map = (int[]) map0;
|
||||
len = map.length;
|
||||
i = Arrays.binarySearch(map, (int)bci);
|
||||
i = Arrays.binarySearch(map, bci);
|
||||
}
|
||||
assert(i != -1);
|
||||
assert(i != 0);
|
||||
@ -322,7 +314,7 @@ class Code extends Attribute.Holder implements Constants {
|
||||
len = map.length;
|
||||
if (bciCode < len)
|
||||
return map[bciCode];
|
||||
i = Arrays.binarySearch(map, (int)bciCode);
|
||||
i = Arrays.binarySearch(map, bciCode);
|
||||
if (i < 0) i = -i-1;
|
||||
int key = bciCode-len;
|
||||
for (;; i--) {
|
||||
|
@ -29,14 +29,15 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashMap;
|
||||
|
||||
import java.util.Map;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
/**
|
||||
* Define the conversions between sequences of small integers and raw bytes.
|
||||
* This is a schema of encodings which incorporates varying lengths,
|
||||
* varying degrees of length variability, and varying amounts of signed-ness.
|
||||
* @author John Rose
|
||||
*/
|
||||
class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric {
|
||||
class Coding implements Comparable, CodingMethod, Histogram.BitMetric {
|
||||
/*
|
||||
Coding schema for single integers, parameterized by (B,H,S):
|
||||
|
||||
@ -191,7 +192,9 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
if (S == 0 || range >= (long)1<<32)
|
||||
return saturate32(range-1);
|
||||
long maxPos = range-1;
|
||||
while (isNegativeCode(maxPos, S)) --maxPos;
|
||||
while (isNegativeCode(maxPos, S)) {
|
||||
--maxPos;
|
||||
}
|
||||
if (maxPos < 0) return -1; // No positive codings at all.
|
||||
int smax = decodeSign32(maxPos, S);
|
||||
// check for 32-bit wraparound:
|
||||
@ -213,9 +216,10 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
if (S == 0) {
|
||||
return 0;
|
||||
}
|
||||
int Smask = (1<<S)-1;
|
||||
long maxNeg = range-1;
|
||||
while (!isNegativeCode(maxNeg, S)) --maxNeg;
|
||||
while (!isNegativeCode(maxNeg, S))
|
||||
--maxNeg;
|
||||
|
||||
if (maxNeg < 0) return 0; // No negative codings at all.
|
||||
return decodeSign32(maxNeg, S);
|
||||
}
|
||||
@ -395,12 +399,12 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
return (del<<14)+(S<<11)+(B<<8)+(H<<0);
|
||||
}
|
||||
|
||||
private static HashMap codeMap;
|
||||
private static Map<Coding, Coding> codeMap;
|
||||
|
||||
private static synchronized Coding of(int B, int H, int S, int del) {
|
||||
if (codeMap == null) codeMap = new HashMap();
|
||||
if (codeMap == null) codeMap = new HashMap<>();
|
||||
Coding x0 = new Coding(B, H, S, del);
|
||||
Coding x1 = (Coding) codeMap.get(x0);
|
||||
Coding x1 = codeMap.get(x0);
|
||||
if (x1 == null) codeMap.put(x0, x1 = x0);
|
||||
return x1;
|
||||
}
|
||||
@ -462,6 +466,7 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
// %%% use byte[] buffer
|
||||
for (int i = start; i < end; i++)
|
||||
a[i] = readFrom(in);
|
||||
|
||||
for (int dstep = 0; dstep < del; dstep++) {
|
||||
long state = 0;
|
||||
for (int i = start; i < end; i++) {
|
||||
@ -750,14 +755,14 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
if (len == 0) return true;
|
||||
if (isFullRange()) return true;
|
||||
// Calculate max, min:
|
||||
int max = values[start];
|
||||
int min = max;
|
||||
int lmax = values[start];
|
||||
int lmin = lmax;
|
||||
for (int i = 1; i < len; i++) {
|
||||
int value = values[start+i];
|
||||
if (max < value) max = value;
|
||||
if (min > value) min = value;
|
||||
if (lmax < value) lmax = value;
|
||||
if (lmin > value) lmin = value;
|
||||
}
|
||||
return canRepresent(min, max);
|
||||
return canRepresent(lmin, lmax);
|
||||
}
|
||||
|
||||
public double getBitLength(int value) { // implements BitMetric
|
||||
@ -800,21 +805,20 @@ class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric
|
||||
//return Coding.of(B, H, S).getLength(deltas, 0, len);
|
||||
values = deltas;
|
||||
start = 0;
|
||||
end = values.length;
|
||||
}
|
||||
int sum = len; // at least 1 byte per
|
||||
// add extra bytes for extra-long values
|
||||
for (int n = 1; n <= B; n++) {
|
||||
// what is the coding interval [min..max] for n bytes?
|
||||
int max = byteMax[n-1];
|
||||
int min = byteMin[n-1];
|
||||
int lmax = byteMax[n-1];
|
||||
int lmin = byteMin[n-1];
|
||||
int longer = 0; // count of guys longer than n bytes
|
||||
for (int i = 0; i < len; i++) {
|
||||
int value = values[start+i];
|
||||
if (value >= 0) {
|
||||
if (value > max) longer++;
|
||||
if (value > lmax) longer++;
|
||||
} else {
|
||||
if (value < min) longer++;
|
||||
if (value < lmin) longer++;
|
||||
}
|
||||
}
|
||||
if (longer == 0) break; // no more passes needed
|
||||
|
@ -34,15 +34,16 @@ import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
/**
|
||||
* Heuristic chooser of basic encodings.
|
||||
* Runs "zip" to measure the apparent information content after coding.
|
||||
* @author John Rose
|
||||
*/
|
||||
class CodingChooser implements Constants {
|
||||
class CodingChooser {
|
||||
int verbose;
|
||||
int effort;
|
||||
boolean optUseHistogram = true;
|
||||
@ -124,10 +125,10 @@ class CodingChooser implements Constants {
|
||||
= !p200.getBoolean(Utils.COM_PREFIX+"no.population.coding");
|
||||
this.optUseAdaptiveCoding
|
||||
= !p200.getBoolean(Utils.COM_PREFIX+"no.adaptive.coding");
|
||||
int stress
|
||||
int lstress
|
||||
= p200.getInteger(Utils.COM_PREFIX+"stress.coding");
|
||||
if (stress != 0)
|
||||
this.stress = new Random(stress);
|
||||
if (lstress != 0)
|
||||
this.stress = new Random(lstress);
|
||||
}
|
||||
|
||||
this.effort = effort;
|
||||
@ -376,9 +377,9 @@ class CodingChooser implements Constants {
|
||||
" fewer bytes than regular "+regular+
|
||||
"; win="+pct(zipSize1-bestZipSize, zipSize1));
|
||||
}
|
||||
CodingMethod bestMethod = this.bestMethod;
|
||||
CodingMethod lbestMethod = this.bestMethod;
|
||||
reset(null, 0, 0); // for GC
|
||||
return bestMethod;
|
||||
return lbestMethod;
|
||||
}
|
||||
CodingMethod choose(int[] values, int start, int end, Coding regular) {
|
||||
return choose(values, start, end, regular, null);
|
||||
@ -742,9 +743,9 @@ class CodingChooser implements Constants {
|
||||
// Steps 1/2/3 are interdependent, and may be iterated.
|
||||
// Steps 4 and 5 may be decided independently afterward.
|
||||
int[] LValuesCoded = PopulationCoding.LValuesCoded;
|
||||
ArrayList bestFits = new ArrayList();
|
||||
ArrayList fullFits = new ArrayList();
|
||||
ArrayList longFits = new ArrayList();
|
||||
List<Coding> bestFits = new ArrayList<>();
|
||||
List<Coding> fullFits = new ArrayList<>();
|
||||
List<Coding> longFits = new ArrayList<>();
|
||||
final int PACK_TO_MAX_S = 1;
|
||||
if (bestPopFVC <= 255) {
|
||||
bestFits.add(BandStructure.BYTE1);
|
||||
@ -776,16 +777,16 @@ class CodingChooser implements Constants {
|
||||
}
|
||||
}
|
||||
// interleave all B greater than bestB with best and full fits
|
||||
for (Iterator i = bestFits.iterator(); i.hasNext(); ) {
|
||||
Coding c = (Coding) i.next();
|
||||
for (Iterator<Coding> i = bestFits.iterator(); i.hasNext(); ) {
|
||||
Coding c = i.next();
|
||||
if (c.B() > bestB) {
|
||||
i.remove();
|
||||
longFits.add(0, c);
|
||||
}
|
||||
}
|
||||
}
|
||||
ArrayList allFits = new ArrayList();
|
||||
for (Iterator i = bestFits.iterator(),
|
||||
List<Coding> allFits = new ArrayList<>();
|
||||
for (Iterator<Coding> i = bestFits.iterator(),
|
||||
j = fullFits.iterator(),
|
||||
k = longFits.iterator();
|
||||
i.hasNext() || j.hasNext() || k.hasNext(); ) {
|
||||
@ -812,8 +813,7 @@ class CodingChooser implements Constants {
|
||||
}
|
||||
if (verbose > 3)
|
||||
Utils.log.info("allFits: "+allFits);
|
||||
for (Iterator i = allFits.iterator(); i.hasNext(); ) {
|
||||
Coding tc = (Coding) i.next();
|
||||
for (Coding tc : allFits) {
|
||||
boolean packToMax = false;
|
||||
if (tc.S() == PACK_TO_MAX_S) {
|
||||
// Kludge: setS(PACK_TO_MAX_S) means packToMax here.
|
||||
@ -910,7 +910,7 @@ class CodingChooser implements Constants {
|
||||
" tc="+pop.tokenCoding+
|
||||
" uc="+pop.unfavoredCoding);
|
||||
//pop.hist.print("pop-hist", null, System.out);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("fv = {");
|
||||
for (int i = 1; i <= fVlen; i++) {
|
||||
if ((i % 10) == 0)
|
||||
@ -949,20 +949,20 @@ class CodingChooser implements Constants {
|
||||
// run occupies too much space. ("Too much" means, say 5% more
|
||||
// than the average integer size of the band as a whole.)
|
||||
// Try to find a better coding for those segments.
|
||||
int start = this.start;
|
||||
int end = this.end;
|
||||
int[] values = this.values;
|
||||
int len = end-start;
|
||||
int lstart = this.start;
|
||||
int lend = this.end;
|
||||
int[] lvalues = this.values;
|
||||
int len = lend-lstart;
|
||||
if (plainCoding.isDelta()) {
|
||||
values = getDeltas(0,0); //%%% not quite right!
|
||||
start = 0;
|
||||
end = values.length;
|
||||
lvalues = getDeltas(0,0); //%%% not quite right!
|
||||
lstart = 0;
|
||||
lend = lvalues.length;
|
||||
}
|
||||
int[] sizes = new int[len+1];
|
||||
int fillp = 0;
|
||||
int totalSize = 0;
|
||||
for (int i = start; i < end; i++) {
|
||||
int val = values[i];
|
||||
for (int i = lstart; i < lend; i++) {
|
||||
int val = lvalues[i];
|
||||
sizes[fillp++] = totalSize;
|
||||
int size = plainCoding.getLength(val);
|
||||
assert(size < Integer.MAX_VALUE);
|
||||
@ -1013,22 +1013,23 @@ class CodingChooser implements Constants {
|
||||
double[] fuzzes = new double[meshes.length];
|
||||
for (int i = 0; i < meshes.length; i++) {
|
||||
int mesh = meshes[i];
|
||||
double fuzz;
|
||||
double lfuzz;
|
||||
if (mesh < 10)
|
||||
fuzz = sizeFuzz3;
|
||||
lfuzz = sizeFuzz3;
|
||||
else if (mesh < 100)
|
||||
fuzz = sizeFuzz2;
|
||||
lfuzz = sizeFuzz2;
|
||||
else
|
||||
fuzz = sizeFuzz;
|
||||
fuzzes[i] = fuzz;
|
||||
threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * fuzz);
|
||||
lfuzz = sizeFuzz;
|
||||
fuzzes[i] = lfuzz;
|
||||
threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * lfuzz);
|
||||
}
|
||||
if (verbose > 1) {
|
||||
System.out.print("tryAdaptiveCoding ["+len+"]"+
|
||||
" avgS="+avgSize+" fuzz="+sizeFuzz+
|
||||
" meshes: {");
|
||||
for (int i = 0; i < meshes.length; i++)
|
||||
System.out.print(" "+meshes[i]+"("+threshes[i]+")");
|
||||
for (int i = 0; i < meshes.length; i++) {
|
||||
System.out.print(" " + meshes[i] + "(" + threshes[i] + ")");
|
||||
}
|
||||
Utils.log.info(" }");
|
||||
}
|
||||
if (runHelper == null) {
|
||||
@ -1229,20 +1230,19 @@ class CodingChooser implements Constants {
|
||||
Histogram hist = getValueHistogram();
|
||||
int fVlen = stressLen(hist.getTotalLength());
|
||||
if (fVlen == 0) return coding;
|
||||
List popvals = new ArrayList();
|
||||
List<Integer> popvals = new ArrayList<>();
|
||||
if (stress.nextBoolean()) {
|
||||
// Build the population from the value list.
|
||||
HashSet popset = new HashSet();
|
||||
Set<Integer> popset = new HashSet<>();
|
||||
for (int i = start; i < end; i++) {
|
||||
Integer val = new Integer(values[i]);
|
||||
if (popset.add(val)) popvals.add(val);
|
||||
if (popset.add(values[i])) popvals.add(values[i]);
|
||||
}
|
||||
} else {
|
||||
int[][] matrix = hist.getMatrix();
|
||||
for (int mrow = 0; mrow < matrix.length; mrow++) {
|
||||
int[] row = matrix[mrow];
|
||||
for (int mcol = 1; mcol < row.length; mcol++) {
|
||||
popvals.add(new Integer(row[mcol]));
|
||||
popvals.add(row[mcol]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1269,7 +1269,7 @@ class CodingChooser implements Constants {
|
||||
fVlen = popvals.size();
|
||||
int[] fvals = new int[1+fVlen];
|
||||
for (int i = 0; i < fVlen; i++) {
|
||||
fvals[1+i] = ((Integer)popvals.get(i)).intValue();
|
||||
fvals[1+i] = (popvals.get(i)).intValue();
|
||||
}
|
||||
PopulationCoding pop = new PopulationCoding();
|
||||
pop.setFavoredValues(fvals, fVlen);
|
||||
@ -1283,13 +1283,13 @@ class CodingChooser implements Constants {
|
||||
}
|
||||
}
|
||||
if (pop.tokenCoding == null) {
|
||||
int min = fvals[1], max = min;
|
||||
int lmin = fvals[1], lmax = lmin;
|
||||
for (int i = 2; i <= fVlen; i++) {
|
||||
int val = fvals[i];
|
||||
if (min > val) min = val;
|
||||
if (max < val) max = val;
|
||||
if (lmin > val) lmin = val;
|
||||
if (lmax < val) lmax = val;
|
||||
}
|
||||
pop.tokenCoding = stressCoding(min, max);
|
||||
pop.tokenCoding = stressCoding(lmin, lmax);
|
||||
}
|
||||
|
||||
computePopSizePrivate(pop, valueCoding, valueCoding);
|
||||
@ -1310,13 +1310,13 @@ class CodingChooser implements Constants {
|
||||
try {
|
||||
assert(!disableRunCoding);
|
||||
disableRunCoding = true; // temporary, while I decide spans
|
||||
int[] allValues = (int[]) values.clone();
|
||||
int[] allValues = values.clone();
|
||||
CodingMethod result = null;
|
||||
int scan = this.end;
|
||||
int start = this.start;
|
||||
for (int split; scan > start; scan = split) {
|
||||
int lstart = this.start;
|
||||
for (int split; scan > lstart; scan = split) {
|
||||
int thisspan;
|
||||
int rand = (scan - start < 100)? -1: stress.nextInt();
|
||||
int rand = (scan - lstart < 100)? -1: stress.nextInt();
|
||||
if ((rand & 7) != 0) {
|
||||
thisspan = (spanlen==1? spanlen: stressLen(spanlen-1)+1);
|
||||
} else {
|
||||
@ -1325,7 +1325,7 @@ class CodingChooser implements Constants {
|
||||
int KB = (rand >>>= 3) & AdaptiveCoding.KB_MAX;
|
||||
for (;;) {
|
||||
thisspan = AdaptiveCoding.decodeK(KX, KB);
|
||||
if (thisspan <= scan - start) break;
|
||||
if (thisspan <= scan - lstart) break;
|
||||
// Try smaller and smaller codings:
|
||||
if (KB != AdaptiveCoding.KB_DEFAULT)
|
||||
KB = AdaptiveCoding.KB_DEFAULT;
|
||||
@ -1335,11 +1335,13 @@ class CodingChooser implements Constants {
|
||||
//System.out.println("KX="+KX+" KB="+KB+" K="+thisspan);
|
||||
assert(AdaptiveCoding.isCodableLength(thisspan));
|
||||
}
|
||||
if (thisspan > scan - start) thisspan = scan - start;
|
||||
while (!AdaptiveCoding.isCodableLength(thisspan)) --thisspan;
|
||||
if (thisspan > scan - lstart) thisspan = scan - lstart;
|
||||
while (!AdaptiveCoding.isCodableLength(thisspan)) {
|
||||
--thisspan;
|
||||
}
|
||||
split = scan - thisspan;
|
||||
assert(split < scan);
|
||||
assert(split >= start);
|
||||
assert(split >= lstart);
|
||||
// Choose a coding for the span [split..scan).
|
||||
CodingMethod sc = choose(allValues, split, scan, plainCoding);
|
||||
if (result == null) {
|
||||
@ -1420,7 +1422,7 @@ class CodingChooser implements Constants {
|
||||
case StreamTokenizer.TT_EOF:
|
||||
throw new NoSuchElementException();
|
||||
case StreamTokenizer.TT_NUMBER:
|
||||
return new Integer((int) in.nval);
|
||||
return Integer.valueOf((int) in.nval);
|
||||
default:
|
||||
assert(false);
|
||||
return null;
|
||||
|
@ -33,13 +33,14 @@ import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Representation of constant pool entries and indexes.
|
||||
* @author John Rose
|
||||
*/
|
||||
abstract
|
||||
class ConstantPool implements Constants {
|
||||
class ConstantPool {
|
||||
private ConstantPool() {} // do not instantiate
|
||||
|
||||
static int verbose() {
|
||||
@ -155,9 +156,6 @@ class ConstantPool implements Constants {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean sameTagAs(Object o) {
|
||||
return (o instanceof Entry) && ((Entry)o).tag == tag;
|
||||
}
|
||||
public boolean eq(Entry that) { // same reference
|
||||
assert(that != null);
|
||||
return this == that || this.equals(that);
|
||||
@ -219,9 +217,9 @@ class ConstantPool implements Constants {
|
||||
return value.hashCode();
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
// Use reference equality of interned strings:
|
||||
return ((Utf8Entry)o).value == value;
|
||||
return (o != null && o.getClass() == Utf8Entry.class
|
||||
&& ((Utf8Entry) o).value.equals(value));
|
||||
}
|
||||
public int compareTo(Object o) {
|
||||
int x = superCompareTo(o);
|
||||
@ -275,8 +273,9 @@ class ConstantPool implements Constants {
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
return (((NumberEntry)o).value).equals(value);
|
||||
return (o != null && o.getClass() == NumberEntry.class
|
||||
&& ((NumberEntry) o).value.equals(value));
|
||||
|
||||
}
|
||||
public int compareTo(Object o) {
|
||||
int x = superCompareTo(o);
|
||||
@ -310,8 +309,8 @@ class ConstantPool implements Constants {
|
||||
return ref.hashCode() + tag;
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
return ((StringEntry)o).ref.eq(ref);
|
||||
return (o != null && o.getClass() == StringEntry.class &&
|
||||
((StringEntry)o).ref.eq(ref));
|
||||
}
|
||||
public int compareTo(Object o) {
|
||||
int x = superCompareTo(o);
|
||||
@ -342,8 +341,8 @@ class ConstantPool implements Constants {
|
||||
hashCode(); // force computation of valueHash
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
return ((ClassEntry)o).ref.eq(ref);
|
||||
return (o != null && o.getClass() == ClassEntry.class
|
||||
&& ((ClassEntry) o).ref.eq(ref));
|
||||
}
|
||||
public int compareTo(Object o) {
|
||||
int x = superCompareTo(o);
|
||||
@ -380,7 +379,9 @@ class ConstantPool implements Constants {
|
||||
return (nameRef.hashCode() + (hc2 << 8)) ^ hc2;
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
if (o == null || o.getClass() != DescriptorEntry.class) {
|
||||
return false;
|
||||
}
|
||||
DescriptorEntry that = (DescriptorEntry)o;
|
||||
return this.nameRef.eq(that.nameRef)
|
||||
&& this.typeRef.eq(that.typeRef);
|
||||
@ -439,7 +440,9 @@ class ConstantPool implements Constants {
|
||||
hashCode(); // force computation of valueHash
|
||||
}
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
if (o == null || o.getClass() != MemberEntry.class) {
|
||||
return false;
|
||||
}
|
||||
MemberEntry that = (MemberEntry)o;
|
||||
return this.classRef.eq(that.classRef)
|
||||
&& this.descRef.eq(that.descRef);
|
||||
@ -511,8 +514,8 @@ class ConstantPool implements Constants {
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if (!sameTagAs(o)) return false;
|
||||
return ((SignatureEntry)o).value == value;
|
||||
return (o != null && o.getClass() == SignatureEntry.class &&
|
||||
((SignatureEntry)o).value.equals(value));
|
||||
}
|
||||
public int compareTo(Object o) {
|
||||
int x = superCompareTo(o);
|
||||
@ -724,7 +727,7 @@ class ConstantPool implements Constants {
|
||||
protected static final ClassEntry[] noClassRefs = {};
|
||||
|
||||
/** An Index is a mapping between CP entries and small integers. */
|
||||
public static
|
||||
public static final
|
||||
class Index extends AbstractList {
|
||||
protected String debugName;
|
||||
protected Entry[] cpMap;
|
||||
@ -894,7 +897,7 @@ class ConstantPool implements Constants {
|
||||
}
|
||||
|
||||
public static
|
||||
Index makeIndex(String debugName, Collection cpMapList) {
|
||||
Index makeIndex(String debugName, Collection<Entry> cpMapList) {
|
||||
return new Index(debugName, cpMapList);
|
||||
}
|
||||
|
||||
@ -916,7 +919,7 @@ class ConstantPool implements Constants {
|
||||
public static
|
||||
Index[] partition(Index ix, int[] keys) {
|
||||
// %%% Should move this into class Index.
|
||||
ArrayList<List<Entry>> parts = new ArrayList<>();
|
||||
List<List<Entry>> parts = new ArrayList<>();
|
||||
Entry[] cpMap = ix.cpMap;
|
||||
assert(keys.length == cpMap.length);
|
||||
for (int i = 0; i < keys.length; i++) {
|
||||
@ -1094,12 +1097,12 @@ class ConstantPool implements Constants {
|
||||
|
||||
// Inverse of getOverloadingIndex
|
||||
public MemberEntry getOverloadingForIndex(byte tag, ClassEntry classRef, String name, int which) {
|
||||
assert(name == name.intern());
|
||||
assert(name.equals(name.intern()));
|
||||
Index ix = getMemberIndex(tag, classRef);
|
||||
int ord = 0;
|
||||
for (int i = 0; i < ix.cpMap.length; i++) {
|
||||
MemberEntry e = (MemberEntry) ix.cpMap[i];
|
||||
if (e.descRef.nameRef.stringValue() == name) {
|
||||
if (e.descRef.nameRef.stringValue().equals(name)) {
|
||||
if (ord == which) return e;
|
||||
ord++;
|
||||
}
|
||||
@ -1133,10 +1136,10 @@ class ConstantPool implements Constants {
|
||||
public static
|
||||
void completeReferencesIn(Set<Entry> cpRefs, boolean flattenSigs) {
|
||||
cpRefs.remove(null);
|
||||
for (ListIterator work =
|
||||
new ArrayList(cpRefs).listIterator(cpRefs.size());
|
||||
for (ListIterator<Entry> work =
|
||||
new ArrayList<>(cpRefs).listIterator(cpRefs.size());
|
||||
work.hasPrevious(); ) {
|
||||
Entry e = (Entry) work.previous();
|
||||
Entry e = work.previous();
|
||||
work.remove(); // pop stack
|
||||
assert(e != null);
|
||||
if (flattenSigs && e.tag == CONSTANT_Signature) {
|
||||
|
@ -32,7 +32,10 @@ import java.util.List;
|
||||
* Shared constants
|
||||
* @author John Rose
|
||||
*/
|
||||
interface Constants {
|
||||
class Constants {
|
||||
|
||||
private Constants(){}
|
||||
|
||||
public final static int JAVA_MAGIC = 0xCAFEBABE;
|
||||
|
||||
/*
|
||||
|
@ -59,12 +59,11 @@ class Driver {
|
||||
ResourceBundle.getBundle("com.sun.java.util.jar.pack.DriverResource");
|
||||
|
||||
public static void main(String[] ava) throws IOException {
|
||||
ArrayList<String> av = new ArrayList<>(Arrays.asList(ava));
|
||||
List<String> av = new ArrayList<>(Arrays.asList(ava));
|
||||
|
||||
boolean doPack = true;
|
||||
boolean doUnpack = false;
|
||||
boolean doRepack = false;
|
||||
boolean doForceRepack = false;
|
||||
boolean doZip = true;
|
||||
String logFile = null;
|
||||
String verboseProp = Utils.DEBUG_VERBOSE;
|
||||
@ -72,17 +71,20 @@ class Driver {
|
||||
{
|
||||
// Non-standard, undocumented "--unpack" switch enables unpack mode.
|
||||
String arg0 = av.isEmpty() ? "" : av.get(0);
|
||||
if (arg0.equals("--pack")) {
|
||||
switch (arg0) {
|
||||
case "--pack":
|
||||
av.remove(0);
|
||||
} else if (arg0.equals("--unpack")) {
|
||||
break;
|
||||
case "--unpack":
|
||||
av.remove(0);
|
||||
doPack = false;
|
||||
doUnpack = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Collect engine properties here:
|
||||
HashMap<String,String> engProps = new HashMap<>();
|
||||
Map<String,String> engProps = new HashMap<>();
|
||||
engProps.put(verboseProp, System.getProperty(verboseProp));
|
||||
|
||||
String optionMap;
|
||||
@ -96,7 +98,7 @@ class Driver {
|
||||
}
|
||||
|
||||
// Collect argument properties here:
|
||||
HashMap<String,String> avProps = new HashMap<>();
|
||||
Map<String,String> avProps = new HashMap<>();
|
||||
try {
|
||||
for (;;) {
|
||||
String state = parseCommandOptions(av, optionMap, avProps);
|
||||
@ -146,7 +148,7 @@ class Driver {
|
||||
}
|
||||
|
||||
// See if there is any other action to take.
|
||||
if (state == "--config-file=") {
|
||||
if ("--config-file=".equals(state)) {
|
||||
String propFile = av.remove(0);
|
||||
InputStream propIn = new FileInputStream(propFile);
|
||||
Properties fileProps = new Properties();
|
||||
@ -157,10 +159,10 @@ class Driver {
|
||||
for (Map.Entry<Object,Object> me : fileProps.entrySet()) {
|
||||
engProps.put((String) me.getKey(), (String) me.getValue());
|
||||
}
|
||||
} else if (state == "--version") {
|
||||
} else if ("--version".equals(state)) {
|
||||
System.out.println(MessageFormat.format(RESOURCE.getString(DriverResource.VERSION), Driver.class.getName(), "1.31, 07/05/05"));
|
||||
return;
|
||||
} else if (state == "--help") {
|
||||
} else if ("--help".equals(state)) {
|
||||
printUsage(doPack, true, System.out);
|
||||
System.exit(1);
|
||||
return;
|
||||
@ -178,14 +180,20 @@ class Driver {
|
||||
// Deal with remaining non-engine properties:
|
||||
for (String opt : avProps.keySet()) {
|
||||
String val = avProps.get(opt);
|
||||
if (opt == "--repack") {
|
||||
doRepack = true;
|
||||
} else if (opt == "--no-gzip") {
|
||||
doZip = (val == null);
|
||||
} else if (opt == "--log-file=") {
|
||||
logFile = val;
|
||||
} else {
|
||||
throw new InternalError(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_OPTION), opt, avProps.get(opt)));
|
||||
switch (opt) {
|
||||
case "--repack":
|
||||
doRepack = true;
|
||||
break;
|
||||
case "--no-gzip":
|
||||
doZip = (val == null);
|
||||
break;
|
||||
case "--log-file=":
|
||||
logFile = val;
|
||||
break;
|
||||
default:
|
||||
throw new InternalError(MessageFormat.format(
|
||||
RESOURCE.getString(DriverResource.BAD_OPTION),
|
||||
opt, avProps.get(opt)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -219,7 +227,9 @@ class Driver {
|
||||
if (packfile.toLowerCase().endsWith(".pack") ||
|
||||
packfile.toLowerCase().endsWith(".pac") ||
|
||||
packfile.toLowerCase().endsWith(".gz")) {
|
||||
System.err.println(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT),packfile));
|
||||
System.err.println(MessageFormat.format(
|
||||
RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT),
|
||||
packfile));
|
||||
printUsage(doPack, false, System.err);
|
||||
System.exit(2);
|
||||
}
|
||||
|
174
jdk/src/share/classes/com/sun/java/util/jar/pack/FixedList.java
Normal file
174
jdk/src/share/classes/com/sun/java/util/jar/pack/FixedList.java
Normal file
@ -0,0 +1,174 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
|
||||
/*
|
||||
* @author ksrini
|
||||
*/
|
||||
|
||||
/*
|
||||
* This class provides an ArrayList implementation which has a fixed size,
|
||||
* thus all the operations which modifies the size have been rendered
|
||||
* inoperative. This essentially allows us to use generified array
|
||||
* lists in lieu of arrays.
|
||||
*/
|
||||
final class FixedList<E> implements List<E> {
|
||||
|
||||
private final ArrayList<E> flist;
|
||||
|
||||
protected FixedList(int capacity) {
|
||||
flist = new ArrayList<>(capacity);
|
||||
// initialize the list to null
|
||||
for (int i = 0 ; i < capacity ; i++) {
|
||||
flist.add(null);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public int size() {
|
||||
return flist.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return flist.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return flist.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<E> iterator() {
|
||||
return flist.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
return flist.toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T[] toArray(T[] a) {
|
||||
return flist.toArray(a);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(E e) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object o) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsAll(Collection<?> c) {
|
||||
return flist.containsAll(c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(Collection<? extends E> c) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(int index, Collection<? extends E> c) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeAll(Collection<?> c) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean retainAll(Collection<?> c) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public E get(int index) {
|
||||
return flist.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public E set(int index, E element) {
|
||||
return flist.set(index, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int index, E element) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public E remove(int index) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("operation not permitted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int indexOf(Object o) {
|
||||
return flist.indexOf(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int lastIndexOf(Object o) {
|
||||
return flist.lastIndexOf(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<E> listIterator() {
|
||||
return flist.listIterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<E> listIterator(int index) {
|
||||
return flist.listIterator(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return flist.subList(fromIndex, toIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FixedList{" + "plist=" + flist + '}';
|
||||
}
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ import java.util.Iterator;
|
||||
*
|
||||
* @author John Rose
|
||||
*/
|
||||
class Fixups extends AbstractCollection implements Constants {
|
||||
final class Fixups extends AbstractCollection {
|
||||
byte[] bytes; // the subject of the relocations
|
||||
int head; // desc locating first reloc
|
||||
int tail; // desc locating last reloc
|
||||
@ -99,7 +99,7 @@ class Fixups extends AbstractCollection implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
public void visitRefs(Collection refs) {
|
||||
public void visitRefs(Collection<Entry> refs) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
refs.add(entries[i]);
|
||||
}
|
||||
@ -124,6 +124,7 @@ class Fixups extends AbstractCollection implements Constants {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setBytes(byte[] newBytes) {
|
||||
if (bytes == newBytes) return;
|
||||
ArrayList old = null;
|
||||
@ -278,7 +279,7 @@ class Fixups extends AbstractCollection implements Constants {
|
||||
return new Fixup(nextDesc(), entries[thisIndex]);
|
||||
}
|
||||
int nextDesc() {
|
||||
int thisIndex = index++;
|
||||
index++;
|
||||
int thisDesc = next;
|
||||
if (index < size) {
|
||||
// Fetch next desc eagerly, in case this fixup gets finalized.
|
||||
@ -310,6 +311,7 @@ class Fixups extends AbstractCollection implements Constants {
|
||||
public boolean add(Object fixup) {
|
||||
return add((Fixup) fixup);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
public boolean addAll(Collection c) {
|
||||
if (c instanceof Fixups) {
|
||||
// Use knowledge of Itr structure to avoid building little structs.
|
||||
@ -420,7 +422,7 @@ class Fixups extends AbstractCollection implements Constants {
|
||||
|
||||
// Iterate over all the references in this set of fixups.
|
||||
public static
|
||||
void visitRefs(Object fixups, Collection refs) {
|
||||
void visitRefs(Object fixups, Collection<Entry> refs) {
|
||||
if (fixups == null) {
|
||||
} else if (!(fixups instanceof Fixups)) {
|
||||
// Special convention; see above.
|
||||
|
@ -34,7 +34,7 @@ import java.util.Arrays;
|
||||
* Histogram derived from an integer array of events (int[]).
|
||||
* @author John Rose
|
||||
*/
|
||||
class Histogram {
|
||||
final class Histogram {
|
||||
// Compact histogram representation: 4 bytes per distinct value,
|
||||
// plus 5 words per distinct count.
|
||||
protected final int[][] matrix; // multi-row matrix {{counti,valueij...}}
|
||||
@ -304,7 +304,7 @@ class Histogram {
|
||||
public
|
||||
String[] getRowTitles(String name) {
|
||||
int totalUnique = getTotalLength();
|
||||
int totalWeight = getTotalWeight();
|
||||
int ltotalWeight = getTotalWeight();
|
||||
String[] histTitles = new String[matrix.length];
|
||||
int cumWeight = 0;
|
||||
int cumUnique = 0;
|
||||
@ -314,7 +314,7 @@ class Histogram {
|
||||
int weight = getRowWeight(i);
|
||||
cumWeight += weight;
|
||||
cumUnique += unique;
|
||||
long wpct = ((long)cumWeight * 100 + totalWeight/2) / totalWeight;
|
||||
long wpct = ((long)cumWeight * 100 + ltotalWeight/2) / ltotalWeight;
|
||||
long upct = ((long)cumUnique * 100 + totalUnique/2) / totalUnique;
|
||||
double len = getRowBitLength(i);
|
||||
assert(0.1 > Math.abs(len - getBitLength(matrix[i][1])));
|
||||
@ -346,14 +346,14 @@ class Histogram {
|
||||
public
|
||||
void print(String name, String[] histTitles, PrintStream out) {
|
||||
int totalUnique = getTotalLength();
|
||||
int totalWeight = getTotalWeight();
|
||||
int ltotalWeight = getTotalWeight();
|
||||
double tlen = getBitLength();
|
||||
double avgLen = tlen / totalWeight;
|
||||
double avg = (double) totalWeight / totalUnique;
|
||||
double avgLen = tlen / ltotalWeight;
|
||||
double avg = (double) ltotalWeight / totalUnique;
|
||||
String title = (name
|
||||
+" len="+round(tlen,10)
|
||||
+" avgLen="+round(avgLen,10)
|
||||
+" weight("+totalWeight+")"
|
||||
+" weight("+ltotalWeight+")"
|
||||
+" unique["+totalUnique+"]"
|
||||
+" avgWeight("+round(avg,100)+")");
|
||||
if (histTitles == null) {
|
||||
@ -363,9 +363,9 @@ class Histogram {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < matrix.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(" "+histTitles[i]+" {");
|
||||
buf.append(" ").append(histTitles[i]).append(" {");
|
||||
for (int j = 1; j < matrix[i].length; j++) {
|
||||
buf.append(" "+matrix[i][j]);
|
||||
buf.append(" ").append(matrix[i][j]);
|
||||
}
|
||||
buf.append(" }");
|
||||
out.println(buf);
|
||||
@ -603,7 +603,7 @@ class Histogram {
|
||||
private static
|
||||
int[] maybeSort(int[] values) {
|
||||
if (!isSorted(values, 0, false)) {
|
||||
values = (int[]) values.clone();
|
||||
values = values.clone();
|
||||
Arrays.sort(values);
|
||||
}
|
||||
return values;
|
||||
|
@ -26,13 +26,15 @@
|
||||
package com.sun.java.util.jar.pack;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* A parsed bytecode instruction.
|
||||
* Provides accessors to various relevant bits.
|
||||
* @author John Rose
|
||||
*/
|
||||
class Instruction implements Constants {
|
||||
class Instruction {
|
||||
protected byte[] bytes; // bytecodes
|
||||
protected int pc; // location of this instruction
|
||||
protected int bc; // opcode of this instruction
|
||||
@ -91,8 +93,8 @@ class Instruction implements Constants {
|
||||
|
||||
/** A fake instruction at this pc whose next() will be at nextpc. */
|
||||
public Instruction forceNextPC(int nextpc) {
|
||||
int length = nextpc - pc;
|
||||
return new Instruction(bytes, pc, -1, -1, length);
|
||||
int llength = nextpc - pc;
|
||||
return new Instruction(bytes, pc, -1, -1, llength);
|
||||
}
|
||||
|
||||
public static Instruction at(byte[] bytes, int pc) {
|
||||
@ -315,12 +317,24 @@ class Instruction implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
/** Two insns are equal if they have the same bytes. */
|
||||
/** Two instructions are equal if they have the same bytes. */
|
||||
public boolean equals(Object o) {
|
||||
return (o instanceof Instruction) && equals((Instruction)o);
|
||||
return (o != null) && (o.getClass() == Instruction.class)
|
||||
&& equals((Instruction) o);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
int hash = 3;
|
||||
hash = 11 * hash + Arrays.hashCode(this.bytes);
|
||||
hash = 11 * hash + this.pc;
|
||||
hash = 11 * hash + this.bc;
|
||||
hash = 11 * hash + this.w;
|
||||
hash = 11 * hash + this.length;
|
||||
return hash;
|
||||
}
|
||||
|
||||
public boolean equals(Instruction that) {
|
||||
if (this.pc != that.pc) return false;
|
||||
if (this.bc != that.bc) return false;
|
||||
if (this.w != that.w) return false;
|
||||
if (this.length != that.length) return false;
|
||||
|
@ -170,8 +170,8 @@ class NativeUnpack {
|
||||
|
||||
void run(InputStream inRaw, JarOutputStream jstream,
|
||||
ByteBuffer presetInput) throws IOException {
|
||||
BufferedInputStream in = new BufferedInputStream(inRaw);
|
||||
this.in = in; // for readInputFn to see
|
||||
BufferedInputStream in0 = new BufferedInputStream(inRaw);
|
||||
this.in = in0; // for readInputFn to see
|
||||
_verbose = _props.getInteger(Utils.DEBUG_VERBOSE);
|
||||
// Fix for BugId: 4902477, -unpack.modification.time = 1059010598000
|
||||
// TODO eliminate and fix in unpack.cpp
|
||||
@ -224,7 +224,7 @@ class NativeUnpack {
|
||||
if (_verbose > 0)
|
||||
Utils.log.info("bytes consumed = "+consumed);
|
||||
if (presetInput == null &&
|
||||
!Utils.isPackMagic(Utils.readMagic(in))) {
|
||||
!Utils.isPackMagic(Utils.readMagic(in0))) {
|
||||
break;
|
||||
}
|
||||
if (_verbose > 0 ) {
|
||||
|
@ -52,12 +52,13 @@ import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.jar.JarFile;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Define the main data structure transmitted by pack/unpack.
|
||||
* @author John Rose
|
||||
*/
|
||||
class Package implements Constants {
|
||||
class Package {
|
||||
int verbose;
|
||||
{
|
||||
PropMap pmap = Utils.currentPropMap();
|
||||
@ -109,9 +110,9 @@ class Package implements Constants {
|
||||
public static final Attribute.Layout attrCodeEmpty;
|
||||
public static final Attribute.Layout attrInnerClassesEmpty;
|
||||
public static final Attribute.Layout attrSourceFileSpecial;
|
||||
public static final Map attrDefs;
|
||||
public static final Map<Attribute.Layout, Attribute> attrDefs;
|
||||
static {
|
||||
HashMap<Layout, Attribute> ad = new HashMap<>(3);
|
||||
Map<Layout, Attribute> ad = new HashMap<>(3);
|
||||
attrCodeEmpty = Attribute.define(ad, ATTR_CONTEXT_METHOD,
|
||||
"Code", "").layout();
|
||||
attrInnerClassesEmpty = Attribute.define(ad, ATTR_CONTEXT_CLASS,
|
||||
@ -130,8 +131,7 @@ class Package implements Constants {
|
||||
*/
|
||||
int getHighestClassVersion() {
|
||||
int res = 0; // initial low value
|
||||
for (Iterator i = classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : classes) {
|
||||
int ver = cls.getVersion();
|
||||
if (res < ver) res = ver;
|
||||
}
|
||||
@ -187,7 +187,7 @@ class Package implements Constants {
|
||||
return classes;
|
||||
}
|
||||
|
||||
public
|
||||
public final
|
||||
class Class extends Attribute.Holder implements Comparable {
|
||||
public Package getPackage() { return Package.this; }
|
||||
|
||||
@ -232,8 +232,8 @@ class Package implements Constants {
|
||||
initFile(newStub(classFile));
|
||||
}
|
||||
|
||||
List getFields() { return fields == null ? noFields : fields; }
|
||||
List getMethods() { return methods == null ? noMethods : methods; }
|
||||
List<Field> getFields() { return fields == null ? noFields : fields; }
|
||||
List<Method> getMethods() { return methods == null ? noMethods : methods; }
|
||||
|
||||
public String getName() {
|
||||
return thisClass.stringValue();
|
||||
@ -264,7 +264,7 @@ class Package implements Constants {
|
||||
if (olda == null)
|
||||
return; // no SourceFile attr.
|
||||
String obvious = getObviousSourceFile();
|
||||
ArrayList ref = new ArrayList(1);
|
||||
List<Entry> ref = new ArrayList<>(1);
|
||||
olda.visitRefs(this, VRM_PACKAGE, ref);
|
||||
Utf8Entry sfName = (Utf8Entry) ref.get(0);
|
||||
Attribute a = olda;
|
||||
@ -322,7 +322,7 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
public void setInnerClasses(Collection<InnerClass> ics) {
|
||||
innerClasses = (ics == null) ? null : new ArrayList<InnerClass>(ics);
|
||||
innerClasses = (ics == null) ? null : new ArrayList<>(ics);
|
||||
// Edit the attribute list, if necessary.
|
||||
Attribute a = getAttribute(attrInnerClassesEmpty);
|
||||
if (innerClasses != null && a == null)
|
||||
@ -341,7 +341,7 @@ class Package implements Constants {
|
||||
* with that of Package.this.allInnerClasses.
|
||||
*/
|
||||
public List<InnerClass> computeGloballyImpliedICs() {
|
||||
HashSet<Entry> cpRefs = new HashSet<>();
|
||||
Set<Entry> cpRefs = new HashSet<>();
|
||||
{ // This block temporarily displaces this.innerClasses.
|
||||
ArrayList<InnerClass> innerClassesSaved = innerClasses;
|
||||
innerClasses = null; // ignore for the moment
|
||||
@ -350,7 +350,7 @@ class Package implements Constants {
|
||||
}
|
||||
ConstantPool.completeReferencesIn(cpRefs, true);
|
||||
|
||||
HashSet<Entry> icRefs = new HashSet<>();
|
||||
Set<Entry> icRefs = new HashSet<>();
|
||||
for (Entry e : cpRefs) {
|
||||
// Restrict cpRefs to InnerClasses entries only.
|
||||
if (!(e instanceof ClassEntry)) continue;
|
||||
@ -390,7 +390,7 @@ class Package implements Constants {
|
||||
List<InnerClass> impliedICs = computeGloballyImpliedICs();
|
||||
List<InnerClass> actualICs = getInnerClasses();
|
||||
if (actualICs == null)
|
||||
actualICs = Collections.EMPTY_LIST;
|
||||
actualICs = Collections.emptyList();
|
||||
|
||||
// Symmetric difference is calculated from I, A like this:
|
||||
// diff = (I+A) - (I*A)
|
||||
@ -409,7 +409,7 @@ class Package implements Constants {
|
||||
// Diff is A since I is empty.
|
||||
}
|
||||
// (I*A) is non-trivial
|
||||
HashSet<InnerClass> center = new HashSet<>(actualICs);
|
||||
Set<InnerClass> center = new HashSet<>(actualICs);
|
||||
center.retainAll(new HashSet<>(impliedICs));
|
||||
impliedICs.addAll(actualICs);
|
||||
impliedICs.removeAll(center);
|
||||
@ -443,7 +443,7 @@ class Package implements Constants {
|
||||
} else if (actualICs == null) {
|
||||
// No local IC attribute, even though some are implied.
|
||||
// Signal with trivial attribute.
|
||||
localICs = Collections.EMPTY_LIST;
|
||||
localICs = Collections.emptyList();
|
||||
} else {
|
||||
// Transmit a non-empty diff, which will create
|
||||
// a local ICs attribute.
|
||||
@ -588,7 +588,7 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
public void strip(String attrName) {
|
||||
if (attrName == "Code")
|
||||
if ("Code".equals(attrName))
|
||||
code = null;
|
||||
if (code != null)
|
||||
code.strip(attrName);
|
||||
@ -622,7 +622,7 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
public void strip(String attrName) {
|
||||
if (attrName == "InnerClass")
|
||||
if ("InnerClass".equals(attrName))
|
||||
innerClasses = null;
|
||||
for (int isM = 0; isM <= 1; isM++) {
|
||||
ArrayList members = (isM == 0) ? fields : methods;
|
||||
@ -639,9 +639,7 @@ class Package implements Constants {
|
||||
if (verbose > 2) Utils.log.fine("visitRefs "+this);
|
||||
refs.add(thisClass);
|
||||
refs.add(superClass);
|
||||
for (int i = 0; i < interfaces.length; i++) {
|
||||
refs.add(interfaces[i]);
|
||||
}
|
||||
refs.addAll(Arrays.asList(interfaces));
|
||||
for (int isM = 0; isM <= 1; isM++) {
|
||||
ArrayList members = (isM == 0) ? fields : methods;
|
||||
if (members == null) continue;
|
||||
@ -741,7 +739,7 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
public List<File> getClassStubs() {
|
||||
ArrayList<File> classStubs = new ArrayList<>(classes.size());
|
||||
List<File> classStubs = new ArrayList<>(classes.size());
|
||||
for (Class cls : classes) {
|
||||
assert(cls.file.isClassStub());
|
||||
classStubs.add(cls.file);
|
||||
@ -749,8 +747,7 @@ class Package implements Constants {
|
||||
return classStubs;
|
||||
}
|
||||
|
||||
public
|
||||
class File implements Comparable {
|
||||
public final class File implements Comparable {
|
||||
String nameString; // true name of this file
|
||||
Utf8Entry name;
|
||||
int modtime = NO_MODTIME;
|
||||
@ -792,8 +789,10 @@ class Package implements Constants {
|
||||
// The nameString is the key. Ignore other things.
|
||||
// (Note: The name might be "", in the case of a trivial class stub.)
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || (o.getClass() != File.class))
|
||||
return false;
|
||||
File that = (File)o;
|
||||
return that.nameString == this.nameString;
|
||||
return that.nameString.equals(this.nameString);
|
||||
}
|
||||
public int hashCode() {
|
||||
return nameString.hashCode();
|
||||
@ -816,9 +815,9 @@ class Package implements Constants {
|
||||
return getFileName(null);
|
||||
}
|
||||
public java.io.File getFileName(java.io.File parent) {
|
||||
String name = this.nameString;
|
||||
String lname = this.nameString;
|
||||
//if (name.startsWith("./")) name = name.substring(2);
|
||||
String fname = name.replace('/', java.io.File.separatorChar);
|
||||
String fname = lname.replace('/', java.io.File.separatorChar);
|
||||
return new java.io.File(parent, fname);
|
||||
}
|
||||
|
||||
@ -834,7 +833,7 @@ class Package implements Constants {
|
||||
}
|
||||
public long getFileLength() {
|
||||
long len = 0;
|
||||
if (prepend == null && append == null) return 0;
|
||||
if (prepend == null || append == null) return 0;
|
||||
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
|
||||
byte[] block = (byte[]) i.next();
|
||||
len += block.length;
|
||||
@ -843,7 +842,7 @@ class Package implements Constants {
|
||||
return len;
|
||||
}
|
||||
public void writeTo(OutputStream out) throws IOException {
|
||||
if (prepend == null && append == null) return;
|
||||
if (prepend == null || append == null) return;
|
||||
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
|
||||
byte[] block = (byte[]) i.next();
|
||||
out.write(block);
|
||||
@ -859,8 +858,8 @@ class Package implements Constants {
|
||||
}
|
||||
public InputStream getInputStream() {
|
||||
InputStream in = new ByteArrayInputStream(append.toByteArray());
|
||||
if (prepend.size() == 0) return in;
|
||||
ArrayList<InputStream> isa = new ArrayList<>(prepend.size()+1);
|
||||
if (prepend.isEmpty()) return in;
|
||||
List<InputStream> isa = new ArrayList<>(prepend.size()+1);
|
||||
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
|
||||
byte[] bytes = (byte[]) i.next();
|
||||
isa.add(new ByteArrayInputStream(bytes));
|
||||
@ -897,11 +896,11 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
// Is there a globally declared table of inner classes?
|
||||
ArrayList<InnerClass> allInnerClasses = new ArrayList<>();
|
||||
HashMap<ClassEntry, InnerClass> allInnerClassesByThis;
|
||||
List<InnerClass> allInnerClasses = new ArrayList<>();
|
||||
Map<ClassEntry, InnerClass> allInnerClassesByThis;
|
||||
|
||||
public
|
||||
List getAllInnerClasses() {
|
||||
List<InnerClass> getAllInnerClasses() {
|
||||
return allInnerClasses;
|
||||
}
|
||||
|
||||
@ -955,16 +954,17 @@ class Package implements Constants {
|
||||
if (parse == null) return false;
|
||||
String pkgOuter = parse[0];
|
||||
//String number = parse[1];
|
||||
String name = parse[2];
|
||||
String lname = parse[2];
|
||||
String haveName = (this.name == null) ? null : this.name.stringValue();
|
||||
String haveOuter = (outerClass == null) ? null : outerClass.stringValue();
|
||||
boolean predictable = (name == haveName && pkgOuter == haveOuter);
|
||||
boolean lpredictable = (lname == haveName && pkgOuter == haveOuter);
|
||||
//System.out.println("computePredictable => "+predictable);
|
||||
return predictable;
|
||||
return lpredictable;
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if (o == null) return false;
|
||||
if (o == null || o.getClass() != InnerClass.class)
|
||||
return false;
|
||||
InnerClass that = (InnerClass)o;
|
||||
return eq(this.thisClass, that.thisClass)
|
||||
&& eq(this.outerClass, that.outerClass)
|
||||
@ -999,7 +999,7 @@ class Package implements Constants {
|
||||
|
||||
// Helper for building InnerClasses attributes.
|
||||
static private
|
||||
void visitInnerClassRefs(Collection innerClasses, int mode, Collection<Entry> refs) {
|
||||
void visitInnerClassRefs(Collection<InnerClass> innerClasses, int mode, Collection<Entry> refs) {
|
||||
if (innerClasses == null) {
|
||||
return; // no attribute; nothing to do
|
||||
}
|
||||
@ -1008,8 +1008,7 @@ class Package implements Constants {
|
||||
}
|
||||
if (innerClasses.size() > 0) {
|
||||
// Count the entries themselves:
|
||||
for (Iterator i = innerClasses.iterator(); i.hasNext(); ) {
|
||||
InnerClass c = (InnerClass) i.next();
|
||||
for (InnerClass c : innerClasses) {
|
||||
c.visitRefs(mode, refs);
|
||||
}
|
||||
}
|
||||
@ -1117,43 +1116,43 @@ class Package implements Constants {
|
||||
// what is one of { Debug, Compile, Constant, Exceptions, InnerClasses }
|
||||
if (verbose > 0)
|
||||
Utils.log.info("Stripping "+what.toLowerCase()+" data and attributes...");
|
||||
if (what == "Debug") {
|
||||
strip("SourceFile");
|
||||
strip("LineNumberTable");
|
||||
strip("LocalVariableTable");
|
||||
strip("LocalVariableTypeTable");
|
||||
}
|
||||
if (what == "Compile") {
|
||||
// Keep the inner classes normally.
|
||||
// Although they have no effect on execution,
|
||||
// the Reflection API exposes them, and JCK checks them.
|
||||
// NO: // strip("InnerClasses");
|
||||
strip("Deprecated");
|
||||
strip("Synthetic");
|
||||
}
|
||||
if (what == "Exceptions") {
|
||||
// Keep the exceptions normally.
|
||||
// Although they have no effect on execution,
|
||||
// the Reflection API exposes them, and JCK checks them.
|
||||
strip("Exceptions");
|
||||
}
|
||||
if (what == "Constant") {
|
||||
stripConstantFields();
|
||||
switch (what) {
|
||||
case "Debug":
|
||||
strip("SourceFile");
|
||||
strip("LineNumberTable");
|
||||
strip("LocalVariableTable");
|
||||
strip("LocalVariableTypeTable");
|
||||
break;
|
||||
case "Compile":
|
||||
// Keep the inner classes normally.
|
||||
// Although they have no effect on execution,
|
||||
// the Reflection API exposes them, and JCK checks them.
|
||||
// NO: // strip("InnerClasses");
|
||||
strip("Deprecated");
|
||||
strip("Synthetic");
|
||||
break;
|
||||
case "Exceptions":
|
||||
// Keep the exceptions normally.
|
||||
// Although they have no effect on execution,
|
||||
// the Reflection API exposes them, and JCK checks them.
|
||||
strip("Exceptions");
|
||||
break;
|
||||
case "Constant":
|
||||
stripConstantFields();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void trimToSize() {
|
||||
classes.trimToSize();
|
||||
for (Iterator i = classes.iterator(); i.hasNext(); ) {
|
||||
Class c = (Class)i.next();
|
||||
for (Class c : classes) {
|
||||
c.trimToSize();
|
||||
}
|
||||
files.trimToSize();
|
||||
}
|
||||
|
||||
public void strip(String attrName) {
|
||||
for (Iterator i = classes.iterator(); i.hasNext(); ) {
|
||||
Class c = (Class)i.next();
|
||||
for (Class c : classes) {
|
||||
c.strip(attrName);
|
||||
}
|
||||
}
|
||||
@ -1166,10 +1165,9 @@ class Package implements Constants {
|
||||
}
|
||||
|
||||
public void stripConstantFields() {
|
||||
for (Iterator i = classes.iterator(); i.hasNext(); ) {
|
||||
Class c = (Class) i.next();
|
||||
for (Iterator j = c.fields.iterator(); j.hasNext(); ) {
|
||||
Class.Field f = (Class.Field) j.next();
|
||||
for (Class c : classes) {
|
||||
for (Iterator<Class.Field> j = c.fields.iterator(); j.hasNext(); ) {
|
||||
Class.Field f = j.next();
|
||||
if (Modifier.isFinal(f.flags)
|
||||
// do not strip non-static finals:
|
||||
&& Modifier.isStatic(f.flags)
|
||||
@ -1189,8 +1187,7 @@ class Package implements Constants {
|
||||
c.visitRefs(mode, refs);
|
||||
}
|
||||
if (mode != VRM_CLASSIC) {
|
||||
for (Iterator i = files.iterator(); i.hasNext(); ) {
|
||||
File f = (File)i.next();
|
||||
for (File f : files) {
|
||||
f.visitRefs(mode, refs);
|
||||
}
|
||||
visitInnerClassRefs(allInnerClasses, mode, refs);
|
||||
@ -1202,6 +1199,7 @@ class Package implements Constants {
|
||||
// compress better. It also moves classes to the end of the
|
||||
// file order. It also removes JAR directory entries, which
|
||||
// are useless.
|
||||
@SuppressWarnings("unchecked")
|
||||
void reorderFiles(boolean keepClassOrder, boolean stripDirectories) {
|
||||
// First reorder the classes, if that is allowed.
|
||||
if (!keepClassOrder) {
|
||||
@ -1214,9 +1212,9 @@ class Package implements Constants {
|
||||
// modtimes and options are not transmitted, and the stub files
|
||||
// for class files do not need to be transmitted at all.
|
||||
// Also
|
||||
List stubs = getClassStubs();
|
||||
for (Iterator i = files.iterator(); i.hasNext(); ) {
|
||||
File file = (File) i.next();
|
||||
List<File> stubs = getClassStubs();
|
||||
for (Iterator<File> i = files.iterator(); i.hasNext(); ) {
|
||||
File file = i.next();
|
||||
if (file.isClassStub() ||
|
||||
(stripDirectories && file.isDirectory())) {
|
||||
i.remove();
|
||||
@ -1259,8 +1257,8 @@ class Package implements Constants {
|
||||
|
||||
void trimStubs() {
|
||||
// Restore enough non-trivial stubs to carry the needed class modtimes.
|
||||
for (ListIterator i = files.listIterator(files.size()); i.hasPrevious(); ) {
|
||||
File file = (File) i.previous();
|
||||
for (ListIterator<File> i = files.listIterator(files.size()); i.hasPrevious(); ) {
|
||||
File file = i.previous();
|
||||
if (!file.isTrivialClassStub()) {
|
||||
if (verbose > 1)
|
||||
Utils.log.fine("Keeping last non-trivial "+file);
|
||||
@ -1309,7 +1307,7 @@ class Package implements Constants {
|
||||
|
||||
// Use this before writing the class files.
|
||||
void ensureAllClassFiles() {
|
||||
HashSet<File> fileSet = new HashSet<>(files);
|
||||
Set<File> fileSet = new HashSet<>(files);
|
||||
for (Class cls : classes) {
|
||||
// Add to the end of ths list:
|
||||
if (!fileSet.contains(cls.file))
|
||||
@ -1317,8 +1315,8 @@ class Package implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
static final List noObjects = Arrays.asList(new Object[0]);
|
||||
static final List noFields = Arrays.asList(new Class.Field[0]);
|
||||
static final List noMethods = Arrays.asList(new Class.Method[0]);
|
||||
static final List noInnerClasses = Arrays.asList(new InnerClass[0]);
|
||||
static final List<Object> noObjects = Arrays.asList(new Object[0]);
|
||||
static final List<Class.Field> noFields = Arrays.asList(new Class.Field[0]);
|
||||
static final List<Class.Method> noMethods = Arrays.asList(new Class.Method[0]);
|
||||
static final List<InnerClass> noInnerClasses = Arrays.asList(new InnerClass[0]);
|
||||
}
|
||||
|
@ -32,11 +32,28 @@ import com.sun.java.util.jar.pack.ConstantPool.Index;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.MemberEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
|
||||
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import com.sun.java.util.jar.pack.Package.Class;
|
||||
import com.sun.java.util.jar.pack.Package.File;
|
||||
import com.sun.java.util.jar.pack.Package.InnerClass;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.PrintStream;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Set;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Reader for a package file.
|
||||
@ -418,7 +435,7 @@ class PackageReader extends BandStructure {
|
||||
cp_Int.readFrom(in);
|
||||
for (int i = 0; i < cpMap.length; i++) {
|
||||
int x = cp_Int.getInt(); // coding handles signs OK
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(new Integer(x));
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(x);
|
||||
}
|
||||
cp_Int.doneDisbursing();
|
||||
break;
|
||||
@ -428,7 +445,7 @@ class PackageReader extends BandStructure {
|
||||
for (int i = 0; i < cpMap.length; i++) {
|
||||
int x = cp_Float.getInt();
|
||||
float fx = Float.intBitsToFloat(x);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(new Float(fx));
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(fx);
|
||||
}
|
||||
cp_Float.doneDisbursing();
|
||||
break;
|
||||
@ -444,7 +461,7 @@ class PackageReader extends BandStructure {
|
||||
long hi = cp_Long_hi.getInt();
|
||||
long lo = cp_Long_lo.getInt();
|
||||
long x = (hi << 32) + ((lo << 32) >>> 32);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(new Long(x));
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(x);
|
||||
}
|
||||
cp_Long_hi.doneDisbursing();
|
||||
cp_Long_lo.doneDisbursing();
|
||||
@ -462,7 +479,7 @@ class PackageReader extends BandStructure {
|
||||
long lo = cp_Double_lo.getInt();
|
||||
long x = (hi << 32) + ((lo << 32) >>> 32);
|
||||
double dx = Double.longBitsToDouble(x);
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(new Double(dx));
|
||||
cpMap[i] = ConstantPool.getLiteralEntry(dx);
|
||||
}
|
||||
cp_Double_hi.doneDisbursing();
|
||||
cp_Double_lo.doneDisbursing();
|
||||
@ -645,7 +662,7 @@ class PackageReader extends BandStructure {
|
||||
cp_Utf8_big_suffix.doneDisbursing();
|
||||
}
|
||||
|
||||
HashMap utf8Signatures; // Utf8Entry->SignatureEntry
|
||||
Map<Utf8Entry, SignatureEntry> utf8Signatures;
|
||||
|
||||
void readSignatureBands(Entry[] cpMap) throws IOException {
|
||||
// cp_Signature:
|
||||
@ -663,7 +680,7 @@ class PackageReader extends BandStructure {
|
||||
cp_Signature_classes.expectLength(getIntTotal(numSigClasses));
|
||||
cp_Signature_classes.readFrom(in);
|
||||
cp_Signature_classes.setIndex(getCPIndex(CONSTANT_Class));
|
||||
utf8Signatures = new HashMap();
|
||||
utf8Signatures = new HashMap<>();
|
||||
for (int i = 0; i < cpMap.length; i++) {
|
||||
Utf8Entry formRef = (Utf8Entry) cp_Signature_form.getRef();
|
||||
ClassEntry[] classRefs = new ClassEntry[numSigClasses[i]];
|
||||
@ -863,7 +880,7 @@ class PackageReader extends BandStructure {
|
||||
ic_name.expectLength(longICCount);
|
||||
ic_name.readFrom(in);
|
||||
ic_flags.resetForSecondPass();
|
||||
ArrayList icList = new ArrayList(numInnerClasses);
|
||||
List<InnerClass> icList = new ArrayList<>(numInnerClasses);
|
||||
for (int i = 0; i < numInnerClasses; i++) {
|
||||
int flags = ic_flags.getInt();
|
||||
boolean longForm = (flags & ACC_IC_LONG_FORM) != 0;
|
||||
@ -876,7 +893,7 @@ class PackageReader extends BandStructure {
|
||||
thisName = (Utf8Entry) ic_name.getRef();
|
||||
} else {
|
||||
String n = thisClass.stringValue();
|
||||
String[] parse = pkg.parseInnerClassName(n);
|
||||
String[] parse = Package.parseInnerClassName(n);
|
||||
assert(parse != null);
|
||||
String pkgOuter = parse[0];
|
||||
//String number = parse[1];
|
||||
@ -905,7 +922,7 @@ class PackageReader extends BandStructure {
|
||||
|
||||
void readLocalInnerClasses(Class cls) throws IOException {
|
||||
int nc = class_InnerClasses_N.getInt();
|
||||
ArrayList localICs = new ArrayList(nc);
|
||||
List<InnerClass> localICs = new ArrayList<>(nc);
|
||||
for (int i = 0; i < nc; i++) {
|
||||
ClassEntry thisClass = (ClassEntry) class_InnerClasses_RC.getRef();
|
||||
int flags = class_InnerClasses_F.getInt();
|
||||
@ -994,10 +1011,8 @@ class PackageReader extends BandStructure {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Comparator entryOutputOrder = new Comparator() {
|
||||
public int compare(Object o0, Object o1) {
|
||||
Entry e0 = (Entry) o0;
|
||||
Entry e1 = (Entry) o1;
|
||||
Comparator<Entry> entryOutputOrder = new Comparator<>() {
|
||||
public int compare(Entry e0, Entry e1) {
|
||||
int k0 = getOutputIndex(e0);
|
||||
int k1 = getOutputIndex(e1);
|
||||
if (k0 >= 0 && k1 >= 0)
|
||||
@ -1034,9 +1049,8 @@ class PackageReader extends BandStructure {
|
||||
}
|
||||
|
||||
Entry[] reconstructLocalCPMap(Class cls) {
|
||||
HashSet ldcRefs = (HashSet) ldcRefMap.get(cls);
|
||||
HashSet cpRefs = new HashSet();
|
||||
HashSet sigSet = new HashSet();
|
||||
Set<Entry> ldcRefs = ldcRefMap.get(cls);
|
||||
Set<Entry> cpRefs = new HashSet<>();
|
||||
|
||||
// look for constant pool entries:
|
||||
cls.visitRefs(VRM_CLASSIC, cpRefs);
|
||||
@ -1064,8 +1078,7 @@ class PackageReader extends BandStructure {
|
||||
|
||||
// construct a local constant pool
|
||||
int numDoubles = 0;
|
||||
for (Iterator i = cpRefs.iterator(); i.hasNext(); ) {
|
||||
Entry e = (Entry) i.next();
|
||||
for (Entry e : cpRefs) {
|
||||
if (e.isDoubleWord()) numDoubles++;
|
||||
assert(e.tag != CONSTANT_Signature) : (e);
|
||||
}
|
||||
@ -1075,8 +1088,7 @@ class PackageReader extends BandStructure {
|
||||
// Add all ldc operands first.
|
||||
if (ldcRefs != null) {
|
||||
assert(cpRefs.containsAll(ldcRefs));
|
||||
for (Iterator i = ldcRefs.iterator(); i.hasNext(); ) {
|
||||
Entry e = (Entry) i.next();
|
||||
for (Entry e : ldcRefs) {
|
||||
cpMap[fillp++] = e;
|
||||
}
|
||||
assert(fillp == 1+ldcRefs.size());
|
||||
@ -1085,11 +1097,10 @@ class PackageReader extends BandStructure {
|
||||
}
|
||||
|
||||
// Next add all the two-byte references.
|
||||
HashSet wideRefs = cpRefs;
|
||||
Set<Entry> wideRefs = cpRefs;
|
||||
cpRefs = null; // do not use!
|
||||
int narrowLimit = fillp;
|
||||
for (Iterator i = wideRefs.iterator(); i.hasNext(); ) {
|
||||
Entry e = (Entry) i.next();
|
||||
for (Entry e : wideRefs) {
|
||||
cpMap[fillp++] = e;
|
||||
}
|
||||
assert(fillp == narrowLimit+wideRefs.size());
|
||||
@ -1144,7 +1155,7 @@ class PackageReader extends BandStructure {
|
||||
method_descr.expectLength(totalNM);
|
||||
if (verbose > 1) Utils.log.fine("expecting #fields="+totalNF+" and #methods="+totalNM+" in #classes="+numClasses);
|
||||
|
||||
ArrayList fields = new ArrayList(totalNF);
|
||||
List<Class.Field> fields = new ArrayList<>(totalNF);
|
||||
field_descr.readFrom(in);
|
||||
for (int i = 0; i < classes.length; i++) {
|
||||
Class c = classes[i];
|
||||
@ -1160,7 +1171,7 @@ class PackageReader extends BandStructure {
|
||||
countAndReadAttrs(ATTR_CONTEXT_FIELD, fields);
|
||||
fields = null; // release to GC
|
||||
|
||||
ArrayList methods = new ArrayList(totalNM);
|
||||
List<Class.Method> methods = new ArrayList<>(totalNM);
|
||||
method_descr.readFrom(in);
|
||||
for (int i = 0; i < classes.length; i++) {
|
||||
Class c = classes[i];
|
||||
@ -1182,13 +1193,12 @@ class PackageReader extends BandStructure {
|
||||
}
|
||||
|
||||
Code[] allCodes;
|
||||
List codesWithFlags;
|
||||
HashMap ldcRefMap = new HashMap(); // HashMap<Class, HashSet<Entry>>
|
||||
List<Code> codesWithFlags;
|
||||
Map<Class, Set<Entry>> ldcRefMap = new HashMap<>();
|
||||
|
||||
Code[] buildCodeAttrs(List methods) {
|
||||
ArrayList codes = new ArrayList(methods.size());
|
||||
for (Iterator i = methods.iterator(); i.hasNext(); ) {
|
||||
Class.Method m = (Class.Method) i.next();
|
||||
Code[] buildCodeAttrs(List<Class.Method> methods) {
|
||||
List<Code> codes = new ArrayList<>(methods.size());
|
||||
for (Class.Method m : methods) {
|
||||
if (m.getAttribute(attrCodeEmpty) != null) {
|
||||
m.code = new Code(m);
|
||||
codes.add(m.code);
|
||||
@ -1211,7 +1221,7 @@ class PackageReader extends BandStructure {
|
||||
boolean attrsOK = testBit(archiveOptions, AO_HAVE_ALL_CODE_FLAGS);
|
||||
code_headers.expectLength(allCodes.length);
|
||||
code_headers.readFrom(in);
|
||||
ArrayList longCodes = new ArrayList(allCodes.length / 10);
|
||||
List<Code> longCodes = new ArrayList<>(allCodes.length / 10);
|
||||
for (int i = 0; i < allCodes.length; i++) {
|
||||
Code c = allCodes[i];
|
||||
int sc = code_headers.getByte();
|
||||
@ -1238,8 +1248,7 @@ class PackageReader extends BandStructure {
|
||||
code_max_stack.readFrom(in);
|
||||
code_max_na_locals.readFrom(in);
|
||||
code_handler_count.readFrom(in);
|
||||
for (Iterator i = longCodes.iterator(); i.hasNext(); ) {
|
||||
Code c = (Code) i.next();
|
||||
for (Code c : longCodes) {
|
||||
c.setMaxStack( code_max_stack.getInt() );
|
||||
c.setMaxNALocals( code_max_na_locals.getInt() );
|
||||
c.setHandlerCount( code_handler_count.getInt() );
|
||||
@ -1386,8 +1395,9 @@ class PackageReader extends BandStructure {
|
||||
|
||||
// Fetch the attribute layout definitions which govern the bands
|
||||
// we are about to read.
|
||||
Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()];
|
||||
attrDefs[ctype].toArray(defs);
|
||||
List<Attribute.Layout> defList = attrDefs.get(ctype);
|
||||
Attribute.Layout[] defs = new Attribute.Layout[defList.size()];
|
||||
defList.toArray(defs);
|
||||
IntBand xxx_flags_hi = getAttrBand(xxx_attr_bands, AB_FLAGS_HI);
|
||||
IntBand xxx_flags_lo = getAttrBand(xxx_attr_bands, AB_FLAGS_LO);
|
||||
IntBand xxx_attr_count = getAttrBand(xxx_attr_bands, AB_ATTR_COUNT);
|
||||
@ -1450,7 +1460,7 @@ class PackageReader extends BandStructure {
|
||||
bits -= (1L<<ai);
|
||||
nfa += 1;
|
||||
}
|
||||
ArrayList ha = new ArrayList(nfa + noa);
|
||||
List<Attribute> ha = new ArrayList<>(nfa + noa);
|
||||
h.attributes = ha;
|
||||
bits = attrBits; // iterate again
|
||||
for (int ai = 0; bits != 0; ai++) {
|
||||
@ -1516,7 +1526,7 @@ class PackageReader extends BandStructure {
|
||||
if (predef != isPredefinedAttr(ctype, ai))
|
||||
continue; // wrong pass
|
||||
int totalCount = totalCounts[ai];
|
||||
Band[] ab = (Band[]) attrBandTable.get(def);
|
||||
Band[] ab = attrBandTable.get(def);
|
||||
if (def == attrInnerClassesEmpty) {
|
||||
// Special case.
|
||||
// Size the bands as if using the following layout:
|
||||
@ -1571,15 +1581,16 @@ class PackageReader extends BandStructure {
|
||||
ATTR_CONTEXT_NAME[ctype]+" attribute");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
void readAttrs(int ctype, Collection holders) throws IOException {
|
||||
// Decode band values into attributes.
|
||||
HashSet sawDefs = new HashSet();
|
||||
Set<Attribute.Layout> sawDefs = new HashSet<>();
|
||||
ByteArrayOutputStream buf = new ByteArrayOutputStream();
|
||||
for (Iterator i = holders.iterator(); i.hasNext(); ) {
|
||||
final Attribute.Holder h = (Attribute.Holder) i.next();
|
||||
if (h.attributes == null) continue;
|
||||
for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) {
|
||||
Attribute a = (Attribute) j.next();
|
||||
for (ListIterator<Attribute> j = h.attributes.listIterator(); j.hasNext(); ) {
|
||||
Attribute a = j.next();
|
||||
Attribute.Layout def = a.layout();
|
||||
if (def.bandCount == 0) {
|
||||
if (def == attrInnerClassesEmpty) {
|
||||
@ -1595,7 +1606,7 @@ class PackageReader extends BandStructure {
|
||||
if (isCV) setConstantValueIndex((Class.Field)h);
|
||||
if (verbose > 2)
|
||||
Utils.log.fine("read "+a+" in "+h);
|
||||
final Band[] ab = (Band[]) attrBandTable.get(def);
|
||||
final Band[] ab = attrBandTable.get(def);
|
||||
// Read one attribute of type def from ab into a byte array.
|
||||
buf.reset();
|
||||
Object fixups = a.unparse(new Attribute.ValueStream() {
|
||||
@ -1617,10 +1628,9 @@ class PackageReader extends BandStructure {
|
||||
}
|
||||
|
||||
// Mark the bands we just used as done disbursing.
|
||||
for (Iterator i = sawDefs.iterator(); i.hasNext(); ) {
|
||||
Attribute.Layout def = (Attribute.Layout) i.next();
|
||||
for (Attribute.Layout def : sawDefs) {
|
||||
if (def == null) continue; // unused index
|
||||
Band[] ab = (Band[]) attrBandTable.get(def);
|
||||
Band[] ab = attrBandTable.get(def);
|
||||
for (int j = 0; j < ab.length; j++) {
|
||||
ab[j].doneDisbursing();
|
||||
}
|
||||
@ -1778,7 +1788,7 @@ class PackageReader extends BandStructure {
|
||||
// scratch buffer for collecting code::
|
||||
byte[] buf = new byte[1<<12];
|
||||
// record of all switch opcodes (these are variable-length)
|
||||
ArrayList allSwitchOps = new ArrayList();
|
||||
List<Integer> allSwitchOps = new ArrayList<>();
|
||||
for (int k = 0; k < allCodes.length; k++) {
|
||||
Code c = allCodes[k];
|
||||
scanOneMethod:
|
||||
@ -1798,7 +1808,7 @@ class PackageReader extends BandStructure {
|
||||
case _tableswitch:
|
||||
case _lookupswitch:
|
||||
bc_case_count.expectMoreLength(1);
|
||||
allSwitchOps.add(new Integer(bc));
|
||||
allSwitchOps.add(bc);
|
||||
break;
|
||||
case _iinc:
|
||||
bc_local.expectMoreLength(1);
|
||||
@ -1866,8 +1876,8 @@ class PackageReader extends BandStructure {
|
||||
|
||||
// To size instruction bands correctly, we need info on switches:
|
||||
bc_case_count.readFrom(in);
|
||||
for (Iterator i = allSwitchOps.iterator(); i.hasNext(); ) {
|
||||
int bc = ((Integer)i.next()).intValue();
|
||||
for (Integer i : allSwitchOps) {
|
||||
int bc = i.intValue();
|
||||
int caseCount = bc_case_count.getInt();
|
||||
bc_label.expectMoreLength(1+caseCount); // default label + cases
|
||||
bc_case_value.expectMoreLength(bc == _tableswitch ? 1 : caseCount);
|
||||
@ -1892,9 +1902,9 @@ class PackageReader extends BandStructure {
|
||||
|
||||
Class curClass = code.thisClass();
|
||||
|
||||
HashSet ldcRefSet = (HashSet) ldcRefMap.get(curClass);
|
||||
Set<Entry> ldcRefSet = ldcRefMap.get(curClass);
|
||||
if (ldcRefSet == null)
|
||||
ldcRefMap.put(curClass, ldcRefSet = new HashSet());
|
||||
ldcRefMap.put(curClass, ldcRefSet = new HashSet<>());
|
||||
|
||||
ClassEntry thisClass = curClass.thisClass;
|
||||
ClassEntry superClass = curClass.superClass;
|
||||
|
@ -45,10 +45,10 @@ import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Writer for a package file.
|
||||
@ -111,12 +111,12 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
}
|
||||
|
||||
HashSet requiredEntries; // for the CP
|
||||
HashMap backCountTable; // for layout callables
|
||||
Set<Entry> requiredEntries; // for the CP
|
||||
Map<Attribute.Layout, int[]> backCountTable; // for layout callables
|
||||
int[][] attrCounts; // count attr. occurences
|
||||
|
||||
void setup() {
|
||||
requiredEntries = new HashSet();
|
||||
requiredEntries = new HashSet<>();
|
||||
setArchiveOptions();
|
||||
trimClassAttributes();
|
||||
collectAttributeLayouts();
|
||||
@ -139,9 +139,7 @@ class PackageWriter extends BandStructure {
|
||||
// Import defaults from package (deflate hint, etc.).
|
||||
archiveOptions |= pkg.default_options;
|
||||
|
||||
for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
|
||||
File file = (File) i.next();
|
||||
|
||||
for (File file : pkg.files) {
|
||||
int modtime = file.modtime;
|
||||
int options = file.options;
|
||||
|
||||
@ -178,16 +176,15 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
}
|
||||
// Decide on default version number (majority rule).
|
||||
HashMap verCounts = new HashMap();
|
||||
Map<Integer, int[]> verCounts = new HashMap<>();
|
||||
int bestCount = 0;
|
||||
int bestVersion = -1;
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
int version = cls.getVersion();
|
||||
int[] var = (int[]) verCounts.get(new Integer(version));
|
||||
int[] var = verCounts.get(version);
|
||||
if (var == null) {
|
||||
var = new int[1];
|
||||
verCounts.put(new Integer(version), var);
|
||||
verCounts.put(version, var);
|
||||
}
|
||||
int count = (var[0] += 1);
|
||||
//System.out.println("version="+version+" count="+count);
|
||||
@ -210,9 +207,7 @@ class PackageWriter extends BandStructure {
|
||||
Package.versionStringOf(pkg.getHighestClassVersion()));
|
||||
|
||||
// Now add explicit pseudo-attrs. to classes with odd versions.
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
|
||||
for (Class cls : pkg.classes) {
|
||||
if (cls.getVersion() != bestVersion) {
|
||||
Attribute a = makeClassFileVersionAttr(cls.minver, cls.majver);
|
||||
if (verbose > 1) {
|
||||
@ -228,8 +223,7 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
|
||||
// Decide if we are transmitting a huge resource file:
|
||||
for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
|
||||
File file = (File) i.next();
|
||||
for (File file : pkg.files) {
|
||||
long len = file.getFileLength();
|
||||
if (len != (int)len) {
|
||||
archiveOptions |= AO_HAVE_FILE_SIZE_HI;
|
||||
@ -244,10 +238,8 @@ class PackageWriter extends BandStructure {
|
||||
// we must declare unconditional presence of code flags.
|
||||
int cost0 = 0;
|
||||
int cost1 = 0;
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) {
|
||||
Class.Method m = (Class.Method) j.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
for (Class.Method m : cls.getMethods()) {
|
||||
if (m.code != null) {
|
||||
if (m.code.attributeSize() == 0) {
|
||||
// cost of a useless unconditional flags byte
|
||||
@ -352,7 +344,7 @@ class PackageWriter extends BandStructure {
|
||||
archive_header_1.putInt(pkg.default_modtime);
|
||||
archive_header_1.putInt(pkg.files.size());
|
||||
} else {
|
||||
assert(pkg.files.size() == 0);
|
||||
assert(pkg.files.isEmpty());
|
||||
}
|
||||
|
||||
if (haveSpecial) {
|
||||
@ -697,8 +689,7 @@ class PackageWriter extends BandStructure {
|
||||
boolean haveModtime = testBit(options, AO_HAVE_FILE_MODTIME);
|
||||
boolean haveOptions = testBit(options, AO_HAVE_FILE_OPTIONS);
|
||||
if (!haveOptions) {
|
||||
for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
|
||||
File file = (File) i.next();
|
||||
for (File file : pkg.files) {
|
||||
if (file.isClassStub()) {
|
||||
haveOptions = true;
|
||||
options |= AO_HAVE_FILE_OPTIONS;
|
||||
@ -711,9 +702,7 @@ class PackageWriter extends BandStructure {
|
||||
options |= AO_HAVE_FILE_HEADERS;
|
||||
archiveOptions = options;
|
||||
}
|
||||
|
||||
for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
|
||||
File file = (File) i.next();
|
||||
for (File file : pkg.files) {
|
||||
file_name.putRef(file.name);
|
||||
long len = file.getFileLength();
|
||||
file_size_lo.putInt((int)len);
|
||||
@ -731,22 +720,20 @@ class PackageWriter extends BandStructure {
|
||||
Utils.log.info("Wrote "+numFiles+" resource files");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
void collectAttributeLayouts() {
|
||||
maxFlags = new int[ATTR_CONTEXT_LIMIT];
|
||||
allLayouts = new HashMap[ATTR_CONTEXT_LIMIT];
|
||||
allLayouts = new FixedList<>(ATTR_CONTEXT_LIMIT);
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
allLayouts[i] = new HashMap();
|
||||
allLayouts.set(i, new HashMap<Attribute.Layout, int[]>());
|
||||
}
|
||||
// Collect maxFlags and allLayouts.
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
visitAttributeLayoutsIn(ATTR_CONTEXT_CLASS, cls);
|
||||
for (Iterator j = cls.getFields().iterator(); j.hasNext(); ) {
|
||||
Class.Field f = (Class.Field) j.next();
|
||||
for (Class.Field f : cls.getFields()) {
|
||||
visitAttributeLayoutsIn(ATTR_CONTEXT_FIELD, f);
|
||||
}
|
||||
for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) {
|
||||
Class.Method m = (Class.Method) j.next();
|
||||
for (Class.Method m : cls.getMethods()) {
|
||||
visitAttributeLayoutsIn(ATTR_CONTEXT_METHOD, m);
|
||||
if (m.code != null) {
|
||||
visitAttributeLayoutsIn(ATTR_CONTEXT_CODE, m.code);
|
||||
@ -755,7 +742,7 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
// If there are many species of attributes, use 63-bit flags.
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
int nl = allLayouts[i].size();
|
||||
int nl = allLayouts.get(i).size();
|
||||
boolean haveLongFlags = haveFlagsHi(i);
|
||||
final int TOO_MANY_ATTRS = 32 /*int flag size*/
|
||||
- 12 /*typical flag bits in use*/
|
||||
@ -781,7 +768,7 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
// Collect counts for both predefs. and custom defs.
|
||||
// Decide on custom, local attribute definitions.
|
||||
backCountTable = new HashMap();
|
||||
backCountTable = new HashMap<>();
|
||||
attrCounts = new int[ATTR_CONTEXT_LIMIT][];
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
// Now the remaining defs in allLayouts[i] need attr. indexes.
|
||||
@ -793,11 +780,12 @@ class PackageWriter extends BandStructure {
|
||||
assert(attrIndexLimit[i] < 64); // all bits fit into a Java long
|
||||
avHiBits &= (1L<<attrIndexLimit[i])-1;
|
||||
int nextLoBit = 0;
|
||||
Map.Entry[] layoutsAndCounts = new Map.Entry[allLayouts[i].size()];
|
||||
allLayouts[i].entrySet().toArray(layoutsAndCounts);
|
||||
Map<Attribute.Layout, int[]> defMap = allLayouts.get(i);
|
||||
Map.Entry[] layoutsAndCounts = new Map.Entry[defMap.size()];
|
||||
defMap.entrySet().toArray(layoutsAndCounts);
|
||||
// Sort by count, most frequent first.
|
||||
// Predefs. participate in this sort, though it does not matter.
|
||||
Arrays.sort(layoutsAndCounts, new Comparator() {
|
||||
Arrays.sort(layoutsAndCounts, new Comparator<>() {
|
||||
public int compare(Object o0, Object o1) {
|
||||
Map.Entry e0 = (Map.Entry) o0;
|
||||
Map.Entry e1 = (Map.Entry) o1;
|
||||
@ -814,7 +802,7 @@ class PackageWriter extends BandStructure {
|
||||
Attribute.Layout def = (Attribute.Layout) e.getKey();
|
||||
int count = ((int[])e.getValue())[0];
|
||||
int index;
|
||||
Integer predefIndex = (Integer) attrIndexTable.get(def);
|
||||
Integer predefIndex = attrIndexTable.get(def);
|
||||
if (predefIndex != null) {
|
||||
// The index is already set.
|
||||
index = predefIndex.intValue();
|
||||
@ -872,29 +860,32 @@ class PackageWriter extends BandStructure {
|
||||
|
||||
// Scratch variables for processing attributes and flags.
|
||||
int[] maxFlags;
|
||||
HashMap[] allLayouts;
|
||||
List<Map<Attribute.Layout, int[]>> allLayouts;
|
||||
|
||||
void visitAttributeLayoutsIn(int ctype, Attribute.Holder h) {
|
||||
// Make note of which flags appear in the class file.
|
||||
// Set them in maxFlags.
|
||||
maxFlags[ctype] |= h.flags;
|
||||
for (Iterator i = h.getAttributes().iterator(); i.hasNext(); ) {
|
||||
Attribute a = (Attribute) i.next();
|
||||
for (Attribute a : h.getAttributes()) {
|
||||
Attribute.Layout def = a.layout();
|
||||
int[] count = (int[]) allLayouts[ctype].get(def);
|
||||
if (count == null)
|
||||
allLayouts[ctype].put(def, count = new int[1]);
|
||||
if (count[0] < Integer.MAX_VALUE)
|
||||
Map<Attribute.Layout, int[]> defMap = allLayouts.get(ctype);
|
||||
int[] count = defMap.get(def);
|
||||
if (count == null) {
|
||||
defMap.put(def, count = new int[1]);
|
||||
}
|
||||
if (count[0] < Integer.MAX_VALUE) {
|
||||
count[0] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Attribute.Layout[] attrDefsWritten;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
void writeAttrDefs() throws IOException {
|
||||
ArrayList defList = new ArrayList();
|
||||
List<Object[]> defList = new ArrayList<>();
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
int limit = attrDefs[i].size();
|
||||
int limit = attrDefs.get(i).size();
|
||||
for (int j = 0; j < limit; j++) {
|
||||
int header = i; // ctype
|
||||
if (j < attrIndexLimit[i]) {
|
||||
@ -906,9 +897,9 @@ class PackageWriter extends BandStructure {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
Attribute.Layout def = (Attribute.Layout) attrDefs[i].get(j);
|
||||
defList.add(new Object[]{ new Integer(header), def });
|
||||
assert(new Integer(j).equals(attrIndexTable.get(def)));
|
||||
Attribute.Layout def = attrDefs.get(i).get(j);
|
||||
defList.add(new Object[]{ Integer.valueOf(header), def });
|
||||
assert(Integer.valueOf(j).equals(attrIndexTable.get(def)));
|
||||
}
|
||||
}
|
||||
// Sort the new attr defs into some "natural" order.
|
||||
@ -934,10 +925,7 @@ class PackageWriter extends BandStructure {
|
||||
attrDefsWritten = new Attribute.Layout[numAttrDefs];
|
||||
PrintStream dump = !optDumpBands ? null
|
||||
: new PrintStream(getDumpStream(attr_definition_headers, ".def"));
|
||||
int[] indexForDebug = new int[ATTR_CONTEXT_LIMIT];
|
||||
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
|
||||
indexForDebug[i] = attrIndexLimit[i];
|
||||
}
|
||||
int[] indexForDebug = Arrays.copyOf(attrIndexLimit, ATTR_CONTEXT_LIMIT);
|
||||
for (int i = 0; i < defs.length; i++) {
|
||||
int header = ((Integer)defs[i][0]).intValue();
|
||||
Attribute.Layout def = (Attribute.Layout) defs[i][1];
|
||||
@ -953,7 +941,7 @@ class PackageWriter extends BandStructure {
|
||||
if (debug) {
|
||||
int hdrIndex = (header >> ADH_BIT_SHIFT) - ADH_BIT_IS_LSB;
|
||||
if (hdrIndex < 0) hdrIndex = indexForDebug[def.ctype()]++;
|
||||
int realIndex = ((Integer) attrIndexTable.get(def)).intValue();
|
||||
int realIndex = (attrIndexTable.get(def)).intValue();
|
||||
assert(hdrIndex == realIndex);
|
||||
}
|
||||
if (dump != null) {
|
||||
@ -969,8 +957,8 @@ class PackageWriter extends BandStructure {
|
||||
for (int ctype = 0; ctype < ATTR_CONTEXT_LIMIT; ctype++) {
|
||||
MultiBand xxx_attr_bands = attrBands[ctype];
|
||||
IntBand xxx_attr_calls = getAttrBand(xxx_attr_bands, AB_ATTR_CALLS);
|
||||
Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()];
|
||||
attrDefs[ctype].toArray(defs);
|
||||
Attribute.Layout[] defs = new Attribute.Layout[attrDefs.get(ctype).size()];
|
||||
attrDefs.get(ctype).toArray(defs);
|
||||
for (boolean predef = true; ; predef = false) {
|
||||
for (int ai = 0; ai < defs.length; ai++) {
|
||||
Attribute.Layout def = defs[ai];
|
||||
@ -980,7 +968,7 @@ class PackageWriter extends BandStructure {
|
||||
int totalCount = attrCounts[ctype][ai];
|
||||
if (totalCount == 0)
|
||||
continue; // irrelevant
|
||||
int[] bc = (int[]) backCountTable.get(def);
|
||||
int[] bc = backCountTable.get(def);
|
||||
for (int j = 0; j < bc.length; j++) {
|
||||
if (bc[j] >= 0) {
|
||||
int backCount = bc[j];
|
||||
@ -998,8 +986,7 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
|
||||
void trimClassAttributes() {
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
// Replace "obvious" SourceFile attrs by null.
|
||||
cls.minimizeSourceFile();
|
||||
}
|
||||
@ -1008,14 +995,12 @@ class PackageWriter extends BandStructure {
|
||||
void collectInnerClasses() {
|
||||
// Capture inner classes, removing them from individual classes.
|
||||
// Irregular inner classes must stay local, though.
|
||||
HashMap allICMap = new HashMap();
|
||||
Map<ClassEntry, InnerClass> allICMap = new HashMap<>();
|
||||
// First, collect a consistent global set.
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
if (!cls.hasInnerClasses()) continue;
|
||||
for (Iterator j = cls.getInnerClasses().iterator(); j.hasNext(); ) {
|
||||
InnerClass ic = (InnerClass) j.next();
|
||||
InnerClass pic = (InnerClass) allICMap.put(ic.thisClass, ic);
|
||||
for (InnerClass ic : cls.getInnerClasses()) {
|
||||
InnerClass pic = allICMap.put(ic.thisClass, ic);
|
||||
if (pic != null && !pic.equals(ic) && pic.predictable) {
|
||||
// Different ICs. Choose the better to make global.
|
||||
allICMap.put(pic.thisClass, pic);
|
||||
@ -1036,15 +1021,13 @@ class PackageWriter extends BandStructure {
|
||||
// Next, empty out of every local set the consistent entries.
|
||||
// Calculate whether there is any remaining need to have a local
|
||||
// set, and whether it needs to be locked.
|
||||
for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
|
||||
Class cls = (Class) i.next();
|
||||
for (Class cls : pkg.classes) {
|
||||
cls.minimizeLocalICs();
|
||||
}
|
||||
}
|
||||
|
||||
void writeInnerClasses() throws IOException {
|
||||
for (Iterator i = pkg.getAllInnerClasses().iterator(); i.hasNext(); ) {
|
||||
InnerClass ic = (InnerClass) i.next();
|
||||
for (InnerClass ic : pkg.getAllInnerClasses()) {
|
||||
int flags = ic.flags;
|
||||
assert((flags & ACC_IC_LONG_FORM) == 0);
|
||||
if (!ic.predictable) {
|
||||
@ -1064,10 +1047,9 @@ class PackageWriter extends BandStructure {
|
||||
* local attribute. This is expected to be rare.
|
||||
*/
|
||||
void writeLocalInnerClasses(Class cls) throws IOException {
|
||||
List localICs = cls.getInnerClasses();
|
||||
List<InnerClass> localICs = cls.getInnerClasses();
|
||||
class_InnerClasses_N.putInt(localICs.size());
|
||||
for (Iterator i = localICs.iterator(); i.hasNext(); ) {
|
||||
InnerClass ic = (InnerClass) i.next();
|
||||
for(InnerClass ic : localICs) {
|
||||
class_InnerClasses_RC.putRef(ic.thisClass);
|
||||
// Is it redundant with the global version?
|
||||
if (ic.equals(pkg.getGlobalInnerClass(ic.thisClass))) {
|
||||
@ -1121,18 +1103,16 @@ class PackageWriter extends BandStructure {
|
||||
}
|
||||
|
||||
void writeMembers(Class cls) throws IOException {
|
||||
List fields = cls.getFields();
|
||||
List<Class.Field> fields = cls.getFields();
|
||||
class_field_count.putInt(fields.size());
|
||||
for (Iterator i = fields.iterator(); i.hasNext(); ) {
|
||||
Class.Field f = (Class.Field) i.next();
|
||||
for (Class.Field f : fields) {
|
||||
field_descr.putRef(f.getDescriptor());
|
||||
writeAttrs(ATTR_CONTEXT_FIELD, f, cls);
|
||||
}
|
||||
|
||||
List methods = cls.getMethods();
|
||||
List<Class.Method> methods = cls.getMethods();
|
||||
class_method_count.putInt(methods.size());
|
||||
for (Iterator i = methods.iterator(); i.hasNext(); ) {
|
||||
Class.Method m = (Class.Method) i.next();
|
||||
for (Class.Method m : methods) {
|
||||
method_descr.putRef(m.getDescriptor());
|
||||
writeAttrs(ATTR_CONTEXT_METHOD, m, cls);
|
||||
assert((m.code != null) == (m.getAttribute(attrCodeEmpty) != null));
|
||||
@ -1206,11 +1186,10 @@ class PackageWriter extends BandStructure {
|
||||
long flagMask = attrFlagMask[ctype]; // which flags are attr bits?
|
||||
long flagsToAdd = 0;
|
||||
int overflowCount = 0;
|
||||
for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) {
|
||||
Attribute a = (Attribute) j.next();
|
||||
for (Attribute a : h.attributes) {
|
||||
Attribute.Layout def = a.layout();
|
||||
int index = ((Integer)attrIndexTable.get(def)).intValue();
|
||||
assert(attrDefs[ctype].get(index) == def);
|
||||
int index = (attrIndexTable.get(def)).intValue();
|
||||
assert(attrDefs.get(ctype).get(index) == def);
|
||||
if (verbose > 3)
|
||||
Utils.log.fine("add attr @"+index+" "+a+" in "+h);
|
||||
if (index < attrIndexLimit[ctype] && testBit(flagMask, 1L<<index)) {
|
||||
@ -1239,10 +1218,10 @@ class PackageWriter extends BandStructure {
|
||||
continue;
|
||||
}
|
||||
assert(a.fixups == null);
|
||||
final Band[] ab = (Band[]) attrBandTable.get(def);
|
||||
final Band[] ab = attrBandTable.get(def);
|
||||
assert(ab != null);
|
||||
assert(ab.length == def.bandCount);
|
||||
final int[] bc = (int[]) backCountTable.get(def);
|
||||
final int[] bc = backCountTable.get(def);
|
||||
assert(bc != null);
|
||||
assert(bc.length == def.getCallables().length);
|
||||
// Write one attribute of type def into ab.
|
||||
@ -1306,7 +1285,7 @@ class PackageWriter extends BandStructure {
|
||||
private int initOpVariant(Instruction i, Entry newClass) {
|
||||
if (i.getBC() != _invokespecial) return -1;
|
||||
MemberEntry ref = (MemberEntry) i.getCPRef(curCPMap);
|
||||
if (ref.descRef.nameRef.stringValue() != "<init>")
|
||||
if ("<init>".equals(ref.descRef.nameRef.stringValue()) == false)
|
||||
return -1;
|
||||
ClassEntry refClass = ref.classRef;
|
||||
if (refClass == curClass.thisClass)
|
||||
@ -1618,14 +1597,16 @@ class PackageWriter extends BandStructure {
|
||||
String count = "" + codeHist[bc];
|
||||
count = " ".substring(count.length()) + count;
|
||||
String pct = "" + (codeHist[bc] * 10000 / totalBytes);
|
||||
while (pct.length() < 4) pct = "0" + pct;
|
||||
while (pct.length() < 4) {
|
||||
pct = "0" + pct;
|
||||
}
|
||||
pct = pct.substring(0, pct.length()-2) + "." + pct.substring(pct.length()-2);
|
||||
hist[bc] = count + " " + pct + "% " + iname;
|
||||
}
|
||||
Arrays.sort(hist);
|
||||
System.out.println("Bytecode histogram ["+totalBytes+"]");
|
||||
for (int i = hist.length; --i >= 0; ) {
|
||||
if (hist[i] == "") continue;
|
||||
if ("".equals(hist[i])) continue;
|
||||
System.out.println(hist[i]);
|
||||
}
|
||||
for (int tag = 0; tag < ldcHist.length; tag++) {
|
||||
|
@ -69,7 +69,8 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
* Get the set of options for the pack and unpack engines.
|
||||
* @return A sorted association of option key strings to option values.
|
||||
*/
|
||||
public SortedMap<String, String> properties() {
|
||||
@SuppressWarnings("unchecked")
|
||||
public SortedMap properties() {
|
||||
return props;
|
||||
}
|
||||
|
||||
@ -155,8 +156,8 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
|
||||
|
||||
// All the worker bees.....
|
||||
|
||||
// The packer worker.
|
||||
@SuppressWarnings("unchecked")
|
||||
private class DoPack {
|
||||
final int verbose = props.getInteger(Utils.DEBUG_VERBOSE);
|
||||
|
||||
@ -179,11 +180,11 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
unknownAttrCommand = uaMode.intern();
|
||||
}
|
||||
|
||||
final HashMap attrDefs;
|
||||
final HashMap attrCommands;
|
||||
final Map<Attribute.Layout, Attribute> attrDefs;
|
||||
final Map<Attribute.Layout, String> attrCommands;
|
||||
{
|
||||
HashMap attrDefs = new HashMap();
|
||||
HashMap attrCommands = new HashMap();
|
||||
Map<Attribute.Layout, Attribute> lattrDefs = new HashMap<>();
|
||||
Map<Attribute.Layout, String> lattrCommands = new HashMap<>();
|
||||
String[] keys = {
|
||||
Pack200.Packer.CLASS_ATTRIBUTE_PFX,
|
||||
Pack200.Packer.FIELD_ATTRIBUTE_PFX,
|
||||
@ -198,8 +199,9 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
};
|
||||
for (int i = 0; i < ctypes.length; i++) {
|
||||
String pfx = keys[i];
|
||||
Map<String, String> map = props.prefixMap(pfx);
|
||||
for (String key : map.keySet()) {
|
||||
Map<Object, Object> map = props.prefixMap(pfx);
|
||||
for (Object k : map.keySet()) {
|
||||
String key = (String)k;
|
||||
assert(key.startsWith(pfx));
|
||||
String name = key.substring(pfx.length());
|
||||
String layout = props.getProperty(key);
|
||||
@ -207,24 +209,18 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
if (Pack200.Packer.STRIP.equals(layout) ||
|
||||
Pack200.Packer.PASS.equals(layout) ||
|
||||
Pack200.Packer.ERROR.equals(layout)) {
|
||||
attrCommands.put(lkey, layout.intern());
|
||||
lattrCommands.put(lkey, layout.intern());
|
||||
} else {
|
||||
Attribute.define(attrDefs, ctypes[i], name, layout);
|
||||
Attribute.define(lattrDefs, ctypes[i], name, layout);
|
||||
if (verbose > 1) {
|
||||
Utils.log.fine("Added layout for "+Constants.ATTR_CONTEXT_NAME[i]+" attribute "+name+" = "+layout);
|
||||
}
|
||||
assert(attrDefs.containsKey(lkey));
|
||||
assert(lattrDefs.containsKey(lkey));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (attrDefs.size() > 0)
|
||||
this.attrDefs = attrDefs;
|
||||
else
|
||||
this.attrDefs = null;
|
||||
if (attrCommands.size() > 0)
|
||||
this.attrCommands = attrCommands;
|
||||
else
|
||||
this.attrCommands = null;
|
||||
this.attrDefs = (lattrDefs.isEmpty()) ? null : lattrDefs;
|
||||
this.attrCommands = (lattrCommands.isEmpty()) ? null : lattrCommands;
|
||||
}
|
||||
|
||||
final boolean keepFileOrder
|
||||
@ -275,8 +271,8 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
{
|
||||
// Which class files will be passed through?
|
||||
passFiles = props.getProperties(Pack200.Packer.PASS_FILE_PFX);
|
||||
for (ListIterator i = passFiles.listIterator(); i.hasNext(); ) {
|
||||
String file = (String) i.next();
|
||||
for (ListIterator<String> i = passFiles.listIterator(); i.hasNext(); ) {
|
||||
String file = i.next();
|
||||
if (file == null) { i.remove(); continue; }
|
||||
file = Utils.getJarEntryName(file); // normalize '\\' to '/'
|
||||
if (file.endsWith("/"))
|
||||
@ -333,7 +329,7 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
pkg.reset();
|
||||
}
|
||||
|
||||
class InFile {
|
||||
final class InFile {
|
||||
final String name;
|
||||
final JarFile jf;
|
||||
final JarEntry je;
|
||||
@ -596,8 +592,8 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
||||
// Package builder must have created a stub for each class.
|
||||
assert(pkg.files.containsAll(pkg.getClassStubs()));
|
||||
// Order of stubs in file list must agree with classes.
|
||||
List res = pkg.files;
|
||||
assert((res = new ArrayList(pkg.files))
|
||||
List<Package.File> res = pkg.files;
|
||||
assert((res = new ArrayList<>(pkg.files))
|
||||
.retainAll(pkg.getClassStubs()) || true);
|
||||
assert(res.equals(pkg.getClassStubs()));
|
||||
}
|
||||
|
@ -31,6 +31,8 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import static com.sun.java.util.jar.pack.Constants.*;
|
||||
|
||||
/**
|
||||
* Population-based coding.
|
||||
@ -38,7 +40,7 @@ import java.util.HashSet;
|
||||
* @author John Rose
|
||||
*/
|
||||
// This tactic alone reduces the final zipped rt.jar by about a percent.
|
||||
class PopulationCoding implements Constants, CodingMethod {
|
||||
class PopulationCoding implements CodingMethod {
|
||||
Histogram vHist; // histogram of all values
|
||||
int[] fValues; // list of favored values
|
||||
int fVlen; // inclusive max index
|
||||
@ -62,8 +64,8 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
}
|
||||
}
|
||||
public void setFavoredValues(int[] fValues) {
|
||||
int fVlen = fValues.length-1;
|
||||
setFavoredValues(fValues, fVlen);
|
||||
int lfVlen = fValues.length-1;
|
||||
setFavoredValues(fValues, lfVlen);
|
||||
}
|
||||
public void setHistogram(Histogram vHist) {
|
||||
this.vHist = vHist;
|
||||
@ -103,7 +105,7 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
if (tokenCoding instanceof Coding && fValues != null) {
|
||||
Coding tc = (Coding) tokenCoding;
|
||||
if (tc == fitTokenCoding(fVlen, tc.L()))
|
||||
this.L = tc.L();;
|
||||
this.L = tc.L();
|
||||
// Otherwise, it's a non-default coding.
|
||||
}
|
||||
}
|
||||
@ -217,13 +219,13 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
}
|
||||
|
||||
private long[] makeSymtab() {
|
||||
long[] symtab = new long[fVlen];
|
||||
long[] lsymtab = new long[fVlen];
|
||||
for (int token = 1; token <= fVlen; token++) {
|
||||
symtab[token-1] = ((long)fValues[token] << 32) | token;
|
||||
lsymtab[token-1] = ((long)fValues[token] << 32) | token;
|
||||
}
|
||||
// Index by value:
|
||||
Arrays.sort(symtab);
|
||||
return symtab;
|
||||
Arrays.sort(lsymtab);
|
||||
return lsymtab;
|
||||
}
|
||||
|
||||
private Coding getTailCoding(CodingMethod c) {
|
||||
@ -302,12 +304,12 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
}
|
||||
|
||||
int[] readFavoredValuesFrom(InputStream in, int maxForDebug) throws IOException {
|
||||
int[] fValues = new int[1000]; // realloc as needed
|
||||
int[] lfValues = new int[1000]; // realloc as needed
|
||||
// The set uniqueValuesForDebug records all favored values.
|
||||
// As each new value is added, we assert that the value
|
||||
// was not already in the set.
|
||||
HashSet uniqueValuesForDebug = null;
|
||||
assert((uniqueValuesForDebug = new HashSet()) != null);
|
||||
Set<Integer> uniqueValuesForDebug = null;
|
||||
assert((uniqueValuesForDebug = new HashSet<>()) != null);
|
||||
int fillp = 1;
|
||||
maxForDebug += fillp;
|
||||
int min = Integer.MIN_VALUE; // farthest from the center
|
||||
@ -317,13 +319,14 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
while (fcm instanceof AdaptiveCoding) {
|
||||
AdaptiveCoding ac = (AdaptiveCoding) fcm;
|
||||
int len = ac.headLength;
|
||||
while (fillp + len > fValues.length)
|
||||
fValues = BandStructure.realloc(fValues);
|
||||
while (fillp + len > lfValues.length) {
|
||||
lfValues = BandStructure.realloc(lfValues);
|
||||
}
|
||||
int newFillp = fillp + len;
|
||||
ac.headCoding.readArrayFrom(in, fValues, fillp, newFillp);
|
||||
ac.headCoding.readArrayFrom(in, lfValues, fillp, newFillp);
|
||||
while (fillp < newFillp) {
|
||||
int val = fValues[fillp++];
|
||||
assert(uniqueValuesForDebug.add(new Integer(val)));
|
||||
int val = lfValues[fillp++];
|
||||
assert(uniqueValuesForDebug.add(val));
|
||||
assert(fillp <= maxForDebug);
|
||||
last = val;
|
||||
min = moreCentral(min, val);
|
||||
@ -344,10 +347,10 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
state = val;
|
||||
if (fillp > 1 && (val == last || val == min)) //|| val == min2
|
||||
break;
|
||||
if (fillp == fValues.length)
|
||||
fValues = BandStructure.realloc(fValues);
|
||||
fValues[fillp++] = val;
|
||||
assert(uniqueValuesForDebug.add(new Integer(val)));
|
||||
if (fillp == lfValues.length)
|
||||
lfValues = BandStructure.realloc(lfValues);
|
||||
lfValues[fillp++] = val;
|
||||
assert(uniqueValuesForDebug.add(val));
|
||||
assert(fillp <= maxForDebug);
|
||||
last = val;
|
||||
min = moreCentral(min, val);
|
||||
@ -358,17 +361,17 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
int val = fc.readFrom(in);
|
||||
if (fillp > 1 && (val == last || val == min)) //|| val == min2
|
||||
break;
|
||||
if (fillp == fValues.length)
|
||||
fValues = BandStructure.realloc(fValues);
|
||||
fValues[fillp++] = val;
|
||||
assert(uniqueValuesForDebug.add(new Integer(val)));
|
||||
if (fillp == lfValues.length)
|
||||
lfValues = BandStructure.realloc(lfValues);
|
||||
lfValues[fillp++] = val;
|
||||
assert(uniqueValuesForDebug.add(val));
|
||||
assert(fillp <= maxForDebug);
|
||||
last = val;
|
||||
min = moreCentral(min, val);
|
||||
//min2 = moreCentral2(min2, val, min);
|
||||
}
|
||||
}
|
||||
return BandStructure.realloc(fValues, fillp);
|
||||
return BandStructure.realloc(lfValues, fillp);
|
||||
}
|
||||
|
||||
private static int moreCentral(int x, int y) {
|
||||
@ -478,7 +481,7 @@ class PopulationCoding implements Constants, CodingMethod {
|
||||
boolean verbose
|
||||
= (p200 != null &&
|
||||
p200.getBoolean(Utils.COM_PREFIX+"verbose.pop"));
|
||||
StringBuffer res = new StringBuffer(100);
|
||||
StringBuilder res = new StringBuilder(100);
|
||||
res.append("pop(").append("fVlen=").append(fVlen);
|
||||
if (verbose && fValues != null) {
|
||||
res.append(" fV=[");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003,2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2010, 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
|
||||
@ -34,8 +34,8 @@ import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
@ -46,36 +46,36 @@ import java.util.jar.Pack200;
|
||||
/**
|
||||
* Control block for publishing Pack200 options to the other classes.
|
||||
*/
|
||||
class PropMap extends TreeMap {
|
||||
ArrayList _listeners = new ArrayList(1);
|
||||
|
||||
final class PropMap implements SortedMap<Object, Object> {
|
||||
private final TreeMap<Object, Object> theMap = new TreeMap<>();;
|
||||
private final List<PropertyChangeListener> listenerList = new ArrayList<>(1);
|
||||
|
||||
void addListener(PropertyChangeListener listener) {
|
||||
_listeners.add(listener);
|
||||
listenerList.add(listener);
|
||||
}
|
||||
|
||||
void removeListener(PropertyChangeListener listener) {
|
||||
_listeners.remove(listener);
|
||||
listenerList.remove(listener);
|
||||
}
|
||||
|
||||
void addListeners(ArrayList listeners) {
|
||||
_listeners.addAll(listeners);
|
||||
void addListeners(ArrayList<PropertyChangeListener> listeners) {
|
||||
listenerList.addAll(listeners);
|
||||
}
|
||||
|
||||
void removeListeners(ArrayList listeners) {
|
||||
_listeners.removeAll(listeners);
|
||||
void removeListeners(ArrayList<PropertyChangeListener> listeners) {
|
||||
listenerList.removeAll(listeners);
|
||||
}
|
||||
|
||||
// Override:
|
||||
public Object put(Object key, Object value) {
|
||||
Object oldValue = super.put(key, value);
|
||||
if (value != oldValue && _listeners.size() > 0) {
|
||||
Object oldValue = theMap.put(key, value);
|
||||
if (value != oldValue && !listenerList.isEmpty()) {
|
||||
// Post the property change event.
|
||||
PropertyChangeEvent event =
|
||||
new PropertyChangeEvent(this, (String) key,
|
||||
oldValue, value);
|
||||
for (Iterator i = _listeners.iterator(); i.hasNext(); ) {
|
||||
PropertyChangeListener listener =
|
||||
(PropertyChangeListener) i.next();
|
||||
for (PropertyChangeListener listener : listenerList) {
|
||||
listener.propertyChange(event);
|
||||
}
|
||||
}
|
||||
@ -85,7 +85,7 @@ class PropMap extends TreeMap {
|
||||
// All this other stuff is private to the current package.
|
||||
// Outide clients of Pack200 do not need to use it; they can
|
||||
// get by with generic SortedMap functionality.
|
||||
private static Map defaultProps;
|
||||
private static Map<Object, Object> defaultProps;
|
||||
static {
|
||||
Properties props = new Properties();
|
||||
|
||||
@ -122,13 +122,12 @@ class PropMap extends TreeMap {
|
||||
// Define certain attribute layouts by default.
|
||||
// Do this after the previous props are put in place,
|
||||
// to allow override if necessary.
|
||||
InputStream propStr = null;
|
||||
try {
|
||||
String propFile = "intrinsic.properties";
|
||||
InputStream propStr = PackerImpl.class.getResourceAsStream(propFile);
|
||||
propStr = PackerImpl.class.getResourceAsStream(propFile);
|
||||
props.load(new BufferedInputStream(propStr));
|
||||
propStr.close();
|
||||
for (Iterator i = props.entrySet().iterator(); i.hasNext(); ) {
|
||||
Map.Entry e = (Map.Entry) i.next();
|
||||
for (Map.Entry<Object, Object> e : props.entrySet()) {
|
||||
String key = (String) e.getKey();
|
||||
String val = (String) e.getValue();
|
||||
if (key.startsWith("attribute.")) {
|
||||
@ -137,19 +136,25 @@ class PropMap extends TreeMap {
|
||||
}
|
||||
} catch (IOException ee) {
|
||||
throw new RuntimeException(ee);
|
||||
} finally {
|
||||
try {
|
||||
if (propStr != null) {
|
||||
propStr.close();
|
||||
}
|
||||
} catch (IOException ignore) {}
|
||||
}
|
||||
|
||||
defaultProps = (new HashMap(props)); // shrink to fit
|
||||
defaultProps = (new HashMap<>(props)); // shrink to fit
|
||||
}
|
||||
|
||||
PropMap() {
|
||||
putAll(defaultProps);
|
||||
theMap.putAll(defaultProps);
|
||||
}
|
||||
|
||||
// Return a view of this map which includes only properties
|
||||
// that begin with the given prefix. This is easy because
|
||||
// the map is sorted, and has a subMap accessor.
|
||||
SortedMap prefixMap(String prefix) {
|
||||
SortedMap<Object, Object> prefixMap(String prefix) {
|
||||
int len = prefix.length();
|
||||
if (len == 0)
|
||||
return this;
|
||||
@ -174,8 +179,8 @@ class PropMap extends TreeMap {
|
||||
|
||||
// Get sequence of props for "prefix", and "prefix.*".
|
||||
List getProperties(String prefix) {
|
||||
Collection values = prefixMap(prefix).values();
|
||||
ArrayList res = new ArrayList(values.size());
|
||||
Collection<Object> values = prefixMap(prefix).values();
|
||||
List<Object> res = new ArrayList<>(values.size());
|
||||
res.addAll(values);
|
||||
while (res.remove(null));
|
||||
return res;
|
||||
@ -240,11 +245,97 @@ class PropMap extends TreeMap {
|
||||
void list(PrintWriter out) {
|
||||
out.println("#"+Utils.PACK_ZIP_ARCHIVE_MARKER_COMMENT+"[");
|
||||
Set defaults = defaultProps.entrySet();
|
||||
for (Iterator i = entrySet().iterator(); i.hasNext(); ) {
|
||||
Map.Entry e = (Map.Entry) i.next();
|
||||
for (Map.Entry e : theMap.entrySet()) {
|
||||
if (defaults.contains(e)) continue;
|
||||
out.println(" " + e.getKey() + " = " + e.getValue());
|
||||
}
|
||||
out.println("#]");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return theMap.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return theMap.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
return theMap.containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(Object value) {
|
||||
return theMap.containsValue(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(Object key) {
|
||||
return theMap.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object remove(Object key) {
|
||||
return theMap.remove(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void putAll(Map m) {
|
||||
theMap.putAll(m);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
theMap.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Object> keySet() {
|
||||
return theMap.keySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Object> values() {
|
||||
return theMap.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Map.Entry<Object, Object>> entrySet() {
|
||||
return theMap.entrySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Comparator<Object> comparator() {
|
||||
return (Comparator<Object>) theMap.comparator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SortedMap<Object, Object> subMap(Object fromKey, Object toKey) {
|
||||
return theMap.subMap(fromKey, toKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SortedMap<Object, Object> headMap(Object toKey) {
|
||||
return theMap.headMap(toKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SortedMap<Object, Object> tailMap(Object fromKey) {
|
||||
return theMap.tailMap(fromKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object firstKey() {
|
||||
return theMap.firstKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object lastKey() {
|
||||
return theMap.lastKey();
|
||||
}
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TimeZone;
|
||||
import java.util.jar.JarEntry;
|
||||
@ -81,7 +81,8 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
|
||||
* Get the set of options for the pack and unpack engines.
|
||||
* @return A sorted association of option key strings to option values.
|
||||
*/
|
||||
public SortedMap<String, String> properties() {
|
||||
@SuppressWarnings("unchecked")
|
||||
public SortedMap properties() {
|
||||
return props;
|
||||
}
|
||||
|
||||
@ -225,9 +226,8 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
|
||||
props.setProperty(java.util.jar.Pack200.Unpacker.PROGRESS,"50");
|
||||
pkg.ensureAllClassFiles();
|
||||
// Now write out the files.
|
||||
HashSet<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses());
|
||||
for (Iterator i = pkg.getFiles().iterator(); i.hasNext(); ) {
|
||||
Package.File file = (Package.File) i.next();
|
||||
Set<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses());
|
||||
for (Package.File file : pkg.getFiles()) {
|
||||
String name = file.nameString;
|
||||
JarEntry je = new JarEntry(Utils.getJarEntryName(name));
|
||||
boolean deflate;
|
||||
|
@ -297,7 +297,7 @@ class Utils {
|
||||
(int)( (1.0 - ((double)ze.getCompressedSize()/(double)ze.getSize()))*100 )
|
||||
: 0 ;
|
||||
// Follow unzip -lv output
|
||||
return (long)ze.getSize() + "\t" + ze.getMethod()
|
||||
return ze.getSize() + "\t" + ze.getMethod()
|
||||
+ "\t" + ze.getCompressedSize() + "\t"
|
||||
+ store + "%\t"
|
||||
+ new Date(ze.getTime()) + "\t"
|
||||
|
@ -1393,8 +1393,11 @@ class DirectAudioDevice extends AbstractMixer {
|
||||
public void run() {
|
||||
if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId());
|
||||
while (thread != null) {
|
||||
if (!doIO) {
|
||||
synchronized(lock) {
|
||||
// doIO is volatile, but we could check it, then get
|
||||
// pre-empted while another thread changes doIO and notifies,
|
||||
// before we wait (so we sleep in wait forever).
|
||||
synchronized(lock) {
|
||||
if (!doIO) {
|
||||
try {
|
||||
lock.wait();
|
||||
} catch(InterruptedException ie) {}
|
||||
|
@ -61,26 +61,43 @@ public final class RhinoScriptEngine extends AbstractScriptEngine
|
||||
private ScriptEngineFactory factory;
|
||||
private InterfaceImplementor implementor;
|
||||
|
||||
private static final int languageVersion = getLanguageVersion();
|
||||
private static final int optimizationLevel = getOptimizationLevel();
|
||||
static {
|
||||
ContextFactory.initGlobal(new ContextFactory() {
|
||||
protected Context makeContext() {
|
||||
Context cx = super.makeContext();
|
||||
cx.setLanguageVersion(languageVersion);
|
||||
cx.setOptimizationLevel(optimizationLevel);
|
||||
cx.setClassShutter(RhinoClassShutter.getInstance());
|
||||
cx.setWrapFactory(RhinoWrapFactory.getInstance());
|
||||
return cx;
|
||||
}
|
||||
|
||||
public boolean hasFeature(Context cx, int feature) {
|
||||
// we do not support E4X (ECMAScript for XML)!
|
||||
if (feature == Context.FEATURE_E4X) {
|
||||
return false;
|
||||
} else {
|
||||
return super.hasFeature(cx, feature);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final String RHINO_JS_VERSION = "rhino.js.version";
|
||||
private static int getLanguageVersion() {
|
||||
int version;
|
||||
String tmp = java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction(RHINO_JS_VERSION));
|
||||
if (tmp != null) {
|
||||
version = Integer.parseInt((String)tmp);
|
||||
} else {
|
||||
version = Context.VERSION_1_8;
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
private static final String RHINO_OPT_LEVEL = "rhino.opt.level";
|
||||
private static int getOptimizationLevel() {
|
||||
int optLevel = -1;
|
||||
// disable optimizer under security manager, for now.
|
||||
if (System.getSecurityManager() == null) {
|
||||
optLevel = Integer.getInteger(RHINO_OPT_LEVEL, -1);
|
||||
}
|
||||
return optLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of RhinoScriptEngine
|
||||
@ -333,6 +350,7 @@ public final class RhinoScriptEngine extends AbstractScriptEngine
|
||||
return result instanceof Undefined ? null : result;
|
||||
}
|
||||
|
||||
/*
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (args.length == 0) {
|
||||
System.out.println("No file specified");
|
||||
@ -347,4 +365,5 @@ public final class RhinoScriptEngine extends AbstractScriptEngine
|
||||
engine.eval(r);
|
||||
System.out.println(engine.get("x"));
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -58,11 +58,11 @@ public class RhinoScriptEngineFactory extends ScriptEngineFactoryBase {
|
||||
} else if (key.equals(ScriptEngine.ENGINE)) {
|
||||
return "Mozilla Rhino";
|
||||
} else if (key.equals(ScriptEngine.ENGINE_VERSION)) {
|
||||
return "1.6 release 2";
|
||||
return "1.7 release 3 PRERELEASE";
|
||||
} else if (key.equals(ScriptEngine.LANGUAGE)) {
|
||||
return "ECMAScript";
|
||||
} else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) {
|
||||
return "1.6";
|
||||
return "1.8";
|
||||
} else if (key.equals("THREADING")) {
|
||||
return "MULTITHREADED";
|
||||
} else {
|
||||
@ -128,10 +128,12 @@ public class RhinoScriptEngineFactory extends ScriptEngineFactoryBase {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
public static void main(String[] args) {
|
||||
RhinoScriptEngineFactory fact = new RhinoScriptEngineFactory();
|
||||
System.out.println(fact.getParameter(ScriptEngine.ENGINE_VERSION));
|
||||
}
|
||||
*/
|
||||
|
||||
private static List<String> names;
|
||||
private static List<String> mimeTypes;
|
||||
|
@ -37,15 +37,6 @@ import javax.script.*;
|
||||
* @since 1.6
|
||||
*/
|
||||
public final class RhinoTopLevel extends ImporterTopLevel {
|
||||
|
||||
// variables defined always to help Java access from JavaScript
|
||||
private static final String builtinVariables =
|
||||
"var com = Packages.com; \n" +
|
||||
"var edu = Packages.edu; \n" +
|
||||
"var javax = Packages.javax; \n" +
|
||||
"var net = Packages.net; \n" +
|
||||
"var org = Packages.org; \n";
|
||||
|
||||
RhinoTopLevel(Context cx, RhinoScriptEngine engine) {
|
||||
super(cx);
|
||||
this.engine = engine;
|
||||
@ -67,9 +58,6 @@ public final class RhinoTopLevel extends ImporterTopLevel {
|
||||
String names[] = { "bindings", "scope", "sync" };
|
||||
defineFunctionProperties(names, RhinoTopLevel.class,
|
||||
ScriptableObject.DONTENUM);
|
||||
|
||||
// define built-in variables
|
||||
cx.evaluateString(this, builtinVariables, "<builtin>", 1, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -311,9 +311,9 @@ function load(str) {
|
||||
try {
|
||||
engine.eval(reader);
|
||||
} finally {
|
||||
engine.put(engine.FILENAME, oldFilename);
|
||||
engine.put(engine.FILENAME, oldFilename);
|
||||
streamClose(stream);
|
||||
}
|
||||
streamClose(stream);
|
||||
}
|
||||
|
||||
// file system utilities
|
||||
|
@ -33,27 +33,17 @@ import sun.util.logging.PlatformLogger;
|
||||
import sun.awt.image.SunWritableRaster;
|
||||
|
||||
/**
|
||||
* The splash screen can be created at application startup, before the
|
||||
* The splash screen can be displayed at application startup, before the
|
||||
* Java Virtual Machine (JVM) starts. The splash screen is displayed as an
|
||||
* undecorated window containing an image. You can use GIF, JPEG, and PNG files
|
||||
* for the image. Animation (for GIF) and transparency (for GIF, PNG) are
|
||||
* supported. The window is positioned at the center of the screen (the
|
||||
* position on multi-monitor systems is not specified - it is platform and
|
||||
* implementation dependent).
|
||||
* The window is closed automatically as soon as the first window is displayed by
|
||||
* Swing/AWT (may be also closed manually using the Java API, see below).
|
||||
* undecorated window containing an image. You can use GIF, JPEG, or PNG files
|
||||
* for the image. Animation is supported for the GIF format, while transparency
|
||||
* is supported both for GIF and PNG. The window is positioned at the center
|
||||
* of the screen. The position on multi-monitor systems is not specified. It is
|
||||
* platform and implementation dependent. The splash screen window is closed
|
||||
* automatically as soon as the first window is displayed by Swing/AWT (may be
|
||||
* also closed manually using the Java API, see below).
|
||||
* <P>
|
||||
* There are two ways to show the native splash screen:
|
||||
* <P>
|
||||
* <UL>
|
||||
* <LI>If your application is run from the command line or from a shortcut,
|
||||
* use the "-splash:" Java application launcher option to show a splash screen.
|
||||
* <BR>
|
||||
* For example:
|
||||
* <PRE>
|
||||
* java -splash:filename.gif Test
|
||||
* </PRE>
|
||||
* <LI>If your application is packaged in a jar file, you can use the
|
||||
* If your application is packaged in a jar file, you can use the
|
||||
* "SplashScreen-Image" option in a manifest file to show a splash screen.
|
||||
* Place the image in the jar archive and specify the path in the option.
|
||||
* The path should not have a leading slash.
|
||||
@ -64,18 +54,39 @@ import sun.awt.image.SunWritableRaster;
|
||||
* Main-Class: Test
|
||||
* SplashScreen-Image: filename.gif
|
||||
* </PRE>
|
||||
* <P>
|
||||
* If the Java implementation provides the command-line interface and you run
|
||||
* your application by using the command line or a shortcut, use the Java
|
||||
* application launcher option to show a splash screen. The Oracle reference
|
||||
* implementation allows you to specify the splash screen image location with
|
||||
* the {@code -splash:} option.
|
||||
* <BR>
|
||||
* For example:
|
||||
* <PRE>
|
||||
* java -splash:filename.gif Test
|
||||
* </PRE>
|
||||
* The command line interface has higher precedence over the manifest
|
||||
* setting.
|
||||
* </UL>
|
||||
* <p>
|
||||
* The splash screen will be displayed as faithfully as possible to present the
|
||||
* whole splash screen image given the limitations of the target platform and
|
||||
* display.
|
||||
* <p>
|
||||
* It is implied that the specified image is presented on the screen "as is",
|
||||
* i.e. preserving the exact color values as specified in the image file. Under
|
||||
* certain circumstances, though, the presented image may differ, e.g. when
|
||||
* applying color dithering to present a 32 bits per pixel (bpp) image on a 16
|
||||
* or 8 bpp screen. The native platform display configuration may also affect
|
||||
* the colors of the displayed image (e.g. color profiles, etc.)
|
||||
* <p>
|
||||
* The {@code SplashScreen} class provides the API for controlling the splash
|
||||
* screen. This class may be used to close the splash screen, change the splash
|
||||
* screen image, get the image position/size and paint in the splash screen. It
|
||||
* cannot be used to create the splash screen; you should use the command line or manifest
|
||||
* file option for that.
|
||||
* screen image, get the splash screen native window position/size, and paint
|
||||
* in the splash screen. It cannot be used to create the splash screen. You
|
||||
* should use the options provided by the Java implementation for that.
|
||||
* <p>
|
||||
* This class cannot be instantiated. Only a single instance of this class
|
||||
* can exist, and it may be obtained using the {@link #getSplashScreen()}
|
||||
* can exist, and it may be obtained by using the {@link #getSplashScreen()}
|
||||
* static method. In case the splash screen has not been created at
|
||||
* application startup via the command line or manifest file option,
|
||||
* the <code>getSplashScreen</code> method returns <code>null</code>.
|
||||
@ -91,7 +102,7 @@ public final class SplashScreen {
|
||||
|
||||
/**
|
||||
* Returns the {@code SplashScreen} object used for
|
||||
* Java startup splash screen control.
|
||||
* Java startup splash screen control on systems that support display.
|
||||
*
|
||||
* @throws UnsupportedOperationException if the splash screen feature is not
|
||||
* supported by the current toolkit
|
||||
@ -219,6 +230,9 @@ public final class SplashScreen {
|
||||
* <p>
|
||||
* You cannot control the size or position of the splash screen.
|
||||
* The splash screen size is adjusted automatically when the image changes.
|
||||
* <p>
|
||||
* The image may contain transparent areas, and thus the reported bounds may
|
||||
* be larger than the visible splash screen image on the screen.
|
||||
*
|
||||
* @return a {@code Rectangle} containing the splash screen bounds
|
||||
* @throws IllegalStateException if the splash screen has already been closed
|
||||
@ -237,6 +251,9 @@ public final class SplashScreen {
|
||||
* <p>
|
||||
* You cannot control the size or position of the splash screen.
|
||||
* The splash screen size is adjusted automatically when the image changes.
|
||||
* <p>
|
||||
* The image may contain transparent areas, and thus the reported size may
|
||||
* be larger than the visible splash screen image on the screen.
|
||||
*
|
||||
* @return a {@link Dimension} object indicating the splash screen size
|
||||
* @throws IllegalStateException if the splash screen has already been closed
|
||||
@ -254,6 +271,10 @@ public final class SplashScreen {
|
||||
* screen window. You should call {@code update()} on the
|
||||
* <code>SplashScreen</code> when you want the splash screen to be
|
||||
* updated immediately.
|
||||
* <p>
|
||||
* The pixel (0, 0) in the coordinate space of the graphics context
|
||||
* corresponds to the origin of the splash screen native window bounds (see
|
||||
* {@link #getBounds()}).
|
||||
*
|
||||
* @return graphics context for the splash screen overlay surface
|
||||
* @throws IllegalStateException if the splash screen has already been closed
|
||||
@ -334,6 +355,11 @@ public final class SplashScreen {
|
||||
* Determines whether the splash screen is visible. The splash screen may
|
||||
* be hidden using {@link #close()}, it is also hidden automatically when
|
||||
* the first AWT/Swing window is made visible.
|
||||
* <p>
|
||||
* Note that the native platform may delay presenting the splash screen
|
||||
* native window on the screen. The return value of {@code true} for this
|
||||
* method only guarantees that the conditions to hide the splash screen
|
||||
* window have not occurred yet.
|
||||
*
|
||||
* @return true if the splash screen is visible (has not been closed yet),
|
||||
* false otherwise
|
||||
|
@ -58,20 +58,20 @@ import java.util.Set;
|
||||
* It is also possible to perform numeric shaping explicitly using instances
|
||||
* of <code>NumericShaper</code>, as this code snippet demonstrates:<br>
|
||||
* <blockquote><pre>
|
||||
* char[] text = ...;
|
||||
* // shape all EUROPEAN digits (except zero) to ARABIC digits
|
||||
* NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
|
||||
* shaper.shape(text, start, count);
|
||||
* char[] text = ...;
|
||||
* // shape all EUROPEAN digits (except zero) to ARABIC digits
|
||||
* NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
|
||||
* shaper.shape(text, start, count);
|
||||
*
|
||||
* // shape European digits to ARABIC digits if preceding text is Arabic, or
|
||||
* // shape European digits to TAMIL digits if preceding text is Tamil, or
|
||||
* // leave European digits alone if there is no preceding text, or
|
||||
* // preceding text is neither Arabic nor Tamil
|
||||
* NumericShaper shaper =
|
||||
* NumericShaper.getContextualShaper(NumericShaper.ARABIC |
|
||||
* NumericShaper.TAMIL,
|
||||
* NumericShaper.EUROPEAN);
|
||||
* shaper.shape(text, start, count);
|
||||
* // shape European digits to ARABIC digits if preceding text is Arabic, or
|
||||
* // shape European digits to TAMIL digits if preceding text is Tamil, or
|
||||
* // leave European digits alone if there is no preceding text, or
|
||||
* // preceding text is neither Arabic nor Tamil
|
||||
* NumericShaper shaper =
|
||||
* NumericShaper.getContextualShaper(NumericShaper.ARABIC |
|
||||
* NumericShaper.TAMIL,
|
||||
* NumericShaper.EUROPEAN);
|
||||
* shaper.shape(text, start, count);
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p><b>Bit mask- and enum-based Unicode ranges</b></p>
|
||||
@ -99,6 +99,37 @@ import java.util.Set;
|
||||
* values are specified, such as {@code NumericShaper.Range.BALINESE},
|
||||
* those ranges are ignored.
|
||||
*
|
||||
* <p><b>Decimal Digits Precedence</b></p>
|
||||
*
|
||||
* <p>A Unicode range may have more than one set of decimal digits. If
|
||||
* multiple decimal digits sets are specified for the same Unicode
|
||||
* range, one of the sets will take precedence as follows.
|
||||
*
|
||||
* <table border=1 cellspacing=3 cellpadding=0 summary="NumericShaper constants precedence.">
|
||||
* <tr>
|
||||
* <th class="TableHeadingColor">Unicode Range</th>
|
||||
* <th class="TableHeadingColor"><code>NumericShaper</code> Constants</th>
|
||||
* <th class="TableHeadingColor">Precedence</th>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td rowspan="2">Arabic</td>
|
||||
* <td>{@link NumericShaper#ARABIC NumericShaper.ARABIC}<br>
|
||||
* {@link NumericShaper#EASTERN_ARABIC NumericShaper.EASTERN_ARABIC}</td>
|
||||
* <td>{@link NumericShaper#EASTERN_ARABIC NumericShaper.EASTERN_ARABIC}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@link NumericShaper.Range#ARABIC}<br>
|
||||
* {@link NumericShaper.Range#EASTERN_ARABIC}</td>
|
||||
* <td>{@link NumericShaper.Range#EASTERN_ARABIC}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Tai Tham</td>
|
||||
* <td>{@link NumericShaper.Range#TAI_THAM_HORA}<br>
|
||||
* {@link NumericShaper.Range#TAI_THAM_THAM}</td>
|
||||
* <td>{@link NumericShaper.Range#TAI_THAM_THAM}</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
|
||||
|
@ -625,7 +625,7 @@ public class IndexColorModel extends ColorModel {
|
||||
}
|
||||
nBits[0] = nBits[1] = nBits[2] = 8;
|
||||
}
|
||||
return nBits;
|
||||
return nBits.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -121,7 +121,7 @@ public abstract class SampleModel
|
||||
*/
|
||||
public SampleModel(int dataType, int w, int h, int numBands)
|
||||
{
|
||||
float size = (float)w*h;
|
||||
long size = (long)w * h;
|
||||
if (w <= 0 || h <= 0) {
|
||||
throw new IllegalArgumentException("Width ("+w+") and height ("+
|
||||
h+") must be > 0");
|
||||
|
@ -92,7 +92,8 @@ public class SinglePixelPackedSampleModel extends SampleModel
|
||||
* Constructs a SinglePixelPackedSampleModel with bitMasks.length bands.
|
||||
* Each sample is stored in a data array element in the position of
|
||||
* its corresponding bit mask. Each bit mask must be contiguous and
|
||||
* masks must not overlap.
|
||||
* masks must not overlap. Bit masks exceeding data type capacity are
|
||||
* truncated.
|
||||
* @param dataType The data type for storing samples.
|
||||
* @param w The width (in pixels) of the region of the
|
||||
* image data described.
|
||||
@ -120,7 +121,8 @@ public class SinglePixelPackedSampleModel extends SampleModel
|
||||
* and a scanline stride equal to scanlineStride data array elements.
|
||||
* Each sample is stored in a data array element in the position of
|
||||
* its corresponding bit mask. Each bit mask must be contiguous and
|
||||
* masks must not overlap.
|
||||
* masks must not overlap. Bit masks exceeding data type capacity are
|
||||
* truncated.
|
||||
* @param dataType The data type for storing samples.
|
||||
* @param w The width (in pixels) of the region of
|
||||
* image data described.
|
||||
@ -153,11 +155,13 @@ public class SinglePixelPackedSampleModel extends SampleModel
|
||||
this.bitOffsets = new int[numBands];
|
||||
this.bitSizes = new int[numBands];
|
||||
|
||||
int maxMask = (int)((1L << DataBuffer.getDataTypeSize(dataType)) - 1);
|
||||
|
||||
this.maxBitSize = 0;
|
||||
for (int i=0; i<numBands; i++) {
|
||||
int bitOffset = 0, bitSize = 0, mask;
|
||||
mask = bitMasks[i];
|
||||
|
||||
this.bitMasks[i] &= maxMask;
|
||||
mask = this.bitMasks[i];
|
||||
if (mask != 0) {
|
||||
while ((mask & 1) == 0) {
|
||||
mask = mask >>> 1;
|
||||
@ -243,30 +247,12 @@ public class SinglePixelPackedSampleModel extends SampleModel
|
||||
|
||||
/** Returns the number of bits per sample for all bands. */
|
||||
public int[] getSampleSize() {
|
||||
int mask;
|
||||
int sampleSize[] = new int [numBands];
|
||||
for (int i=0; i<numBands; i++) {
|
||||
sampleSize[i] = 0;
|
||||
mask = bitMasks[i] >>> bitOffsets[i];
|
||||
while ((mask & 1) != 0) {
|
||||
sampleSize[i] ++;
|
||||
mask = mask >>> 1;
|
||||
}
|
||||
}
|
||||
|
||||
return sampleSize;
|
||||
return bitSizes.clone();
|
||||
}
|
||||
|
||||
/** Returns the number of bits per sample for the specified band. */
|
||||
public int getSampleSize(int band) {
|
||||
int sampleSize = 0;
|
||||
int mask = bitMasks[band] >>> bitOffsets[band];
|
||||
while ((mask & 1) != 0) {
|
||||
sampleSize ++;
|
||||
mask = mask >>> 1;
|
||||
}
|
||||
|
||||
return sampleSize;
|
||||
return bitSizes[band];
|
||||
}
|
||||
|
||||
/** Returns the offset (in data array elements) of pixel (x,y).
|
||||
|
@ -34,7 +34,7 @@ import java.io.File;
|
||||
*/
|
||||
|
||||
class DeleteOnExitHook {
|
||||
private static LinkedHashSet<String> files = new LinkedHashSet<String>();
|
||||
private static LinkedHashSet<String> files = new LinkedHashSet<>();
|
||||
static {
|
||||
// DeleteOnExitHook must be the last shutdown hook to be invoked.
|
||||
// Application shutdown hooks may add the first file to the
|
||||
@ -71,7 +71,7 @@ class DeleteOnExitHook {
|
||||
files = null;
|
||||
}
|
||||
|
||||
ArrayList<String> toBeDeleted = new ArrayList<String>(theFiles);
|
||||
ArrayList<String> toBeDeleted = new ArrayList<>(theFiles);
|
||||
|
||||
// reverse the list to maintain previous jdk deletion order.
|
||||
// Last in first deleted.
|
||||
|
@ -1067,7 +1067,7 @@ public class File
|
||||
if ((names == null) || (filter == null)) {
|
||||
return names;
|
||||
}
|
||||
List<String> v = new ArrayList<String>();
|
||||
List<String> v = new ArrayList<>();
|
||||
for (int i = 0 ; i < names.length ; i++) {
|
||||
if (filter.accept(this, names[i])) {
|
||||
v.add(names[i]);
|
||||
@ -1158,7 +1158,7 @@ public class File
|
||||
public File[] listFiles(FilenameFilter filter) {
|
||||
String ss[] = list();
|
||||
if (ss == null) return null;
|
||||
ArrayList<File> files = new ArrayList<File>();
|
||||
ArrayList<File> files = new ArrayList<>();
|
||||
for (String s : ss)
|
||||
if ((filter == null) || filter.accept(this, s))
|
||||
files.add(new File(s, this));
|
||||
@ -1195,7 +1195,7 @@ public class File
|
||||
public File[] listFiles(FileFilter filter) {
|
||||
String ss[] = list();
|
||||
if (ss == null) return null;
|
||||
ArrayList<File> files = new ArrayList<File>();
|
||||
ArrayList<File> files = new ArrayList<>();
|
||||
for (String s : ss) {
|
||||
File f = new File(s, this);
|
||||
if ((filter == null) || filter.accept(f))
|
||||
|
@ -56,7 +56,7 @@ class FileInputStream extends InputStream
|
||||
private volatile boolean closed = false;
|
||||
|
||||
private static final ThreadLocal<Boolean> runningFinalize =
|
||||
new ThreadLocal<Boolean>();
|
||||
new ThreadLocal<>();
|
||||
|
||||
private static boolean isRunningFinalize() {
|
||||
Boolean val;
|
||||
|
@ -69,7 +69,7 @@ class FileOutputStream extends OutputStream
|
||||
private final Object closeLock = new Object();
|
||||
private volatile boolean closed = false;
|
||||
private static final ThreadLocal<Boolean> runningFinalize =
|
||||
new ThreadLocal<Boolean>();
|
||||
new ThreadLocal<>();
|
||||
|
||||
private static boolean isRunningFinalize() {
|
||||
Boolean val;
|
||||
|
@ -725,7 +725,7 @@ implements Serializable {
|
||||
*/
|
||||
|
||||
public FilePermissionCollection() {
|
||||
perms = new ArrayList<Permission>();
|
||||
perms = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -830,7 +830,7 @@ implements Serializable {
|
||||
// Don't call out.defaultWriteObject()
|
||||
|
||||
// Write out Vector
|
||||
Vector<Permission> permissions = new Vector<Permission>(perms.size());
|
||||
Vector<Permission> permissions = new Vector<>(perms.size());
|
||||
synchronized (this) {
|
||||
permissions.addAll(perms);
|
||||
}
|
||||
@ -853,7 +853,7 @@ implements Serializable {
|
||||
|
||||
// Get the one we want
|
||||
Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null);
|
||||
perms = new ArrayList<Permission>(permissions.size());
|
||||
perms = new ArrayList<>(permissions.size());
|
||||
perms.addAll(permissions);
|
||||
}
|
||||
}
|
||||
|
@ -213,7 +213,7 @@ public class ObjectInputStream
|
||||
|
||||
/** table mapping primitive type names to corresponding class objects */
|
||||
private static final HashMap<String, Class<?>> primClasses
|
||||
= new HashMap<String, Class<?>>(8, 1.0F);
|
||||
= new HashMap<>(8, 1.0F);
|
||||
static {
|
||||
primClasses.put("boolean", boolean.class);
|
||||
primClasses.put("byte", byte.class);
|
||||
@ -229,11 +229,11 @@ public class ObjectInputStream
|
||||
private static class Caches {
|
||||
/** cache of subclass security audit results */
|
||||
static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
|
||||
new ConcurrentHashMap<WeakClassKey,Boolean>();
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/** queue for WeakReferences to audited subclasses */
|
||||
static final ReferenceQueue<Class<?>> subclassAuditsQueue =
|
||||
new ReferenceQueue<Class<?>>();
|
||||
new ReferenceQueue<>();
|
||||
}
|
||||
|
||||
/** filter stream for handling block data conversion */
|
||||
|
@ -165,11 +165,11 @@ public class ObjectOutputStream
|
||||
private static class Caches {
|
||||
/** cache of subclass security audit results */
|
||||
static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
|
||||
new ConcurrentHashMap<WeakClassKey,Boolean>();
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/** queue for WeakReferences to audited subclasses */
|
||||
static final ReferenceQueue<Class<?>> subclassAuditsQueue =
|
||||
new ReferenceQueue<Class<?>>();
|
||||
new ReferenceQueue<>();
|
||||
}
|
||||
|
||||
/** filter stream for handling block data conversion */
|
||||
@ -2413,7 +2413,7 @@ public class ObjectOutputStream
|
||||
private final List<String> stack;
|
||||
|
||||
DebugTraceInfoStack() {
|
||||
stack = new ArrayList<String>();
|
||||
stack = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -84,18 +84,18 @@ public class ObjectStreamClass implements Serializable {
|
||||
private static class Caches {
|
||||
/** cache mapping local classes -> descriptors */
|
||||
static final ConcurrentMap<WeakClassKey,Reference<?>> localDescs =
|
||||
new ConcurrentHashMap<WeakClassKey,Reference<?>>();
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/** cache mapping field group/local desc pairs -> field reflectors */
|
||||
static final ConcurrentMap<FieldReflectorKey,Reference<?>> reflectors =
|
||||
new ConcurrentHashMap<FieldReflectorKey,Reference<?>>();
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/** queue for WeakReferences to local classes */
|
||||
private static final ReferenceQueue<Class<?>> localDescsQueue =
|
||||
new ReferenceQueue<Class<?>>();
|
||||
new ReferenceQueue<>();
|
||||
/** queue for WeakReferences to field reflectors keys */
|
||||
private static final ReferenceQueue<Class<?>> reflectorsQueue =
|
||||
new ReferenceQueue<Class<?>>();
|
||||
new ReferenceQueue<>();
|
||||
}
|
||||
|
||||
/** class associated with this descriptor (if any) */
|
||||
@ -290,7 +290,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
EntryFuture future = null;
|
||||
if (entry == null) {
|
||||
EntryFuture newEntry = new EntryFuture();
|
||||
Reference<?> newRef = new SoftReference<EntryFuture>(newEntry);
|
||||
Reference<?> newRef = new SoftReference<>(newEntry);
|
||||
do {
|
||||
if (ref != null) {
|
||||
Caches.localDescs.remove(key, ref);
|
||||
@ -329,7 +329,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
entry = th;
|
||||
}
|
||||
if (future.set(entry)) {
|
||||
Caches.localDescs.put(key, new SoftReference<Object>(entry));
|
||||
Caches.localDescs.put(key, new SoftReference<>(entry));
|
||||
} else {
|
||||
// nested lookup call already set future
|
||||
entry = future.get();
|
||||
@ -1130,7 +1130,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
private ClassDataSlot[] getClassDataLayout0()
|
||||
throws InvalidClassException
|
||||
{
|
||||
ArrayList<ClassDataSlot> slots = new ArrayList<ClassDataSlot>();
|
||||
ArrayList<ClassDataSlot> slots = new ArrayList<>();
|
||||
Class<?> start = cl, end = cl;
|
||||
|
||||
// locate closest non-serializable superclass
|
||||
@ -1566,7 +1566,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
|
||||
ObjectStreamField[] boundFields =
|
||||
new ObjectStreamField[serialPersistentFields.length];
|
||||
Set<String> fieldNames = new HashSet<String>(serialPersistentFields.length);
|
||||
Set<String> fieldNames = new HashSet<>(serialPersistentFields.length);
|
||||
|
||||
for (int i = 0; i < serialPersistentFields.length; i++) {
|
||||
ObjectStreamField spf = serialPersistentFields[i];
|
||||
@ -1604,7 +1604,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
*/
|
||||
private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) {
|
||||
Field[] clFields = cl.getDeclaredFields();
|
||||
ArrayList<ObjectStreamField> list = new ArrayList<ObjectStreamField>();
|
||||
ArrayList<ObjectStreamField> list = new ArrayList<>();
|
||||
int mask = Modifier.STATIC | Modifier.TRANSIENT;
|
||||
|
||||
for (int i = 0; i < clFields.length; i++) {
|
||||
@ -1855,8 +1855,8 @@ public class ObjectStreamClass implements Serializable {
|
||||
writeKeys = new long[nfields];
|
||||
offsets = new int[nfields];
|
||||
typeCodes = new char[nfields];
|
||||
ArrayList<Class<?>> typeList = new ArrayList<Class<?>>();
|
||||
Set<Long> usedKeys = new HashSet<Long>();
|
||||
ArrayList<Class<?>> typeList = new ArrayList<>();
|
||||
Set<Long> usedKeys = new HashSet<>();
|
||||
|
||||
|
||||
for (int i = 0; i < nfields; i++) {
|
||||
@ -2092,7 +2092,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
EntryFuture future = null;
|
||||
if (entry == null) {
|
||||
EntryFuture newEntry = new EntryFuture();
|
||||
Reference<?> newRef = new SoftReference<EntryFuture>(newEntry);
|
||||
Reference<?> newRef = new SoftReference<>(newEntry);
|
||||
do {
|
||||
if (ref != null) {
|
||||
Caches.reflectors.remove(key, ref);
|
||||
@ -2118,7 +2118,7 @@ public class ObjectStreamClass implements Serializable {
|
||||
entry = th;
|
||||
}
|
||||
future.set(entry);
|
||||
Caches.reflectors.put(key, new SoftReference<Object>(entry));
|
||||
Caches.reflectors.put(key, new SoftReference<>(entry));
|
||||
}
|
||||
|
||||
if (entry instanceof FieldReflector) {
|
||||
|
@ -47,7 +47,7 @@ class ApplicationShutdownHooks {
|
||||
}
|
||||
}
|
||||
);
|
||||
hooks = new IdentityHashMap<Thread, Thread>();
|
||||
hooks = new IdentityHashMap<>();
|
||||
} catch (IllegalStateException e) {
|
||||
// application shutdown hooks cannot be added if
|
||||
// shutdown is in progress.
|
||||
|
@ -648,8 +648,7 @@ class Character implements java.io.Serializable, Comparable<Character> {
|
||||
*/
|
||||
public static final class UnicodeBlock extends Subset {
|
||||
|
||||
private static Map<String, UnicodeBlock> map
|
||||
= new HashMap<String, UnicodeBlock>(256);
|
||||
private static Map<String, UnicodeBlock> map = new HashMap<>(256);
|
||||
|
||||
/**
|
||||
* Creates a UnicodeBlock with the given identifier name.
|
||||
@ -4178,7 +4177,7 @@ class Character implements java.io.Serializable, Comparable<Character> {
|
||||
|
||||
private static HashMap<String, Character.UnicodeScript> aliases;
|
||||
static {
|
||||
aliases = new HashMap<String, UnicodeScript>(128);
|
||||
aliases = new HashMap<>(128);
|
||||
aliases.put("ARAB", ARABIC);
|
||||
aliases.put("ARMI", IMPERIAL_ARAMAIC);
|
||||
aliases.put("ARMN", ARMENIAN);
|
||||
|
@ -81,7 +81,7 @@ class CharacterName {
|
||||
} while (cpOff < cpEnd);
|
||||
strPool = new byte[total - cpEnd];
|
||||
dis.readFully(strPool);
|
||||
refStrPool = new SoftReference<byte[]>(strPool);
|
||||
refStrPool = new SoftReference<>(strPool);
|
||||
} catch (Exception x) {
|
||||
throw new InternalError(x.getMessage());
|
||||
} finally {
|
||||
|
@ -1306,7 +1306,7 @@ public final
|
||||
return java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<Class<?>[]>() {
|
||||
public Class[] run() {
|
||||
List<Class<?>> list = new ArrayList<Class<?>>();
|
||||
List<Class<?>> list = new ArrayList<>();
|
||||
Class<?> currentClass = Class.this;
|
||||
while (currentClass != null) {
|
||||
Class<?>[] members = currentClass.getDeclaredClasses();
|
||||
@ -2306,9 +2306,9 @@ public final
|
||||
res = Reflection.filterFields(this, getDeclaredFields0(publicOnly));
|
||||
if (useCaches) {
|
||||
if (publicOnly) {
|
||||
declaredPublicFields = new SoftReference<Field[]>(res);
|
||||
declaredPublicFields = new SoftReference<>(res);
|
||||
} else {
|
||||
declaredFields = new SoftReference<Field[]>(res);
|
||||
declaredFields = new SoftReference<>(res);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
@ -2330,9 +2330,9 @@ public final
|
||||
|
||||
// No cached value available; compute value recursively.
|
||||
// Traverse in correct order for getField().
|
||||
List<Field> fields = new ArrayList<Field>();
|
||||
List<Field> fields = new ArrayList<>();
|
||||
if (traversedInterfaces == null) {
|
||||
traversedInterfaces = new HashSet<Class<?>>();
|
||||
traversedInterfaces = new HashSet<>();
|
||||
}
|
||||
|
||||
// Local fields
|
||||
@ -2358,7 +2358,7 @@ public final
|
||||
res = new Field[fields.size()];
|
||||
fields.toArray(res);
|
||||
if (useCaches) {
|
||||
publicFields = new SoftReference<Field[]>(res);
|
||||
publicFields = new SoftReference<>(res);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@ -2403,9 +2403,9 @@ public final
|
||||
}
|
||||
if (useCaches) {
|
||||
if (publicOnly) {
|
||||
publicConstructors = new SoftReference<Constructor<T>[]>(res);
|
||||
publicConstructors = new SoftReference<>(res);
|
||||
} else {
|
||||
declaredConstructors = new SoftReference<Constructor<T>[]>(res);
|
||||
declaredConstructors = new SoftReference<>(res);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
@ -2440,9 +2440,9 @@ public final
|
||||
res = Reflection.filterMethods(this, getDeclaredMethods0(publicOnly));
|
||||
if (useCaches) {
|
||||
if (publicOnly) {
|
||||
declaredPublicMethods = new SoftReference<Method[]>(res);
|
||||
declaredPublicMethods = new SoftReference<>(res);
|
||||
} else {
|
||||
declaredMethods = new SoftReference<Method[]>(res);
|
||||
declaredMethods = new SoftReference<>(res);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
@ -2598,7 +2598,7 @@ public final
|
||||
methods.compactAndTrim();
|
||||
res = methods.getArray();
|
||||
if (useCaches) {
|
||||
publicMethods = new SoftReference<Method[]>(res);
|
||||
publicMethods = new SoftReference<>(res);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@ -2977,7 +2977,7 @@ public final
|
||||
if (universe == null)
|
||||
throw new IllegalArgumentException(
|
||||
getName() + " is not an enum type");
|
||||
Map<String, T> m = new HashMap<String, T>(2 * universe.length);
|
||||
Map<String, T> m = new HashMap<>(2 * universe.length);
|
||||
for (T constant : universe)
|
||||
m.put(((Enum<?>)constant).name(), constant);
|
||||
enumConstantDirectory = m;
|
||||
@ -3090,7 +3090,7 @@ public final
|
||||
if (superClass == null) {
|
||||
annotations = declaredAnnotations;
|
||||
} else {
|
||||
annotations = new HashMap<Class<? extends Annotation>, Annotation>();
|
||||
annotations = new HashMap<>();
|
||||
superClass.initAnnotationsIfNecessary();
|
||||
for (Map.Entry<Class<? extends Annotation>, Annotation> e : superClass.annotations.entrySet()) {
|
||||
Class<? extends Annotation> annotationClass = e.getKey();
|
||||
|
@ -247,7 +247,7 @@ public abstract class ClassLoader {
|
||||
|
||||
// The classes loaded by this class loader. The only purpose of this table
|
||||
// is to keep the classes from being GC'ed until the loader is GC'ed.
|
||||
private final Vector<Class<?>> classes = new Vector<Class<?>>();
|
||||
private final Vector<Class<?>> classes = new Vector<>();
|
||||
|
||||
// The "default" domain. Set as the default ProtectionDomain on newly
|
||||
// created classes.
|
||||
@ -266,8 +266,7 @@ public abstract class ClassLoader {
|
||||
// The packages defined in this class loader. Each package name is mapped
|
||||
// to its corresponding Package object.
|
||||
// @GuardedBy("itself")
|
||||
private final HashMap<String, Package> packages =
|
||||
new HashMap<String, Package>();
|
||||
private final HashMap<String, Package> packages = new HashMap<>();
|
||||
|
||||
private static Void checkCreateClassLoader() {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
@ -280,16 +279,16 @@ public abstract class ClassLoader {
|
||||
private ClassLoader(Void unused, ClassLoader parent) {
|
||||
this.parent = parent;
|
||||
if (ParallelLoaders.isRegistered(this.getClass())) {
|
||||
parallelLockMap = new ConcurrentHashMap<String, Object>();
|
||||
package2certs = new ConcurrentHashMap<String, Certificate[]>();
|
||||
parallelLockMap = new ConcurrentHashMap<>();
|
||||
package2certs = new ConcurrentHashMap<>();
|
||||
domains =
|
||||
Collections.synchronizedSet(new HashSet<ProtectionDomain>());
|
||||
assertionLock = new Object();
|
||||
} else {
|
||||
// no finer-grained lock; lock on the classloader instance
|
||||
parallelLockMap = null;
|
||||
package2certs = new Hashtable<String, Certificate[]>();
|
||||
domains = new HashSet<ProtectionDomain>();
|
||||
package2certs = new Hashtable<>();
|
||||
domains = new HashSet<>();
|
||||
assertionLock = this;
|
||||
}
|
||||
}
|
||||
@ -1182,7 +1181,7 @@ public abstract class ClassLoader {
|
||||
}
|
||||
tmp[1] = findResources(name);
|
||||
|
||||
return new CompoundEnumeration<URL>(tmp);
|
||||
return new CompoundEnumeration<>(tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1657,7 +1656,7 @@ public abstract class ClassLoader {
|
||||
protected Package[] getPackages() {
|
||||
Map<String, Package> map;
|
||||
synchronized (packages) {
|
||||
map = new HashMap<String, Package>(packages);
|
||||
map = new HashMap<>(packages);
|
||||
}
|
||||
Package[] pkgs;
|
||||
if (parent != null) {
|
||||
@ -1764,20 +1763,17 @@ public abstract class ClassLoader {
|
||||
}
|
||||
|
||||
// All native library names we've loaded.
|
||||
private static Vector<String> loadedLibraryNames
|
||||
= new Vector<String>();
|
||||
private static Vector<String> loadedLibraryNames = new Vector<>();
|
||||
|
||||
// Native libraries belonging to system classes.
|
||||
private static Vector<NativeLibrary> systemNativeLibraries
|
||||
= new Vector<NativeLibrary>();
|
||||
= new Vector<>();
|
||||
|
||||
// Native libraries associated with the class loader.
|
||||
private Vector<NativeLibrary> nativeLibraries
|
||||
= new Vector<NativeLibrary>();
|
||||
private Vector<NativeLibrary> nativeLibraries = new Vector<>();
|
||||
|
||||
// native libraries being loaded/unloaded.
|
||||
private static Stack<NativeLibrary> nativeLibraryContext
|
||||
= new Stack<NativeLibrary>();
|
||||
private static Stack<NativeLibrary> nativeLibraryContext = new Stack<>();
|
||||
|
||||
// The paths searched for libraries
|
||||
private static String usr_paths[];
|
||||
@ -2101,8 +2097,8 @@ public abstract class ClassLoader {
|
||||
* them to empty maps, effectively ignoring any present settings.
|
||||
*/
|
||||
synchronized (assertionLock) {
|
||||
classAssertionStatus = new HashMap<String, Boolean>();
|
||||
packageAssertionStatus = new HashMap<String, Boolean>();
|
||||
classAssertionStatus = new HashMap<>();
|
||||
packageAssertionStatus = new HashMap<>();
|
||||
defaultAssertionStatus = false;
|
||||
}
|
||||
}
|
||||
@ -2164,8 +2160,8 @@ public abstract class ClassLoader {
|
||||
private void initializeJavaAssertionMaps() {
|
||||
// assert Thread.holdsLock(assertionLock);
|
||||
|
||||
classAssertionStatus = new HashMap<String, Boolean>();
|
||||
packageAssertionStatus = new HashMap<String, Boolean>();
|
||||
classAssertionStatus = new HashMap<>();
|
||||
packageAssertionStatus = new HashMap<>();
|
||||
AssertionStatusDirectives directives = retrieveDirectives();
|
||||
|
||||
for(int i = 0; i < directives.classes.length; i++)
|
||||
|
@ -588,16 +588,13 @@ public class Package implements java.lang.reflect.AnnotatedElement {
|
||||
}
|
||||
|
||||
// The map of loaded system packages
|
||||
private static Map<String, Package> pkgs
|
||||
= new HashMap<String, Package>(31);
|
||||
private static Map<String, Package> pkgs = new HashMap<>(31);
|
||||
|
||||
// Maps each directory or zip file name to its corresponding url
|
||||
private static Map<String, URL> urls
|
||||
= new HashMap<String, URL>(10);
|
||||
private static Map<String, URL> urls = new HashMap<>(10);
|
||||
|
||||
// Maps each code source url for a jar file to its manifest
|
||||
private static Map<String, Manifest> mans
|
||||
= new HashMap<String, Manifest>(10);
|
||||
private static Map<String, Manifest> mans = new HashMap<>(10);
|
||||
|
||||
private static native String getSystemPackage0(String name);
|
||||
private static native String[] getSystemPackages0();
|
||||
|
@ -214,7 +214,7 @@ public final class ProcessBuilder
|
||||
* @param command a string array containing the program and its arguments
|
||||
*/
|
||||
public ProcessBuilder(String... command) {
|
||||
this.command = new ArrayList<String>(command.length);
|
||||
this.command = new ArrayList<>(command.length);
|
||||
for (String arg : command)
|
||||
this.command.add(arg);
|
||||
}
|
||||
@ -251,7 +251,7 @@ public final class ProcessBuilder
|
||||
* @return this process builder
|
||||
*/
|
||||
public ProcessBuilder command(String... command) {
|
||||
this.command = new ArrayList<String>(command.length);
|
||||
this.command = new ArrayList<>(command.length);
|
||||
for (String arg : command)
|
||||
this.command.add(arg);
|
||||
return this;
|
||||
|
@ -2330,7 +2330,7 @@ public final class String
|
||||
int off = 0;
|
||||
int next = 0;
|
||||
boolean limited = limit > 0;
|
||||
ArrayList<String> list = new ArrayList<String>();
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
while ((next = indexOf(ch, off)) != -1) {
|
||||
if (!limited || list.size() < limit - 1) {
|
||||
list.add(substring(off, next));
|
||||
|
@ -53,9 +53,9 @@ class StringCoding {
|
||||
|
||||
/** The cached coders for each thread */
|
||||
private final static ThreadLocal<SoftReference<StringDecoder>> decoder =
|
||||
new ThreadLocal<SoftReference<StringDecoder>>();
|
||||
new ThreadLocal<>();
|
||||
private final static ThreadLocal<SoftReference<StringEncoder>> encoder =
|
||||
new ThreadLocal<SoftReference<StringEncoder>>();
|
||||
new ThreadLocal<>();
|
||||
|
||||
private static boolean warnUnsupportedCharset = true;
|
||||
|
||||
@ -67,7 +67,7 @@ class StringCoding {
|
||||
}
|
||||
|
||||
private static <T> void set(ThreadLocal<SoftReference<T>> tl, T ob) {
|
||||
tl.set(new SoftReference<T>(ob));
|
||||
tl.set(new SoftReference<>(ob));
|
||||
}
|
||||
|
||||
// Trim the given byte array to the given length
|
||||
|
@ -1642,8 +1642,7 @@ class Thread implements Runnable {
|
||||
// Get a snapshot of the list of all threads
|
||||
Thread[] threads = getThreads();
|
||||
StackTraceElement[][] traces = dumpThreads(threads);
|
||||
Map<Thread, StackTraceElement[]> m
|
||||
= new HashMap<Thread, StackTraceElement[]>(threads.length);
|
||||
Map<Thread, StackTraceElement[]> m = new HashMap<>(threads.length);
|
||||
for (int i = 0; i < threads.length; i++) {
|
||||
StackTraceElement[] stackTrace = traces[i];
|
||||
if (stackTrace != null) {
|
||||
@ -1664,11 +1663,11 @@ class Thread implements Runnable {
|
||||
private static class Caches {
|
||||
/** cache of subclass security audit results */
|
||||
static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
|
||||
new ConcurrentHashMap<WeakClassKey,Boolean>();
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/** queue for WeakReferences to audited subclasses */
|
||||
static final ReferenceQueue<Class<?>> subclassAuditsQueue =
|
||||
new ReferenceQueue<Class<?>>();
|
||||
new ReferenceQueue<>();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -828,7 +828,7 @@ public class Throwable implements Serializable {
|
||||
// Use the sentinel for a zero-length list
|
||||
suppressed = SUPPRESSED_SENTINEL;
|
||||
} else { // Copy Throwables to new list
|
||||
suppressed = new ArrayList<Throwable>(1);
|
||||
suppressed = new ArrayList<>(1);
|
||||
for (Throwable t : suppressedExceptions) {
|
||||
// Enforce constraints on suppressed exceptions in
|
||||
// case of corrupt or malicious stream.
|
||||
@ -911,7 +911,7 @@ public class Throwable implements Serializable {
|
||||
return;
|
||||
|
||||
if (suppressedExceptions == SUPPRESSED_SENTINEL)
|
||||
suppressedExceptions = new ArrayList<Throwable>(1);
|
||||
suppressedExceptions = new ArrayList<>(1);
|
||||
|
||||
assert suppressedExceptions != SUPPRESSED_SENTINEL;
|
||||
|
||||
|
@ -794,7 +794,7 @@ public class ManagementFactory {
|
||||
*/
|
||||
public static List<Class<? extends PlatformManagedObject>> getAllPlatformMXBeanInterfaces() {
|
||||
List<Class<? extends PlatformManagedObject>> result =
|
||||
new ArrayList<Class<? extends PlatformManagedObject>>();
|
||||
new ArrayList<>();
|
||||
for (PlatformComponent component: PlatformComponent.values()) {
|
||||
result.add(component.getMXBeanInterface());
|
||||
}
|
||||
|
@ -267,7 +267,7 @@ enum PlatformComponent {
|
||||
List<T> getGcMXBeanList(Class<T> gcMXBeanIntf) {
|
||||
List<GarbageCollectorMXBean> list =
|
||||
ManagementFactoryHelper.getGarbageCollectorMXBeans();
|
||||
List<T> result = new ArrayList<T>(list.size());
|
||||
List<T> result = new ArrayList<>(list.size());
|
||||
for (GarbageCollectorMXBean m : list) {
|
||||
if (gcMXBeanIntf.isInstance(m)) {
|
||||
result.add(gcMXBeanIntf.cast(m));
|
||||
@ -330,7 +330,7 @@ enum PlatformComponent {
|
||||
}
|
||||
|
||||
private static Set<String> keyProperties(String... keyNames) {
|
||||
Set<String> set = new HashSet<String>();
|
||||
Set<String> set = new HashSet<>();
|
||||
set.add("type");
|
||||
for (String s : keyNames) {
|
||||
set.add(s);
|
||||
@ -364,7 +364,7 @@ enum PlatformComponent {
|
||||
List<T> getMXBeans(MBeanServerConnection mbs, Class<T> mxbeanInterface)
|
||||
throws java.io.IOException
|
||||
{
|
||||
List<T> result = new ArrayList<T>();
|
||||
List<T> result = new ArrayList<>();
|
||||
for (ObjectName on : getObjectNames(mbs)) {
|
||||
result.add(ManagementFactory.
|
||||
newPlatformMXBeanProxy(mbs,
|
||||
|
@ -144,7 +144,7 @@ public final
|
||||
// which implicitly requires that new java.lang.reflect
|
||||
// objects be fabricated for each reflective call on Class
|
||||
// objects.)
|
||||
Constructor<T> res = new Constructor<T>(clazz,
|
||||
Constructor<T> res = new Constructor<>(clazz,
|
||||
parameterTypes,
|
||||
exceptionTypes, modifiers, slot,
|
||||
signature,
|
||||
|
@ -232,7 +232,7 @@ public class Proxy implements java.io.Serializable {
|
||||
|
||||
/** maps a class loader to the proxy class cache for that loader */
|
||||
private static Map<ClassLoader, Map<List<String>, Object>> loaderToCache
|
||||
= new WeakHashMap<ClassLoader, Map<List<String>, Object>>();
|
||||
= new WeakHashMap<>();
|
||||
|
||||
/** marks that a particular proxy class is currently being generated */
|
||||
private static Object pendingGenerationMarker = new Object();
|
||||
@ -356,7 +356,7 @@ public class Proxy implements java.io.Serializable {
|
||||
String[] interfaceNames = new String[interfaces.length];
|
||||
|
||||
// for detecting duplicates
|
||||
Set<Class<?>> interfaceSet = new HashSet<Class<?>>();
|
||||
Set<Class<?>> interfaceSet = new HashSet<>();
|
||||
|
||||
for (int i = 0; i < interfaces.length; i++) {
|
||||
/*
|
||||
@ -413,7 +413,7 @@ public class Proxy implements java.io.Serializable {
|
||||
synchronized (loaderToCache) {
|
||||
cache = loaderToCache.get(loader);
|
||||
if (cache == null) {
|
||||
cache = new HashMap<List<String>, Object>();
|
||||
cache = new HashMap<>();
|
||||
loaderToCache.put(loader, cache);
|
||||
}
|
||||
/*
|
||||
|
@ -84,7 +84,7 @@ class ReflectAccess implements sun.reflect.LangReflectAccess {
|
||||
byte[] annotations,
|
||||
byte[] parameterAnnotations)
|
||||
{
|
||||
return new Constructor<T>(declaringClass,
|
||||
return new Constructor<>(declaringClass,
|
||||
parameterTypes,
|
||||
checkedExceptions,
|
||||
modifiers,
|
||||
|
@ -364,7 +364,7 @@ public class DriverManager {
|
||||
* @return the list of JDBC Drivers loaded by the caller's class loader
|
||||
*/
|
||||
public static java.util.Enumeration<Driver> getDrivers() {
|
||||
java.util.Vector<Driver> result = new java.util.Vector<Driver>();
|
||||
java.util.Vector<Driver> result = new java.util.Vector<>();
|
||||
java.util.Vector drivers = null;
|
||||
|
||||
if (!initialized) {
|
||||
|
@ -577,7 +577,7 @@ public interface Statement extends Wrapper, AutoCloseable {
|
||||
*
|
||||
* @see #addBatch
|
||||
* @see DatabaseMetaData#supportsBatchUpdates
|
||||
* @since 1.3
|
||||
* @since 1.2
|
||||
*/
|
||||
int[] executeBatch() throws SQLException;
|
||||
|
||||
|
@ -93,73 +93,65 @@ import java.util.Locale;
|
||||
* currency
|
||||
* percent
|
||||
* <i>SubformatPattern</i>
|
||||
*
|
||||
* <i>String:</i>
|
||||
* <i>StringPart<sub>opt</sub></i>
|
||||
* <i>String</i> <i>StringPart</i>
|
||||
*
|
||||
* <i>StringPart:</i>
|
||||
* ''
|
||||
* ' <i>QuotedString</i> '
|
||||
* <i>UnquotedString</i>
|
||||
*
|
||||
* <i>SubformatPattern:</i>
|
||||
* <i>SubformatPatternPart<sub>opt</sub></i>
|
||||
* <i>SubformatPattern</i> <i>SubformatPatternPart</i>
|
||||
*
|
||||
* <i>SubFormatPatternPart:</i>
|
||||
* ' <i>QuotedPattern</i> '
|
||||
* <i>UnquotedPattern</i>
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p>
|
||||
* Within a <i>String</i>, <code>"''"</code> represents a single
|
||||
* quote. A <i>QuotedString</i> can contain arbitrary characters
|
||||
* except single quotes; the surrounding single quotes are removed.
|
||||
* An <i>UnquotedString</i> can contain arbitrary characters
|
||||
* except single quotes and left curly brackets. Thus, a string that
|
||||
* should result in the formatted message "'{0}'" can be written as
|
||||
* <code>"'''{'0}''"</code> or <code>"'''{0}'''"</code>.
|
||||
* <p>
|
||||
* Within a <i>SubformatPattern</i>, different rules apply.
|
||||
* A <i>QuotedPattern</i> can contain arbitrary characters
|
||||
* except single quotes; but the surrounding single quotes are
|
||||
* <strong>not</strong> removed, so they may be interpreted by the
|
||||
* subformat. For example, <code>"{1,number,$'#',##}"</code> will
|
||||
* produce a number format with the pound-sign quoted, with a result
|
||||
* such as: "$#31,45".
|
||||
* An <i>UnquotedPattern</i> can contain arbitrary characters
|
||||
* except single quotes, but curly braces within it must be balanced.
|
||||
* For example, <code>"ab {0} de"</code> and <code>"ab '}' de"</code>
|
||||
* are valid subformat patterns, but <code>"ab {0'}' de"</code> and
|
||||
* <code>"ab } de"</code> are not.
|
||||
* <p>Within a <i>String</i>, a pair of single quotes can be used to
|
||||
* quote any arbitrary characters except single quotes. For example,
|
||||
* pattern string <code>"'{0}'"</code> represents string
|
||||
* <code>"{0}"</code>, not a <i>FormatElement</i>. A single quote itself
|
||||
* must be represented by doubled single quotes {@code ''} throughout a
|
||||
* <i>String</i>. For example, pattern string <code>"'{''}'"</code> is
|
||||
* interpreted as a sequence of <code>'{</code> (start of quoting and a
|
||||
* left curly brace), <code>''</code> (a single quote), and
|
||||
* <code>}'</code> (a right curly brace and end of quoting),
|
||||
* <em>not</em> <code>'{'</code> and <code>'}'</code> (quoted left and
|
||||
* right curly braces): representing string <code>"{'}"</code>,
|
||||
* <em>not</em> <code>"{}"</code>.
|
||||
*
|
||||
* <p>A <i>SubformatPattern</i> is interpreted by its corresponding
|
||||
* subformat, and subformat-dependent pattern rules apply. For example,
|
||||
* pattern string <code>"{1,number,<u>$'#',##</u>}"</code>
|
||||
* (<i>SubformatPattern</i> with underline) will produce a number format
|
||||
* with the pound-sign quoted, with a result such as: {@code
|
||||
* "$#31,45"}. Refer to each {@code Format} subclass documentation for
|
||||
* details.
|
||||
*
|
||||
* <p>Any unmatched quote is treated as closed at the end of the given
|
||||
* pattern. For example, pattern string {@code "'{0}"} is treated as
|
||||
* pattern {@code "'{0}'"}.
|
||||
*
|
||||
* <p>Any curly braces within an unquoted pattern must be balanced. For
|
||||
* example, <code>"ab {0} de"</code> and <code>"ab '}' de"</code> are
|
||||
* valid patterns, but <code>"ab {0'}' de"</code>, <code>"ab } de"</code>
|
||||
* and <code>"''{''"</code> are not.
|
||||
*
|
||||
* <p>
|
||||
* <dl><dt><b>Warning:</b><dd>The rules for using quotes within message
|
||||
* format patterns unfortunately have shown to be somewhat confusing.
|
||||
* In particular, it isn't always obvious to localizers whether single
|
||||
* quotes need to be doubled or not. Make sure to inform localizers about
|
||||
* the rules, and tell them (for example, by using comments in resource
|
||||
* bundle source files) which strings will be processed by MessageFormat.
|
||||
* bundle source files) which strings will be processed by {@code MessageFormat}.
|
||||
* Note that localizers may need to use single quotes in translated
|
||||
* strings where the original version doesn't have them.
|
||||
* </dl>
|
||||
* <p>
|
||||
* The <i>ArgumentIndex</i> value is a non-negative integer written
|
||||
* using the digits '0' through '9', and represents an index into the
|
||||
* <code>arguments</code> array passed to the <code>format</code> methods
|
||||
* or the result array returned by the <code>parse</code> methods.
|
||||
* using the digits {@code '0'} through {@code '9'}, and represents an index into the
|
||||
* {@code arguments} array passed to the {@code format} methods
|
||||
* or the result array returned by the {@code parse} methods.
|
||||
* <p>
|
||||
* The <i>FormatType</i> and <i>FormatStyle</i> values are used to create
|
||||
* a <code>Format</code> instance for the format element. The following
|
||||
* table shows how the values map to Format instances. Combinations not
|
||||
* a {@code Format} instance for the format element. The following
|
||||
* table shows how the values map to {@code Format} instances. Combinations not
|
||||
* shown in the table are illegal. A <i>SubformatPattern</i> must
|
||||
* be a valid pattern string for the Format subclass used.
|
||||
* be a valid pattern string for the {@code Format} subclass used.
|
||||
* <p>
|
||||
* <table border=1 summary="Shows how FormatType and FormatStyle values map to Format instances">
|
||||
* <tr>
|
||||
* <th id="ft">Format Type
|
||||
* <th id="fs">Format Style
|
||||
* <th id="sc">Subformat Created
|
||||
* <th id="ft" class="TableHeadingColor">FormatType
|
||||
* <th id="fs" class="TableHeadingColor">FormatStyle
|
||||
* <th id="sc" class="TableHeadingColor">Subformat Created
|
||||
* <tr>
|
||||
* <td headers="ft"><i>(none)</i>
|
||||
* <td headers="fs"><i>(none)</i>
|
||||
@ -167,61 +159,61 @@ import java.util.Locale;
|
||||
* <tr>
|
||||
* <td headers="ft" rowspan=5><code>number</code>
|
||||
* <td headers="fs"><i>(none)</i>
|
||||
* <td headers="sc"><code>NumberFormat.getInstance(getLocale())</code>
|
||||
* <td headers="sc">{@link NumberFormat#getInstance(Locale) NumberFormat.getInstance}{@code (getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>integer</code>
|
||||
* <td headers="sc"><code>NumberFormat.getIntegerInstance(getLocale())</code>
|
||||
* <td headers="sc">{@link NumberFormat#getIntegerInstance(Locale) NumberFormat.getIntegerInstance}{@code (getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>currency</code>
|
||||
* <td headers="sc"><code>NumberFormat.getCurrencyInstance(getLocale())</code>
|
||||
* <td headers="sc">{@link NumberFormat#getCurrencyInstance(Locale) NumberFormat.getCurrencyInstance}{@code (getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>percent</code>
|
||||
* <td headers="sc"><code>NumberFormat.getPercentInstance(getLocale())</code>
|
||||
* <td headers="sc">{@link NumberFormat#getPercentInstance(Locale) NumberFormat.getPercentInstance}{@code (getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><i>SubformatPattern</i>
|
||||
* <td headers="sc"><code>new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))</code>
|
||||
* <td headers="sc">{@code new} {@link DecimalFormat#DecimalFormat(String,DecimalFormatSymbols) DecimalFormat}{@code (subformatPattern,} {@link DecimalFormatSymbols#getInstance(Locale) DecimalFormatSymbols.getInstance}{@code (getLocale()))}
|
||||
* <tr>
|
||||
* <td headers="ft" rowspan=6><code>date</code>
|
||||
* <td headers="fs"><i>(none)</i>
|
||||
* <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>short</code>
|
||||
* <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.SHORT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#SHORT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>medium</code>
|
||||
* <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>long</code>
|
||||
* <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.LONG, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#LONG}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>full</code>
|
||||
* <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.FULL, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#FULL}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><i>SubformatPattern</i>
|
||||
* <td headers="sc"><code>new SimpleDateFormat(subformatPattern, getLocale())</code>
|
||||
* <td headers="sc">{@code new} {@link SimpleDateFormat#SimpleDateFormat(String,Locale) SimpleDateFormat}{@code (subformatPattern, getLocale())}
|
||||
* <tr>
|
||||
* <td headers="ft" rowspan=6><code>time</code>
|
||||
* <td headers="fs"><i>(none)</i>
|
||||
* <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>short</code>
|
||||
* <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.SHORT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#SHORT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>medium</code>
|
||||
* <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>long</code>
|
||||
* <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.LONG, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#LONG}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><code>full</code>
|
||||
* <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.FULL, getLocale())</code>
|
||||
* <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#FULL}{@code , getLocale())}
|
||||
* <tr>
|
||||
* <td headers="fs"><i>SubformatPattern</i>
|
||||
* <td headers="sc"><code>new SimpleDateFormat(subformatPattern, getLocale())</code>
|
||||
* <td headers="sc">{@code new} {@link SimpleDateFormat#SimpleDateFormat(String,Locale) SimpleDateFormat}{@code (subformatPattern, getLocale())}
|
||||
* <tr>
|
||||
* <td headers="ft"><code>choice</code>
|
||||
* <td headers="fs"><i>SubformatPattern</i>
|
||||
* <td headers="sc"><code>new ChoiceFormat(subformatPattern)</code>
|
||||
* <td headers="sc">{@code new} {@link ChoiceFormat#ChoiceFormat(String) ChoiceFormat}{@code (subformatPattern)}
|
||||
* </table>
|
||||
* <p>
|
||||
*
|
||||
@ -321,7 +313,7 @@ import java.util.Locale;
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p>
|
||||
* Likewise, parsing with a MessageFormat object using patterns containing
|
||||
* Likewise, parsing with a {@code MessageFormat} object using patterns containing
|
||||
* multiple occurrences of the same argument would return the last match. For
|
||||
* example,
|
||||
* <blockquote><pre>
|
||||
@ -343,7 +335,11 @@ import java.util.Locale;
|
||||
* @see Format
|
||||
* @see NumberFormat
|
||||
* @see DecimalFormat
|
||||
* @see DecimalFormatSymbols
|
||||
* @see ChoiceFormat
|
||||
* @see DateFormat
|
||||
* @see SimpleDateFormat
|
||||
*
|
||||
* @author Mark Davis
|
||||
*/
|
||||
|
||||
@ -427,18 +423,19 @@ public class MessageFormat extends Format {
|
||||
* @exception IllegalArgumentException if the pattern is invalid
|
||||
*/
|
||||
public void applyPattern(String pattern) {
|
||||
StringBuffer[] segments = new StringBuffer[4];
|
||||
for (int i = 0; i < segments.length; ++i) {
|
||||
segments[i] = new StringBuffer();
|
||||
}
|
||||
int part = 0;
|
||||
StringBuilder[] segments = new StringBuilder[4];
|
||||
// Allocate only segments[SEG_RAW] here. The rest are
|
||||
// allocated on demand.
|
||||
segments[SEG_RAW] = new StringBuilder();
|
||||
|
||||
int part = SEG_RAW;
|
||||
int formatNumber = 0;
|
||||
boolean inQuote = false;
|
||||
int braceStack = 0;
|
||||
maxOffset = -1;
|
||||
for (int i = 0; i < pattern.length(); ++i) {
|
||||
char ch = pattern.charAt(i);
|
||||
if (part == 0) {
|
||||
if (part == SEG_RAW) {
|
||||
if (ch == '\'') {
|
||||
if (i + 1 < pattern.length()
|
||||
&& pattern.charAt(i+1) == '\'') {
|
||||
@ -448,43 +445,61 @@ public class MessageFormat extends Format {
|
||||
inQuote = !inQuote;
|
||||
}
|
||||
} else if (ch == '{' && !inQuote) {
|
||||
part = 1;
|
||||
part = SEG_INDEX;
|
||||
if (segments[SEG_INDEX] == null) {
|
||||
segments[SEG_INDEX] = new StringBuilder();
|
||||
}
|
||||
} else {
|
||||
segments[part].append(ch);
|
||||
}
|
||||
} else if (inQuote) { // just copy quotes in parts
|
||||
segments[part].append(ch);
|
||||
if (ch == '\'') {
|
||||
inQuote = false;
|
||||
}
|
||||
} else {
|
||||
switch (ch) {
|
||||
case ',':
|
||||
if (part < 3)
|
||||
part += 1;
|
||||
else
|
||||
segments[part].append(ch);
|
||||
break;
|
||||
case '{':
|
||||
++braceStack;
|
||||
} else {
|
||||
if (inQuote) { // just copy quotes in parts
|
||||
segments[part].append(ch);
|
||||
break;
|
||||
case '}':
|
||||
if (braceStack == 0) {
|
||||
part = 0;
|
||||
makeFormat(i, formatNumber, segments);
|
||||
formatNumber++;
|
||||
} else {
|
||||
--braceStack;
|
||||
segments[part].append(ch);
|
||||
if (ch == '\'') {
|
||||
inQuote = false;
|
||||
}
|
||||
} else {
|
||||
switch (ch) {
|
||||
case ',':
|
||||
if (part < SEG_MODIFIER) {
|
||||
if (segments[++part] == null) {
|
||||
segments[part] = new StringBuilder();
|
||||
}
|
||||
} else {
|
||||
segments[part].append(ch);
|
||||
}
|
||||
break;
|
||||
case '{':
|
||||
++braceStack;
|
||||
segments[part].append(ch);
|
||||
break;
|
||||
case '}':
|
||||
if (braceStack == 0) {
|
||||
part = SEG_RAW;
|
||||
makeFormat(i, formatNumber, segments);
|
||||
formatNumber++;
|
||||
// throw away other segments
|
||||
segments[SEG_INDEX] = null;
|
||||
segments[SEG_TYPE] = null;
|
||||
segments[SEG_MODIFIER] = null;
|
||||
} else {
|
||||
--braceStack;
|
||||
segments[part].append(ch);
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
// Skip any leading space chars for SEG_TYPE.
|
||||
if (part != SEG_TYPE || segments[SEG_TYPE].length() > 0) {
|
||||
segments[part].append(ch);
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
inQuote = true;
|
||||
// fall through, so we keep quotes in other parts
|
||||
default:
|
||||
segments[part].append(ch);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
inQuote = true;
|
||||
// fall through, so we keep quotes in other parts
|
||||
default:
|
||||
segments[part].append(ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -506,65 +521,57 @@ public class MessageFormat extends Format {
|
||||
public String toPattern() {
|
||||
// later, make this more extensible
|
||||
int lastOffset = 0;
|
||||
StringBuffer result = new StringBuffer();
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (int i = 0; i <= maxOffset; ++i) {
|
||||
copyAndFixQuotes(pattern, lastOffset, offsets[i],result);
|
||||
copyAndFixQuotes(pattern, lastOffset, offsets[i], result);
|
||||
lastOffset = offsets[i];
|
||||
result.append('{');
|
||||
result.append(argumentNumbers[i]);
|
||||
if (formats[i] == null) {
|
||||
result.append('{').append(argumentNumbers[i]);
|
||||
Format fmt = formats[i];
|
||||
if (fmt == null) {
|
||||
// do nothing, string format
|
||||
} else if (formats[i] instanceof DecimalFormat) {
|
||||
if (formats[i].equals(NumberFormat.getInstance(locale))) {
|
||||
} else if (fmt instanceof NumberFormat) {
|
||||
if (fmt.equals(NumberFormat.getInstance(locale))) {
|
||||
result.append(",number");
|
||||
} else if (formats[i].equals(NumberFormat.getCurrencyInstance(locale))) {
|
||||
} else if (fmt.equals(NumberFormat.getCurrencyInstance(locale))) {
|
||||
result.append(",number,currency");
|
||||
} else if (formats[i].equals(NumberFormat.getPercentInstance(locale))) {
|
||||
} else if (fmt.equals(NumberFormat.getPercentInstance(locale))) {
|
||||
result.append(",number,percent");
|
||||
} else if (formats[i].equals(NumberFormat.getIntegerInstance(locale))) {
|
||||
} else if (fmt.equals(NumberFormat.getIntegerInstance(locale))) {
|
||||
result.append(",number,integer");
|
||||
} else {
|
||||
result.append(",number," +
|
||||
((DecimalFormat)formats[i]).toPattern());
|
||||
if (fmt instanceof DecimalFormat) {
|
||||
result.append(",number,").append(((DecimalFormat)fmt).toPattern());
|
||||
} else if (fmt instanceof ChoiceFormat) {
|
||||
result.append(",choice,").append(((ChoiceFormat)fmt).toPattern());
|
||||
} else {
|
||||
// UNKNOWN
|
||||
}
|
||||
}
|
||||
} else if (formats[i] instanceof SimpleDateFormat) {
|
||||
if (formats[i].equals(DateFormat.getDateInstance(
|
||||
DateFormat.DEFAULT,locale))) {
|
||||
result.append(",date");
|
||||
} else if (formats[i].equals(DateFormat.getDateInstance(
|
||||
DateFormat.SHORT,locale))) {
|
||||
result.append(",date,short");
|
||||
} else if (formats[i].equals(DateFormat.getDateInstance(
|
||||
DateFormat.DEFAULT,locale))) {
|
||||
result.append(",date,medium");
|
||||
} else if (formats[i].equals(DateFormat.getDateInstance(
|
||||
DateFormat.LONG,locale))) {
|
||||
result.append(",date,long");
|
||||
} else if (formats[i].equals(DateFormat.getDateInstance(
|
||||
DateFormat.FULL,locale))) {
|
||||
result.append(",date,full");
|
||||
} else if (formats[i].equals(DateFormat.getTimeInstance(
|
||||
DateFormat.DEFAULT,locale))) {
|
||||
result.append(",time");
|
||||
} else if (formats[i].equals(DateFormat.getTimeInstance(
|
||||
DateFormat.SHORT,locale))) {
|
||||
result.append(",time,short");
|
||||
} else if (formats[i].equals(DateFormat.getTimeInstance(
|
||||
DateFormat.DEFAULT,locale))) {
|
||||
result.append(",time,medium");
|
||||
} else if (formats[i].equals(DateFormat.getTimeInstance(
|
||||
DateFormat.LONG,locale))) {
|
||||
result.append(",time,long");
|
||||
} else if (formats[i].equals(DateFormat.getTimeInstance(
|
||||
DateFormat.FULL,locale))) {
|
||||
result.append(",time,full");
|
||||
} else {
|
||||
result.append(",date,"
|
||||
+ ((SimpleDateFormat)formats[i]).toPattern());
|
||||
} else if (fmt instanceof DateFormat) {
|
||||
int index;
|
||||
for (index = MODIFIER_DEFAULT; index < DATE_TIME_MODIFIERS.length; index++) {
|
||||
DateFormat df = DateFormat.getDateInstance(DATE_TIME_MODIFIERS[index],
|
||||
locale);
|
||||
if (fmt.equals(df)) {
|
||||
result.append(",date");
|
||||
break;
|
||||
}
|
||||
df = DateFormat.getTimeInstance(DATE_TIME_MODIFIERS[index],
|
||||
locale);
|
||||
if (fmt.equals(df)) {
|
||||
result.append(",time");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index >= DATE_TIME_MODIFIERS.length) {
|
||||
if (fmt instanceof SimpleDateFormat) {
|
||||
result.append(",date,").append(((SimpleDateFormat)fmt).toPattern());
|
||||
} else {
|
||||
// UNKNOWN
|
||||
}
|
||||
} else if (index != MODIFIER_DEFAULT) {
|
||||
result.append(',').append(DATE_TIME_MODIFIER_KEYWORDS[index]);
|
||||
}
|
||||
} else if (formats[i] instanceof ChoiceFormat) {
|
||||
result.append(",choice,"
|
||||
+ ((ChoiceFormat)formats[i]).toPattern());
|
||||
} else {
|
||||
//result.append(", unknown");
|
||||
}
|
||||
@ -678,7 +685,7 @@ public class MessageFormat extends Format {
|
||||
*
|
||||
* @param formatElementIndex the index of a format element within the pattern
|
||||
* @param newFormat the format to use for the specified format element
|
||||
* @exception ArrayIndexOutOfBoundsException if formatElementIndex is equal to or
|
||||
* @exception ArrayIndexOutOfBoundsException if {@code formatElementIndex} is equal to or
|
||||
* larger than the number of format elements in the pattern string
|
||||
*/
|
||||
public void setFormat(int formatElementIndex, Format newFormat) {
|
||||
@ -972,7 +979,8 @@ public class MessageFormat extends Format {
|
||||
if (patternOffset >= tempLength) {
|
||||
next = source.length();
|
||||
}else{
|
||||
next = source.indexOf( pattern.substring(patternOffset,tempLength), sourceOffset);
|
||||
next = source.indexOf(pattern.substring(patternOffset, tempLength),
|
||||
sourceOffset);
|
||||
}
|
||||
|
||||
if (next < 0) {
|
||||
@ -1226,7 +1234,7 @@ public class MessageFormat extends Format {
|
||||
lastOffset = offsets[i];
|
||||
int argumentNumber = argumentNumbers[i];
|
||||
if (arguments == null || argumentNumber >= arguments.length) {
|
||||
result.append("{" + argumentNumber + "}");
|
||||
result.append('{').append(argumentNumber).append('}');
|
||||
continue;
|
||||
}
|
||||
// int argRecursion = ((recursionProtection >> (argumentNumber*2)) & 0x3);
|
||||
@ -1338,25 +1346,83 @@ public class MessageFormat extends Format {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String[] typeList =
|
||||
{"", "", "number", "", "date", "", "time", "", "choice"};
|
||||
private static final String[] modifierList =
|
||||
{"", "", "currency", "", "percent", "", "integer"};
|
||||
private static final String[] dateModifierList =
|
||||
{"", "", "short", "", "medium", "", "long", "", "full"};
|
||||
// Indices for segments
|
||||
private static final int SEG_RAW = 0;
|
||||
private static final int SEG_INDEX = 1;
|
||||
private static final int SEG_TYPE = 2;
|
||||
private static final int SEG_MODIFIER = 3; // modifier or subformat
|
||||
|
||||
// Indices for type keywords
|
||||
private static final int TYPE_NULL = 0;
|
||||
private static final int TYPE_NUMBER = 1;
|
||||
private static final int TYPE_DATE = 2;
|
||||
private static final int TYPE_TIME = 3;
|
||||
private static final int TYPE_CHOICE = 4;
|
||||
|
||||
private static final String[] TYPE_KEYWORDS = {
|
||||
"",
|
||||
"number",
|
||||
"date",
|
||||
"time",
|
||||
"choice"
|
||||
};
|
||||
|
||||
// Indices for number modifiers
|
||||
private static final int MODIFIER_DEFAULT = 0; // common in number and date-time
|
||||
private static final int MODIFIER_CURRENCY = 1;
|
||||
private static final int MODIFIER_PERCENT = 2;
|
||||
private static final int MODIFIER_INTEGER = 3;
|
||||
|
||||
private static final String[] NUMBER_MODIFIER_KEYWORDS = {
|
||||
"",
|
||||
"currency",
|
||||
"percent",
|
||||
"integer"
|
||||
};
|
||||
|
||||
// Indices for date-time modifiers
|
||||
private static final int MODIFIER_SHORT = 1;
|
||||
private static final int MODIFIER_MEDIUM = 2;
|
||||
private static final int MODIFIER_LONG = 3;
|
||||
private static final int MODIFIER_FULL = 4;
|
||||
|
||||
private static final String[] DATE_TIME_MODIFIER_KEYWORDS = {
|
||||
"",
|
||||
"short",
|
||||
"medium",
|
||||
"long",
|
||||
"full"
|
||||
};
|
||||
|
||||
// Date-time style values corresponding to the date-time modifiers.
|
||||
private static final int[] DATE_TIME_MODIFIERS = {
|
||||
DateFormat.DEFAULT,
|
||||
DateFormat.SHORT,
|
||||
DateFormat.MEDIUM,
|
||||
DateFormat.LONG,
|
||||
DateFormat.FULL,
|
||||
};
|
||||
|
||||
private void makeFormat(int position, int offsetNumber,
|
||||
StringBuffer[] segments)
|
||||
StringBuilder[] textSegments)
|
||||
{
|
||||
String[] segments = new String[textSegments.length];
|
||||
for (int i = 0; i < textSegments.length; i++) {
|
||||
StringBuilder oneseg = textSegments[i];
|
||||
segments[i] = (oneseg != null) ? oneseg.toString() : "";
|
||||
}
|
||||
|
||||
// get the argument number
|
||||
int argumentNumber;
|
||||
try {
|
||||
argumentNumber = Integer.parseInt(segments[1].toString()); // always unlocalized!
|
||||
argumentNumber = Integer.parseInt(segments[SEG_INDEX]); // always unlocalized!
|
||||
} catch (NumberFormatException e) {
|
||||
throw new IllegalArgumentException("can't parse argument number: " + segments[1]);
|
||||
throw new IllegalArgumentException("can't parse argument number: "
|
||||
+ segments[SEG_INDEX], e);
|
||||
}
|
||||
if (argumentNumber < 0) {
|
||||
throw new IllegalArgumentException("negative argument number: " + argumentNumber);
|
||||
throw new IllegalArgumentException("negative argument number: "
|
||||
+ argumentNumber);
|
||||
}
|
||||
|
||||
// resize format information arrays if necessary
|
||||
@ -1374,120 +1440,129 @@ public class MessageFormat extends Format {
|
||||
}
|
||||
int oldMaxOffset = maxOffset;
|
||||
maxOffset = offsetNumber;
|
||||
offsets[offsetNumber] = segments[0].length();
|
||||
offsets[offsetNumber] = segments[SEG_RAW].length();
|
||||
argumentNumbers[offsetNumber] = argumentNumber;
|
||||
|
||||
// now get the format
|
||||
Format newFormat = null;
|
||||
switch (findKeyword(segments[2].toString(), typeList)) {
|
||||
case 0:
|
||||
break;
|
||||
case 1: case 2:// number
|
||||
switch (findKeyword(segments[3].toString(), modifierList)) {
|
||||
case 0: // default;
|
||||
newFormat = NumberFormat.getInstance(locale);
|
||||
if (segments[SEG_TYPE].length() != 0) {
|
||||
int type = findKeyword(segments[SEG_TYPE], TYPE_KEYWORDS);
|
||||
switch (type) {
|
||||
case TYPE_NULL:
|
||||
// Type "" is allowed. e.g., "{0,}", "{0,,}", and "{0,,#}"
|
||||
// are treated as "{0}".
|
||||
break;
|
||||
case 1: case 2:// currency
|
||||
newFormat = NumberFormat.getCurrencyInstance(locale);
|
||||
|
||||
case TYPE_NUMBER:
|
||||
switch (findKeyword(segments[SEG_MODIFIER], NUMBER_MODIFIER_KEYWORDS)) {
|
||||
case MODIFIER_DEFAULT:
|
||||
newFormat = NumberFormat.getInstance(locale);
|
||||
break;
|
||||
case MODIFIER_CURRENCY:
|
||||
newFormat = NumberFormat.getCurrencyInstance(locale);
|
||||
break;
|
||||
case MODIFIER_PERCENT:
|
||||
newFormat = NumberFormat.getPercentInstance(locale);
|
||||
break;
|
||||
case MODIFIER_INTEGER:
|
||||
newFormat = NumberFormat.getIntegerInstance(locale);
|
||||
break;
|
||||
default: // DecimalFormat pattern
|
||||
try {
|
||||
newFormat = new DecimalFormat(segments[SEG_MODIFIER],
|
||||
DecimalFormatSymbols.getInstance(locale));
|
||||
} catch (IllegalArgumentException e) {
|
||||
maxOffset = oldMaxOffset;
|
||||
throw e;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 3: case 4:// percent
|
||||
newFormat = NumberFormat.getPercentInstance(locale);
|
||||
|
||||
case TYPE_DATE:
|
||||
case TYPE_TIME:
|
||||
int mod = findKeyword(segments[SEG_MODIFIER], DATE_TIME_MODIFIER_KEYWORDS);
|
||||
if (mod >= 0 && mod < DATE_TIME_MODIFIER_KEYWORDS.length) {
|
||||
if (type == TYPE_DATE) {
|
||||
newFormat = DateFormat.getDateInstance(DATE_TIME_MODIFIERS[mod],
|
||||
locale);
|
||||
} else {
|
||||
newFormat = DateFormat.getTimeInstance(DATE_TIME_MODIFIERS[mod],
|
||||
locale);
|
||||
}
|
||||
} else {
|
||||
// SimpleDateFormat pattern
|
||||
try {
|
||||
newFormat = new SimpleDateFormat(segments[SEG_MODIFIER], locale);
|
||||
} catch (IllegalArgumentException e) {
|
||||
maxOffset = oldMaxOffset;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: case 6:// integer
|
||||
newFormat = NumberFormat.getIntegerInstance(locale);
|
||||
break;
|
||||
default: // pattern
|
||||
newFormat = new DecimalFormat(segments[3].toString(), DecimalFormatSymbols.getInstance(locale));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 3: case 4: // date
|
||||
switch (findKeyword(segments[3].toString(), dateModifierList)) {
|
||||
case 0: // default
|
||||
newFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
|
||||
break;
|
||||
case 1: case 2: // short
|
||||
newFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale);
|
||||
break;
|
||||
case 3: case 4: // medium
|
||||
newFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
|
||||
break;
|
||||
case 5: case 6: // long
|
||||
newFormat = DateFormat.getDateInstance(DateFormat.LONG, locale);
|
||||
break;
|
||||
case 7: case 8: // full
|
||||
newFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
|
||||
|
||||
case TYPE_CHOICE:
|
||||
try {
|
||||
// ChoiceFormat pattern
|
||||
newFormat = new ChoiceFormat(segments[SEG_MODIFIER]);
|
||||
} catch (Exception e) {
|
||||
maxOffset = oldMaxOffset;
|
||||
throw new IllegalArgumentException("Choice Pattern incorrect: "
|
||||
+ segments[SEG_MODIFIER], e);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
newFormat = new SimpleDateFormat(segments[3].toString(), locale);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 5: case 6:// time
|
||||
switch (findKeyword(segments[3].toString(), dateModifierList)) {
|
||||
case 0: // default
|
||||
newFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
|
||||
break;
|
||||
case 1: case 2: // short
|
||||
newFormat = DateFormat.getTimeInstance(DateFormat.SHORT, locale);
|
||||
break;
|
||||
case 3: case 4: // medium
|
||||
newFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
|
||||
break;
|
||||
case 5: case 6: // long
|
||||
newFormat = DateFormat.getTimeInstance(DateFormat.LONG, locale);
|
||||
break;
|
||||
case 7: case 8: // full
|
||||
newFormat = DateFormat.getTimeInstance(DateFormat.FULL, locale);
|
||||
break;
|
||||
default:
|
||||
newFormat = new SimpleDateFormat(segments[3].toString(), locale);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 7: case 8:// choice
|
||||
try {
|
||||
newFormat = new ChoiceFormat(segments[3].toString());
|
||||
} catch (Exception e) {
|
||||
maxOffset = oldMaxOffset;
|
||||
throw new IllegalArgumentException(
|
||||
"Choice Pattern incorrect");
|
||||
throw new IllegalArgumentException("unknown format type: " +
|
||||
segments[SEG_TYPE]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
maxOffset = oldMaxOffset;
|
||||
throw new IllegalArgumentException("unknown format type: " +
|
||||
segments[2].toString());
|
||||
}
|
||||
formats[offsetNumber] = newFormat;
|
||||
segments[1].setLength(0); // throw away other segments
|
||||
segments[2].setLength(0);
|
||||
segments[3].setLength(0);
|
||||
}
|
||||
|
||||
private static final int findKeyword(String s, String[] list) {
|
||||
s = s.trim().toLowerCase();
|
||||
for (int i = 0; i < list.length; ++i) {
|
||||
if (s.equals(list[i]))
|
||||
return i;
|
||||
}
|
||||
|
||||
// Try trimmed lowercase.
|
||||
String ls = s.trim().toLowerCase(Locale.ROOT);
|
||||
if (ls != s) {
|
||||
for (int i = 0; i < list.length; ++i) {
|
||||
if (ls.equals(list[i]))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
private static final void copyAndFixQuotes(
|
||||
String source, int start, int end, StringBuffer target) {
|
||||
private static final void copyAndFixQuotes(String source, int start, int end,
|
||||
StringBuilder target) {
|
||||
boolean quoted = false;
|
||||
|
||||
for (int i = start; i < end; ++i) {
|
||||
char ch = source.charAt(i);
|
||||
if (ch == '{') {
|
||||
target.append("'{'");
|
||||
} else if (ch == '}') {
|
||||
target.append("'}'");
|
||||
if (!quoted) {
|
||||
target.append('\'');
|
||||
quoted = true;
|
||||
}
|
||||
target.append(ch);
|
||||
} else if (ch == '\'') {
|
||||
target.append("''");
|
||||
} else {
|
||||
if (quoted) {
|
||||
target.append('\'');
|
||||
quoted = false;
|
||||
}
|
||||
target.append(ch);
|
||||
}
|
||||
}
|
||||
if (quoted) {
|
||||
target.append('\'');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1662,6 +1662,81 @@ public class SimpleDateFormat extends DateFormat {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses numeric forms of time zone offset, such as "hh:mm", and
|
||||
* sets calb to the parsed value.
|
||||
*
|
||||
* @param text the text to be parsed
|
||||
* @param start the character position to start parsing
|
||||
* @param sign 1: positive; -1: negative
|
||||
* @param count 0: 'Z' or "GMT+hh:mm" parsing; 1 - 3: the number of 'X's
|
||||
* @param colon true - colon required between hh and mm; false - no colon required
|
||||
* @param calb a CalendarBuilder in which the parsed value is stored
|
||||
* @return updated parsed position, or its negative value to indicate a parsing error
|
||||
*/
|
||||
private int subParseNumericZone(String text, int start, int sign, int count,
|
||||
boolean colon, CalendarBuilder calb) {
|
||||
int index = start;
|
||||
|
||||
parse:
|
||||
try {
|
||||
char c = text.charAt(index++);
|
||||
// Parse hh
|
||||
int hours;
|
||||
if (!isDigit(c)) {
|
||||
break parse;
|
||||
}
|
||||
hours = c - '0';
|
||||
c = text.charAt(index++);
|
||||
if (isDigit(c)) {
|
||||
hours = hours * 10 + (c - '0');
|
||||
} else {
|
||||
// If no colon in RFC 822 or 'X' (ISO), two digits are
|
||||
// required.
|
||||
if (count > 0 || !colon) {
|
||||
break parse;
|
||||
}
|
||||
--index;
|
||||
}
|
||||
if (hours > 23) {
|
||||
break parse;
|
||||
}
|
||||
int minutes = 0;
|
||||
if (count != 1) {
|
||||
// Proceed with parsing mm
|
||||
c = text.charAt(index++);
|
||||
if (colon) {
|
||||
if (c != ':') {
|
||||
break parse;
|
||||
}
|
||||
c = text.charAt(index++);
|
||||
}
|
||||
if (!isDigit(c)) {
|
||||
break parse;
|
||||
}
|
||||
minutes = c - '0';
|
||||
c = text.charAt(index++);
|
||||
if (!isDigit(c)) {
|
||||
break parse;
|
||||
}
|
||||
minutes = minutes * 10 + (c - '0');
|
||||
if (minutes > 59) {
|
||||
break parse;
|
||||
}
|
||||
}
|
||||
minutes += hours * 60;
|
||||
calb.set(Calendar.ZONE_OFFSET, minutes * MILLIS_PER_MINUTE * sign)
|
||||
.set(Calendar.DST_OFFSET, 0);
|
||||
return index;
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
}
|
||||
return 1 - index; // -(index - 1)
|
||||
}
|
||||
|
||||
private boolean isDigit(char c) {
|
||||
return c >= '0' && c <= '9';
|
||||
}
|
||||
|
||||
/**
|
||||
* Private member function that converts the parsed date strings into
|
||||
* timeFields. Returns -start (for ParsePosition) if failed.
|
||||
@ -1907,248 +1982,95 @@ public class SimpleDateFormat extends DateFormat {
|
||||
|
||||
case PATTERN_ZONE_NAME: // 'z'
|
||||
case PATTERN_ZONE_VALUE: // 'Z'
|
||||
// First try to parse generic forms such as GMT-07:00. Do this first
|
||||
// in case localized TimeZoneNames contains the string "GMT"
|
||||
// for a zone; in that case, we don't want to match the first three
|
||||
// characters of GMT+/-hh:mm etc.
|
||||
{
|
||||
int sign = 0;
|
||||
int offset;
|
||||
|
||||
// For time zones that have no known names, look for strings
|
||||
// of the form:
|
||||
// GMT[+-]hours:minutes or
|
||||
// GMT.
|
||||
if ((text.length() - start) >= GMT.length() &&
|
||||
text.regionMatches(true, start, GMT, 0, GMT.length())) {
|
||||
int num;
|
||||
calb.set(Calendar.DST_OFFSET, 0);
|
||||
pos.index = start + GMT.length();
|
||||
|
||||
try { // try-catch for "GMT" only time zone string
|
||||
char c = text.charAt(pos.index);
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
}
|
||||
try {
|
||||
char c = text.charAt(pos.index);
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
}
|
||||
catch(StringIndexOutOfBoundsException e) {}
|
||||
if (sign == 0) {
|
||||
// Try parsing a custom time zone "GMT+hh:mm" or "GMT".
|
||||
if ((c == 'G' || c == 'g')
|
||||
&& (text.length() - start) >= GMT.length()
|
||||
&& text.regionMatches(true, start, GMT, 0, GMT.length())) {
|
||||
pos.index = start + GMT.length();
|
||||
|
||||
if (sign == 0) { /* "GMT" without offset */
|
||||
calb.set(Calendar.ZONE_OFFSET, 0);
|
||||
return pos.index;
|
||||
}
|
||||
|
||||
// Look for hours.
|
||||
try {
|
||||
char c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
num = c - '0';
|
||||
|
||||
if (text.charAt(++pos.index) != ':') {
|
||||
c = text.charAt(pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
if ((text.length() - pos.index) > 0) {
|
||||
c = text.charAt(pos.index);
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
}
|
||||
}
|
||||
num *= 10;
|
||||
num += c - '0';
|
||||
pos.index++;
|
||||
}
|
||||
if (num > 23) {
|
||||
--pos.index;
|
||||
break parsing;
|
||||
}
|
||||
if (text.charAt(pos.index) != ':') {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
// Look for minutes.
|
||||
offset = num * 60;
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
num = c - '0';
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
num *= 10;
|
||||
num += c - '0';
|
||||
if (sign == 0) { /* "GMT" without offset */
|
||||
calb.set(Calendar.ZONE_OFFSET, 0)
|
||||
.set(Calendar.DST_OFFSET, 0);
|
||||
return pos.index;
|
||||
}
|
||||
|
||||
if (num > 59) {
|
||||
break parsing;
|
||||
}
|
||||
} catch (StringIndexOutOfBoundsException e) {
|
||||
break parsing;
|
||||
}
|
||||
offset += num;
|
||||
// Fall through for final processing below of 'offset' and 'sign'.
|
||||
} else {
|
||||
// If the first character is a sign, look for numeric timezones of
|
||||
// the form [+-]hhmm as specified by RFC 822. Otherwise, check
|
||||
// for named time zones by looking through the locale data from
|
||||
// the TimeZoneNames strings.
|
||||
try {
|
||||
char c = text.charAt(pos.index);
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
} else {
|
||||
// Try parsing the text as a time zone name (abbr).
|
||||
int i = subParseZoneString(text, pos.index, calb);
|
||||
if (i != 0) {
|
||||
// Parse the rest as "hh:mm"
|
||||
int i = subParseNumericZone(text, ++pos.index,
|
||||
sign, 0, true, calb);
|
||||
if (i > 0) {
|
||||
return i;
|
||||
}
|
||||
break parsing;
|
||||
pos.index = -i;
|
||||
} else {
|
||||
// Try parsing the text as a time zone
|
||||
// name or abbreviation.
|
||||
int i = subParseZoneString(text, pos.index, calb);
|
||||
if (i > 0) {
|
||||
return i;
|
||||
}
|
||||
pos.index = -i;
|
||||
}
|
||||
|
||||
// Parse the text as an RFC 822 time zone string. This code is
|
||||
// actually a little more permissive than RFC 822. It will
|
||||
// try to do its best with numbers that aren't strictly 4
|
||||
// digits long.
|
||||
|
||||
// Look for hh.
|
||||
int hours = 0;
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
} else {
|
||||
// Parse the rest as "hhmm" (RFC 822)
|
||||
int i = subParseNumericZone(text, ++pos.index,
|
||||
sign, 0, false, calb);
|
||||
if (i > 0) {
|
||||
return i;
|
||||
}
|
||||
hours = c - '0';
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
hours *= 10;
|
||||
hours += c - '0';
|
||||
|
||||
if (hours > 23) {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
// Look for mm.
|
||||
int minutes = 0;
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
minutes = c - '0';
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
minutes *= 10;
|
||||
minutes += c - '0';
|
||||
|
||||
if (minutes > 59) {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
offset = hours * 60 + minutes;
|
||||
} catch (StringIndexOutOfBoundsException e) {
|
||||
break parsing;
|
||||
pos.index = -i;
|
||||
}
|
||||
}
|
||||
|
||||
// Do the final processing for both of the above cases. We only
|
||||
// arrive here if the form GMT+/-... or an RFC 822 form was seen.
|
||||
if (sign != 0) {
|
||||
offset *= MILLIS_PER_MINUTE * sign;
|
||||
calb.set(Calendar.ZONE_OFFSET, offset).set(Calendar.DST_OFFSET, 0);
|
||||
return ++pos.index;
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
}
|
||||
}
|
||||
break parsing;
|
||||
|
||||
case PATTERN_ISO_ZONE: // 'X'
|
||||
{
|
||||
int sign = 0;
|
||||
int offset = 0;
|
||||
|
||||
iso8601: {
|
||||
try {
|
||||
char c = text.charAt(pos.index);
|
||||
if (c == 'Z') {
|
||||
calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0);
|
||||
return ++pos.index;
|
||||
}
|
||||
|
||||
// parse text as "+/-hh[[:]mm]" based on count
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
}
|
||||
// Look for hh.
|
||||
int hours = 0;
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
hours = c - '0';
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
hours *= 10;
|
||||
hours += c - '0';
|
||||
if (hours > 23) {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
if (count == 1) { // "X"
|
||||
offset = hours * 60;
|
||||
break iso8601;
|
||||
}
|
||||
|
||||
c = text.charAt(++pos.index);
|
||||
// Skip ':' if "XXX"
|
||||
if (c == ':') {
|
||||
if (count == 2) {
|
||||
break parsing;
|
||||
}
|
||||
c = text.charAt(++pos.index);
|
||||
} else {
|
||||
if (count == 3) {
|
||||
// missing ':'
|
||||
break parsing;
|
||||
}
|
||||
}
|
||||
|
||||
// Look for mm.
|
||||
int minutes = 0;
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
minutes = c - '0';
|
||||
c = text.charAt(++pos.index);
|
||||
if (c < '0' || c > '9') { /* must be from '0' to '9'. */
|
||||
break parsing;
|
||||
}
|
||||
minutes *= 10;
|
||||
minutes += c - '0';
|
||||
|
||||
if (minutes > 59) {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
offset = hours * 60 + minutes;
|
||||
} catch (StringIndexOutOfBoundsException e) {
|
||||
break parsing;
|
||||
}
|
||||
if ((text.length() - pos.index) <= 0) {
|
||||
break parsing;
|
||||
}
|
||||
|
||||
// Do the final processing for both of the above cases. We only
|
||||
// arrive here if the form GMT+/-... or an RFC 822 form was seen.
|
||||
if (sign != 0) {
|
||||
offset *= MILLIS_PER_MINUTE * sign;
|
||||
calb.set(Calendar.ZONE_OFFSET, offset).set(Calendar.DST_OFFSET, 0);
|
||||
int sign = 0;
|
||||
char c = text.charAt(pos.index);
|
||||
if (c == 'Z') {
|
||||
calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0);
|
||||
return ++pos.index;
|
||||
}
|
||||
|
||||
// parse text as "+/-hh[[:]mm]" based on count
|
||||
if (c == '+') {
|
||||
sign = 1;
|
||||
} else if (c == '-') {
|
||||
sign = -1;
|
||||
} else {
|
||||
++pos.index;
|
||||
break parsing;
|
||||
}
|
||||
int i = subParseNumericZone(text, ++pos.index, sign, count,
|
||||
count == 3, calb);
|
||||
if (i > 0) {
|
||||
return i;
|
||||
}
|
||||
pos.index = -i;
|
||||
}
|
||||
break parsing;
|
||||
|
||||
|
@ -482,8 +482,8 @@ public abstract class AbstractList<E> extends AbstractCollection<E> implements L
|
||||
*/
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return (this instanceof RandomAccess ?
|
||||
new RandomAccessSubList<E>(this, fromIndex, toIndex) :
|
||||
new SubList<E>(this, fromIndex, toIndex));
|
||||
new RandomAccessSubList<>(this, fromIndex, toIndex) :
|
||||
new SubList<>(this, fromIndex, toIndex));
|
||||
}
|
||||
|
||||
// Comparison and hashing
|
||||
@ -747,7 +747,7 @@ class SubList<E> extends AbstractList<E> {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new SubList<E>(this, fromIndex, toIndex);
|
||||
return new SubList<>(this, fromIndex, toIndex);
|
||||
}
|
||||
|
||||
private void rangeCheck(int index) {
|
||||
@ -776,6 +776,6 @@ class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new RandomAccessSubList<E>(this, fromIndex, toIndex);
|
||||
return new RandomAccessSubList<>(this, fromIndex, toIndex);
|
||||
}
|
||||
}
|
||||
|
@ -2824,7 +2824,7 @@ public class Arrays {
|
||||
* @return a list view of the specified array
|
||||
*/
|
||||
public static <T> List<T> asList(T... a) {
|
||||
return new ArrayList<T>(a);
|
||||
return new ArrayList<>(a);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1035,7 +1035,7 @@ public class Collections {
|
||||
* @return an unmodifiable view of the specified collection.
|
||||
*/
|
||||
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
|
||||
return new UnmodifiableCollection<T>(c);
|
||||
return new UnmodifiableCollection<>(c);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1109,7 +1109,7 @@ public class Collections {
|
||||
* @return an unmodifiable view of the specified set.
|
||||
*/
|
||||
public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
|
||||
return new UnmodifiableSet<T>(s);
|
||||
return new UnmodifiableSet<>(s);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1141,7 +1141,7 @@ public class Collections {
|
||||
* @return an unmodifiable view of the specified sorted set.
|
||||
*/
|
||||
public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
|
||||
return new UnmodifiableSortedSet<T>(s);
|
||||
return new UnmodifiableSortedSet<>(s);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1158,13 +1158,13 @@ public class Collections {
|
||||
public Comparator<? super E> comparator() {return ss.comparator();}
|
||||
|
||||
public SortedSet<E> subSet(E fromElement, E toElement) {
|
||||
return new UnmodifiableSortedSet<E>(ss.subSet(fromElement,toElement));
|
||||
return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement));
|
||||
}
|
||||
public SortedSet<E> headSet(E toElement) {
|
||||
return new UnmodifiableSortedSet<E>(ss.headSet(toElement));
|
||||
return new UnmodifiableSortedSet<>(ss.headSet(toElement));
|
||||
}
|
||||
public SortedSet<E> tailSet(E fromElement) {
|
||||
return new UnmodifiableSortedSet<E>(ss.tailSet(fromElement));
|
||||
return new UnmodifiableSortedSet<>(ss.tailSet(fromElement));
|
||||
}
|
||||
|
||||
public E first() {return ss.first();}
|
||||
@ -1188,8 +1188,8 @@ public class Collections {
|
||||
*/
|
||||
public static <T> List<T> unmodifiableList(List<? extends T> list) {
|
||||
return (list instanceof RandomAccess ?
|
||||
new UnmodifiableRandomAccessList<T>(list) :
|
||||
new UnmodifiableList<T>(list));
|
||||
new UnmodifiableRandomAccessList<>(list) :
|
||||
new UnmodifiableList<>(list));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1250,7 +1250,7 @@ public class Collections {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new UnmodifiableList<E>(list.subList(fromIndex, toIndex));
|
||||
return new UnmodifiableList<>(list.subList(fromIndex, toIndex));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1267,7 +1267,7 @@ public class Collections {
|
||||
*/
|
||||
private Object readResolve() {
|
||||
return (list instanceof RandomAccess
|
||||
? new UnmodifiableRandomAccessList<E>(list)
|
||||
? new UnmodifiableRandomAccessList<>(list)
|
||||
: this);
|
||||
}
|
||||
}
|
||||
@ -1283,7 +1283,7 @@ public class Collections {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new UnmodifiableRandomAccessList<E>(
|
||||
return new UnmodifiableRandomAccessList<>(
|
||||
list.subList(fromIndex, toIndex));
|
||||
}
|
||||
|
||||
@ -1296,7 +1296,7 @@ public class Collections {
|
||||
* deserialization.
|
||||
*/
|
||||
private Object writeReplace() {
|
||||
return new UnmodifiableList<E>(list);
|
||||
return new UnmodifiableList<>(list);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1315,7 +1315,7 @@ public class Collections {
|
||||
* @return an unmodifiable view of the specified map.
|
||||
*/
|
||||
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
|
||||
return new UnmodifiableMap<K,V>(m);
|
||||
return new UnmodifiableMap<>(m);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1363,7 +1363,7 @@ public class Collections {
|
||||
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
if (entrySet==null)
|
||||
entrySet = new UnmodifiableEntrySet<K,V>(m.entrySet());
|
||||
entrySet = new UnmodifiableEntrySet<>(m.entrySet());
|
||||
return entrySet;
|
||||
}
|
||||
|
||||
@ -1400,7 +1400,7 @@ public class Collections {
|
||||
return i.hasNext();
|
||||
}
|
||||
public Map.Entry<K,V> next() {
|
||||
return new UnmodifiableEntry<K,V>(i.next());
|
||||
return new UnmodifiableEntry<>(i.next());
|
||||
}
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
@ -1411,7 +1411,7 @@ public class Collections {
|
||||
public Object[] toArray() {
|
||||
Object[] a = c.toArray();
|
||||
for (int i=0; i<a.length; i++)
|
||||
a[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)a[i]);
|
||||
a[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)a[i]);
|
||||
return a;
|
||||
}
|
||||
|
||||
@ -1422,7 +1422,7 @@ public class Collections {
|
||||
Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
|
||||
|
||||
for (int i=0; i<arr.length; i++)
|
||||
arr[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)arr[i]);
|
||||
arr[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)arr[i]);
|
||||
|
||||
if (arr.length > a.length)
|
||||
return (T[])arr;
|
||||
@ -1443,7 +1443,7 @@ public class Collections {
|
||||
if (!(o instanceof Map.Entry))
|
||||
return false;
|
||||
return c.contains(
|
||||
new UnmodifiableEntry<Object,Object>((Map.Entry<?,?>) o));
|
||||
new UnmodifiableEntry<>((Map.Entry<?,?>) o));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1517,7 +1517,7 @@ public class Collections {
|
||||
* @return an unmodifiable view of the specified sorted map.
|
||||
*/
|
||||
public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m) {
|
||||
return new UnmodifiableSortedMap<K,V>(m);
|
||||
return new UnmodifiableSortedMap<>(m);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1535,13 +1535,13 @@ public class Collections {
|
||||
public Comparator<? super K> comparator() {return sm.comparator();}
|
||||
|
||||
public SortedMap<K,V> subMap(K fromKey, K toKey) {
|
||||
return new UnmodifiableSortedMap<K,V>(sm.subMap(fromKey, toKey));
|
||||
return new UnmodifiableSortedMap<>(sm.subMap(fromKey, toKey));
|
||||
}
|
||||
public SortedMap<K,V> headMap(K toKey) {
|
||||
return new UnmodifiableSortedMap<K,V>(sm.headMap(toKey));
|
||||
return new UnmodifiableSortedMap<>(sm.headMap(toKey));
|
||||
}
|
||||
public SortedMap<K,V> tailMap(K fromKey) {
|
||||
return new UnmodifiableSortedMap<K,V>(sm.tailMap(fromKey));
|
||||
return new UnmodifiableSortedMap<>(sm.tailMap(fromKey));
|
||||
}
|
||||
|
||||
public K firstKey() {return sm.firstKey();}
|
||||
@ -1583,11 +1583,11 @@ public class Collections {
|
||||
* @return a synchronized view of the specified collection.
|
||||
*/
|
||||
public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
|
||||
return new SynchronizedCollection<T>(c);
|
||||
return new SynchronizedCollection<>(c);
|
||||
}
|
||||
|
||||
static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
|
||||
return new SynchronizedCollection<T>(c, mutex);
|
||||
return new SynchronizedCollection<>(c, mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1686,11 +1686,11 @@ public class Collections {
|
||||
* @return a synchronized view of the specified set.
|
||||
*/
|
||||
public static <T> Set<T> synchronizedSet(Set<T> s) {
|
||||
return new SynchronizedSet<T>(s);
|
||||
return new SynchronizedSet<>(s);
|
||||
}
|
||||
|
||||
static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) {
|
||||
return new SynchronizedSet<T>(s, mutex);
|
||||
return new SynchronizedSet<>(s, mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1754,7 +1754,7 @@ public class Collections {
|
||||
* @return a synchronized view of the specified sorted set.
|
||||
*/
|
||||
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) {
|
||||
return new SynchronizedSortedSet<T>(s);
|
||||
return new SynchronizedSortedSet<>(s);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1783,18 +1783,18 @@ public class Collections {
|
||||
|
||||
public SortedSet<E> subSet(E fromElement, E toElement) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedSet<E>(
|
||||
return new SynchronizedSortedSet<>(
|
||||
ss.subSet(fromElement, toElement), mutex);
|
||||
}
|
||||
}
|
||||
public SortedSet<E> headSet(E toElement) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedSet<E>(ss.headSet(toElement), mutex);
|
||||
return new SynchronizedSortedSet<>(ss.headSet(toElement), mutex);
|
||||
}
|
||||
}
|
||||
public SortedSet<E> tailSet(E fromElement) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedSet<E>(ss.tailSet(fromElement),mutex);
|
||||
return new SynchronizedSortedSet<>(ss.tailSet(fromElement),mutex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1833,14 +1833,14 @@ public class Collections {
|
||||
*/
|
||||
public static <T> List<T> synchronizedList(List<T> list) {
|
||||
return (list instanceof RandomAccess ?
|
||||
new SynchronizedRandomAccessList<T>(list) :
|
||||
new SynchronizedList<T>(list));
|
||||
new SynchronizedRandomAccessList<>(list) :
|
||||
new SynchronizedList<>(list));
|
||||
}
|
||||
|
||||
static <T> List<T> synchronizedList(List<T> list, Object mutex) {
|
||||
return (list instanceof RandomAccess ?
|
||||
new SynchronizedRandomAccessList<T>(list, mutex) :
|
||||
new SynchronizedList<T>(list, mutex));
|
||||
new SynchronizedRandomAccessList<>(list, mutex) :
|
||||
new SynchronizedList<>(list, mutex));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1903,7 +1903,7 @@ public class Collections {
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedList<E>(list.subList(fromIndex, toIndex),
|
||||
return new SynchronizedList<>(list.subList(fromIndex, toIndex),
|
||||
mutex);
|
||||
}
|
||||
}
|
||||
@ -1922,7 +1922,7 @@ public class Collections {
|
||||
*/
|
||||
private Object readResolve() {
|
||||
return (list instanceof RandomAccess
|
||||
? new SynchronizedRandomAccessList<E>(list)
|
||||
? new SynchronizedRandomAccessList<>(list)
|
||||
: this);
|
||||
}
|
||||
}
|
||||
@ -1944,7 +1944,7 @@ public class Collections {
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedRandomAccessList<E>(
|
||||
return new SynchronizedRandomAccessList<>(
|
||||
list.subList(fromIndex, toIndex), mutex);
|
||||
}
|
||||
}
|
||||
@ -1958,7 +1958,7 @@ public class Collections {
|
||||
* deserialization.
|
||||
*/
|
||||
private Object writeReplace() {
|
||||
return new SynchronizedList<E>(list);
|
||||
return new SynchronizedList<>(list);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1990,7 +1990,7 @@ public class Collections {
|
||||
* @return a synchronized view of the specified map.
|
||||
*/
|
||||
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
|
||||
return new SynchronizedMap<K,V>(m);
|
||||
return new SynchronizedMap<>(m);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2051,7 +2051,7 @@ public class Collections {
|
||||
public Set<K> keySet() {
|
||||
synchronized (mutex) {
|
||||
if (keySet==null)
|
||||
keySet = new SynchronizedSet<K>(m.keySet(), mutex);
|
||||
keySet = new SynchronizedSet<>(m.keySet(), mutex);
|
||||
return keySet;
|
||||
}
|
||||
}
|
||||
@ -2059,7 +2059,7 @@ public class Collections {
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
synchronized (mutex) {
|
||||
if (entrySet==null)
|
||||
entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);
|
||||
entrySet = new SynchronizedSet<>(m.entrySet(), mutex);
|
||||
return entrySet;
|
||||
}
|
||||
}
|
||||
@ -2067,7 +2067,7 @@ public class Collections {
|
||||
public Collection<V> values() {
|
||||
synchronized (mutex) {
|
||||
if (values==null)
|
||||
values = new SynchronizedCollection<V>(m.values(), mutex);
|
||||
values = new SynchronizedCollection<>(m.values(), mutex);
|
||||
return values;
|
||||
}
|
||||
}
|
||||
@ -2129,7 +2129,7 @@ public class Collections {
|
||||
* @return a synchronized view of the specified sorted map.
|
||||
*/
|
||||
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m) {
|
||||
return new SynchronizedSortedMap<K,V>(m);
|
||||
return new SynchronizedSortedMap<>(m);
|
||||
}
|
||||
|
||||
|
||||
@ -2159,18 +2159,18 @@ public class Collections {
|
||||
|
||||
public SortedMap<K,V> subMap(K fromKey, K toKey) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedMap<K,V>(
|
||||
return new SynchronizedSortedMap<>(
|
||||
sm.subMap(fromKey, toKey), mutex);
|
||||
}
|
||||
}
|
||||
public SortedMap<K,V> headMap(K toKey) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedMap<K,V>(sm.headMap(toKey), mutex);
|
||||
return new SynchronizedSortedMap<>(sm.headMap(toKey), mutex);
|
||||
}
|
||||
}
|
||||
public SortedMap<K,V> tailMap(K fromKey) {
|
||||
synchronized (mutex) {
|
||||
return new SynchronizedSortedMap<K,V>(sm.tailMap(fromKey),mutex);
|
||||
return new SynchronizedSortedMap<>(sm.tailMap(fromKey),mutex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2246,7 +2246,7 @@ public class Collections {
|
||||
*/
|
||||
public static <E> Collection<E> checkedCollection(Collection<E> c,
|
||||
Class<E> type) {
|
||||
return new CheckedCollection<E>(c, type);
|
||||
return new CheckedCollection<>(c, type);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@ -2378,7 +2378,7 @@ public class Collections {
|
||||
* @since 1.5
|
||||
*/
|
||||
public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
|
||||
return new CheckedSet<E>(s, type);
|
||||
return new CheckedSet<>(s, type);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2424,7 +2424,7 @@ public class Collections {
|
||||
*/
|
||||
public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
|
||||
Class<E> type) {
|
||||
return new CheckedSortedSet<E>(s, type);
|
||||
return new CheckedSortedSet<>(s, type);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2484,8 +2484,8 @@ public class Collections {
|
||||
*/
|
||||
public static <E> List<E> checkedList(List<E> list, Class<E> type) {
|
||||
return (list instanceof RandomAccess ?
|
||||
new CheckedRandomAccessList<E>(list, type) :
|
||||
new CheckedList<E>(list, type));
|
||||
new CheckedRandomAccessList<>(list, type) :
|
||||
new CheckedList<>(list, type));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2550,7 +2550,7 @@ public class Collections {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new CheckedList<E>(list.subList(fromIndex, toIndex), type);
|
||||
return new CheckedList<>(list.subList(fromIndex, toIndex), type);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2567,7 +2567,7 @@ public class Collections {
|
||||
}
|
||||
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
return new CheckedRandomAccessList<E>(
|
||||
return new CheckedRandomAccessList<>(
|
||||
list.subList(fromIndex, toIndex), type);
|
||||
}
|
||||
}
|
||||
@ -2609,7 +2609,7 @@ public class Collections {
|
||||
public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
|
||||
Class<K> keyType,
|
||||
Class<V> valueType) {
|
||||
return new CheckedMap<K,V>(m, keyType, valueType);
|
||||
return new CheckedMap<>(m, keyType, valueType);
|
||||
}
|
||||
|
||||
|
||||
@ -2677,15 +2677,14 @@ public class Collections {
|
||||
// - protection from malicious t
|
||||
// - correct behavior if t is a concurrent map
|
||||
Object[] entries = t.entrySet().toArray();
|
||||
List<Map.Entry<K,V>> checked =
|
||||
new ArrayList<Map.Entry<K,V>>(entries.length);
|
||||
List<Map.Entry<K,V>> checked = new ArrayList<>(entries.length);
|
||||
for (Object o : entries) {
|
||||
Map.Entry<?,?> e = (Map.Entry<?,?>) o;
|
||||
Object k = e.getKey();
|
||||
Object v = e.getValue();
|
||||
typeCheck(k, v);
|
||||
checked.add(
|
||||
new AbstractMap.SimpleImmutableEntry<K,V>((K) k, (V) v));
|
||||
new AbstractMap.SimpleImmutableEntry<>((K) k, (V) v));
|
||||
}
|
||||
for (Map.Entry<K,V> e : checked)
|
||||
m.put(e.getKey(), e.getValue());
|
||||
@ -2695,7 +2694,7 @@ public class Collections {
|
||||
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
if (entrySet==null)
|
||||
entrySet = new CheckedEntrySet<K,V>(m.entrySet(), valueType);
|
||||
entrySet = new CheckedEntrySet<>(m.entrySet(), valueType);
|
||||
return entrySet;
|
||||
}
|
||||
|
||||
@ -2810,7 +2809,7 @@ public class Collections {
|
||||
if (!(o instanceof Map.Entry))
|
||||
return false;
|
||||
return s.remove(new AbstractMap.SimpleImmutableEntry
|
||||
<Object, Object>((Map.Entry<?,?>)o));
|
||||
<>((Map.Entry<?,?>)o));
|
||||
}
|
||||
|
||||
public boolean removeAll(Collection<?> c) {
|
||||
@ -2843,7 +2842,7 @@ public class Collections {
|
||||
|
||||
static <K,V,T> CheckedEntry<K,V,T> checkedEntry(Map.Entry<K,V> e,
|
||||
Class<T> valueType) {
|
||||
return new CheckedEntry<K,V,T>(e, valueType);
|
||||
return new CheckedEntry<>(e, valueType);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2884,7 +2883,7 @@ public class Collections {
|
||||
if (!(o instanceof Map.Entry))
|
||||
return false;
|
||||
return e.equals(new AbstractMap.SimpleImmutableEntry
|
||||
<Object, Object>((Map.Entry<?,?>)o));
|
||||
<>((Map.Entry<?,?>)o));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2927,7 +2926,7 @@ public class Collections {
|
||||
public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m,
|
||||
Class<K> keyType,
|
||||
Class<V> valueType) {
|
||||
return new CheckedSortedMap<K,V>(m, keyType, valueType);
|
||||
return new CheckedSortedMap<>(m, keyType, valueType);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2993,7 +2992,7 @@ public class Collections {
|
||||
|
||||
private static class EmptyIterator<E> implements Iterator<E> {
|
||||
static final EmptyIterator<Object> EMPTY_ITERATOR
|
||||
= new EmptyIterator<Object>();
|
||||
= new EmptyIterator<>();
|
||||
|
||||
public boolean hasNext() { return false; }
|
||||
public E next() { throw new NoSuchElementException(); }
|
||||
@ -3042,7 +3041,7 @@ public class Collections {
|
||||
implements ListIterator<E>
|
||||
{
|
||||
static final EmptyListIterator<Object> EMPTY_ITERATOR
|
||||
= new EmptyListIterator<Object>();
|
||||
= new EmptyListIterator<>();
|
||||
|
||||
public boolean hasPrevious() { return false; }
|
||||
public E previous() { throw new NoSuchElementException(); }
|
||||
@ -3078,7 +3077,7 @@ public class Collections {
|
||||
|
||||
private static class EmptyEnumeration<E> implements Enumeration<E> {
|
||||
static final EmptyEnumeration<Object> EMPTY_ENUMERATION
|
||||
= new EmptyEnumeration<Object>();
|
||||
= new EmptyEnumeration<>();
|
||||
|
||||
public boolean hasMoreElements() { return false; }
|
||||
public E nextElement() { throw new NoSuchElementException(); }
|
||||
@ -3090,7 +3089,7 @@ public class Collections {
|
||||
* @see #emptySet()
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static final Set EMPTY_SET = new EmptySet<Object>();
|
||||
public static final Set EMPTY_SET = new EmptySet<>();
|
||||
|
||||
/**
|
||||
* Returns the empty set (immutable). This set is serializable.
|
||||
@ -3150,7 +3149,7 @@ public class Collections {
|
||||
* @see #emptyList()
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static final List EMPTY_LIST = new EmptyList<Object>();
|
||||
public static final List EMPTY_LIST = new EmptyList<>();
|
||||
|
||||
/**
|
||||
* Returns the empty list (immutable). This list is serializable.
|
||||
@ -3224,7 +3223,7 @@ public class Collections {
|
||||
* @since 1.3
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static final Map EMPTY_MAP = new EmptyMap<Object,Object>();
|
||||
public static final Map EMPTY_MAP = new EmptyMap<>();
|
||||
|
||||
/**
|
||||
* Returns the empty map (immutable). This map is serializable.
|
||||
@ -3286,7 +3285,7 @@ public class Collections {
|
||||
* @return an immutable set containing only the specified object.
|
||||
*/
|
||||
public static <T> Set<T> singleton(T o) {
|
||||
return new SingletonSet<T>(o);
|
||||
return new SingletonSet<>(o);
|
||||
}
|
||||
|
||||
static <E> Iterator<E> singletonIterator(final E e) {
|
||||
@ -3339,7 +3338,7 @@ public class Collections {
|
||||
* @since 1.3
|
||||
*/
|
||||
public static <T> List<T> singletonList(T o) {
|
||||
return new SingletonList<T>(o);
|
||||
return new SingletonList<>(o);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3381,7 +3380,7 @@ public class Collections {
|
||||
* @since 1.3
|
||||
*/
|
||||
public static <K,V> Map<K,V> singletonMap(K key, V value) {
|
||||
return new SingletonMap<K,V>(key, value);
|
||||
return new SingletonMap<>(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3423,7 +3422,7 @@ public class Collections {
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
if (entrySet==null)
|
||||
entrySet = Collections.<Map.Entry<K,V>>singleton(
|
||||
new SimpleImmutableEntry<K,V>(k, v));
|
||||
new SimpleImmutableEntry<>(k, v));
|
||||
return entrySet;
|
||||
}
|
||||
|
||||
@ -3455,7 +3454,7 @@ public class Collections {
|
||||
public static <T> List<T> nCopies(int n, T o) {
|
||||
if (n < 0)
|
||||
throw new IllegalArgumentException("List length = " + n);
|
||||
return new CopiesList<T>(n, o);
|
||||
return new CopiesList<>(n, o);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3529,7 +3528,7 @@ public class Collections {
|
||||
if (fromIndex > toIndex)
|
||||
throw new IllegalArgumentException("fromIndex(" + fromIndex +
|
||||
") > toIndex(" + toIndex + ")");
|
||||
return new CopiesList<E>(toIndex - fromIndex, element);
|
||||
return new CopiesList<>(toIndex - fromIndex, element);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3595,7 +3594,7 @@ public class Collections {
|
||||
if (cmp instanceof ReverseComparator2)
|
||||
return ((ReverseComparator2<T>)cmp).cmp;
|
||||
|
||||
return new ReverseComparator2<T>(cmp);
|
||||
return new ReverseComparator2<>(cmp);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3674,7 +3673,7 @@ public class Collections {
|
||||
* @see ArrayList
|
||||
*/
|
||||
public static <T> ArrayList<T> list(Enumeration<T> e) {
|
||||
ArrayList<T> l = new ArrayList<T>();
|
||||
ArrayList<T> l = new ArrayList<>();
|
||||
while (e.hasMoreElements())
|
||||
l.add(e.nextElement());
|
||||
return l;
|
||||
@ -3819,7 +3818,7 @@ public class Collections {
|
||||
* @since 1.6
|
||||
*/
|
||||
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
|
||||
return new SetFromMap<E>(map);
|
||||
return new SetFromMap<>(map);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3883,7 +3882,7 @@ public class Collections {
|
||||
* @since 1.6
|
||||
*/
|
||||
public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
|
||||
return new AsLIFOQueue<T>(deque);
|
||||
return new AsLIFOQueue<>(deque);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -499,7 +499,7 @@ public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>
|
||||
int j = 0;
|
||||
for (int i = 0; i < vals.length; i++)
|
||||
if (vals[i] != null)
|
||||
a[j++] = new AbstractMap.SimpleEntry<K,V>(
|
||||
a[j++] = new AbstractMap.SimpleEntry<>(
|
||||
keyUniverse[i], unmaskNull(vals[i]));
|
||||
return a;
|
||||
}
|
||||
|
@ -110,9 +110,9 @@ public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
|
||||
throw new ClassCastException(elementType + " not an enum");
|
||||
|
||||
if (universe.length <= 64)
|
||||
return new RegularEnumSet<E>(elementType, universe);
|
||||
return new RegularEnumSet<>(elementType, universe);
|
||||
else
|
||||
return new JumboEnumSet<E>(elementType, universe);
|
||||
return new JumboEnumSet<>(elementType, universe);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -430,7 +430,7 @@ public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
|
||||
}
|
||||
|
||||
Object writeReplace() {
|
||||
return new SerializationProxy<E>(this);
|
||||
return new SerializationProxy<>(this);
|
||||
}
|
||||
|
||||
// readObject method for the serialization proxy pattern
|
||||
|
@ -2490,7 +2490,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
* Finds format specifiers in the format string.
|
||||
*/
|
||||
private FormatString[] parse(String s) {
|
||||
ArrayList<FormatString> al = new ArrayList<FormatString>();
|
||||
ArrayList<FormatString> al = new ArrayList<>();
|
||||
Matcher m = fsPattern.matcher(s);
|
||||
for (int i = 0, len = s.length(); i < len; ) {
|
||||
if (m.find(i)) {
|
||||
|
@ -763,7 +763,7 @@ public class HashMap<K,V>
|
||||
*/
|
||||
void addEntry(int hash, K key, V value, int bucketIndex) {
|
||||
Entry<K,V> e = table[bucketIndex];
|
||||
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
|
||||
table[bucketIndex] = new Entry<>(hash, key, value, e);
|
||||
if (size++ >= threshold)
|
||||
resize(2 * table.length);
|
||||
}
|
||||
@ -778,7 +778,7 @@ public class HashMap<K,V>
|
||||
*/
|
||||
void createEntry(int hash, K key, V value, int bucketIndex) {
|
||||
Entry<K,V> e = table[bucketIndex];
|
||||
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
|
||||
table[bucketIndex] = new Entry<>(hash, key, value, e);
|
||||
size++;
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ public class HashSet<E>
|
||||
* default initial capacity (16) and load factor (0.75).
|
||||
*/
|
||||
public HashSet() {
|
||||
map = new HashMap<E,Object>();
|
||||
map = new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -113,7 +113,7 @@ public class HashSet<E>
|
||||
* @throws NullPointerException if the specified collection is null
|
||||
*/
|
||||
public HashSet(Collection<? extends E> c) {
|
||||
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
|
||||
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
|
||||
addAll(c);
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ public class HashSet<E>
|
||||
* than zero, or if the load factor is nonpositive
|
||||
*/
|
||||
public HashSet(int initialCapacity, float loadFactor) {
|
||||
map = new HashMap<E,Object>(initialCapacity, loadFactor);
|
||||
map = new HashMap<>(initialCapacity, loadFactor);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -139,7 +139,7 @@ public class HashSet<E>
|
||||
* than zero
|
||||
*/
|
||||
public HashSet(int initialCapacity) {
|
||||
map = new HashMap<E,Object>(initialCapacity);
|
||||
map = new HashMap<>(initialCapacity);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -156,7 +156,7 @@ public class HashSet<E>
|
||||
* than zero, or if the load factor is nonpositive
|
||||
*/
|
||||
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
|
||||
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
|
||||
map = new LinkedHashMap<>(initialCapacity, loadFactor);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -455,7 +455,7 @@ public class Hashtable<K,V>
|
||||
|
||||
// Creates the new entry.
|
||||
Entry<K,V> e = tab[index];
|
||||
tab[index] = new Entry<K,V>(hash, key, value, e);
|
||||
tab[index] = new Entry<>(hash, key, value, e);
|
||||
count++;
|
||||
return null;
|
||||
}
|
||||
@ -579,7 +579,7 @@ public class Hashtable<K,V>
|
||||
if (count == 0) {
|
||||
return Collections.emptyEnumeration();
|
||||
} else {
|
||||
return new Enumerator<T>(type, false);
|
||||
return new Enumerator<>(type, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -587,7 +587,7 @@ public class Hashtable<K,V>
|
||||
if (count == 0) {
|
||||
return Collections.emptyIterator();
|
||||
} else {
|
||||
return new Enumerator<T>(type, true);
|
||||
return new Enumerator<>(type, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -929,7 +929,7 @@ public class Hashtable<K,V>
|
||||
}
|
||||
// Creates the new entry.
|
||||
Entry<K,V> e = tab[index];
|
||||
tab[index] = new Entry<K,V>(hash, key, value, e);
|
||||
tab[index] = new Entry<>(hash, key, value, e);
|
||||
count++;
|
||||
}
|
||||
|
||||
@ -950,7 +950,7 @@ public class Hashtable<K,V>
|
||||
}
|
||||
|
||||
protected Object clone() {
|
||||
return new Entry<K,V>(hash, key, value,
|
||||
return new Entry<>(hash, key, value,
|
||||
(next==null ? null : (Entry<K,V>) next.clone()));
|
||||
}
|
||||
|
||||
|
@ -1134,7 +1134,7 @@ public class IdentityHashMap<K,V>
|
||||
Object[] result = new Object[size];
|
||||
Iterator<Map.Entry<K,V>> it = iterator();
|
||||
for (int i = 0; i < size; i++)
|
||||
result[i] = new AbstractMap.SimpleEntry<K,V>(it.next());
|
||||
result[i] = new AbstractMap.SimpleEntry<>(it.next());
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -1146,7 +1146,7 @@ public class IdentityHashMap<K,V>
|
||||
.newInstance(a.getClass().getComponentType(), size);
|
||||
Iterator<Map.Entry<K,V>> it = iterator();
|
||||
for (int i = 0; i < size; i++)
|
||||
a[i] = (T) new AbstractMap.SimpleEntry<K,V>(it.next());
|
||||
a[i] = (T) new AbstractMap.SimpleEntry<>(it.next());
|
||||
if (a.length > size)
|
||||
a[size] = null;
|
||||
return a;
|
||||
|
@ -89,7 +89,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> {
|
||||
* @return an iterator over the elements contained in this set
|
||||
*/
|
||||
public Iterator<E> iterator() {
|
||||
return new EnumSetIterator<E>();
|
||||
return new EnumSetIterator<>();
|
||||
}
|
||||
|
||||
private class EnumSetIterator<E extends Enum<E>> implements Iterator<E> {
|
||||
|
@ -237,7 +237,7 @@ public class LinkedHashMap<K,V>
|
||||
* the chain.
|
||||
*/
|
||||
void init() {
|
||||
header = new Entry<K,V>(-1, null, null, null);
|
||||
header = new Entry<>(-1, null, null, null);
|
||||
header.before = header.after = header;
|
||||
}
|
||||
|
||||
@ -438,7 +438,7 @@ public class LinkedHashMap<K,V>
|
||||
*/
|
||||
void createEntry(int hash, K key, V value, int bucketIndex) {
|
||||
HashMap.Entry<K,V> old = table[bucketIndex];
|
||||
Entry<K,V> e = new Entry<K,V>(hash, key, value, old);
|
||||
Entry<K,V> e = new Entry<>(hash, key, value, old);
|
||||
table[bucketIndex] = e;
|
||||
e.addBefore(header);
|
||||
size++;
|
||||
|
@ -122,7 +122,7 @@ public class LinkedList<E>
|
||||
*/
|
||||
private void linkFirst(E e) {
|
||||
final Node<E> f = first;
|
||||
final Node<E> newNode = new Node<E>(null, e, f);
|
||||
final Node<E> newNode = new Node<>(null, e, f);
|
||||
first = newNode;
|
||||
if (f == null)
|
||||
last = newNode;
|
||||
@ -137,7 +137,7 @@ public class LinkedList<E>
|
||||
*/
|
||||
void linkLast(E e) {
|
||||
final Node<E> l = last;
|
||||
final Node<E> newNode = new Node<E>(l, e, null);
|
||||
final Node<E> newNode = new Node<>(l, e, null);
|
||||
last = newNode;
|
||||
if (l == null)
|
||||
first = newNode;
|
||||
@ -153,7 +153,7 @@ public class LinkedList<E>
|
||||
void linkBefore(E e, Node<E> succ) {
|
||||
// assert succ != null;
|
||||
final Node<E> pred = succ.prev;
|
||||
final Node<E> newNode = new Node<E>(pred, e, succ);
|
||||
final Node<E> newNode = new Node<>(pred, e, succ);
|
||||
succ.prev = newNode;
|
||||
if (pred == null)
|
||||
first = newNode;
|
||||
@ -419,7 +419,7 @@ public class LinkedList<E>
|
||||
|
||||
for (Object o : a) {
|
||||
@SuppressWarnings("unchecked") E e = (E) o;
|
||||
Node<E> newNode = new Node<E>(pred, e, null);
|
||||
Node<E> newNode = new Node<>(pred, e, null);
|
||||
if (pred == null)
|
||||
first = newNode;
|
||||
else
|
||||
|
@ -187,7 +187,7 @@ public abstract class ListResourceBundle extends ResourceBundle {
|
||||
return;
|
||||
|
||||
Object[][] contents = getContents();
|
||||
HashMap<String,Object> temp = new HashMap<String,Object>(contents.length);
|
||||
HashMap<String,Object> temp = new HashMap<>(contents.length);
|
||||
for (int i = 0; i < contents.length; ++i) {
|
||||
// key must be non-null String, value must be non-null
|
||||
String key = (String) contents[i][0];
|
||||
|
@ -1449,10 +1449,15 @@ public final class Locale implements Cloneable, Serializable {
|
||||
* three-letter language abbreviation is not available for this locale.
|
||||
*/
|
||||
public String getISO3Language() throws MissingResourceException {
|
||||
String language3 = getISO3Code(_baseLocale.getLanguage(), LocaleISOData.isoLanguageTable);
|
||||
String lang = _baseLocale.getLanguage();
|
||||
if (lang.length() == 3) {
|
||||
return lang;
|
||||
}
|
||||
|
||||
String language3 = getISO3Code(lang, LocaleISOData.isoLanguageTable);
|
||||
if (language3 == null) {
|
||||
throw new MissingResourceException("Couldn't find 3-letter language code for "
|
||||
+ _baseLocale.getLanguage(), "FormatData_" + toString(), "ShortLanguage");
|
||||
+ lang, "FormatData_" + toString(), "ShortLanguage");
|
||||
}
|
||||
return language3;
|
||||
}
|
||||
|
@ -538,7 +538,7 @@ public class PriorityQueue<E> extends AbstractQueue<E>
|
||||
cursor--;
|
||||
else {
|
||||
if (forgetMeNot == null)
|
||||
forgetMeNot = new ArrayDeque<E>();
|
||||
forgetMeNot = new ArrayDeque<>();
|
||||
forgetMeNot.add(moved);
|
||||
}
|
||||
} else if (lastRetElt != null) {
|
||||
|
@ -1011,7 +1011,7 @@ class Properties extends Hashtable<Object,Object> {
|
||||
* @since 1.6
|
||||
*/
|
||||
public Set<String> stringPropertyNames() {
|
||||
Hashtable<String, String> h = new Hashtable<String, String>();
|
||||
Hashtable<String, String> h = new Hashtable<>();
|
||||
enumerateStringProperties(h);
|
||||
return h.keySet();
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ class RegularEnumSet<E extends Enum<E>> extends EnumSet<E> {
|
||||
* @return an iterator over the elements contained in this set
|
||||
*/
|
||||
public Iterator<E> iterator() {
|
||||
return new EnumSetIterator<E>();
|
||||
return new EnumSetIterator<>();
|
||||
}
|
||||
|
||||
private class EnumSetIterator<E extends Enum<E>> implements Iterator<E> {
|
||||
|
@ -191,7 +191,7 @@ public final class ServiceLoader<S>
|
||||
private ClassLoader loader;
|
||||
|
||||
// Cached providers, in instantiation order
|
||||
private LinkedHashMap<String,S> providers = new LinkedHashMap<String,S>();
|
||||
private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
|
||||
|
||||
// The current lazy-lookup iterator
|
||||
private LazyIterator lookupIterator;
|
||||
@ -291,7 +291,7 @@ public final class ServiceLoader<S>
|
||||
{
|
||||
InputStream in = null;
|
||||
BufferedReader r = null;
|
||||
ArrayList<String> names = new ArrayList<String>();
|
||||
ArrayList<String> names = new ArrayList<>();
|
||||
try {
|
||||
in = u.openStream();
|
||||
r = new BufferedReader(new InputStreamReader(in, "utf-8"));
|
||||
@ -463,7 +463,7 @@ public final class ServiceLoader<S>
|
||||
public static <S> ServiceLoader<S> load(Class<S> service,
|
||||
ClassLoader loader)
|
||||
{
|
||||
return new ServiceLoader<S>(service, loader);
|
||||
return new ServiceLoader<>(service, loader);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -196,7 +196,7 @@ class TimSort<T> {
|
||||
* extending short natural runs to minRun elements, and merging runs
|
||||
* to maintain stack invariant.
|
||||
*/
|
||||
TimSort<T> ts = new TimSort<T>(a, c);
|
||||
TimSort<T> ts = new TimSort<>(a, c);
|
||||
int minRun = minRunLength(nRemaining);
|
||||
do {
|
||||
// Identify next run
|
||||
|
@ -533,7 +533,7 @@ public class TreeMap<K,V>
|
||||
// throw NullPointerException
|
||||
//
|
||||
// compare(key, key); // type check
|
||||
root = new Entry<K,V>(key, value, null);
|
||||
root = new Entry<>(key, value, null);
|
||||
size = 1;
|
||||
modCount++;
|
||||
return null;
|
||||
@ -569,7 +569,7 @@ public class TreeMap<K,V>
|
||||
return t.setValue(value);
|
||||
} while (t != null);
|
||||
}
|
||||
Entry<K,V> e = new Entry<K,V>(key, value, parent);
|
||||
Entry<K,V> e = new Entry<>(key, value, parent);
|
||||
if (cmp < 0)
|
||||
parent.left = e;
|
||||
else
|
||||
@ -1069,14 +1069,14 @@ public class TreeMap<K,V>
|
||||
}
|
||||
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
|
||||
E toElement, boolean toInclusive) {
|
||||
return new KeySet<E>(m.subMap(fromElement, fromInclusive,
|
||||
return new KeySet<>(m.subMap(fromElement, fromInclusive,
|
||||
toElement, toInclusive));
|
||||
}
|
||||
public NavigableSet<E> headSet(E toElement, boolean inclusive) {
|
||||
return new KeySet<E>(m.headMap(toElement, inclusive));
|
||||
return new KeySet<>(m.headMap(toElement, inclusive));
|
||||
}
|
||||
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
|
||||
return new KeySet<E>(m.tailMap(fromElement, inclusive));
|
||||
return new KeySet<>(m.tailMap(fromElement, inclusive));
|
||||
}
|
||||
public SortedSet<E> subSet(E fromElement, E toElement) {
|
||||
return subSet(fromElement, true, toElement, false);
|
||||
@ -1205,7 +1205,7 @@ public class TreeMap<K,V>
|
||||
*/
|
||||
static <K,V> Map.Entry<K,V> exportEntry(TreeMap.Entry<K,V> e) {
|
||||
return (e == null) ? null :
|
||||
new AbstractMap.SimpleImmutableEntry<K,V>(e);
|
||||
new AbstractMap.SimpleImmutableEntry<>(e);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2406,7 +2406,7 @@ public class TreeMap<K,V>
|
||||
value = (defaultVal != null ? defaultVal : (V) str.readObject());
|
||||
}
|
||||
|
||||
Entry<K,V> middle = new Entry<K,V>(key, value, null);
|
||||
Entry<K,V> middle = new Entry<>(key, value, null);
|
||||
|
||||
// color nodes in non-full bottommost level red
|
||||
if (level == redLevel)
|
||||
|
@ -138,7 +138,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
* ordering} of the elements will be used.
|
||||
*/
|
||||
public TreeSet(Comparator<? super E> comparator) {
|
||||
this(new TreeMap<E,Object>(comparator));
|
||||
this(new TreeMap<>(comparator));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -195,7 +195,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet<E> descendingSet() {
|
||||
return new TreeSet<E>(m.descendingMap());
|
||||
return new TreeSet<>(m.descendingMap());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -322,7 +322,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
*/
|
||||
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
|
||||
E toElement, boolean toInclusive) {
|
||||
return new TreeSet<E>(m.subMap(fromElement, fromInclusive,
|
||||
return new TreeSet<>(m.subMap(fromElement, fromInclusive,
|
||||
toElement, toInclusive));
|
||||
}
|
||||
|
||||
@ -335,7 +335,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet<E> headSet(E toElement, boolean inclusive) {
|
||||
return new TreeSet<E>(m.headMap(toElement, inclusive));
|
||||
return new TreeSet<>(m.headMap(toElement, inclusive));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -347,7 +347,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
* @since 1.6
|
||||
*/
|
||||
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
|
||||
return new TreeSet<E>(m.tailMap(fromElement, inclusive));
|
||||
return new TreeSet<>(m.tailMap(fromElement, inclusive));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -477,7 +477,7 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
throw new InternalError();
|
||||
}
|
||||
|
||||
clone.m = new TreeMap<E,Object>(m);
|
||||
clone.m = new TreeMap<>(m);
|
||||
return clone;
|
||||
}
|
||||
|
||||
@ -524,9 +524,9 @@ public class TreeSet<E> extends AbstractSet<E>
|
||||
// Create backing TreeMap
|
||||
TreeMap<E,Object> tm;
|
||||
if (c==null)
|
||||
tm = new TreeMap<E,Object>();
|
||||
tm = new TreeMap<>();
|
||||
else
|
||||
tm = new TreeMap<E,Object>(c);
|
||||
tm = new TreeMap<>(c);
|
||||
m = tm;
|
||||
|
||||
// Read in size
|
||||
|
@ -171,7 +171,7 @@ public class WeakHashMap<K,V>
|
||||
/**
|
||||
* Reference queue for cleared WeakEntries
|
||||
*/
|
||||
private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
|
||||
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
|
||||
|
||||
/**
|
||||
* The number of times this WeakHashMap has been structurally modified.
|
||||
@ -439,7 +439,7 @@ public class WeakHashMap<K,V>
|
||||
|
||||
modCount++;
|
||||
Entry<K,V> e = tab[i];
|
||||
tab[i] = new Entry<K,V>(k, value, queue, h, e);
|
||||
tab[i] = new Entry<>(k, value, queue, h, e);
|
||||
if (++size >= threshold)
|
||||
resize(tab.length * 2);
|
||||
return null;
|
||||
@ -955,10 +955,9 @@ public class WeakHashMap<K,V>
|
||||
}
|
||||
|
||||
private List<Map.Entry<K,V>> deepCopy() {
|
||||
List<Map.Entry<K,V>> list =
|
||||
new ArrayList<Map.Entry<K,V>>(size());
|
||||
List<Map.Entry<K,V>> list = new ArrayList<>(size());
|
||||
for (Map.Entry<K,V> e : this)
|
||||
list.add(new AbstractMap.SimpleEntry<K,V>(e));
|
||||
list.add(new AbstractMap.SimpleEntry<>(e));
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@ -732,14 +732,14 @@ public abstract class Pack200 {
|
||||
private synchronized static Object newInstance(String prop) {
|
||||
String implName = "(unknown)";
|
||||
try {
|
||||
Class impl = (prop == PACK_PROVIDER)? packerImpl: unpackerImpl;
|
||||
Class impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl;
|
||||
if (impl == null) {
|
||||
// The first time, we must decide which class to use.
|
||||
implName = java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction(prop,""));
|
||||
if (implName != null && !implName.equals(""))
|
||||
impl = Class.forName(implName);
|
||||
else if (prop == PACK_PROVIDER)
|
||||
else if (PACK_PROVIDER.equals(prop))
|
||||
impl = com.sun.java.util.jar.pack.PackerImpl.class;
|
||||
else
|
||||
impl = com.sun.java.util.jar.pack.UnpackerImpl.class;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user