Merge
authorlana
Fri, 18 Mar 2011 15:44:45 -0700
changeset 8755 eadf2725c5d6
parent 8754 0c97cc803f5b (current diff)
parent 8693 2173b8120b13 (diff)
child 8756 0ab2251ed456
child 8947 35ff89272f4f
Merge
jdk/make/common/Modules.gmk
jdk/make/java/nio/mxbean/Makefile
jdk/make/modules/Makefile
jdk/make/modules/bootmodule.roots
jdk/make/modules/jdk7.depconfig
jdk/make/modules/modules.config
jdk/make/modules/modules.group
jdk/make/modules/optional.depconfig
jdk/make/modules/tools/Makefile
jdk/make/modules/tools/build.xml
jdk/make/modules/tools/nbproject/project.properties
jdk/make/modules/tools/nbproject/project.xml
jdk/make/modules/tools/src/com/sun/classanalyzer/AnnotatedDependency.java
jdk/make/modules/tools/src/com/sun/classanalyzer/AnnotationParser.java
jdk/make/modules/tools/src/com/sun/classanalyzer/BootAnalyzer.java
jdk/make/modules/tools/src/com/sun/classanalyzer/CheckDeps.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ClassAnalyzer.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ClassFileParser.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ClassPath.java
jdk/make/modules/tools/src/com/sun/classanalyzer/CodeAttributeParser.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ConstantPoolAnalyzer.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ConstantPoolParser.java
jdk/make/modules/tools/src/com/sun/classanalyzer/DependencyConfig.java
jdk/make/modules/tools/src/com/sun/classanalyzer/Klass.java
jdk/make/modules/tools/src/com/sun/classanalyzer/Module.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ModuleConfig.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ResolutionInfo.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ResourceFile.java
jdk/make/modules/tools/src/com/sun/classanalyzer/ShowDeps.java
jdk/src/share/classes/sun/misc/BootClassLoaderHook.java
jdk/src/share/classes/sun/misc/JavaSecurityCodeSignerAccess.java
jdk/test/sun/misc/BootClassLoaderHook/TestHook.java
langtools/test/tools/javac/T6900037.java
langtools/test/tools/javac/T6900037.out
langtools/test/tools/javac/diags/examples/DiamondInvalidArg.java
langtools/test/tools/javac/diags/examples/DiamondInvalidArgs.java
langtools/test/tools/javac/generics/diamond/neg/Neg12.java
langtools/test/tools/javac/generics/diamond/neg/Neg12.out
langtools/test/tools/javac/multicatch/Neg05.java
langtools/test/tools/javac/multicatch/Neg05.out
--- a/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 6823ea7eb8eb6fab405d7edb7a5c2f690887a2fa jdk7-b129
 a36beda9b9de91231d92a2c529f21cc218fcf8d5 jdk7-b130
 d8af56da89bc0fc02a6b6ad78f51157a46d665ab jdk7-b131
+d61280d36755d1941fb487f554e8b7a6d0bca6a1 jdk7-b132
+fd444c61e7ed3d92b2a730da7c737b02191b682f jdk7-b133
--- a/.hgtags-top-repo	Fri Mar 18 17:56:47 2011 +0300
+++ b/.hgtags-top-repo	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 a6b015b59fbc2518762c17ccc35702f03ef7713a jdk7-b129
 cc58c11af15411042719e9c82707fdbef60a9e0f jdk7-b130
 5d86d951426aaf340b1ba84ae2d5ab5da65a71e2 jdk7-b131
+0f62a65fb666b337caa585015ab6ea2e60e709ca jdk7-b132
+c6f380693342feadccc5fe2c5adf500e861361aa jdk7-b133
--- a/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -36,12 +36,6 @@
   JDK_MAKE_SHARED_DIR=$(JDK_TOPDIR)/make/common/shared
 endif
 
-# For start and finish echo lines
-TITLE_TEXT = Control $(PLATFORM) $(ARCH) $(RELEASE)
-DATE_STAMP = `$(DATE) '+%y-%m-%d %H:%M'`
-START_ECHO  = echo "$(TITLE_TEXT) $@ build started: $(DATE_STAMP)"
-FINISH_ECHO = echo "$(TITLE_TEXT) $@ build finished: $(DATE_STAMP)"
-
 default: all
 
 include $(JDK_MAKE_SHARED_DIR)/Defs-control.gmk
@@ -57,10 +51,6 @@
 include ./make/sponsors-rules.gmk
 include ./make/deploy-rules.gmk
 
-# What "all" means
-all::
-	@$(START_ECHO)
-
 all:: sanity
 
 ifeq ($(SKIP_FASTDEBUG_BUILD), false)
@@ -73,40 +63,44 @@
 
 all:: all_product_build 
 
-all:: 
-	@$(FINISH_ECHO)
+all_product_build::
 
 # Everything for a full product build
-all_product_build::
-	@$(START_ECHO)
+ifeq ($(SKIP_PRODUCT_BUILD), false)
 
-ifeq ($(SKIP_PRODUCT_BUILD), false)
-  
   all_product_build:: product_build
 
   ifeq ($(BUILD_INSTALL), true)
     all_product_build:: $(INSTALL)
     clobber:: install-clobber
   endif
-  
+
   ifeq ($(BUILD_SPONSORS), true)
     all_product_build:: $(SPONSORS)
     clobber:: sponsors-clobber
   endif
-  
+
   ifneq ($(SKIP_COMPARE_IMAGES), true)
     all_product_build:: compare-image
   endif
 
 endif
 
-all_product_build:: 
-	@$(FINISH_ECHO)
+define StartTimer
+	$(MKDIR) -p $(BUILDTIMESDIR)
+	$(RM) $(BUILDTIMESDIR)/build_time_*
+	$(call RecordStartTime,TOTAL)
+endef
+
+define StopTimer
+	$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),)
+endef
 
 # Generic build of basic repo series
 generic_build_repo_series::
 	$(MKDIR) -p $(OUTPUTDIR)
 	$(MKDIR) -p $(OUTPUTDIR)/j2sdk-image
+	@$(call StartTimer)
 
 ifeq ($(BUILD_LANGTOOLS), true)
   generic_build_repo_series:: langtools
@@ -143,6 +137,9 @@
   clobber:: deploy-clobber
 endif
 
+generic_build_repo_series::
+	@$(call StopTimer,$(if $(DEBUG_NAME),$(DEBUG_NAME)_build,all_product_build))
+
 # The debug build, fastdebug or debug. Needs special handling.
 #  Note that debug builds do NOT do INSTALL steps, but must be done
 #  after the product build and before the INSTALL step of the product build.
@@ -167,28 +164,22 @@
 FRESH_DEBUG_BOOTDIR=$(ABS_BOOTDIR_OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-$(DEBUG_NAME)/j2sdk-image
   
 create_fresh_product_bootdir: FRC
-	@$(START_ECHO)
 	$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
 		GENERATE_DOCS=false \
 		BOOT_CYCLE_SETTINGS= \
 		build_product_image
-	@$(FINISH_ECHO)
 
 create_fresh_debug_bootdir: FRC
-	@$(START_ECHO)
 	$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
 		GENERATE_DOCS=false \
 		BOOT_CYCLE_DEBUG_SETTINGS= \
 		build_debug_image
-	@$(FINISH_ECHO)
 
 create_fresh_fastdebug_bootdir: FRC
-	@$(START_ECHO)
 	$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
 		GENERATE_DOCS=false \
 		BOOT_CYCLE_DEBUG_SETTINGS= \
 		build_fastdebug_image
-	@$(FINISH_ECHO)
 
 # Create boot image?
 ifeq ($(SKIP_BOOT_CYCLE),false)
@@ -197,6 +188,8 @@
   endif
 endif
 
+
+
 ifeq ($(DO_BOOT_CYCLE),true)
   
   # Create the bootdir to use in the build
@@ -221,27 +214,23 @@
 endif
 
 build_product_image:
-	@$(START_ECHO)
 	$(MAKE) \
 	        SKIP_FASTDEBUG_BUILD=true \
 	        SKIP_DEBUG_BUILD=true \
 	        $(BOOT_CYCLE_SETTINGS) \
 	        generic_build_repo_series
-	@$(FINISH_ECHO)
 
 #   NOTE: On windows, do not use $(ABS_OUTPUTDIR)-$(DEBUG_NAME).
 #         Due to the use of short paths in $(ABS_OUTPUTDIR), this may 
 #         not be the same location.
 
 generic_debug_build:
-	@$(START_ECHO)
 	$(MAKE) \
 		ALT_OUTPUTDIR=$(ABS_OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-$(DEBUG_NAME) \
 	        DEBUG_NAME=$(DEBUG_NAME) \
 		GENERATE_DOCS=false \
 	        $(BOOT_CYCLE_DEBUG_SETTINGS) \
 		generic_build_repo_series
-	@$(FINISH_ECHO)
 
 build_debug_image:
 	$(MAKE) DEBUG_NAME=debug generic_debug_build
@@ -254,7 +243,8 @@
 debug_build:: build_debug_image
 fastdebug_build:: build_fastdebug_image
 
-clobber::
+clobber:: REPORT_BUILD_TIMES=
+clobber:: 
 	$(RM) -r $(OUTPUTDIR)/*
 	$(RM) -r $(OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-debug/*
 	$(RM) -r $(OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-fastdebug/*
--- a/corba/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/corba/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 66fa0fcc779296c99746b09efce6109944f82f30 jdk7-b129
 563a8f8b5be3940e9346cffac4eff9ed02b3c69f jdk7-b130
 9d6dd2cdfcb92612dbd836ecded87770d52b49db jdk7-b131
+1b1e75e8f476e5c07f0d2b035993895e2603e1f0 jdk7-b132
+671fe2e623ffefb4b7c312be919fc71eb48c1df1 jdk7-b133
--- a/hotspot/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -151,3 +151,6 @@
 e9aa2ca89ad6c53420623d579765f9706ec523d7 jdk7-b130
 0aa3b49089112d5faa77902ad680c582ab53f651 jdk7-b131
 e9aa2ca89ad6c53420623d579765f9706ec523d7 hs21-b02
+0e531ab5ba04967a0e9aa6aef65e6eb3a0dcf632 jdk7-b132
+a8d643a4db47c7b58e0bcb49c77b5c3610de86a8 hs21-b03
+1b3a350709e4325d759bb453ff3fb6a463270488 jdk7-b133
--- a/hotspot/make/hotspot_version	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/make/hotspot_version	Fri Mar 18 15:44:45 2011 -0700
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=21
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=03
+HS_BUILD_NUMBER=04
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=7
--- a/hotspot/make/windows/makefiles/compile.make	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/make/windows/makefiles/compile.make	Fri Mar 18 15:44:45 2011 -0700
@@ -207,6 +207,9 @@
 # Manifest Tool - used in VS2005 and later to adjust manifests stored
 # as resources inside build artifacts.
 MT=mt.exe
+!if "$(BUILDARCH)" == "i486"
+LINK_FLAGS = /SAFESEH $(LINK_FLAGS)
+!endif
 !endif
 
 # Compile for space above time.
--- a/hotspot/make/windows/makefiles/launcher.make	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/make/windows/makefiles/launcher.make	Fri Mar 18 15:44:45 2011 -0700
@@ -1,71 +1,73 @@
-#
-# 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.
-#
-# 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.
-#  
-#
-
-
-LAUNCHER_FLAGS=$(CPP_FLAGS) $(ARCHFLAG) \
-	/D FULL_VERSION=\"$(HOTSPOT_RELEASE_VERSION)\" \
-	/D JDK_MAJOR_VERSION=\"$(JDK_MAJOR_VERSION)\" \
-	/D JDK_MINOR_VERSION=\"$(JDK_MINOR_VERSION)\" \
-	/D GAMMA \
-	/D LAUNCHER_TYPE=\"gamma\" \
-	/D _CRT_SECURE_NO_WARNINGS \
-	/D _CRT_SECURE_NO_DEPRECATE \
-	/D LINK_INTO_LIBJVM \
-	/I $(WorkSpace)\src\os\windows\launcher \
-	/I $(WorkSpace)\src\share\tools\launcher \
-	/I $(WorkSpace)\src\share\vm\prims \
-	/I $(WorkSpace)\src\share\vm \
-	/I $(WorkSpace)\src\cpu\$(Platform_arch)\vm \
-	/I $(WorkSpace)\src\os\windows\vm
-
-LINK_FLAGS=/manifest $(HS_INTERNAL_NAME).lib kernel32.lib user32.lib /nologo /machine:$(MACHINE) /map /debug /subsystem:console 
-
-!if "$(COMPILER_NAME)" == "VS2005"
-# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
-#    on the link command line, otherwise we get missing __security_check_cookie
-#    externals at link time. Even with /GS-, you need bufferoverflowU.lib.
-BUFFEROVERFLOWLIB = bufferoverflowU.lib
-LINK_FLAGS = $(LINK_FLAGS) $(BUFFEROVERFLOWLIB)
-!endif
-
-LAUNCHERDIR = $(WorkSpace)/src/os/windows/launcher
-LAUNCHERDIR_SHARE = $(WorkSpace)/src/share/tools/launcher
-
-OUTDIR = launcher
-
-{$(LAUNCHERDIR)}.c{$(OUTDIR)}.obj:
-	-mkdir $(OUTDIR) 2>NUL >NUL
-        $(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
-
-{$(LAUNCHERDIR_SHARE)}.c{$(OUTDIR)}.obj:
-	-mkdir $(OUTDIR) 2>NUL >NUL
-        $(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
-
-$(OUTDIR)\*.obj: $(LAUNCHERDIR)\*.c $(LAUNCHERDIR)\*.h $(LAUNCHERDIR_SHARE)\*.c $(LAUNCHERDIR_SHARE)\*.h
-
-launcher: $(OUTDIR)\java.obj $(OUTDIR)\java_md.obj $(OUTDIR)\jli_util.obj
-	echo $(JAVA_HOME) > jdkpath.txt  
-	$(LINK) $(LINK_FLAGS) /out:hotspot.exe $**
-
-
+#
+# 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.
+#
+# 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.
+#  
+#
+
+
+LAUNCHER_FLAGS=$(CPP_FLAGS) $(ARCHFLAG) \
+	/D FULL_VERSION=\"$(HOTSPOT_RELEASE_VERSION)\" \
+	/D JDK_MAJOR_VERSION=\"$(JDK_MAJOR_VERSION)\" \
+	/D JDK_MINOR_VERSION=\"$(JDK_MINOR_VERSION)\" \
+	/D GAMMA \
+	/D LAUNCHER_TYPE=\"gamma\" \
+	/D _CRT_SECURE_NO_WARNINGS \
+	/D _CRT_SECURE_NO_DEPRECATE \
+	/D LINK_INTO_LIBJVM \
+	/I $(WorkSpace)\src\os\windows\launcher \
+	/I $(WorkSpace)\src\share\tools\launcher \
+	/I $(WorkSpace)\src\share\vm\prims \
+	/I $(WorkSpace)\src\share\vm \
+	/I $(WorkSpace)\src\cpu\$(Platform_arch)\vm \
+	/I $(WorkSpace)\src\os\windows\vm
+
+LINK_FLAGS=/manifest $(HS_INTERNAL_NAME).lib kernel32.lib user32.lib /nologo /machine:$(MACHINE) /map /debug /subsystem:console 
+
+!if "$(COMPILER_NAME)" == "VS2005"
+# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
+#    on the link command line, otherwise we get missing __security_check_cookie
+#    externals at link time. Even with /GS-, you need bufferoverflowU.lib.
+BUFFEROVERFLOWLIB = bufferoverflowU.lib
+LINK_FLAGS = $(LINK_FLAGS) $(BUFFEROVERFLOWLIB)
+!endif
+
+!if "$(COMPILER_NAME)" == "VS2010" && "$(BUILDARCH)" == "i486"
+LINK_FLAGS = /SAFESEH $(LINK_FLAGS)
+!endif
+
+LAUNCHERDIR = $(WorkSpace)/src/os/windows/launcher
+LAUNCHERDIR_SHARE = $(WorkSpace)/src/share/tools/launcher
+
+OUTDIR = launcher
+
+{$(LAUNCHERDIR)}.c{$(OUTDIR)}.obj:
+	-mkdir $(OUTDIR) 2>NUL >NUL
+        $(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
+
+{$(LAUNCHERDIR_SHARE)}.c{$(OUTDIR)}.obj:
+	-mkdir $(OUTDIR) 2>NUL >NUL
+        $(CPP) $(LAUNCHER_FLAGS) /c /Fo$@ $<
+
+$(OUTDIR)\*.obj: $(LAUNCHERDIR)\*.c $(LAUNCHERDIR)\*.h $(LAUNCHERDIR_SHARE)\*.c $(LAUNCHERDIR_SHARE)\*.h
+
+launcher: $(OUTDIR)\java.obj $(OUTDIR)\java_md.obj $(OUTDIR)\jli_util.obj
+	echo $(JAVA_HOME) > jdkpath.txt  
+	$(LINK) $(LINK_FLAGS) /out:hotspot.exe $**
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -395,9 +395,9 @@
 
   int offset = code_offset();
 
-  __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type);
+  __ call(Runtime1::entry_for(Runtime1::handle_exception_from_callee_id), relocInfo::runtime_call_type);
   __ delayed()->nop();
-  debug_only(__ stop("should have gone to the caller");)
+  __ should_not_reach_here();
   assert(code_offset() - offset <= exception_handler_size, "overflow");
   __ end_a_stub();
 
--- a/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -148,7 +148,7 @@
 
 static OopMap* generate_oop_map(StubAssembler* sasm, bool save_fpu_registers) {
   assert(frame_size_in_bytes == __ total_frame_size_in_bytes(reg_save_size_in_words),
-         " mismatch in calculation");
+         "mismatch in calculation");
   sasm->set_frame_size(frame_size_in_bytes / BytesPerWord);
   int frame_size_in_slots = frame_size_in_bytes / sizeof(jint);
   OopMap* oop_map = new OopMap(frame_size_in_slots, 0);
@@ -176,9 +176,8 @@
 
 static OopMap* save_live_registers(StubAssembler* sasm, bool save_fpu_registers = true) {
   assert(frame_size_in_bytes == __ total_frame_size_in_bytes(reg_save_size_in_words),
-         " mismatch in calculation");
+         "mismatch in calculation");
   __ save_frame_c1(frame_size_in_bytes);
-  sasm->set_frame_size(frame_size_in_bytes / BytesPerWord);
 
   // Record volatile registers as callee-save values in an OopMap so their save locations will be
   // propagated to the caller frame's RegisterMap during StackFrameStream construction (needed for
@@ -367,23 +366,7 @@
   switch (id) {
     case forward_exception_id:
       {
-        // we're handling an exception in the context of a compiled
-        // frame.  The registers have been saved in the standard
-        // places.  Perform an exception lookup in the caller and
-        // dispatch to the handler if found.  Otherwise unwind and
-        // dispatch to the callers exception handler.
-
-        oop_maps = new OopMapSet();
-        OopMap* oop_map = generate_oop_map(sasm, true);
-
-        // transfer the pending exception to the exception_oop
-        __ ld_ptr(G2_thread, in_bytes(JavaThread::pending_exception_offset()), Oexception);
-        __ ld_ptr(Oexception, 0, G0);
-        __ st_ptr(G0, G2_thread, in_bytes(JavaThread::pending_exception_offset()));
-        __ add(I7, frame::pc_return_offset, Oissuing_pc);
-
-        generate_handle_exception(sasm, oop_maps, oop_map);
-        __ should_not_reach_here();
+        oop_maps = generate_handle_exception(id, sasm);
       }
       break;
 
@@ -671,15 +654,14 @@
       break;
 
     case handle_exception_id:
-      {
-        __ set_info("handle_exception", dont_gc_arguments);
-        // make a frame and preserve the caller's caller-save registers
+      { __ set_info("handle_exception", dont_gc_arguments);
+        oop_maps = generate_handle_exception(id, sasm);
+      }
+      break;
 
-        oop_maps = new OopMapSet();
-        OopMap* oop_map = save_live_registers(sasm);
-        __ mov(Oexception->after_save(),  Oexception);
-        __ mov(Oissuing_pc->after_save(), Oissuing_pc);
-        generate_handle_exception(sasm, oop_maps, oop_map);
+    case handle_exception_from_callee_id:
+      { __ set_info("handle_exception_from_callee", dont_gc_arguments);
+        oop_maps = generate_handle_exception(id, sasm);
       }
       break;
 
@@ -696,7 +678,7 @@
                         G2_thread, Oissuing_pc->after_save());
         __ verify_not_null_oop(Oexception->after_save());
 
-        // Restore SP from L7 if the exception PC is a MethodHandle call site.
+        // Restore SP from L7 if the exception PC is a method handle call site.
         __ mov(O0, G5);  // Save the target address.
         __ lduw(Address(G2_thread, JavaThread::is_method_handle_return_offset()), L0);
         __ tst(L0);  // Condition codes are preserved over the restore.
@@ -1006,48 +988,89 @@
 }
 
 
-void Runtime1::generate_handle_exception(StubAssembler* sasm, OopMapSet* oop_maps, OopMap* oop_map, bool) {
-  Label no_deopt;
+OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler* sasm) {
+  __ block_comment("generate_handle_exception");
+
+  // Save registers, if required.
+  OopMapSet* oop_maps = new OopMapSet();
+  OopMap* oop_map = NULL;
+  switch (id) {
+  case forward_exception_id:
+    // We're handling an exception in the context of a compiled frame.
+    // The registers have been saved in the standard places.  Perform
+    // an exception lookup in the caller and dispatch to the handler
+    // if found.  Otherwise unwind and dispatch to the callers
+    // exception handler.
+     oop_map = generate_oop_map(sasm, true);
+
+     // transfer the pending exception to the exception_oop
+     __ ld_ptr(G2_thread, in_bytes(JavaThread::pending_exception_offset()), Oexception);
+     __ ld_ptr(Oexception, 0, G0);
+     __ st_ptr(G0, G2_thread, in_bytes(JavaThread::pending_exception_offset()));
+     __ add(I7, frame::pc_return_offset, Oissuing_pc);
+    break;
+  case handle_exception_id:
+    // At this point all registers MAY be live.
+    oop_map = save_live_registers(sasm);
+    __ mov(Oexception->after_save(),  Oexception);
+    __ mov(Oissuing_pc->after_save(), Oissuing_pc);
+    break;
+  case handle_exception_from_callee_id:
+    // At this point all registers except exception oop (Oexception)
+    // and exception pc (Oissuing_pc) are dead.
+    oop_map = new OopMap(frame_size_in_bytes / sizeof(jint), 0);
+    sasm->set_frame_size(frame_size_in_bytes / BytesPerWord);
+    __ save_frame_c1(frame_size_in_bytes);
+    __ mov(Oexception->after_save(),  Oexception);
+    __ mov(Oissuing_pc->after_save(), Oissuing_pc);
+    break;
+  default:  ShouldNotReachHere();
+  }
 
   __ verify_not_null_oop(Oexception);
 
   // save the exception and issuing pc in the thread
-  __ st_ptr(Oexception, G2_thread, in_bytes(JavaThread::exception_oop_offset()));
+  __ st_ptr(Oexception,  G2_thread, in_bytes(JavaThread::exception_oop_offset()));
   __ st_ptr(Oissuing_pc, G2_thread, in_bytes(JavaThread::exception_pc_offset()));
 
-  // save the real return address and use the throwing pc as the return address to lookup (has bci & oop map)
-  __ mov(I7, L0);
+  // use the throwing pc as the return address to lookup (has bci & oop map)
   __ mov(Oissuing_pc, I7);
   __ sub(I7, frame::pc_return_offset, I7);
   int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, exception_handler_for_pc));
+  oop_maps->add_gc_map(call_offset, oop_map);
 
   // Note: if nmethod has been deoptimized then regardless of
   // whether it had a handler or not we will deoptimize
   // by entering the deopt blob with a pending exception.
 
-#ifdef ASSERT
-  Label done;
-  __ tst(O0);
-  __ br(Assembler::notZero, false, Assembler::pn, done);
-  __ delayed()->nop();
-  __ stop("should have found address");
-  __ bind(done);
-#endif
+  // Restore the registers that were saved at the beginning, remove
+  // the frame and jump to the exception handler.
+  switch (id) {
+  case forward_exception_id:
+  case handle_exception_id:
+    restore_live_registers(sasm);
+    __ jmp(O0, 0);
+    __ delayed()->restore();
+    break;
+  case handle_exception_from_callee_id:
+    // Restore SP from L7 if the exception PC is a method handle call site.
+    __ mov(O0, G5);  // Save the target address.
+    __ lduw(Address(G2_thread, JavaThread::is_method_handle_return_offset()), L0);
+    __ tst(L0);  // Condition codes are preserved over the restore.
+    __ restore();
 
-  // restore the registers that were saved at the beginning and jump to the exception handler.
-  restore_live_registers(sasm);
+    __ jmp(G5, 0);  // jump to the exception handler
+    __ delayed()->movcc(Assembler::notZero, false, Assembler::icc, L7_mh_SP_save, SP);  // Restore SP if required.
+    break;
+  default:  ShouldNotReachHere();
+  }
 
-  __ jmp(O0, 0);
-  __ delayed()->restore();
-
-  oop_maps->add_gc_map(call_offset, oop_map);
+  return oop_maps;
 }
 
 
 #undef __
 
-#define __ masm->
-
 const char *Runtime1::pd_name_for_address(address entry) {
   return "<unknown function>";
 }
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -417,6 +417,7 @@
 
   // Some handy addresses:
   Address G5_method_fie(    G5_method,        in_bytes(methodOopDesc::from_interpreted_offset()));
+  Address G5_method_fce(    G5_method,        in_bytes(methodOopDesc::from_compiled_offset()));
 
   Address G3_mh_vmtarget(   G3_method_handle, java_dyn_MethodHandle::vmtarget_offset_in_bytes());
 
@@ -444,12 +445,10 @@
   case _raise_exception:
     {
       // Not a real MH entry, but rather shared code for raising an
-      // exception.  Since we use a C2I adapter to set up the
-      // interpreter state, arguments are expected in compiler
-      // argument registers.
+      // exception.  Since we use the compiled entry, arguments are
+      // expected in compiler argument registers.
       assert(raise_exception_method(), "must be set");
-      address c2i_entry = raise_exception_method()->get_c2i_entry();
-      assert(c2i_entry, "method must be linked");
+      assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
 
       __ mov(O5_savedSP, SP);  // Cut the stack back to where the caller started.
 
@@ -468,10 +467,9 @@
       __ delayed()->nop();
 
       __ verify_oop(G5_method);
-      __ jump_to(AddressLiteral(c2i_entry), O3_scratch);
+      __ jump_indirect_to(G5_method_fce, O3_scratch);  // jump to compiled entry
       __ delayed()->nop();
 
-      // If we get here, the Java runtime did not do its job of creating the exception.
       // Do something that is at least causes a valid throw from the interpreter.
       __ bind(L_no_method);
       __ unimplemented("call throw_WrongMethodType_entry");
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -968,19 +968,6 @@
     return start;
   }
 
-  static address disjoint_byte_copy_entry;
-  static address disjoint_short_copy_entry;
-  static address disjoint_int_copy_entry;
-  static address disjoint_long_copy_entry;
-  static address disjoint_oop_copy_entry;
-
-  static address byte_copy_entry;
-  static address short_copy_entry;
-  static address int_copy_entry;
-  static address long_copy_entry;
-  static address oop_copy_entry;
-
-  static address checkcast_copy_entry;
 
   //
   // Verify that a register contains clean 32-bits positive value
@@ -1046,31 +1033,40 @@
   //
   //  The input registers are overwritten.
   //
-  void gen_write_ref_array_pre_barrier(Register addr, Register count) {
+  void gen_write_ref_array_pre_barrier(Register addr, Register count, bool dest_uninitialized) {
     BarrierSet* bs = Universe::heap()->barrier_set();
-    if (bs->has_write_ref_pre_barrier()) {
-      assert(bs->has_write_ref_array_pre_opt(),
-             "Else unsupported barrier set.");
-
-      __ save_frame(0);
-      // Save the necessary global regs... will be used after.
-      if (addr->is_global()) {
-        __ mov(addr, L0);
-      }
-      if (count->is_global()) {
-        __ mov(count, L1);
-      }
-      __ mov(addr->after_save(), O0);
-      // Get the count into O1
-      __ call(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre));
-      __ delayed()->mov(count->after_save(), O1);
-      if (addr->is_global()) {
-        __ mov(L0, addr);
-      }
-      if (count->is_global()) {
-        __ mov(L1, count);
-      }
-      __ restore();
+    switch (bs->kind()) {
+      case BarrierSet::G1SATBCT:
+      case BarrierSet::G1SATBCTLogging:
+        // With G1, don't generate the call if we statically know that the target in uninitialized
+        if (!dest_uninitialized) {
+          __ save_frame(0);
+          // Save the necessary global regs... will be used after.
+          if (addr->is_global()) {
+            __ mov(addr, L0);
+          }
+          if (count->is_global()) {
+            __ mov(count, L1);
+          }
+          __ mov(addr->after_save(), O0);
+          // Get the count into O1
+          __ call(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre));
+          __ delayed()->mov(count->after_save(), O1);
+          if (addr->is_global()) {
+            __ mov(L0, addr);
+          }
+          if (count->is_global()) {
+            __ mov(L1, count);
+          }
+          __ restore();
+        }
+        break;
+      case BarrierSet::CardTableModRef:
+      case BarrierSet::CardTableExtension:
+      case BarrierSet::ModRef:
+        break;
+      default:
+        ShouldNotReachHere();
     }
   }
   //
@@ -1084,7 +1080,7 @@
   //  The input registers are overwritten.
   //
   void gen_write_ref_array_post_barrier(Register addr, Register count,
-                                   Register tmp) {
+                                        Register tmp) {
     BarrierSet* bs = Universe::heap()->barrier_set();
 
     switch (bs->kind()) {
@@ -1283,7 +1279,7 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_disjoint_byte_copy(bool aligned, const char * name) {
+  address generate_disjoint_byte_copy(bool aligned, address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1299,9 +1295,11 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  disjoint_byte_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     // for short arrays, just do single element copy
     __ cmp(count, 23); // 16 + 7
@@ -1391,15 +1389,13 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_conjoint_byte_copy(bool aligned, const char * name) {
+  address generate_conjoint_byte_copy(bool aligned, address nooverlap_target,
+                                      address *entry, const char *name) {
     // Do reverse copy.
 
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
-    address nooverlap_target = aligned ?
-        StubRoutines::arrayof_jbyte_disjoint_arraycopy() :
-        disjoint_byte_copy_entry;
 
     Label L_skip_alignment, L_align, L_aligned_copy;
     Label L_copy_byte, L_copy_byte_loop, L_exit;
@@ -1412,9 +1408,11 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  byte_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     array_overlap_test(nooverlap_target, 0);
 
@@ -1504,7 +1502,7 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_disjoint_short_copy(bool aligned, const char * name) {
+  address generate_disjoint_short_copy(bool aligned, address *entry, const char * name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1520,9 +1518,11 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  disjoint_short_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     // for short arrays, just do single element copy
     __ cmp(count, 11); // 8 + 3  (22 bytes)
@@ -1842,15 +1842,13 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_conjoint_short_copy(bool aligned, const char * name) {
+  address generate_conjoint_short_copy(bool aligned, address nooverlap_target,
+                                       address *entry, const char *name) {
     // Do reverse copy.
 
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
-    address nooverlap_target = aligned ?
-        StubRoutines::arrayof_jshort_disjoint_arraycopy() :
-        disjoint_short_copy_entry;
 
     Label L_skip_alignment, L_skip_alignment2, L_aligned_copy;
     Label L_copy_2_bytes, L_copy_2_bytes_loop, L_exit;
@@ -1865,9 +1863,11 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  short_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     array_overlap_test(nooverlap_target, 1);
 
@@ -2072,7 +2072,7 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_disjoint_int_copy(bool aligned, const char * name) {
+  address generate_disjoint_int_copy(bool aligned, address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -2080,9 +2080,11 @@
     const Register count = O2;
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  disjoint_int_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     generate_disjoint_int_copy_core(aligned);
 
@@ -2204,20 +2206,19 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_conjoint_int_copy(bool aligned, const char * name) {
+  address generate_conjoint_int_copy(bool aligned, address nooverlap_target,
+                                     address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
 
-    address nooverlap_target = aligned ?
-        StubRoutines::arrayof_jint_disjoint_arraycopy() :
-        disjoint_int_copy_entry;
-
     assert_clean_int(O2, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  int_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     array_overlap_test(nooverlap_target, 2);
 
@@ -2336,16 +2337,18 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_disjoint_long_copy(bool aligned, const char * name) {
+  address generate_disjoint_long_copy(bool aligned, address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
 
     assert_clean_int(O2, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  disjoint_long_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     generate_disjoint_long_copy_core(aligned);
 
@@ -2406,19 +2409,21 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_conjoint_long_copy(bool aligned, const char * name) {
+  address generate_conjoint_long_copy(bool aligned, address nooverlap_target,
+                                      address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
 
-    assert(!aligned, "usage");
-    address nooverlap_target = disjoint_long_copy_entry;
+    assert(aligned, "Should always be aligned");
 
     assert_clean_int(O2, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  long_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     array_overlap_test(nooverlap_target, 3);
 
@@ -2439,7 +2444,8 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_disjoint_oop_copy(bool aligned, const char * name) {
+  address generate_disjoint_oop_copy(bool aligned, address *entry, const char *name,
+                                     bool dest_uninitialized = false) {
 
     const Register from  = O0;  // source array address
     const Register to    = O1;  // destination array address
@@ -2451,14 +2457,16 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  disjoint_oop_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here
+      BLOCK_COMMENT("Entry:");
+    }
 
     // save arguments for barrier generation
     __ mov(to, G1);
     __ mov(count, G5);
-    gen_write_ref_array_pre_barrier(G1, G5);
+    gen_write_ref_array_pre_barrier(G1, G5, dest_uninitialized);
   #ifdef _LP64
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
     if (UseCompressedOops) {
@@ -2487,7 +2495,9 @@
   //      to:    O1
   //      count: O2 treated as signed
   //
-  address generate_conjoint_oop_copy(bool aligned, const char * name) {
+  address generate_conjoint_oop_copy(bool aligned, address nooverlap_target,
+                                     address *entry, const char *name,
+                                     bool dest_uninitialized = false) {
 
     const Register from  = O0;  // source array address
     const Register to    = O1;  // destination array address
@@ -2499,21 +2509,18 @@
 
     assert_clean_int(count, O3);     // Make sure 'count' is clean int.
 
-    if (!aligned)  oop_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here
-    if (!aligned)  BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here
+      BLOCK_COMMENT("Entry:");
+    }
+
+    array_overlap_test(nooverlap_target, LogBytesPerHeapOop);
 
     // save arguments for barrier generation
     __ mov(to, G1);
     __ mov(count, G5);
-
-    gen_write_ref_array_pre_barrier(G1, G5);
-
-    address nooverlap_target = aligned ?
-        StubRoutines::arrayof_oop_disjoint_arraycopy() :
-        disjoint_oop_copy_entry;
-
-    array_overlap_test(nooverlap_target, LogBytesPerHeapOop);
+    gen_write_ref_array_pre_barrier(G1, G5, dest_uninitialized);
 
   #ifdef _LP64
     if (UseCompressedOops) {
@@ -2582,7 +2589,7 @@
   //      ckval: O4 (super_klass)
   //      ret:   O0 zero for success; (-1^K) where K is partial transfer count
   //
-  address generate_checkcast_copy(const char* name) {
+  address generate_checkcast_copy(const char *name, address *entry, bool dest_uninitialized = false) {
 
     const Register O0_from   = O0;      // source array address
     const Register O1_to     = O1;      // destination array address
@@ -2600,8 +2607,6 @@
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
 
-    gen_write_ref_array_pre_barrier(O1, O2);
-
 #ifdef ASSERT
     // We sometimes save a frame (see generate_type_check below).
     // If this will cause trouble, let's fail now instead of later.
@@ -2625,9 +2630,12 @@
     }
 #endif //ASSERT
 
-    checkcast_copy_entry = __ pc();
-    // caller can pass a 64-bit byte count here (from generic stub)
-    BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from generic stub)
+      BLOCK_COMMENT("Entry:");
+    }
+    gen_write_ref_array_pre_barrier(O1_to, O2_count, dest_uninitialized);
 
     Label load_element, store_element, do_card_marks, fail, done;
     __ addcc(O2_count, 0, G1_remain);   // initialize loop index, and test it
@@ -2700,7 +2708,11 @@
   // Examines the alignment of the operands and dispatches
   // to a long, int, short, or byte copy loop.
   //
-  address generate_unsafe_copy(const char* name) {
+  address generate_unsafe_copy(const char* name,
+                               address byte_copy_entry,
+                               address short_copy_entry,
+                               address int_copy_entry,
+                               address long_copy_entry) {
 
     const Register O0_from   = O0;      // source array address
     const Register O1_to     = O1;      // destination array address
@@ -2796,8 +2808,13 @@
   //    O0 ==  0  -  success
   //    O0 == -1  -  need to call System.arraycopy
   //
-  address generate_generic_copy(const char *name) {
-
+  address generate_generic_copy(const char *name,
+                                address entry_jbyte_arraycopy,
+                                address entry_jshort_arraycopy,
+                                address entry_jint_arraycopy,
+                                address entry_oop_arraycopy,
+                                address entry_jlong_arraycopy,
+                                address entry_checkcast_arraycopy) {
     Label L_failed, L_objArray;
 
     // Input registers
@@ -2970,15 +2987,15 @@
 
     BLOCK_COMMENT("choose copy loop based on element size");
     __ cmp(G3_elsize, 0);
-    __ br(Assembler::equal,true,Assembler::pt,StubRoutines::_jbyte_arraycopy);
+    __ br(Assembler::equal, true, Assembler::pt, entry_jbyte_arraycopy);
     __ delayed()->signx(length, count); // length
 
     __ cmp(G3_elsize, LogBytesPerShort);
-    __ br(Assembler::equal,true,Assembler::pt,StubRoutines::_jshort_arraycopy);
+    __ br(Assembler::equal, true, Assembler::pt, entry_jshort_arraycopy);
     __ delayed()->signx(length, count); // length
 
     __ cmp(G3_elsize, LogBytesPerInt);
-    __ br(Assembler::equal,true,Assembler::pt,StubRoutines::_jint_arraycopy);
+    __ br(Assembler::equal, true, Assembler::pt, entry_jint_arraycopy);
     __ delayed()->signx(length, count); // length
 #ifdef ASSERT
     { Label L;
@@ -2989,7 +3006,7 @@
       __ bind(L);
     }
 #endif
-    __ br(Assembler::always,false,Assembler::pt,StubRoutines::_jlong_arraycopy);
+    __ br(Assembler::always, false, Assembler::pt, entry_jlong_arraycopy);
     __ delayed()->signx(length, count); // length
 
     // objArrayKlass
@@ -3013,7 +3030,7 @@
     __ add(src, src_pos, from);       // src_addr
     __ add(dst, dst_pos, to);         // dst_addr
   __ BIND(L_plain_copy);
-    __ br(Assembler::always, false, Assembler::pt,StubRoutines::_oop_arraycopy);
+    __ br(Assembler::always, false, Assembler::pt, entry_oop_arraycopy);
     __ delayed()->signx(length, count); // length
 
   __ BIND(L_checkcast_copy);
@@ -3057,7 +3074,7 @@
       __ ld_ptr(G4_dst_klass, ek_offset, O4);   // dest elem klass
       // lduw(O4, sco_offset, O3);              // sco of elem klass
 
-      __ br(Assembler::always, false, Assembler::pt, checkcast_copy_entry);
+      __ br(Assembler::always, false, Assembler::pt, entry_checkcast_arraycopy);
       __ delayed()->lduw(O4, sco_offset, O3);
     }
 
@@ -3068,39 +3085,124 @@
   }
 
   void generate_arraycopy_stubs() {
-
-    // Note:  the disjoint stubs must be generated first, some of
-    //        the conjoint stubs use them.
-    StubRoutines::_jbyte_disjoint_arraycopy  = generate_disjoint_byte_copy(false, "jbyte_disjoint_arraycopy");
-    StubRoutines::_jshort_disjoint_arraycopy = generate_disjoint_short_copy(false, "jshort_disjoint_arraycopy");
-    StubRoutines::_jint_disjoint_arraycopy   = generate_disjoint_int_copy(false, "jint_disjoint_arraycopy");
-    StubRoutines::_jlong_disjoint_arraycopy  = generate_disjoint_long_copy(false, "jlong_disjoint_arraycopy");
-    StubRoutines::_oop_disjoint_arraycopy    = generate_disjoint_oop_copy(false, "oop_disjoint_arraycopy");
-    StubRoutines::_arrayof_jbyte_disjoint_arraycopy  = generate_disjoint_byte_copy(true, "arrayof_jbyte_disjoint_arraycopy");
-    StubRoutines::_arrayof_jshort_disjoint_arraycopy = generate_disjoint_short_copy(true, "arrayof_jshort_disjoint_arraycopy");
-    StubRoutines::_arrayof_jint_disjoint_arraycopy   = generate_disjoint_int_copy(true, "arrayof_jint_disjoint_arraycopy");
-    StubRoutines::_arrayof_jlong_disjoint_arraycopy  = generate_disjoint_long_copy(true, "arrayof_jlong_disjoint_arraycopy");
-    StubRoutines::_arrayof_oop_disjoint_arraycopy    =  generate_disjoint_oop_copy(true, "arrayof_oop_disjoint_arraycopy");
-
-    StubRoutines::_jbyte_arraycopy  = generate_conjoint_byte_copy(false, "jbyte_arraycopy");
-    StubRoutines::_jshort_arraycopy = generate_conjoint_short_copy(false, "jshort_arraycopy");
-    StubRoutines::_jint_arraycopy   = generate_conjoint_int_copy(false, "jint_arraycopy");
-    StubRoutines::_jlong_arraycopy  = generate_conjoint_long_copy(false, "jlong_arraycopy");
-    StubRoutines::_oop_arraycopy    = generate_conjoint_oop_copy(false, "oop_arraycopy");
-    StubRoutines::_arrayof_jbyte_arraycopy    = generate_conjoint_byte_copy(true, "arrayof_jbyte_arraycopy");
-    StubRoutines::_arrayof_jshort_arraycopy   = generate_conjoint_short_copy(true, "arrayof_jshort_arraycopy");
+    address entry;
+    address entry_jbyte_arraycopy;
+    address entry_jshort_arraycopy;
+    address entry_jint_arraycopy;
+    address entry_oop_arraycopy;
+    address entry_jlong_arraycopy;
+    address entry_checkcast_arraycopy;
+
+    //*** jbyte
+    // Always need aligned and unaligned versions
+    StubRoutines::_jbyte_disjoint_arraycopy         = generate_disjoint_byte_copy(false, &entry,
+                                                                                  "jbyte_disjoint_arraycopy");
+    StubRoutines::_jbyte_arraycopy                  = generate_conjoint_byte_copy(false, entry,
+                                                                                  &entry_jbyte_arraycopy,
+                                                                                  "jbyte_arraycopy");
+    StubRoutines::_arrayof_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(true, &entry,
+                                                                                  "arrayof_jbyte_disjoint_arraycopy");
+    StubRoutines::_arrayof_jbyte_arraycopy          = generate_conjoint_byte_copy(true, entry, NULL,
+                                                                                  "arrayof_jbyte_arraycopy");
+
+    //*** jshort
+    // Always need aligned and unaligned versions
+    StubRoutines::_jshort_disjoint_arraycopy         = generate_disjoint_short_copy(false, &entry,
+                                                                                    "jshort_disjoint_arraycopy");
+    StubRoutines::_jshort_arraycopy                  = generate_conjoint_short_copy(false, entry,
+                                                                                    &entry_jshort_arraycopy,
+                                                                                    "jshort_arraycopy");
+    StubRoutines::_arrayof_jshort_disjoint_arraycopy = generate_disjoint_short_copy(true, &entry,
+                                                                                    "arrayof_jshort_disjoint_arraycopy");
+    StubRoutines::_arrayof_jshort_arraycopy          = generate_conjoint_short_copy(true, entry, NULL,
+                                                                                    "arrayof_jshort_arraycopy");
+
+    //*** jint
+    // Aligned versions
+    StubRoutines::_arrayof_jint_disjoint_arraycopy = generate_disjoint_int_copy(true, &entry,
+                                                                                "arrayof_jint_disjoint_arraycopy");
+    StubRoutines::_arrayof_jint_arraycopy          = generate_conjoint_int_copy(true, entry, &entry_jint_arraycopy,
+                                                                                "arrayof_jint_arraycopy");
 #ifdef _LP64
-    // since sizeof(jint) < sizeof(HeapWord), there's a different flavor:
-    StubRoutines::_arrayof_jint_arraycopy     = generate_conjoint_int_copy(true, "arrayof_jint_arraycopy");
-  #else
-    StubRoutines::_arrayof_jint_arraycopy     = StubRoutines::_jint_arraycopy;
+    // In 64 bit we need both aligned and unaligned versions of jint arraycopy.
+    // entry_jint_arraycopy always points to the unaligned version (notice that we overwrite it).
+    StubRoutines::_jint_disjoint_arraycopy         = generate_disjoint_int_copy(false, &entry,
+                                                                                "jint_disjoint_arraycopy");
+    StubRoutines::_jint_arraycopy                  = generate_conjoint_int_copy(false, entry,
+                                                                                &entry_jint_arraycopy,
+                                                                                "jint_arraycopy");
+#else
+    // In 32 bit jints are always HeapWordSize aligned, so always use the aligned version
+    // (in fact in 32bit we always have a pre-loop part even in the aligned version,
+    //  because it uses 64-bit loads/stores, so the aligned flag is actually ignored).
+    StubRoutines::_jint_disjoint_arraycopy = StubRoutines::_arrayof_jint_disjoint_arraycopy;
+    StubRoutines::_jint_arraycopy          = StubRoutines::_arrayof_jint_arraycopy;
 #endif
-    StubRoutines::_arrayof_jlong_arraycopy    = StubRoutines::_jlong_arraycopy;
-    StubRoutines::_arrayof_oop_arraycopy      = StubRoutines::_oop_arraycopy;
-
-    StubRoutines::_checkcast_arraycopy = generate_checkcast_copy("checkcast_arraycopy");
-    StubRoutines::_unsafe_arraycopy    = generate_unsafe_copy("unsafe_arraycopy");
-    StubRoutines::_generic_arraycopy   = generate_generic_copy("generic_arraycopy");
+
+
+    //*** jlong
+    // It is always aligned
+    StubRoutines::_arrayof_jlong_disjoint_arraycopy = generate_disjoint_long_copy(true, &entry,
+                                                                                  "arrayof_jlong_disjoint_arraycopy");
+    StubRoutines::_arrayof_jlong_arraycopy          = generate_conjoint_long_copy(true, entry, &entry_jlong_arraycopy,
+                                                                                  "arrayof_jlong_arraycopy");
+    StubRoutines::_jlong_disjoint_arraycopy         = StubRoutines::_arrayof_jlong_disjoint_arraycopy;
+    StubRoutines::_jlong_arraycopy                  = StubRoutines::_arrayof_jlong_arraycopy;
+
+
+    //*** oops
+    // Aligned versions
+    StubRoutines::_arrayof_oop_disjoint_arraycopy        = generate_disjoint_oop_copy(true, &entry,
+                                                                                      "arrayof_oop_disjoint_arraycopy");
+    StubRoutines::_arrayof_oop_arraycopy                 = generate_conjoint_oop_copy(true, entry, &entry_oop_arraycopy,
+                                                                                      "arrayof_oop_arraycopy");
+    // Aligned versions without pre-barriers
+    StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = generate_disjoint_oop_copy(true, &entry,
+                                                                                      "arrayof_oop_disjoint_arraycopy_uninit",
+                                                                                      /*dest_uninitialized*/true);
+    StubRoutines::_arrayof_oop_arraycopy_uninit          = generate_conjoint_oop_copy(true, entry, NULL,
+                                                                                      "arrayof_oop_arraycopy_uninit",
+                                                                                      /*dest_uninitialized*/true);
+#ifdef _LP64
+    if (UseCompressedOops) {
+      // With compressed oops we need unaligned versions, notice that we overwrite entry_oop_arraycopy.
+      StubRoutines::_oop_disjoint_arraycopy            = generate_disjoint_oop_copy(false, &entry,
+                                                                                    "oop_disjoint_arraycopy");
+      StubRoutines::_oop_arraycopy                     = generate_conjoint_oop_copy(false, entry, &entry_oop_arraycopy,
+                                                                                    "oop_arraycopy");
+      // Unaligned versions without pre-barriers
+      StubRoutines::_oop_disjoint_arraycopy_uninit     = generate_disjoint_oop_copy(false, &entry,
+                                                                                    "oop_disjoint_arraycopy_uninit",
+                                                                                    /*dest_uninitialized*/true);
+      StubRoutines::_oop_arraycopy_uninit              = generate_conjoint_oop_copy(false, entry, NULL,
+                                                                                    "oop_arraycopy_uninit",
+                                                                                    /*dest_uninitialized*/true);
+    } else
+#endif
+    {
+      // oop arraycopy is always aligned on 32bit and 64bit without compressed oops
+      StubRoutines::_oop_disjoint_arraycopy            = StubRoutines::_arrayof_oop_disjoint_arraycopy;
+      StubRoutines::_oop_arraycopy                     = StubRoutines::_arrayof_oop_arraycopy;
+      StubRoutines::_oop_disjoint_arraycopy_uninit     = StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit;
+      StubRoutines::_oop_arraycopy_uninit              = StubRoutines::_arrayof_oop_arraycopy_uninit;
+    }
+
+    StubRoutines::_checkcast_arraycopy        = generate_checkcast_copy("checkcast_arraycopy", &entry_checkcast_arraycopy);
+    StubRoutines::_checkcast_arraycopy_uninit = generate_checkcast_copy("checkcast_arraycopy_uninit", NULL,
+                                                                        /*dest_uninitialized*/true);
+
+    StubRoutines::_unsafe_arraycopy    = generate_unsafe_copy("unsafe_arraycopy",
+                                                              entry_jbyte_arraycopy,
+                                                              entry_jshort_arraycopy,
+                                                              entry_jint_arraycopy,
+                                                              entry_jlong_arraycopy);
+    StubRoutines::_generic_arraycopy   = generate_generic_copy("generic_arraycopy",
+                                                               entry_jbyte_arraycopy,
+                                                               entry_jshort_arraycopy,
+                                                               entry_jint_arraycopy,
+                                                               entry_oop_arraycopy,
+                                                               entry_jlong_arraycopy,
+                                                               entry_checkcast_arraycopy);
 
     StubRoutines::_jbyte_fill = generate_fill(T_BYTE, false, "jbyte_fill");
     StubRoutines::_jshort_fill = generate_fill(T_SHORT, false, "jshort_fill");
@@ -3224,21 +3326,6 @@
 
 }; // end class declaration
 
-
-address StubGenerator::disjoint_byte_copy_entry  = NULL;
-address StubGenerator::disjoint_short_copy_entry = NULL;
-address StubGenerator::disjoint_int_copy_entry   = NULL;
-address StubGenerator::disjoint_long_copy_entry  = NULL;
-address StubGenerator::disjoint_oop_copy_entry   = NULL;
-
-address StubGenerator::byte_copy_entry  = NULL;
-address StubGenerator::short_copy_entry = NULL;
-address StubGenerator::int_copy_entry   = NULL;
-address StubGenerator::long_copy_entry  = NULL;
-address StubGenerator::oop_copy_entry   = NULL;
-
-address StubGenerator::checkcast_copy_entry = NULL;
-
 void StubGenerator_generate(CodeBuffer* code, bool all) {
   StubGenerator g(code, all);
 }
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1601,6 +1601,17 @@
   emit_byte(0xC0 | encode);
 }
 
+void Assembler::movdl(XMMRegister dst, Address src) {
+  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+  InstructionMark im(this);
+  emit_byte(0x66);
+  prefix(src, dst);
+  emit_byte(0x0F);
+  emit_byte(0x6E);
+  emit_operand(dst, src);
+}
+
+
 void Assembler::movdqa(XMMRegister dst, Address src) {
   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
   InstructionMark im(this);
@@ -2412,7 +2423,10 @@
 }
 
 void Assembler::psrlq(XMMRegister dst, int shift) {
-  // HMM Table D-1 says sse2 or mmx
+  // Shift 64 bit value logically right by specified number of bits.
+  // HMM Table D-1 says sse2 or mmx.
+  // Do not confuse it with psrldq SSE2 instruction which
+  // shifts 128 bit value in xmm register by number of bytes.
   NOT_LP64(assert(VM_Version::supports_sse(), ""));
 
   int encode = prefixq_and_encode(xmm2->encoding(), dst->encoding());
@@ -2423,6 +2437,18 @@
   emit_byte(shift);
 }
 
+void Assembler::psrldq(XMMRegister dst, int shift) {
+  // Shift 128 bit value in xmm register by number of bytes.
+  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+
+  int encode = prefixq_and_encode(xmm3->encoding(), dst->encoding());
+  emit_byte(0x66);
+  emit_byte(0x0F);
+  emit_byte(0x73);
+  emit_byte(0xC0 | encode);
+  emit_byte(shift);
+}
+
 void Assembler::ptest(XMMRegister dst, Address src) {
   assert(VM_Version::supports_sse4_1(), "");
 
@@ -8567,101 +8593,418 @@
 }
 #endif // _LP64
 
-// IndexOf substring.
-void MacroAssembler::string_indexof(Register str1, Register str2,
-                                    Register cnt1, Register cnt2, Register result,
-                                    XMMRegister vec, Register tmp) {
+// IndexOf for constant substrings with size >= 8 chars
+// which don't need to be loaded through stack.
+void MacroAssembler::string_indexofC8(Register str1, Register str2,
+                                      Register cnt1, Register cnt2,
+                                      int int_cnt2,  Register result,
+                                      XMMRegister vec, Register tmp) {
   assert(UseSSE42Intrinsics, "SSE4.2 is required");
 
-  Label RELOAD_SUBSTR, PREP_FOR_SCAN, SCAN_TO_SUBSTR,
-        SCAN_SUBSTR, RET_NOT_FOUND, CLEANUP;
-
-  push(str1); // string addr
-  push(str2); // substr addr
-  push(cnt2); // substr count
-  jmpb(PREP_FOR_SCAN);
-
-  // Substr count saved at sp
-  // Substr saved at sp+1*wordSize
-  // String saved at sp+2*wordSize
-
-  // Reload substr for rescan
-  bind(RELOAD_SUBSTR);
-  movl(cnt2, Address(rsp, 0));
-  movptr(str2, Address(rsp, wordSize));
-  // We came here after the beginninig of the substring was
-  // matched but the rest of it was not so we need to search
-  // again. Start from the next element after the previous match.
-  subptr(str1, result); // Restore counter
-  shrl(str1, 1);
-  addl(cnt1, str1);
-  decrementl(cnt1);
-  lea(str1, Address(result, 2)); // Reload string
-
-  // Load substr
-  bind(PREP_FOR_SCAN);
-  movdqu(vec, Address(str2, 0));
-  addl(cnt1, 8);  // prime the loop
-  subptr(str1, 16);
-
-  // Scan string for substr in 16-byte vectors
-  bind(SCAN_TO_SUBSTR);
-  subl(cnt1, 8);
-  addptr(str1, 16);
-
-  // pcmpestri
+  // This method uses pcmpestri inxtruction with bound registers
   //   inputs:
   //     xmm - substring
   //     rax - substring length (elements count)
-  //     mem - scaned string
+  //     mem - scanned string
+  //     rdx - string length (elements count)
+  //     0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
+  //   outputs:
+  //     rcx - matched index in string
+  assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
+
+  Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR,
+        RET_FOUND, RET_NOT_FOUND, EXIT, FOUND_SUBSTR,
+        MATCH_SUBSTR_HEAD, RELOAD_STR, FOUND_CANDIDATE;
+
+  // Note, inline_string_indexOf() generates checks:
+  // if (substr.count > string.count) return -1;
+  // if (substr.count == 0) return 0;
+  assert(int_cnt2 >= 8, "this code isused only for cnt2 >= 8 chars");
+
+  // Load substring.
+  movdqu(vec, Address(str2, 0));
+  movl(cnt2, int_cnt2);
+  movptr(result, str1); // string addr
+
+  if (int_cnt2 > 8) {
+    jmpb(SCAN_TO_SUBSTR);
+
+    // Reload substr for rescan, this code
+    // is executed only for large substrings (> 8 chars)
+    bind(RELOAD_SUBSTR);
+    movdqu(vec, Address(str2, 0));
+    negptr(cnt2); // Jumped here with negative cnt2, convert to positive
+
+    bind(RELOAD_STR);
+    // We came here after the beginning of the substring was
+    // matched but the rest of it was not so we need to search
+    // again. Start from the next element after the previous match.
+
+    // cnt2 is number of substring reminding elements and
+    // cnt1 is number of string reminding elements when cmp failed.
+    // Restored cnt1 = cnt1 - cnt2 + int_cnt2
+    subl(cnt1, cnt2);
+    addl(cnt1, int_cnt2);
+    movl(cnt2, int_cnt2); // Now restore cnt2
+
+    decrementl(cnt1);     // Shift to next element
+    cmpl(cnt1, cnt2);
+    jccb(Assembler::negative, RET_NOT_FOUND);  // Left less then substring
+
+    addptr(result, 2);
+
+  } // (int_cnt2 > 8)
+
+  // Scan string for start of substr in 16-byte vectors
+  bind(SCAN_TO_SUBSTR);
+  pcmpestri(vec, Address(result, 0), 0x0d);
+  jccb(Assembler::below, FOUND_CANDIDATE);   // CF == 1
+  subl(cnt1, 8);
+  jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
+  cmpl(cnt1, cnt2);
+  jccb(Assembler::negative, RET_NOT_FOUND);  // Left less then substring
+  addptr(result, 16);
+  jmpb(SCAN_TO_SUBSTR);
+
+  // Found a potential substr
+  bind(FOUND_CANDIDATE);
+  // Matched whole vector if first element matched (tmp(rcx) == 0).
+  if (int_cnt2 == 8) {
+    jccb(Assembler::overflow, RET_FOUND);    // OF == 1
+  } else { // int_cnt2 > 8
+    jccb(Assembler::overflow, FOUND_SUBSTR);
+  }
+  // After pcmpestri tmp(rcx) contains matched element index
+  // Compute start addr of substr
+  lea(result, Address(result, tmp, Address::times_2));
+
+  // Make sure string is still long enough
+  subl(cnt1, tmp);
+  cmpl(cnt1, cnt2);
+  if (int_cnt2 == 8) {
+    jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
+  } else { // int_cnt2 > 8
+    jccb(Assembler::greaterEqual, MATCH_SUBSTR_HEAD);
+  }
+  // Left less then substring.
+
+  bind(RET_NOT_FOUND);
+  movl(result, -1);
+  jmpb(EXIT);
+
+  if (int_cnt2 > 8) {
+    // This code is optimized for the case when whole substring
+    // is matched if its head is matched.
+    bind(MATCH_SUBSTR_HEAD);
+    pcmpestri(vec, Address(result, 0), 0x0d);
+    // Reload only string if does not match
+    jccb(Assembler::noOverflow, RELOAD_STR); // OF == 0
+
+    Label CONT_SCAN_SUBSTR;
+    // Compare the rest of substring (> 8 chars).
+    bind(FOUND_SUBSTR);
+    // First 8 chars are already matched.
+    negptr(cnt2);
+    addptr(cnt2, 8);
+
+    bind(SCAN_SUBSTR);
+    subl(cnt1, 8);
+    cmpl(cnt2, -8); // Do not read beyond substring
+    jccb(Assembler::lessEqual, CONT_SCAN_SUBSTR);
+    // Back-up strings to avoid reading beyond substring:
+    // cnt1 = cnt1 - cnt2 + 8
+    addl(cnt1, cnt2); // cnt2 is negative
+    addl(cnt1, 8);
+    movl(cnt2, 8); negptr(cnt2);
+    bind(CONT_SCAN_SUBSTR);
+    if (int_cnt2 < (int)G) {
+      movdqu(vec, Address(str2, cnt2, Address::times_2, int_cnt2*2));
+      pcmpestri(vec, Address(result, cnt2, Address::times_2, int_cnt2*2), 0x0d);
+    } else {
+      // calculate index in register to avoid integer overflow (int_cnt2*2)
+      movl(tmp, int_cnt2);
+      addptr(tmp, cnt2);
+      movdqu(vec, Address(str2, tmp, Address::times_2, 0));
+      pcmpestri(vec, Address(result, tmp, Address::times_2, 0), 0x0d);
+    }
+    // Need to reload strings pointers if not matched whole vector
+    jccb(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
+    addptr(cnt2, 8);
+    jccb(Assembler::negative, SCAN_SUBSTR);
+    // Fall through if found full substring
+
+  } // (int_cnt2 > 8)
+
+  bind(RET_FOUND);
+  // Found result if we matched full small substring.
+  // Compute substr offset
+  subptr(result, str1);
+  shrl(result, 1); // index
+  bind(EXIT);
+
+} // string_indexofC8
+
+// Small strings are loaded through stack if they cross page boundary.
+void MacroAssembler::string_indexof(Register str1, Register str2,
+                                    Register cnt1, Register cnt2,
+                                    int int_cnt2,  Register result,
+                                    XMMRegister vec, Register tmp) {
+  assert(UseSSE42Intrinsics, "SSE4.2 is required");
+  //
+  // int_cnt2 is length of small (< 8 chars) constant substring
+  // or (-1) for non constant substring in which case its length
+  // is in cnt2 register.
+  //
+  // Note, inline_string_indexOf() generates checks:
+  // if (substr.count > string.count) return -1;
+  // if (substr.count == 0) return 0;
+  //
+  assert(int_cnt2 == -1 || (0 < int_cnt2 && int_cnt2 < 8), "should be != 0");
+
+  // This method uses pcmpestri inxtruction with bound registers
+  //   inputs:
+  //     xmm - substring
+  //     rax - substring length (elements count)
+  //     mem - scanned string
   //     rdx - string length (elements count)
   //     0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
   //   outputs:
   //     rcx - matched index in string
   assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
 
-  pcmpestri(vec, Address(str1, 0), 0x0d);
-  jcc(Assembler::above, SCAN_TO_SUBSTR);      // CF == 0 && ZF == 0
-  jccb(Assembler::aboveEqual, RET_NOT_FOUND); // CF == 0
-
-  // Fallthrough: found a potential substr
+  Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR, ADJUST_STR,
+        RET_FOUND, RET_NOT_FOUND, CLEANUP, FOUND_SUBSTR,
+        FOUND_CANDIDATE;
+
+  { //========================================================
+    // We don't know where these strings are located
+    // and we can't read beyond them. Load them through stack.
+    Label BIG_STRINGS, CHECK_STR, COPY_SUBSTR, COPY_STR;
+
+    movptr(tmp, rsp); // save old SP
+
+    if (int_cnt2 > 0) {     // small (< 8 chars) constant substring
+      if (int_cnt2 == 1) {  // One char
+        load_unsigned_short(result, Address(str2, 0));
+        movdl(vec, result); // move 32 bits
+      } else if (int_cnt2 == 2) { // Two chars
+        movdl(vec, Address(str2, 0)); // move 32 bits
+      } else if (int_cnt2 == 4) { // Four chars
+        movq(vec, Address(str2, 0));  // move 64 bits
+      } else { // cnt2 = { 3, 5, 6, 7 }
+        // Array header size is 12 bytes in 32-bit VM
+        // + 6 bytes for 3 chars == 18 bytes,
+        // enough space to load vec and shift.
+        assert(HeapWordSize*typeArrayKlass::header_size() >= 12,"sanity");
+        movdqu(vec, Address(str2, (int_cnt2*2)-16));
+        psrldq(vec, 16-(int_cnt2*2));
+      }
+    } else { // not constant substring
+      cmpl(cnt2, 8);
+      jccb(Assembler::aboveEqual, BIG_STRINGS); // Both strings are big enough
+
+      // We can read beyond string if srt+16 does not cross page boundary
+      // since heaps are aligned and mapped by pages.
+      assert(os::vm_page_size() < (int)G, "default page should be small");
+      movl(result, str2); // We need only low 32 bits
+      andl(result, (os::vm_page_size()-1));
+      cmpl(result, (os::vm_page_size()-16));
+      jccb(Assembler::belowEqual, CHECK_STR);
+
+      // Move small strings to stack to allow load 16 bytes into vec.
+      subptr(rsp, 16);
+      int stk_offset = wordSize-2;
+      push(cnt2);
+
+      bind(COPY_SUBSTR);
+      load_unsigned_short(result, Address(str2, cnt2, Address::times_2, -2));
+      movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
+      decrement(cnt2);
+      jccb(Assembler::notZero, COPY_SUBSTR);
+
+      pop(cnt2);
+      movptr(str2, rsp);  // New substring address
+    } // non constant
+
+    bind(CHECK_STR);
+    cmpl(cnt1, 8);
+    jccb(Assembler::aboveEqual, BIG_STRINGS);
+
+    // Check cross page boundary.
+    movl(result, str1); // We need only low 32 bits
+    andl(result, (os::vm_page_size()-1));
+    cmpl(result, (os::vm_page_size()-16));
+    jccb(Assembler::belowEqual, BIG_STRINGS);
+
+    subptr(rsp, 16);
+    int stk_offset = -2;
+    if (int_cnt2 < 0) { // not constant
+      push(cnt2);
+      stk_offset += wordSize;
+    }
+    movl(cnt2, cnt1);
+
+    bind(COPY_STR);
+    load_unsigned_short(result, Address(str1, cnt2, Address::times_2, -2));
+    movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
+    decrement(cnt2);
+    jccb(Assembler::notZero, COPY_STR);
+
+    if (int_cnt2 < 0) { // not constant
+      pop(cnt2);
+    }
+    movptr(str1, rsp);  // New string address
+
+    bind(BIG_STRINGS);
+    // Load substring.
+    if (int_cnt2 < 0) { // -1
+      movdqu(vec, Address(str2, 0));
+      push(cnt2);       // substr count
+      push(str2);       // substr addr
+      push(str1);       // string addr
+    } else {
+      // Small (< 8 chars) constant substrings are loaded already.
+      movl(cnt2, int_cnt2);
+    }
+    push(tmp);  // original SP
+
+  } // Finished loading
+
+  //========================================================
+  // Start search
+  //
+
+  movptr(result, str1); // string addr
+
+  if (int_cnt2  < 0) {  // Only for non constant substring
+    jmpb(SCAN_TO_SUBSTR);
+
+    // SP saved at sp+0
+    // String saved at sp+1*wordSize
+    // Substr saved at sp+2*wordSize
+    // Substr count saved at sp+3*wordSize
+
+    // Reload substr for rescan, this code
+    // is executed only for large substrings (> 8 chars)
+    bind(RELOAD_SUBSTR);
+    movptr(str2, Address(rsp, 2*wordSize));
+    movl(cnt2, Address(rsp, 3*wordSize));
+    movdqu(vec, Address(str2, 0));
+    // We came here after the beginning of the substring was
+    // matched but the rest of it was not so we need to search
+    // again. Start from the next element after the previous match.
+    subptr(str1, result); // Restore counter
+    shrl(str1, 1);
+    addl(cnt1, str1);
+    decrementl(cnt1);   // Shift to next element
+    cmpl(cnt1, cnt2);
+    jccb(Assembler::negative, RET_NOT_FOUND);  // Left less then substring
+
+    addptr(result, 2);
+  } // non constant
+
+  // Scan string for start of substr in 16-byte vectors
+  bind(SCAN_TO_SUBSTR);
+  assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
+  pcmpestri(vec, Address(result, 0), 0x0d);
+  jccb(Assembler::below, FOUND_CANDIDATE);   // CF == 1
+  subl(cnt1, 8);
+  jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
+  cmpl(cnt1, cnt2);
+  jccb(Assembler::negative, RET_NOT_FOUND);  // Left less then substring
+  addptr(result, 16);
+
+  bind(ADJUST_STR);
+  cmpl(cnt1, 8); // Do not read beyond string
+  jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
+  // Back-up string to avoid reading beyond string.
+  lea(result, Address(result, cnt1, Address::times_2, -16));
+  movl(cnt1, 8);
+  jmpb(SCAN_TO_SUBSTR);
+
+  // Found a potential substr
+  bind(FOUND_CANDIDATE);
+  // After pcmpestri tmp(rcx) contains matched element index
 
   // Make sure string is still long enough
   subl(cnt1, tmp);
   cmpl(cnt1, cnt2);
-  jccb(Assembler::negative, RET_NOT_FOUND);
-  // Compute start addr of substr
-  lea(str1, Address(str1, tmp, Address::times_2));
-  movptr(result, str1); // save
-
-  // Compare potential substr
-  addl(cnt1, 8);     // prime the loop
-  addl(cnt2, 8);
-  subptr(str1, 16);
-  subptr(str2, 16);
-
-  // Scan 16-byte vectors of string and substr
-  bind(SCAN_SUBSTR);
-  subl(cnt1, 8);
-  subl(cnt2, 8);
-  addptr(str1, 16);
-  addptr(str2, 16);
-  movdqu(vec, Address(str2, 0));
-  pcmpestri(vec, Address(str1, 0), 0x0d);
-  jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
-  jcc(Assembler::positive, SCAN_SUBSTR);     // SF == 0
-
-  // Compute substr offset
-  subptr(result, Address(rsp, 2*wordSize));
-  shrl(result, 1); // index
-  jmpb(CLEANUP);
+  jccb(Assembler::greaterEqual, FOUND_SUBSTR);
+  // Left less then substring.
 
   bind(RET_NOT_FOUND);
   movl(result, -1);
+  jmpb(CLEANUP);
+
+  bind(FOUND_SUBSTR);
+  // Compute start addr of substr
+  lea(result, Address(result, tmp, Address::times_2));
+
+  if (int_cnt2 > 0) { // Constant substring
+    // Repeat search for small substring (< 8 chars)
+    // from new point without reloading substring.
+    // Have to check that we don't read beyond string.
+    cmpl(tmp, 8-int_cnt2);
+    jccb(Assembler::greater, ADJUST_STR);
+    // Fall through if matched whole substring.
+  } else { // non constant
+    assert(int_cnt2 == -1, "should be != 0");
+
+    addl(tmp, cnt2);
+    // Found result if we matched whole substring.
+    cmpl(tmp, 8);
+    jccb(Assembler::lessEqual, RET_FOUND);
+
+    // Repeat search for small substring (<= 8 chars)
+    // from new point 'str1' without reloading substring.
+    cmpl(cnt2, 8);
+    // Have to check that we don't read beyond string.
+    jccb(Assembler::lessEqual, ADJUST_STR);
+
+    Label CHECK_NEXT, CONT_SCAN_SUBSTR, RET_FOUND_LONG;
+    // Compare the rest of substring (> 8 chars).
+    movptr(str1, result);
+
+    cmpl(tmp, cnt2);
+    // First 8 chars are already matched.
+    jccb(Assembler::equal, CHECK_NEXT);
+
+    bind(SCAN_SUBSTR);
+    pcmpestri(vec, Address(str1, 0), 0x0d);
+    // Need to reload strings pointers if not matched whole vector
+    jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
+
+    bind(CHECK_NEXT);
+    subl(cnt2, 8);
+    jccb(Assembler::lessEqual, RET_FOUND_LONG); // Found full substring
+    addptr(str1, 16);
+    addptr(str2, 16);
+    subl(cnt1, 8);
+    cmpl(cnt2, 8); // Do not read beyond substring
+    jccb(Assembler::greaterEqual, CONT_SCAN_SUBSTR);
+    // Back-up strings to avoid reading beyond substring.
+    lea(str2, Address(str2, cnt2, Address::times_2, -16));
+    lea(str1, Address(str1, cnt2, Address::times_2, -16));
+    subl(cnt1, cnt2);
+    movl(cnt2, 8);
+    addl(cnt1, 8);
+    bind(CONT_SCAN_SUBSTR);
+    movdqu(vec, Address(str2, 0));
+    jmpb(SCAN_SUBSTR);
+
+    bind(RET_FOUND_LONG);
+    movptr(str1, Address(rsp, wordSize));
+  } // non constant
+
+  bind(RET_FOUND);
+  // Compute substr offset
+  subptr(result, str1);
+  shrl(result, 1); // index
 
   bind(CLEANUP);
-  addptr(rsp, 3*wordSize);
-}
+  pop(rsp); // restore SP
+
+} // string_indexof
 
 // Compare strings.
 void MacroAssembler::string_compare(Register str1, Register str2,
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1121,6 +1121,7 @@
 
   void movdl(XMMRegister dst, Register src);
   void movdl(Register dst, XMMRegister src);
+  void movdl(XMMRegister dst, Address src);
 
   // Move Double Quadword
   void movdq(XMMRegister dst, Register src);
@@ -1288,9 +1289,12 @@
   void pshuflw(XMMRegister dst, XMMRegister src, int mode);
   void pshuflw(XMMRegister dst, Address src,     int mode);
 
-  // Shift Right Logical Quadword Immediate
+  // Shift Right by bits Logical Quadword Immediate
   void psrlq(XMMRegister dst, int shift);
 
+  // Shift Right by bytes Logical DoubleQuadword Immediate
+  void psrldq(XMMRegister dst, int shift);
+
   // Logical Compare Double Quadword
   void ptest(XMMRegister dst, XMMRegister src);
   void ptest(XMMRegister dst, Address src);
@@ -2290,10 +2294,22 @@
   void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); }
 
   // IndexOf strings.
+  // Small strings are loaded through stack if they cross page boundary.
   void string_indexof(Register str1, Register str2,
-                      Register cnt1, Register cnt2, Register result,
+                      Register cnt1, Register cnt2,
+                      int int_cnt2,  Register result,
                       XMMRegister vec, Register tmp);
 
+  // IndexOf for constant substrings with size >= 8 elements
+  // which don't need to be loaded through stack.
+  void string_indexofC8(Register str1, Register str2,
+                      Register cnt1, Register cnt2,
+                      int int_cnt2,  Register result,
+                      XMMRegister vec, Register tmp);
+
+    // Smallest code: we don't need to load through stack,
+    // check string tail.
+
   // Compare strings.
   void string_compare(Register str1, Register str2,
                       Register cnt1, Register cnt2, Register result,
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -456,10 +456,8 @@
   __ verify_not_null_oop(rax);
 
   // search an exception handler (rax: exception oop, rdx: throwing pc)
-  __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::handle_exception_nofpu_id)));
-
-  __ stop("should not reach here");
-
+  __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::handle_exception_from_callee_id)));
+  __ should_not_reach_here();
   assert(code_offset() - offset <= exception_handler_size, "overflow");
   __ end_a_stub();
 
--- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -248,11 +248,14 @@
 #ifdef _LP64
   align_dummy_0, align_dummy_1,
 #endif // _LP64
-  dummy1, SLOT2(dummy1H)                                                                    // 0, 4
-  dummy2, SLOT2(dummy2H)                                                                    // 8, 12
-  // Two temps to be used as needed by users of save/restore callee registers
-  temp_2_off, SLOT2(temp_2H_off)                                                            // 16, 20
-  temp_1_off, SLOT2(temp_1H_off)                                                            // 24, 28
+#ifdef _WIN64
+  // Windows always allocates space for it's argument registers (see
+  // frame::arg_reg_save_area_bytes).
+  arg_reg_save_1, arg_reg_save_1H,                                                          // 0, 4
+  arg_reg_save_2, arg_reg_save_2H,                                                          // 8, 12
+  arg_reg_save_3, arg_reg_save_3H,                                                          // 16, 20
+  arg_reg_save_4, arg_reg_save_4H,                                                          // 24, 28
+#endif // _WIN64
   xmm_regs_as_doubles_off,                                                                  // 32
   float_regs_as_doubles_off = xmm_regs_as_doubles_off + xmm_regs_as_doubles_size_in_slots,  // 160
   fpu_state_off = float_regs_as_doubles_off + float_regs_as_doubles_size_in_slots,          // 224
@@ -282,24 +285,7 @@
   rax_off, SLOT2(raxH_off)                                                                  // 480, 484
   saved_rbp_off, SLOT2(saved_rbpH_off)                                                      // 488, 492
   return_off, SLOT2(returnH_off)                                                            // 496, 500
-  reg_save_frame_size,  // As noted: neglects any parameters to runtime                     // 504
-
-#ifdef _WIN64
-  c_rarg0_off = rcx_off,
-#else
-  c_rarg0_off = rdi_off,
-#endif // WIN64
-
-  // equates
-
-  // illegal instruction handler
-  continue_dest_off = temp_1_off,
-
-  // deoptimization equates
-  fp0_off = float_regs_as_doubles_off, // slot for java float/double return value
-  xmm0_off = xmm_regs_as_doubles_off,  // slot for java float/double return value
-  deopt_type = temp_2_off,             // slot for type of deopt in progress
-  ret_type = temp_1_off                // slot for return type
+  reg_save_frame_size   // As noted: neglects any parameters to runtime                     // 504
 };
 
 
@@ -405,11 +391,6 @@
                                    bool save_fpu_registers = true) {
   __ block_comment("save_live_registers");
 
-  // 64bit passes the args in regs to the c++ runtime
-  int frame_size_in_slots = reg_save_frame_size NOT_LP64(+ num_rt_args); // args + thread
-  // frame_size = round_to(frame_size, 4);
-  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word );
-
   __ pusha();         // integer registers
 
   // assert(float_regs_as_doubles_off % 2 == 0, "misaligned offset");
@@ -642,19 +623,58 @@
 }
 
 
-void Runtime1::generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_maps, OopMap* oop_map, bool save_fpu_registers) {
+OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
+  __ block_comment("generate_handle_exception");
+
   // incoming parameters
   const Register exception_oop = rax;
-  const Register exception_pc = rdx;
+  const Register exception_pc  = rdx;
   // other registers used in this stub
-  const Register real_return_addr = rbx;
   const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread);
 
-  __ block_comment("generate_handle_exception");
+  // Save registers, if required.
+  OopMapSet* oop_maps = new OopMapSet();
+  OopMap* oop_map = NULL;
+  switch (id) {
+  case forward_exception_id:
+    // We're handling an exception in the context of a compiled frame.
+    // The registers have been saved in the standard places.  Perform
+    // an exception lookup in the caller and dispatch to the handler
+    // if found.  Otherwise unwind and dispatch to the callers
+    // exception handler.
+    oop_map = generate_oop_map(sasm, 1 /*thread*/);
+
+    // load and clear pending exception oop into RAX
+    __ movptr(exception_oop, Address(thread, Thread::pending_exception_offset()));
+    __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD);
+
+    // load issuing PC (the return address for this stub) into rdx
+    __ movptr(exception_pc, Address(rbp, 1*BytesPerWord));
+
+    // make sure that the vm_results are cleared (may be unnecessary)
+    __ movptr(Address(thread, JavaThread::vm_result_offset()),   NULL_WORD);
+    __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
+    break;
+  case handle_exception_nofpu_id:
+  case handle_exception_id:
+    // At this point all registers MAY be live.
+    oop_map = save_live_registers(sasm, 1 /*thread*/, id == handle_exception_nofpu_id);
+    break;
+  case handle_exception_from_callee_id: {
+    // At this point all registers except exception oop (RAX) and
+    // exception pc (RDX) are dead.
+    const int frame_size = 2 /*BP, return address*/ NOT_LP64(+ 1 /*thread*/) WIN64_ONLY(+ frame::arg_reg_save_area_bytes / BytesPerWord);
+    oop_map = new OopMap(frame_size * VMRegImpl::slots_per_word, 0);
+    sasm->set_frame_size(frame_size);
+    WIN64_ONLY(__ subq(rsp, frame::arg_reg_save_area_bytes));
+    break;
+  }
+  default:  ShouldNotReachHere();
+  }
 
 #ifdef TIERED
   // C2 can leave the fpu stack dirty
-  if (UseSSE < 2 ) {
+  if (UseSSE < 2) {
     __ empty_FPU_stack();
   }
 #endif // TIERED
@@ -686,11 +706,7 @@
   // save exception oop and issuing pc into JavaThread
   // (exception handler will load it from here)
   __ movptr(Address(thread, JavaThread::exception_oop_offset()), exception_oop);
-  __ movptr(Address(thread, JavaThread::exception_pc_offset()), exception_pc);
-
-  // save real return address (pc that called this stub)
-  __ movptr(real_return_addr, Address(rbp, 1*BytesPerWord));
-  __ movptr(Address(rsp, temp_1_off * VMRegImpl::stack_slot_size), real_return_addr);
+  __ movptr(Address(thread, JavaThread::exception_pc_offset()),  exception_pc);
 
   // patch throwing pc into return address (has bci & oop map)
   __ movptr(Address(rbp, 1*BytesPerWord), exception_pc);
@@ -700,33 +716,41 @@
   int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, exception_handler_for_pc));
   oop_maps->add_gc_map(call_offset, oop_map);
 
-  // rax,: handler address
+  // rax: handler address
   //      will be the deopt blob if nmethod was deoptimized while we looked up
   //      handler regardless of whether handler existed in the nmethod.
 
   // only rax, is valid at this time, all other registers have been destroyed by the runtime call
   __ invalidate_registers(false, true, true, true, true, true);
 
-#ifdef ASSERT
-  // Do we have an exception handler in the nmethod?
-  Label done;
-  __ testptr(rax, rax);
-  __ jcc(Assembler::notZero, done);
-  __ stop("no handler found");
-  __ bind(done);
-#endif
-
-  // exception handler found
-  // patch the return address -> the stub will directly return to the exception handler
+  // patch the return address, this stub will directly return to the exception handler
   __ movptr(Address(rbp, 1*BytesPerWord), rax);
 
-  // restore registers
-  restore_live_registers(sasm, save_fpu_registers);
+  switch (id) {
+  case forward_exception_id:
+  case handle_exception_nofpu_id:
+  case handle_exception_id:
+    // Restore the registers that were saved at the beginning.
+    restore_live_registers(sasm, id == handle_exception_nofpu_id);
+    break;
+  case handle_exception_from_callee_id:
+    // WIN64_ONLY: No need to add frame::arg_reg_save_area_bytes to SP
+    // since we do a leave anyway.
 
-  // return to exception handler
-  __ leave();
-  __ ret(0);
+    // Pop the return address since we are possibly changing SP (restoring from BP).
+    __ leave();
+    __ pop(rcx);
 
+    // Restore SP from BP if the exception PC is a method handle call site.
+    NOT_LP64(__ get_thread(thread);)
+    __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0);
+    __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
+    __ jmp(rcx);  // jump to exception handler
+    break;
+  default:  ShouldNotReachHere();
+  }
+
+  return oop_maps;
 }
 
 
@@ -791,7 +815,7 @@
   // the pop is also necessary to simulate the effect of a ret(0)
   __ pop(exception_pc);
 
-  // Restore SP from BP if the exception PC is a MethodHandle call site.
+  // Restore SP from BP if the exception PC is a method handle call site.
   NOT_LP64(__ get_thread(thread);)
   __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0);
   __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
@@ -934,7 +958,6 @@
   __ ret(0);
 
   return oop_maps;
-
 }
 
 
@@ -952,35 +975,9 @@
   switch (id) {
     case forward_exception_id:
       {
-        // we're handling an exception in the context of a compiled
-        // frame.  The registers have been saved in the standard
-        // places.  Perform an exception lookup in the caller and
-        // dispatch to the handler if found.  Otherwise unwind and
-        // dispatch to the callers exception handler.
-
-        const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread);
-        const Register exception_oop = rax;
-        const Register exception_pc = rdx;
-
-        // load pending exception oop into rax,
-        __ movptr(exception_oop, Address(thread, Thread::pending_exception_offset()));
-        // clear pending exception
-        __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD);
-
-        // load issuing PC (the return address for this stub) into rdx
-        __ movptr(exception_pc, Address(rbp, 1*BytesPerWord));
-
-        // make sure that the vm_results are cleared (may be unnecessary)
-        __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD);
-        __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
-
-        // verify that that there is really a valid exception in rax,
-        __ verify_not_null_oop(exception_oop);
-
-        oop_maps = new OopMapSet();
-        OopMap* oop_map = generate_oop_map(sasm, 1);
-        generate_handle_exception(sasm, oop_maps, oop_map);
-        __ stop("should not reach here");
+        oop_maps = generate_handle_exception(id, sasm);
+        __ leave();
+        __ ret(0);
       }
       break;
 
@@ -1315,13 +1312,15 @@
       break;
 
     case handle_exception_nofpu_id:
-      save_fpu_registers = false;
-      // fall through
     case handle_exception_id:
       { StubFrame f(sasm, "handle_exception", dont_gc_arguments);
-        oop_maps = new OopMapSet();
-        OopMap* oop_map = save_live_registers(sasm, 1, save_fpu_registers);
-        generate_handle_exception(sasm, oop_maps, oop_map, save_fpu_registers);
+        oop_maps = generate_handle_exception(id, sasm);
+      }
+      break;
+
+    case handle_exception_from_callee_id:
+      { StubFrame f(sasm, "handle_exception_from_callee", dont_gc_arguments);
+        oop_maps = generate_handle_exception(id, sasm);
       }
       break;
 
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -419,6 +419,7 @@
 
   // some handy addresses
   Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
+  Address rbx_method_fce(     rbx,      methodOopDesc::from_compiled_offset() );
 
   Address rcx_mh_vmtarget(    rcx_recv, java_dyn_MethodHandle::vmtarget_offset_in_bytes() );
   Address rcx_dmh_vmindex(    rcx_recv, sun_dyn_DirectMethodHandle::vmindex_offset_in_bytes() );
@@ -448,12 +449,10 @@
   case _raise_exception:
     {
       // Not a real MH entry, but rather shared code for raising an
-      // exception.  Since we use a C2I adapter to set up the
-      // interpreter state, arguments are expected in compiler
-      // argument registers.
+      // exception.  Since we use the compiled entry, arguments are
+      // expected in compiler argument registers.
       assert(raise_exception_method(), "must be set");
-      address c2i_entry = raise_exception_method()->get_c2i_entry();
-      assert(c2i_entry, "method must be linked");
+      assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
 
       const Register rdi_pc = rax;
       __ pop(rdi_pc);  // caller PC
@@ -472,13 +471,10 @@
       __ jccb(Assembler::zero, L_no_method);
       __ verify_oop(rbx_method);
 
-      // 32-bit: push remaining arguments as if coming from the compiler.
       NOT_LP64(__ push(rarg2_required));
+      __ push(rdi_pc);         // restore caller PC
+      __ jmp(rbx_method_fce);  // jump to compiled entry
 
-      __ push(rdi_pc);  // restore caller PC
-      __ jump(ExternalAddress(c2i_entry));  // do C2I transition
-
-      // If we get here, the Java runtime did not do its job of creating the exception.
       // Do something that is at least causes a valid throw from the interpreter.
       __ bind(L_no_method);
       __ push(rarg2_required);
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -439,10 +439,6 @@
     // Verify that there is really a valid exception in RAX.
     __ verify_oop(exception_oop);
 
-    // Restore SP from BP if the exception PC is a MethodHandle call site.
-    __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0);
-    __ cmovptr(Assembler::notEqual, rsp, rbp);
-
     // continue at exception handler (return address removed)
     // rax: exception
     // rbx: exception handler
@@ -733,18 +729,19 @@
   //  Input:
   //     start   -  starting address
   //     count   -  element count
-  void  gen_write_ref_array_pre_barrier(Register start, Register count) {
+  void  gen_write_ref_array_pre_barrier(Register start, Register count, bool uninitialized_target) {
     assert_different_registers(start, count);
     BarrierSet* bs = Universe::heap()->barrier_set();
     switch (bs->kind()) {
       case BarrierSet::G1SATBCT:
       case BarrierSet::G1SATBCTLogging:
-        {
-          __ pusha();                      // push registers
-          __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre),
-                          start, count);
-          __ popa();
-        }
+        // With G1, don't generate the call if we statically know that the target in uninitialized
+        if (!uninitialized_target) {
+           __ pusha();                      // push registers
+           __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre),
+                           start, count);
+           __ popa();
+         }
         break;
       case BarrierSet::CardTableModRef:
       case BarrierSet::CardTableExtension:
@@ -923,7 +920,8 @@
 
   address generate_disjoint_copy(BasicType t, bool aligned,
                                  Address::ScaleFactor sf,
-                                 address* entry, const char *name) {
+                                 address* entry, const char *name,
+                                 bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -945,16 +943,19 @@
     __ movptr(from , Address(rsp, 12+ 4));
     __ movptr(to   , Address(rsp, 12+ 8));
     __ movl(count, Address(rsp, 12+ 12));
+
+    if (entry != NULL) {
+      *entry = __ pc(); // Entry point from conjoint arraycopy stub.
+      BLOCK_COMMENT("Entry:");
+    }
+
     if (t == T_OBJECT) {
       __ testl(count, count);
       __ jcc(Assembler::zero, L_0_count);
-      gen_write_ref_array_pre_barrier(to, count);
+      gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
       __ mov(saved_to, to);          // save 'to'
     }
 
-    *entry = __ pc(); // Entry point from conjoint arraycopy stub.
-    BLOCK_COMMENT("Entry:");
-
     __ subptr(to, from); // to --> to_from
     __ cmpl(count, 2<<shift); // Short arrays (< 8 bytes) copy by element
     __ jcc(Assembler::below, L_copy_4_bytes); // use unsigned cmp
@@ -1085,7 +1086,8 @@
   address generate_conjoint_copy(BasicType t, bool aligned,
                                  Address::ScaleFactor sf,
                                  address nooverlap_target,
-                                 address* entry, const char *name) {
+                                 address* entry, const char *name,
+                                 bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1108,23 +1110,17 @@
     __ movptr(src  , Address(rsp, 12+ 4));   // from
     __ movptr(dst  , Address(rsp, 12+ 8));   // to
     __ movl2ptr(count, Address(rsp, 12+12)); // count
-    if (t == T_OBJECT) {
-       gen_write_ref_array_pre_barrier(dst, count);
-    }
 
     if (entry != NULL) {
       *entry = __ pc(); // Entry point from generic arraycopy stub.
       BLOCK_COMMENT("Entry:");
     }
 
-    if (t == T_OBJECT) {
-      __ testl(count, count);
-      __ jcc(Assembler::zero, L_0_count);
-    }
+    // nooverlap_target expects arguments in rsi and rdi.
     __ mov(from, src);
     __ mov(to  , dst);
 
-    // arrays overlap test
+    // arrays overlap test: dispatch to disjoint stub if necessary.
     RuntimeAddress nooverlap(nooverlap_target);
     __ cmpptr(dst, src);
     __ lea(end, Address(src, count, sf, 0)); // src + count * elem_size
@@ -1132,6 +1128,12 @@
     __ cmpptr(dst, end);
     __ jump_cc(Assembler::aboveEqual, nooverlap);
 
+    if (t == T_OBJECT) {
+      __ testl(count, count);
+      __ jcc(Assembler::zero, L_0_count);
+      gen_write_ref_array_pre_barrier(dst, count, dest_uninitialized);
+    }
+
     // copy from high to low
     __ cmpl(count, 2<<shift); // Short arrays (< 8 bytes) copy by element
     __ jcc(Assembler::below, L_copy_4_bytes); // use unsigned cmp
@@ -1416,7 +1418,7 @@
   //    rax, ==  0  -  success
   //    rax, == -1^K - failure, where K is partial transfer count
   //
-  address generate_checkcast_copy(const char *name, address* entry) {
+  address generate_checkcast_copy(const char *name, address* entry, bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1451,8 +1453,10 @@
     __ movptr(to,         to_arg);
     __ movl2ptr(length, length_arg);
 
-    *entry = __ pc(); // Entry point from generic arraycopy stub.
-    BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc(); // Entry point from generic arraycopy stub.
+      BLOCK_COMMENT("Entry:");
+    }
 
     //---------------------------------------------------------------
     // Assembler stub will be used for this call to arraycopy
@@ -1475,7 +1479,7 @@
     Address elem_klass_addr(elem, oopDesc::klass_offset_in_bytes());
 
     // Copy from low to high addresses, indexed from the end of each array.
-    gen_write_ref_array_pre_barrier(to, count);
+    gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
     __ lea(end_from, end_from_addr);
     __ lea(end_to,   end_to_addr);
     assert(length == count, "");        // else fix next line:
@@ -2038,6 +2042,15 @@
         generate_conjoint_copy(T_OBJECT, true, Address::times_ptr,  entry,
                                &entry_oop_arraycopy, "oop_arraycopy");
 
+    StubRoutines::_oop_disjoint_arraycopy_uninit =
+        generate_disjoint_copy(T_OBJECT, true, Address::times_ptr, &entry,
+                               "oop_disjoint_arraycopy_uninit",
+                               /*dest_uninitialized*/true);
+    StubRoutines::_oop_arraycopy_uninit =
+        generate_conjoint_copy(T_OBJECT, true, Address::times_ptr,  entry,
+                               NULL, "oop_arraycopy_uninit",
+                               /*dest_uninitialized*/true);
+
     StubRoutines::_jlong_disjoint_arraycopy =
         generate_disjoint_long_copy(&entry, "jlong_disjoint_arraycopy");
     StubRoutines::_jlong_arraycopy =
@@ -2051,20 +2064,20 @@
     StubRoutines::_arrayof_jshort_fill = generate_fill(T_SHORT, true, "arrayof_jshort_fill");
     StubRoutines::_arrayof_jint_fill = generate_fill(T_INT, true, "arrayof_jint_fill");
 
-    StubRoutines::_arrayof_jint_disjoint_arraycopy  =
-        StubRoutines::_jint_disjoint_arraycopy;
-    StubRoutines::_arrayof_oop_disjoint_arraycopy   =
-        StubRoutines::_oop_disjoint_arraycopy;
-    StubRoutines::_arrayof_jlong_disjoint_arraycopy =
-        StubRoutines::_jlong_disjoint_arraycopy;
+    StubRoutines::_arrayof_jint_disjoint_arraycopy       = StubRoutines::_jint_disjoint_arraycopy;
+    StubRoutines::_arrayof_oop_disjoint_arraycopy        = StubRoutines::_oop_disjoint_arraycopy;
+    StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = StubRoutines::_oop_disjoint_arraycopy_uninit;
+    StubRoutines::_arrayof_jlong_disjoint_arraycopy      = StubRoutines::_jlong_disjoint_arraycopy;
 
-    StubRoutines::_arrayof_jint_arraycopy  = StubRoutines::_jint_arraycopy;
-    StubRoutines::_arrayof_oop_arraycopy   = StubRoutines::_oop_arraycopy;
-    StubRoutines::_arrayof_jlong_arraycopy = StubRoutines::_jlong_arraycopy;
+    StubRoutines::_arrayof_jint_arraycopy       = StubRoutines::_jint_arraycopy;
+    StubRoutines::_arrayof_oop_arraycopy        = StubRoutines::_oop_arraycopy;
+    StubRoutines::_arrayof_oop_arraycopy_uninit = StubRoutines::_oop_arraycopy_uninit;
+    StubRoutines::_arrayof_jlong_arraycopy      = StubRoutines::_jlong_arraycopy;
 
     StubRoutines::_checkcast_arraycopy =
-        generate_checkcast_copy("checkcast_arraycopy",
-                                  &entry_checkcast_arraycopy);
+        generate_checkcast_copy("checkcast_arraycopy", &entry_checkcast_arraycopy);
+    StubRoutines::_checkcast_arraycopy_uninit =
+        generate_checkcast_copy("checkcast_arraycopy_uninit", NULL, /*dest_uninitialized*/true);
 
     StubRoutines::_unsafe_arraycopy =
         generate_unsafe_copy("unsafe_arraycopy",
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -1057,20 +1057,6 @@
     return start;
   }
 
-  static address disjoint_byte_copy_entry;
-  static address disjoint_short_copy_entry;
-  static address disjoint_int_copy_entry;
-  static address disjoint_long_copy_entry;
-  static address disjoint_oop_copy_entry;
-
-  static address byte_copy_entry;
-  static address short_copy_entry;
-  static address int_copy_entry;
-  static address long_copy_entry;
-  static address oop_copy_entry;
-
-  static address checkcast_copy_entry;
-
   //
   // Verify that a register contains clean 32-bits positive value
   // (high 32-bits are 0) so it could be used in 64-bits shifts.
@@ -1173,34 +1159,35 @@
   // Generate code for an array write pre barrier
   //
   //     addr    -  starting address
-  //     count    -  element count
+  //     count   -  element count
+  //     tmp     - scratch register
   //
   //     Destroy no registers!
   //
-  void  gen_write_ref_array_pre_barrier(Register addr, Register count) {
+  void  gen_write_ref_array_pre_barrier(Register addr, Register count, bool dest_uninitialized) {
     BarrierSet* bs = Universe::heap()->barrier_set();
     switch (bs->kind()) {
       case BarrierSet::G1SATBCT:
       case BarrierSet::G1SATBCTLogging:
-        {
-          __ pusha();                      // push registers
-          if (count == c_rarg0) {
-            if (addr == c_rarg1) {
-              // exactly backwards!!
-              __ xchgptr(c_rarg1, c_rarg0);
-            } else {
-              __ movptr(c_rarg1, count);
-              __ movptr(c_rarg0, addr);
-            }
-
-          } else {
-            __ movptr(c_rarg0, addr);
-            __ movptr(c_rarg1, count);
-          }
-          __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), 2);
-          __ popa();
+        // With G1, don't generate the call if we statically know that the target in uninitialized
+        if (!dest_uninitialized) {
+           __ pusha();                      // push registers
+           if (count == c_rarg0) {
+             if (addr == c_rarg1) {
+               // exactly backwards!!
+               __ xchgptr(c_rarg1, c_rarg0);
+             } else {
+               __ movptr(c_rarg1, count);
+               __ movptr(c_rarg0, addr);
+             }
+           } else {
+             __ movptr(c_rarg0, addr);
+             __ movptr(c_rarg1, count);
+           }
+           __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), 2);
+           __ popa();
         }
-        break;
+         break;
       case BarrierSet::CardTableModRef:
       case BarrierSet::CardTableExtension:
       case BarrierSet::ModRef:
@@ -1379,7 +1366,7 @@
   //   disjoint_byte_copy_entry is set to the no-overlap entry point
   //   used by generate_conjoint_byte_copy().
   //
-  address generate_disjoint_byte_copy(bool aligned, const char *name) {
+  address generate_disjoint_byte_copy(bool aligned, address* entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1399,9 +1386,11 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    disjoint_byte_copy_entry = __ pc();
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+    if (entry != NULL) {
+      *entry = __ pc();
+       // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
@@ -1479,7 +1468,8 @@
   // dwords or qwords that span cache line boundaries will still be loaded
   // and stored atomically.
   //
-  address generate_conjoint_byte_copy(bool aligned, const char *name) {
+  address generate_conjoint_byte_copy(bool aligned, address nooverlap_target,
+                                      address* entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1494,11 +1484,13 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    byte_copy_entry = __ pc();
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-
-    array_overlap_test(disjoint_byte_copy_entry, Address::times_1);
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
+
+    array_overlap_test(nooverlap_target, Address::times_1);
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
 
@@ -1574,7 +1566,7 @@
   //   disjoint_short_copy_entry is set to the no-overlap entry point
   //   used by generate_conjoint_short_copy().
   //
-  address generate_disjoint_short_copy(bool aligned, const char *name) {
+  address generate_disjoint_short_copy(bool aligned, address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1593,9 +1585,11 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    disjoint_short_copy_entry = __ pc();
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
 
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
@@ -1686,7 +1680,8 @@
   // or qwords that span cache line boundaries will still be loaded
   // and stored atomically.
   //
-  address generate_conjoint_short_copy(bool aligned, const char *name) {
+  address generate_conjoint_short_copy(bool aligned, address nooverlap_target,
+                                       address *entry, const char *name) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1701,11 +1696,13 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    short_copy_entry = __ pc();
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-
-    array_overlap_test(disjoint_short_copy_entry, Address::times_2);
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
+
+    array_overlap_test(nooverlap_target, Address::times_2);
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
 
@@ -1773,7 +1770,8 @@
   //   disjoint_int_copy_entry is set to the no-overlap entry point
   //   used by generate_conjoint_int_oop_copy().
   //
-  address generate_disjoint_int_oop_copy(bool aligned, bool is_oop, const char *name) {
+  address generate_disjoint_int_oop_copy(bool aligned, bool is_oop, address* entry,
+                                         const char *name, bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1793,21 +1791,17 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    (is_oop ? disjoint_oop_copy_entry : disjoint_int_copy_entry) = __ pc();
-
-    if (is_oop) {
-      // no registers are destroyed by this call
-      gen_write_ref_array_pre_barrier(/* dest */ c_rarg1, /* count */ c_rarg2);
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
     }
 
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
-
     if (is_oop) {
       __ movq(saved_to, to);
+      gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
     }
 
     // 'from', 'to' and 'count' are now valid
@@ -1867,7 +1861,9 @@
   // the hardware handle it.  The two dwords within qwords that span
   // cache line boundaries will still be loaded and stored atomicly.
   //
-  address generate_conjoint_int_oop_copy(bool aligned, bool is_oop, const char *name) {
+  address generate_conjoint_int_oop_copy(bool aligned, bool is_oop, address nooverlap_target,
+                                         address *entry, const char *name,
+                                         bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1882,20 +1878,21 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
+    if (entry != NULL) {
+      *entry = __ pc();
+       // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
+    }
+
+    array_overlap_test(nooverlap_target, Address::times_4);
+    setup_arg_regs(); // from => rdi, to => rsi, count => rdx
+                      // r9 and r10 may be used to save non-volatile registers
+
     if (is_oop) {
       // no registers are destroyed by this call
-      gen_write_ref_array_pre_barrier(/* dest */ c_rarg1, /* count */ c_rarg2);
+      gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
     }
 
-    (is_oop ? oop_copy_entry : int_copy_entry) = __ pc();
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-
-    array_overlap_test(is_oop ? disjoint_oop_copy_entry : disjoint_int_copy_entry,
-                       Address::times_4);
-    setup_arg_regs(); // from => rdi, to => rsi, count => rdx
-                      // r9 and r10 may be used to save non-volatile registers
-
     assert_clean_int(count, rax); // Make sure 'count' is clean int.
     // 'from', 'to' and 'count' are now valid
     __ movptr(dword_count, count);
@@ -1959,7 +1956,8 @@
   //   disjoint_oop_copy_entry or disjoint_long_copy_entry is set to the
   //   no-overlap entry point used by generate_conjoint_long_oop_copy().
   //
-  address generate_disjoint_long_oop_copy(bool aligned, bool is_oop, const char *name) {
+  address generate_disjoint_long_oop_copy(bool aligned, bool is_oop, address *entry,
+                                          const char *name, bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -1978,20 +1976,19 @@
     // Save no-overlap entry point for generate_conjoint_long_oop_copy()
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    if (is_oop) {
-      disjoint_oop_copy_entry  = __ pc();
-      // no registers are destroyed by this call
-      gen_write_ref_array_pre_barrier(/* dest */ c_rarg1, /* count */ c_rarg2);
-    } else {
-      disjoint_long_copy_entry = __ pc();
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
     }
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
 
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
-
     // 'from', 'to' and 'qword_count' are now valid
+    if (is_oop) {
+      // no registers are destroyed by this call
+      gen_write_ref_array_pre_barrier(to, qword_count, dest_uninitialized);
+    }
 
     // Copy from low to high addresses.  Use 'to' as scratch.
     __ lea(end_from, Address(from, qword_count, Address::times_8, -8));
@@ -2045,7 +2042,9 @@
   //   c_rarg1   - destination array address
   //   c_rarg2   - element count, treated as ssize_t, can be zero
   //
-  address generate_conjoint_long_oop_copy(bool aligned, bool is_oop, const char *name) {
+  address generate_conjoint_long_oop_copy(bool aligned, bool is_oop,
+                                          address nooverlap_target, address *entry,
+                                          const char *name, bool dest_uninitialized = false) {
     __ align(CodeEntryAlignment);
     StubCodeMark mark(this, "StubRoutines", name);
     address start = __ pc();
@@ -2059,31 +2058,21 @@
     __ enter(); // required for proper stackwalking of RuntimeStub frame
     assert_clean_int(c_rarg2, rax);    // Make sure 'count' is clean int.
 
-    address disjoint_copy_entry = NULL;
-    if (is_oop) {
-      assert(!UseCompressedOops, "shouldn't be called for compressed oops");
-      disjoint_copy_entry = disjoint_oop_copy_entry;
-      oop_copy_entry  = __ pc();
-      array_overlap_test(disjoint_oop_copy_entry, Address::times_8);
-    } else {
-      disjoint_copy_entry = disjoint_long_copy_entry;
-      long_copy_entry = __ pc();
-      array_overlap_test(disjoint_long_copy_entry, Address::times_8);
+    if (entry != NULL) {
+      *entry = __ pc();
+      // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
+      BLOCK_COMMENT("Entry:");
     }
-    BLOCK_COMMENT("Entry:");
-    // caller can pass a 64-bit byte count here (from Unsafe.copyMemory)
-
-    array_overlap_test(disjoint_copy_entry, Address::times_8);
+
+    array_overlap_test(nooverlap_target, Address::times_8);
     setup_arg_regs(); // from => rdi, to => rsi, count => rdx
                       // r9 and r10 may be used to save non-volatile registers
-
     // 'from', 'to' and 'qword_count' are now valid
-
     if (is_oop) {
       // Save to and count for store barrier
       __ movptr(saved_count, qword_count);
       // No registers are destroyed by this call
-      gen_write_ref_array_pre_barrier(to, saved_count);
+      gen_write_ref_array_pre_barrier(to, saved_count, dest_uninitialized);
     }
 
     __ jmp(L_copy_32_bytes);
@@ -2162,7 +2151,8 @@
   //    rax ==  0  -  success
   //    rax == -1^K - failure, where K is partial transfer count
   //
-  address generate_checkcast_copy(const char *name) {
+  address generate_checkcast_copy(const char *name, address *entry,
+                                  bool dest_uninitialized = false) {
 
     Label L_load_element, L_store_element, L_do_card_marks, L_done;
 
@@ -2216,8 +2206,10 @@
 #endif
 
     // Caller of this entry point must set up the argument registers.
-    checkcast_copy_entry  = __ pc();
-    BLOCK_COMMENT("Entry:");
+    if (entry != NULL) {
+      *entry = __ pc();
+      BLOCK_COMMENT("Entry:");
+    }
 
     // allocate spill slots for r13, r14
     enum {
@@ -2254,7 +2246,7 @@
     Address from_element_addr(end_from, count, TIMES_OOP, 0);
     Address   to_element_addr(end_to,   count, TIMES_OOP, 0);
 
-    gen_write_ref_array_pre_barrier(to, count);
+    gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
 
     // Copy from low to high addresses, indexed from the end of each array.
     __ lea(end_from, end_from_addr);
@@ -2334,7 +2326,9 @@
   // Examines the alignment of the operands and dispatches
   // to a long, int, short, or byte copy loop.
   //
-  address generate_unsafe_copy(const char *name) {
+  address generate_unsafe_copy(const char *name,
+                               address byte_copy_entry, address short_copy_entry,
+                               address int_copy_entry, address long_copy_entry) {
 
     Label L_long_aligned, L_int_aligned, L_short_aligned;
 
@@ -2432,7 +2426,10 @@
   //    rax ==  0  -  success
   //    rax == -1^K - failure, where K is partial transfer count
   //
-  address generate_generic_copy(const char *name) {
+  address generate_generic_copy(const char *name,
+                                address byte_copy_entry, address short_copy_entry,
+                                address int_copy_entry, address long_copy_entry,
+                                address oop_copy_entry, address checkcast_copy_entry) {
 
     Label L_failed, L_failed_0, L_objArray;
     Label L_copy_bytes, L_copy_shorts, L_copy_ints, L_copy_longs;
@@ -2725,33 +2722,75 @@
   }
 
   void generate_arraycopy_stubs() {
-    // Call the conjoint generation methods immediately after
-    // the disjoint ones so that short branches from the former
-    // to the latter can be generated.
-    StubRoutines::_jbyte_disjoint_arraycopy  = generate_disjoint_byte_copy(false, "jbyte_disjoint_arraycopy");
-    StubRoutines::_jbyte_arraycopy           = generate_conjoint_byte_copy(false, "jbyte_arraycopy");
-
-    StubRoutines::_jshort_disjoint_arraycopy = generate_disjoint_short_copy(false, "jshort_disjoint_arraycopy");
-    StubRoutines::_jshort_arraycopy          = generate_conjoint_short_copy(false, "jshort_arraycopy");
-
-    StubRoutines::_jint_disjoint_arraycopy   = generate_disjoint_int_oop_copy(false, false, "jint_disjoint_arraycopy");
-    StubRoutines::_jint_arraycopy            = generate_conjoint_int_oop_copy(false, false, "jint_arraycopy");
-
-    StubRoutines::_jlong_disjoint_arraycopy  = generate_disjoint_long_oop_copy(false, false, "jlong_disjoint_arraycopy");
-    StubRoutines::_jlong_arraycopy           = generate_conjoint_long_oop_copy(false, false, "jlong_arraycopy");
+    address entry;
+    address entry_jbyte_arraycopy;
+    address entry_jshort_arraycopy;
+    address entry_jint_arraycopy;
+    address entry_oop_arraycopy;
+    address entry_jlong_arraycopy;
+    address entry_checkcast_arraycopy;
+
+    StubRoutines::_jbyte_disjoint_arraycopy  = generate_disjoint_byte_copy(false, &entry,
+                                                                           "jbyte_disjoint_arraycopy");
+    StubRoutines::_jbyte_arraycopy           = generate_conjoint_byte_copy(false, entry, &entry_jbyte_arraycopy,
+                                                                           "jbyte_arraycopy");
+
+    StubRoutines::_jshort_disjoint_arraycopy = generate_disjoint_short_copy(false, &entry,
+                                                                            "jshort_disjoint_arraycopy");
+    StubRoutines::_jshort_arraycopy          = generate_conjoint_short_copy(false, entry, &entry_jshort_arraycopy,
+                                                                            "jshort_arraycopy");
+
+    StubRoutines::_jint_disjoint_arraycopy   = generate_disjoint_int_oop_copy(false, false, &entry,
+                                                                              "jint_disjoint_arraycopy");
+    StubRoutines::_jint_arraycopy            = generate_conjoint_int_oop_copy(false, false, entry,
+                                                                              &entry_jint_arraycopy, "jint_arraycopy");
+
+    StubRoutines::_jlong_disjoint_arraycopy  = generate_disjoint_long_oop_copy(false, false, &entry,
+                                                                               "jlong_disjoint_arraycopy");
+    StubRoutines::_jlong_arraycopy           = generate_conjoint_long_oop_copy(false, false, entry,
+                                                                               &entry_jlong_arraycopy, "jlong_arraycopy");
 
 
     if (UseCompressedOops) {
-      StubRoutines::_oop_disjoint_arraycopy  = generate_disjoint_int_oop_copy(false, true, "oop_disjoint_arraycopy");
-      StubRoutines::_oop_arraycopy           = generate_conjoint_int_oop_copy(false, true, "oop_arraycopy");
+      StubRoutines::_oop_disjoint_arraycopy  = generate_disjoint_int_oop_copy(false, true, &entry,
+                                                                              "oop_disjoint_arraycopy");
+      StubRoutines::_oop_arraycopy           = generate_conjoint_int_oop_copy(false, true, entry,
+                                                                              &entry_oop_arraycopy, "oop_arraycopy");
+      StubRoutines::_oop_disjoint_arraycopy_uninit  = generate_disjoint_int_oop_copy(false, true, &entry,
+                                                                                     "oop_disjoint_arraycopy_uninit",
+                                                                                     /*dest_uninitialized*/true);
+      StubRoutines::_oop_arraycopy_uninit           = generate_conjoint_int_oop_copy(false, true, entry,
+                                                                                     NULL, "oop_arraycopy_uninit",
+                                                                                     /*dest_uninitialized*/true);
     } else {
-      StubRoutines::_oop_disjoint_arraycopy  = generate_disjoint_long_oop_copy(false, true, "oop_disjoint_arraycopy");
-      StubRoutines::_oop_arraycopy           = generate_conjoint_long_oop_copy(false, true, "oop_arraycopy");
+      StubRoutines::_oop_disjoint_arraycopy  = generate_disjoint_long_oop_copy(false, true, &entry,
+                                                                               "oop_disjoint_arraycopy");
+      StubRoutines::_oop_arraycopy           = generate_conjoint_long_oop_copy(false, true, entry,
+                                                                               &entry_oop_arraycopy, "oop_arraycopy");
+      StubRoutines::_oop_disjoint_arraycopy_uninit  = generate_disjoint_long_oop_copy(false, true, &entry,
+                                                                                      "oop_disjoint_arraycopy_uninit",
+                                                                                      /*dest_uninitialized*/true);
+      StubRoutines::_oop_arraycopy_uninit           = generate_conjoint_long_oop_copy(false, true, entry,
+                                                                                      NULL, "oop_arraycopy_uninit",
+                                                                                      /*dest_uninitialized*/true);
     }
 
-    StubRoutines::_checkcast_arraycopy = generate_checkcast_copy("checkcast_arraycopy");
-    StubRoutines::_unsafe_arraycopy    = generate_unsafe_copy("unsafe_arraycopy");
-    StubRoutines::_generic_arraycopy   = generate_generic_copy("generic_arraycopy");
+    StubRoutines::_checkcast_arraycopy        = generate_checkcast_copy("checkcast_arraycopy", &entry_checkcast_arraycopy);
+    StubRoutines::_checkcast_arraycopy_uninit = generate_checkcast_copy("checkcast_arraycopy_uninit", NULL,
+                                                                        /*dest_uninitialized*/true);
+
+    StubRoutines::_unsafe_arraycopy    = generate_unsafe_copy("unsafe_arraycopy",
+                                                              entry_jbyte_arraycopy,
+                                                              entry_jshort_arraycopy,
+                                                              entry_jint_arraycopy,
+                                                              entry_jlong_arraycopy);
+    StubRoutines::_generic_arraycopy   = generate_generic_copy("generic_arraycopy",
+                                                               entry_jbyte_arraycopy,
+                                                               entry_jshort_arraycopy,
+                                                               entry_jint_arraycopy,
+                                                               entry_oop_arraycopy,
+                                                               entry_jlong_arraycopy,
+                                                               entry_checkcast_arraycopy);
 
     StubRoutines::_jbyte_fill = generate_fill(T_BYTE, false, "jbyte_fill");
     StubRoutines::_jshort_fill = generate_fill(T_SHORT, false, "jshort_fill");
@@ -2776,6 +2815,9 @@
 
     StubRoutines::_arrayof_oop_disjoint_arraycopy    = StubRoutines::_oop_disjoint_arraycopy;
     StubRoutines::_arrayof_oop_arraycopy             = StubRoutines::_oop_arraycopy;
+
+    StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit    = StubRoutines::_oop_disjoint_arraycopy_uninit;
+    StubRoutines::_arrayof_oop_arraycopy_uninit             = StubRoutines::_oop_arraycopy_uninit;
   }
 
   void generate_math_stubs() {
@@ -3069,20 +3111,6 @@
   }
 }; // end class declaration
 
-address StubGenerator::disjoint_byte_copy_entry  = NULL;
-address StubGenerator::disjoint_short_copy_entry = NULL;
-address StubGenerator::disjoint_int_copy_entry   = NULL;
-address StubGenerator::disjoint_long_copy_entry  = NULL;
-address StubGenerator::disjoint_oop_copy_entry   = NULL;
-
-address StubGenerator::byte_copy_entry  = NULL;
-address StubGenerator::short_copy_entry = NULL;
-address StubGenerator::int_copy_entry   = NULL;
-address StubGenerator::long_copy_entry  = NULL;
-address StubGenerator::oop_copy_entry   = NULL;
-
-address StubGenerator::checkcast_copy_entry = NULL;
-
 void StubGenerator_generate(CodeBuffer* code, bool all) {
   StubGenerator g(code, all);
 }
--- a/hotspot/src/cpu/x86/vm/x86_32.ad	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1997, 2011, 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
@@ -12658,17 +12658,46 @@
   ins_pipe( pipe_slow );
 %}
 
+// fast search of substring with known size.
+instruct string_indexof_con(eDIRegP str1, eDXRegI cnt1, eSIRegP str2, immI int_cnt2,
+                            eBXRegI result, regXD vec, eAXRegI cnt2, eCXRegI tmp, eFlagsReg cr) %{
+  predicate(UseSSE42Intrinsics);
+  match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
+  effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr);
+
+  format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result   // KILL $vec, $cnt1, $cnt2, $tmp" %}
+  ins_encode %{
+    int icnt2 = (int)$int_cnt2$$constant;
+    if (icnt2 >= 8) {
+      // IndexOf for constant substrings with size >= 8 elements
+      // which don't need to be loaded through stack.
+      __ string_indexofC8($str1$$Register, $str2$$Register,
+                          $cnt1$$Register, $cnt2$$Register,
+                          icnt2, $result$$Register,
+                          $vec$$XMMRegister, $tmp$$Register);
+    } else {
+      // Small strings are loaded through stack if they cross page boundary.
+      __ string_indexof($str1$$Register, $str2$$Register,
+                        $cnt1$$Register, $cnt2$$Register,
+                        icnt2, $result$$Register,
+                        $vec$$XMMRegister, $tmp$$Register);
+    }
+  %}
+  ins_pipe( pipe_slow );
+%}
+
 instruct string_indexof(eDIRegP str1, eDXRegI cnt1, eSIRegP str2, eAXRegI cnt2,
-                        eBXRegI result, regXD tmp1, eCXRegI tmp2, eFlagsReg cr) %{
+                        eBXRegI result, regXD vec, eCXRegI tmp, eFlagsReg cr) %{
   predicate(UseSSE42Intrinsics);
   match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
-  effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp2, KILL cr);
-
-  format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result   // KILL $tmp2, $tmp1" %}
+  effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr);
+
+  format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result   // KILL all" %}
   ins_encode %{
     __ string_indexof($str1$$Register, $str2$$Register,
-                      $cnt1$$Register, $cnt2$$Register, $result$$Register,
-                      $tmp1$$XMMRegister, $tmp2$$Register);
+                      $cnt1$$Register, $cnt2$$Register,
+                      (-1), $result$$Register,
+                      $vec$$XMMRegister, $tmp$$Register);
   %}
   ins_pipe( pipe_slow );
 %}
--- a/hotspot/src/cpu/x86/vm/x86_64.ad	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2003, 2011, 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
@@ -11598,18 +11598,48 @@
   ins_pipe( pipe_slow );
 %}
 
+// fast search of substring with known size.
+instruct string_indexof_con(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2,
+                            rbx_RegI result, regD vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
+%{
+  predicate(UseSSE42Intrinsics);
+  match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
+  effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr);
+
+  format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result   // KILL $vec, $cnt1, $cnt2, $tmp" %}
+  ins_encode %{
+    int icnt2 = (int)$int_cnt2$$constant;
+    if (icnt2 >= 8) {
+      // IndexOf for constant substrings with size >= 8 elements
+      // which don't need to be loaded through stack.
+      __ string_indexofC8($str1$$Register, $str2$$Register,
+                          $cnt1$$Register, $cnt2$$Register,
+                          icnt2, $result$$Register,
+                          $vec$$XMMRegister, $tmp$$Register);
+    } else {
+      // Small strings are loaded through stack if they cross page boundary.
+      __ string_indexof($str1$$Register, $str2$$Register,
+                        $cnt1$$Register, $cnt2$$Register,
+                        icnt2, $result$$Register,
+                        $vec$$XMMRegister, $tmp$$Register);
+    }
+  %}
+  ins_pipe( pipe_slow );
+%}
+
 instruct string_indexof(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2,
-                        rbx_RegI result, regD tmp1, rcx_RegI tmp2, rFlagsReg cr)
+                        rbx_RegI result, regD vec, rcx_RegI tmp, rFlagsReg cr)
 %{
   predicate(UseSSE42Intrinsics);
   match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
-  effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp2, KILL cr);
-
-  format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result   // KILL $tmp1, $tmp2" %}
+  effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr);
+
+  format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result   // KILL all" %}
   ins_encode %{
     __ string_indexof($str1$$Register, $str2$$Register,
-                      $cnt1$$Register, $cnt2$$Register, $result$$Register,
-                      $tmp1$$XMMRegister, $tmp2$$Register);
+                      $cnt1$$Register, $cnt2$$Register,
+                      (-1), $result$$Register,
+                      $vec$$XMMRegister, $tmp$$Register);
   %}
   ins_pipe( pipe_slow );
 %}
--- a/hotspot/src/os/linux/vm/os_linux.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/os/linux/vm/os_linux.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -2213,7 +2213,7 @@
   if (rp == NULL)
     return;
 
-  if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) {
+  if (Arguments::created_by_gamma_launcher()) {
     // Support for the gamma launcher.  Typical value for buf is
     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".  If "/jre/lib/" appears at
     // the right place in the string, then assume we are installed in a JDK and
--- a/hotspot/src/os/posix/vm/os_posix.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/os/posix/vm/os_posix.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -59,3 +59,12 @@
   VMError::report_coredump_status(buffer, success);
 }
 
+bool os::is_debugger_attached() {
+  // not implemented
+  return false;
+}
+
+void os::wait_for_keypress_at_exit(void) {
+  // don't do anything on posix platforms
+  return;
+}
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -2511,7 +2511,7 @@
   assert(ret != 0, "cannot locate libjvm");
   realpath((char *)dlinfo.dli_fname, buf);
 
-  if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) {
+  if (Arguments::created_by_gamma_launcher()) {
     // Support for the gamma launcher.  Typical value for buf is
     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".  If "/jre/lib/" appears at
     // the right place in the string, then assume we are installed in a JDK and
--- a/hotspot/src/os/windows/vm/os_windows.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/os/windows/vm/os_windows.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -22,10 +22,8 @@
  *
  */
 
-#ifdef _WIN64
-// Must be at least Windows 2000 or XP to use VectoredExceptions
+// Must be at least Windows 2000 or XP to use VectoredExceptions and IsDebuggerPresent
 #define _WIN32_WINNT 0x500
-#endif
 
 // no precompiled headers
 #include "classfile/classLoader.hpp"
@@ -1788,7 +1786,7 @@
   }
 
   buf[0] = '\0';
-  if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) {
+  if (Arguments::created_by_gamma_launcher()) {
      // Support for the gamma launcher. Check for an
      // JAVA_HOME environment variable
      // and fix up the path so it looks like
@@ -3418,6 +3416,19 @@
 }
 
 
+bool os::is_debugger_attached() {
+  return IsDebuggerPresent() ? true : false;
+}
+
+
+void os::wait_for_keypress_at_exit(void) {
+  if (PauseAtExit) {
+    fprintf(stderr, "Press any key to continue...\n");
+    fgetc(stdin);
+  }
+}
+
+
 int os::message_box(const char* title, const char* message) {
   int result = MessageBox(NULL, message, title,
                           MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
--- a/hotspot/src/share/tools/hsdis/hsdis-demo.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/tools/hsdis/hsdis-demo.c	Fri Mar 18 15:44:45 2011 -0700
@@ -22,8 +22,6 @@
  *
  */
 
-#include "precompiled.hpp"
-
 /* hsdis-demo.c -- dump a range of addresses as native instructions
    This demonstrates the protocol required by the HotSpot PrintAssembly option.
 */
--- a/hotspot/src/share/tools/hsdis/hsdis.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/tools/hsdis/hsdis.c	Fri Mar 18 15:44:45 2011 -0700
@@ -22,8 +22,6 @@
  *
  */
 
-#include "precompiled.hpp"
-
 /* hsdis.c -- dump a range of addresses as native instructions
    This implements the plugin protocol required by the
    HotSpot PrintAssembly option.
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -3308,22 +3308,23 @@
   Value exception = append_with_bci(new ExceptionObject(), SynchronizationEntryBCI);
   assert(exception->is_pinned(), "must be");
 
+  int bci = SynchronizationEntryBCI;
   if (compilation()->env()->dtrace_method_probes()) {
-    // Report exit from inline methods
+    // Report exit from inline methods.  We don't have a stream here
+    // so pass an explicit bci of SynchronizationEntryBCI.
     Values* args = new Values(1);
-    args->push(append(new Constant(new ObjectConstant(method()))));
-    append(new RuntimeCall(voidType, "dtrace_method_exit", CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), args));
+    args->push(append_with_bci(new Constant(new ObjectConstant(method())), bci));
+    append_with_bci(new RuntimeCall(voidType, "dtrace_method_exit", CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), args), bci);
   }
 
-  int bci = SynchronizationEntryBCI;
   if (lock) {
     assert(state()->locks_size() > 0 && state()->lock_at(state()->locks_size() - 1) == lock, "lock is missing");
     if (!lock->is_linked()) {
-      lock = append_with_bci(lock, -1);
+      lock = append_with_bci(lock, bci);
     }
 
     // exit the monitor in the context of the synchronized method
-    monitorexit(lock, SynchronizationEntryBCI);
+    monitorexit(lock, bci);
 
     // exit the context of the synchronized method
     if (!default_handler) {
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -426,10 +426,9 @@
 // been deoptimized. If that is the case we return the deopt blob
 // unpack_with_exception entry instead. This makes life for the exception blob easier
 // because making that same check and diverting is painful from assembly language.
-//
-
-
 JRT_ENTRY_NO_ASYNC(static address, exception_handler_for_pc_helper(JavaThread* thread, oopDesc* ex, address pc, nmethod*& nm))
+  // Reset method handle flag.
+  thread->set_is_method_handle_return(false);
 
   Handle exception(thread, ex);
   nm = CodeCache::find_nmethod(pc);
@@ -480,11 +479,12 @@
     return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
   }
 
-  // ExceptionCache is used only for exceptions at call and not for implicit exceptions
+  // ExceptionCache is used only for exceptions at call sites and not for implicit exceptions
   if (guard_pages_enabled) {
     address fast_continuation = nm->handler_for_exception_and_pc(exception, pc);
     if (fast_continuation != NULL) {
-      if (fast_continuation == ExceptionCache::unwind_handler()) fast_continuation = NULL;
+      // Set flag if return address is a method handle call site.
+      thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
       return fast_continuation;
     }
   }
@@ -522,14 +522,14 @@
     thread->set_exception_pc(pc);
 
     // the exception cache is used only by non-implicit exceptions
-    if (continuation == NULL) {
-      nm->add_handler_for_exception_and_pc(exception, pc, ExceptionCache::unwind_handler());
-    } else {
+    if (continuation != NULL) {
       nm->add_handler_for_exception_and_pc(exception, pc, continuation);
     }
   }
 
   thread->set_vm_result(exception());
+  // Set flag if return address is a method handle call site.
+  thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
 
   if (TraceExceptions) {
     ttyLocker ttyl;
@@ -542,20 +542,19 @@
 JRT_END
 
 // Enter this method from compiled code only if there is a Java exception handler
-// in the method handling the exception
+// in the method handling the exception.
 // We are entering here from exception stub. We don't do a normal VM transition here.
 // We do it in a helper. This is so we can check to see if the nmethod we have just
 // searched for an exception handler has been deoptimized in the meantime.
-address  Runtime1::exception_handler_for_pc(JavaThread* thread) {
+address Runtime1::exception_handler_for_pc(JavaThread* thread) {
   oop exception = thread->exception_oop();
   address pc = thread->exception_pc();
   // Still in Java mode
-  debug_only(ResetNoHandleMark rnhm);
+  DEBUG_ONLY(ResetNoHandleMark rnhm);
   nmethod* nm = NULL;
   address continuation = NULL;
   {
     // Enter VM mode by calling the helper
-
     ResetNoHandleMark rnhm;
     continuation = exception_handler_for_pc_helper(thread, exception, pc, nm);
   }
@@ -563,11 +562,11 @@
 
   // Now check to see if the nmethod we were called from is now deoptimized.
   // If so we must return to the deopt blob and deoptimize the nmethod
-
   if (nm != NULL && caller_is_deopted()) {
     continuation = SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
   }
 
+  assert(continuation != NULL, "no handler found");
   return continuation;
 }
 
--- a/hotspot/src/share/vm/c1/c1_Runtime1.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -54,6 +54,7 @@
   stub(new_multi_array)              \
   stub(handle_exception_nofpu)         /* optimized version that does not preserve fpu registers */ \
   stub(handle_exception)             \
+  stub(handle_exception_from_callee) \
   stub(throw_array_store_exception)  \
   stub(throw_class_cast_exception)   \
   stub(throw_incompatible_class_change_error)   \
@@ -116,11 +117,11 @@
   static const char* _blob_names[];
 
   // stub generation
-  static void generate_blob_for(BufferBlob* blob, StubID id);
-  static OopMapSet* generate_code_for(StubID id, StubAssembler* masm);
+  static void       generate_blob_for(BufferBlob* blob, StubID id);
+  static OopMapSet* generate_code_for(StubID id, StubAssembler* sasm);
   static OopMapSet* generate_exception_throw(StubAssembler* sasm, address target, bool has_argument);
-  static void generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_maps, OopMap* oop_map, bool ignore_fpu_registers = false);
-  static void generate_unwind_exception(StubAssembler *sasm);
+  static OopMapSet* generate_handle_exception(StubID id, StubAssembler* sasm);
+  static void       generate_unwind_exception(StubAssembler *sasm);
   static OopMapSet* generate_patching(StubAssembler* sasm, address target);
 
   static OopMapSet* generate_stub_call(StubAssembler* sasm, Register result, address entry,
--- a/hotspot/src/share/vm/classfile/classLoader.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1332,7 +1332,7 @@
       }
 
       if (_compile_the_world_counter >= CompileTheWorldStartAt) {
-        if (k.is_null() || (exception_occurred && !CompileTheWorldIgnoreInitErrors)) {
+        if (k.is_null() || exception_occurred) {
           // If something went wrong (e.g. ExceptionInInitializerError) we skip this class
           tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_counter, buffer);
         } else {
--- a/hotspot/src/share/vm/classfile/stackMapFrame.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/classfile/stackMapFrame.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -170,6 +170,44 @@
   return true;
 }
 
+bool StackMapFrame::has_flag_match_exception(
+    const StackMapFrame* target) const {
+  // We allow flags of {UninitThis} to assign to {} if-and-only-if the
+  // target frame does not depend upon the current type.
+  // This is slightly too strict, as we need only enforce that the
+  // slots that were initialized by the <init> (the things that were
+  // UninitializedThis before initialize_object() converted them) are unused.
+  // However we didn't save that information so we'll enforce this upon
+  // anything that might have been initialized.  This is a rare situation
+  // and javac never generates code that would end up here, but some profilers
+  // (such as NetBeans) might, when adding exception handlers in <init>
+  // methods to cover the invokespecial instruction.  See 7020118.
+
+  assert(max_locals() == target->max_locals() &&
+         stack_size() == target->stack_size(), "StackMap sizes must match");
+
+  VerificationType top = VerificationType::top_type();
+  VerificationType this_type = verifier()->current_type();
+
+  if (!flag_this_uninit() || target->flags() != 0) {
+    return false;
+  }
+
+  for (int i = 0; i < target->locals_size(); ++i) {
+    if (locals()[i] == this_type && target->locals()[i] != top) {
+      return false;
+    }
+  }
+
+  for (int i = 0; i < target->stack_size(); ++i) {
+    if (stack()[i] == this_type && target->stack()[i] != top) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
   if (_max_locals != target->max_locals() || _stack_size != target->stack_size()) {
     return false;
@@ -182,7 +220,9 @@
   bool match_stack = is_assignable_to(
     _stack, target->stack(), _stack_size, CHECK_false);
   bool match_flags = (_flags | target->flags()) == target->flags();
-  return (match_locals && match_stack && match_flags);
+
+  return match_locals && match_stack &&
+    (match_flags || has_flag_match_exception(target));
 }
 
 VerificationType StackMapFrame::pop_stack_ex(VerificationType type, TRAPS) {
--- a/hotspot/src/share/vm/classfile/stackMapFrame.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/classfile/stackMapFrame.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -228,6 +228,8 @@
   bool is_assignable_to(
     VerificationType* src, VerificationType* target, int32_t len, TRAPS) const;
 
+  bool has_flag_match_exception(const StackMapFrame* target) const;
+
   // Debugging
   void print() const PRODUCT_RETURN;
 };
--- a/hotspot/src/share/vm/classfile/verificationType.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/classfile/verificationType.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -128,6 +128,7 @@
 
   // Create verification types
   static VerificationType bogus_type() { return VerificationType(Bogus); }
+  static VerificationType top_type() { return bogus_type(); } // alias
   static VerificationType null_type() { return VerificationType(Null); }
   static VerificationType integer_type() { return VerificationType(Integer); }
   static VerificationType float_type() { return VerificationType(Float); }
--- a/hotspot/src/share/vm/code/nmethod.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/code/nmethod.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -190,15 +190,10 @@
 } nmethod_stats;
 #endif //PRODUCT
 
+
 //---------------------------------------------------------------------------------
 
 
-// The _unwind_handler is a special marker address, which says that
-// for given exception oop and address, the frame should be removed
-// as the tuple cannot be caught in the nmethod
-address ExceptionCache::_unwind_handler = (address) -1;
-
-
 ExceptionCache::ExceptionCache(Handle exception, address pc, address handler) {
   assert(pc != NULL, "Must be non null");
   assert(exception.not_null(), "Must be non null");
--- a/hotspot/src/share/vm/code/nmethod.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/code/nmethod.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -34,7 +34,6 @@
 class ExceptionCache : public CHeapObj {
   friend class VMStructs;
  private:
-  static address _unwind_handler;
   enum { cache_size = 16 };
   klassOop _exception_type;
   address  _pc[cache_size];
@@ -62,8 +61,6 @@
   bool    match_exception_with_space(Handle exception) ;
   address test_address(address addr);
   bool    add_address_and_handler(address addr, address handler) ;
-
-  static address unwind_handler() { return _unwind_handler; }
 };
 
 
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -5474,8 +5474,6 @@
   _refine_cte_cl->set_concurrent(concurrent);
 }
 
-#ifdef ASSERT
-
 bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
   HeapRegion* hr = heap_region_containing(p);
   if (hr == NULL) {
@@ -5484,7 +5482,6 @@
     return hr->is_in(p);
   }
 }
-#endif // ASSERT
 
 class VerifyRegionListsClosure : public HeapRegionClosure {
 private:
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1134,7 +1134,7 @@
     return _g1_committed;
   }
 
-  NOT_PRODUCT(bool is_in_closed_subset(const void* p) const;)
+  virtual bool is_in_closed_subset(const void* p) const;
 
   // Dirty card table entries covering a list of young regions.
   void dirtyCardsForYoungRegions(CardTableModRefBS* ct_bs, HeapRegion* list);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -83,11 +83,15 @@
   }
 
   template <class T> void write_ref_array_pre_work(T* dst, int count);
-  virtual void write_ref_array_pre(oop* dst, int count) {
-    write_ref_array_pre_work(dst, count);
+  virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) {
+    if (!dest_uninitialized) {
+      write_ref_array_pre_work(dst, count);
+    }
   }
-  virtual void write_ref_array_pre(narrowOop* dst, int count) {
-    write_ref_array_pre_work(dst, count);
+  virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) {
+    if (!dest_uninitialized) {
+      write_ref_array_pre_work(dst, count);
+    }
   }
 };
 
--- a/hotspot/src/share/vm/memory/allocation.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/memory/allocation.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -422,6 +422,9 @@
   return sum;                   // Return total consumed space.
 }
 
+void Arena::signal_out_of_memory(size_t sz, const char* whence) const {
+  vm_exit_out_of_memory(sz, whence);
+}
 
 // Grow a new Chunk
 void* Arena::grow( size_t x ) {
@@ -431,8 +434,9 @@
   Chunk *k = _chunk;            // Get filled-up chunk address
   _chunk = new (len) Chunk(len);
 
-  if (_chunk == NULL)
-      vm_exit_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow");
+  if (_chunk == NULL) {
+    signal_out_of_memory(len * Chunk::aligned_overhead_size(), "Arena::grow");
+  }
 
   if (k) k->set_next(_chunk);   // Append new chunk to end of linked list
   else _first = _chunk;
@@ -529,6 +533,7 @@
 // for debugging with UseMallocOnly
 void* Arena::internal_malloc_4(size_t x) {
   assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" );
+  check_for_overflow(x, "Arena::internal_malloc_4");
   if (_hwm + x > _max) {
     return grow(x);
   } else {
--- a/hotspot/src/share/vm/memory/allocation.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/memory/allocation.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -207,6 +207,15 @@
   debug_only(void* malloc(size_t size);)
   debug_only(void* internal_malloc_4(size_t x);)
   NOT_PRODUCT(void inc_bytes_allocated(size_t x);)
+
+  void signal_out_of_memory(size_t request, const char* whence) const;
+
+  void check_for_overflow(size_t request, const char* whence) const {
+    if (UINTPTR_MAX - request < (uintptr_t)_hwm) {
+      signal_out_of_memory(request, whence);
+    }
+ }
+
  public:
   Arena();
   Arena(size_t init_size);
@@ -220,6 +229,7 @@
     assert(is_power_of_2(ARENA_AMALLOC_ALIGNMENT) , "should be a power of 2");
     x = ARENA_ALIGN(x);
     debug_only(if (UseMallocOnly) return malloc(x);)
+    check_for_overflow(x, "Arena::Amalloc");
     NOT_PRODUCT(inc_bytes_allocated(x);)
     if (_hwm + x > _max) {
       return grow(x);
@@ -233,6 +243,7 @@
   void *Amalloc_4(size_t x) {
     assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" );
     debug_only(if (UseMallocOnly) return malloc(x);)
+    check_for_overflow(x, "Arena::Amalloc_4");
     NOT_PRODUCT(inc_bytes_allocated(x);)
     if (_hwm + x > _max) {
       return grow(x);
@@ -253,6 +264,7 @@
     size_t delta = (((size_t)_hwm + DALIGN_M1) & ~DALIGN_M1) - (size_t)_hwm;
     x += delta;
 #endif
+    check_for_overflow(x, "Arena::Amalloc_D");
     NOT_PRODUCT(inc_bytes_allocated(x);)
     if (_hwm + x > _max) {
       return grow(x); // grow() returns a result aligned >= 8 bytes.
--- a/hotspot/src/share/vm/memory/barrierSet.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/memory/barrierSet.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -35,9 +35,9 @@
                    start,            count);
 #endif
   if (UseCompressedOops) {
-    Universe::heap()->barrier_set()->write_ref_array_pre((narrowOop*)start, (int)count);
+    Universe::heap()->barrier_set()->write_ref_array_pre((narrowOop*)start, (int)count, false);
   } else {
-    Universe::heap()->barrier_set()->write_ref_array_pre(      (oop*)start, (int)count);
+    Universe::heap()->barrier_set()->write_ref_array_pre(      (oop*)start, (int)count, false);
   }
 }
 
--- a/hotspot/src/share/vm/memory/barrierSet.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/memory/barrierSet.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,6 +44,10 @@
     Uninit
   };
 
+  enum Flags {
+    None                = 0,
+    TargetUninitialized = 1
+  };
 protected:
   int _max_covered_regions;
   Name _kind;
@@ -128,8 +132,10 @@
   virtual void read_prim_array(MemRegion mr) = 0;
 
   // Below length is the # array elements being written
-  virtual void write_ref_array_pre(      oop* dst, int length) {}
-  virtual void write_ref_array_pre(narrowOop* dst, int length) {}
+  virtual void write_ref_array_pre(oop* dst, int length,
+                                   bool dest_uninitialized = false) {}
+  virtual void write_ref_array_pre(narrowOop* dst, int length,
+                                   bool dest_uninitialized = false) {}
   // Below count is the # array elements being written, starting
   // at the address "start", which may not necessarily be HeapWord-aligned
   inline void write_ref_array(HeapWord* start, size_t count);
--- a/hotspot/src/share/vm/opto/library_call.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -97,7 +97,7 @@
                              RegionNode* region);
   Node* generate_current_thread(Node* &tls_output);
   address basictype2arraycopy(BasicType t, Node *src_offset, Node *dest_offset,
-                              bool disjoint_bases, const char* &name);
+                              bool disjoint_bases, const char* &name, bool dest_uninitialized);
   Node* load_mirror_from_klass(Node* klass);
   Node* load_klass_from_mirror_common(Node* mirror, bool never_see_null,
                                       int nargs,
@@ -212,26 +212,26 @@
                                 AllocateNode* alloc,
                                 Node* src,  Node* src_offset,
                                 Node* dest, Node* dest_offset,
-                                Node* dest_size);
+                                Node* dest_size, bool dest_uninitialized);
   void generate_slow_arraycopy(const TypePtr* adr_type,
                                Node* src,  Node* src_offset,
                                Node* dest, Node* dest_offset,
-                               Node* copy_length);
+                               Node* copy_length, bool dest_uninitialized);
   Node* generate_checkcast_arraycopy(const TypePtr* adr_type,
                                      Node* dest_elem_klass,
                                      Node* src,  Node* src_offset,
                                      Node* dest, Node* dest_offset,
-                                     Node* copy_length);
+                                     Node* copy_length, bool dest_uninitialized);
   Node* generate_generic_arraycopy(const TypePtr* adr_type,
                                    Node* src,  Node* src_offset,
                                    Node* dest, Node* dest_offset,
-                                   Node* copy_length);
+                                   Node* copy_length, bool dest_uninitialized);
   void generate_unchecked_arraycopy(const TypePtr* adr_type,
                                     BasicType basic_elem_type,
                                     bool disjoint_bases,
                                     Node* src,  Node* src_offset,
                                     Node* dest, Node* dest_offset,
-                                    Node* copy_length);
+                                    Node* copy_length, bool dest_uninitialized);
   bool inline_unsafe_CAS(BasicType type);
   bool inline_unsafe_ordered_store(BasicType type);
   bool inline_fp_conversions(vmIntrinsics::ID id);
@@ -1193,7 +1193,7 @@
   Node* result;
   // Disable the use of pcmpestri until it can be guaranteed that
   // the load doesn't cross into the uncommited space.
-  if (false && Matcher::has_match_rule(Op_StrIndexOf) &&
+  if (Matcher::has_match_rule(Op_StrIndexOf) &&
       UseSSE42Intrinsics) {
     // Generate SSE4.2 version of indexOf
     // We currently only have match rules that use SSE4.2
@@ -1211,14 +1211,14 @@
       return true;
     }
 
+    ciInstanceKlass* str_klass = env()->String_klass();
+    const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(str_klass);
+
     // Make the merge point
-    RegionNode* result_rgn = new (C, 3) RegionNode(3);
-    Node*       result_phi = new (C, 3) PhiNode(result_rgn, TypeInt::INT);
+    RegionNode* result_rgn = new (C, 4) RegionNode(4);
+    Node*       result_phi = new (C, 4) PhiNode(result_rgn, TypeInt::INT);
     Node* no_ctrl  = NULL;
 
-    ciInstanceKlass* klass = env()->String_klass();
-    const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
-
     // Get counts for string and substr
     Node* source_cnta = basic_plus_adr(receiver, receiver, count_offset);
     Node* source_cnt  = make_load(no_ctrl, source_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset));
@@ -1236,6 +1236,17 @@
     }
 
     if (!stopped()) {
+      // Check for substr count == 0
+      cmp = _gvn.transform( new(C, 3) CmpINode(substr_cnt, intcon(0)) );
+      bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::eq) );
+      Node* if_zero = generate_slow_guard(bol, NULL);
+      if (if_zero != NULL) {
+        result_phi->init_req(3, intcon(0));
+        result_rgn->init_req(3, if_zero);
+      }
+    }
+
+    if (!stopped()) {
       result = make_string_method_node(Op_StrIndexOf, receiver, source_cnt, argument, substr_cnt);
       result_phi->init_req(1, result);
       result_rgn->init_req(1, control());
@@ -1244,8 +1255,8 @@
     record_for_igvn(result_rgn);
     result = _gvn.transform(result_phi);
 
-  } else { //Use LibraryCallKit::string_indexOf
-    // don't intrinsify is argument isn't a constant string.
+  } else { // Use LibraryCallKit::string_indexOf
+    // don't intrinsify if argument isn't a constant string.
     if (!argument->is_Con()) {
      return false;
     }
@@ -1281,7 +1292,7 @@
     // No null check on the argument is needed since it's a constant String oop.
     _sp -= 2;
     if (stopped()) {
-     return true;
+      return true;
     }
 
     // The null string as a pattern always returns 0 (match at beginning of string)
@@ -4081,7 +4092,8 @@
   const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
   bool disjoint_bases = true;
   generate_unchecked_arraycopy(raw_adr_type, T_LONG, disjoint_bases,
-                               src, NULL, dest, NULL, countx);
+                               src, NULL, dest, NULL, countx,
+                               /*dest_uninitialized*/true);
 
   // If necessary, emit some card marks afterwards.  (Non-arrays only.)
   if (card_mark) {
@@ -4295,7 +4307,7 @@
 // Note:  The condition "disjoint" applies also for overlapping copies
 // where an descending copy is permitted (i.e., dest_offset <= src_offset).
 static address
-select_arraycopy_function(BasicType t, bool aligned, bool disjoint, const char* &name) {
+select_arraycopy_function(BasicType t, bool aligned, bool disjoint, const char* &name, bool dest_uninitialized) {
   int selector =
     (aligned  ? COPYFUNC_ALIGNED  : COPYFUNC_UNALIGNED) +
     (disjoint ? COPYFUNC_DISJOINT : COPYFUNC_CONJOINT);
@@ -4304,6 +4316,10 @@
   name = #xxx_arraycopy; \
   return StubRoutines::xxx_arraycopy(); }
 
+#define RETURN_STUB_PARM(xxx_arraycopy, parm) {           \
+  name = #xxx_arraycopy; \
+  return StubRoutines::xxx_arraycopy(parm); }
+
   switch (t) {
   case T_BYTE:
   case T_BOOLEAN:
@@ -4340,10 +4356,10 @@
   case T_ARRAY:
   case T_OBJECT:
     switch (selector) {
-    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(oop_arraycopy);
-    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_oop_arraycopy);
-    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(oop_disjoint_arraycopy);
-    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_oop_disjoint_arraycopy);
+    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB_PARM(oop_arraycopy, dest_uninitialized);
+    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB_PARM(arrayof_oop_arraycopy, dest_uninitialized);
+    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB_PARM(oop_disjoint_arraycopy, dest_uninitialized);
+    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB_PARM(arrayof_oop_disjoint_arraycopy, dest_uninitialized);
     }
   default:
     ShouldNotReachHere();
@@ -4351,6 +4367,7 @@
   }
 
 #undef RETURN_STUB
+#undef RETURN_STUB_PARM
 }
 
 //------------------------------basictype2arraycopy----------------------------
@@ -4358,7 +4375,8 @@
                                             Node* src_offset,
                                             Node* dest_offset,
                                             bool disjoint_bases,
-                                            const char* &name) {
+                                            const char* &name,
+                                            bool dest_uninitialized) {
   const TypeInt* src_offset_inttype  = gvn().find_int_type(src_offset);;
   const TypeInt* dest_offset_inttype = gvn().find_int_type(dest_offset);;
 
@@ -4384,7 +4402,7 @@
     disjoint = true;
   }
 
-  return select_arraycopy_function(t, aligned, disjoint, name);
+  return select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized);
 }
 
 
@@ -4440,7 +4458,8 @@
     // The component types are not the same or are not recognized.  Punt.
     // (But, avoid the native method wrapper to JVM_ArrayCopy.)
     generate_slow_arraycopy(TypePtr::BOTTOM,
-                            src, src_offset, dest, dest_offset, length);
+                            src, src_offset, dest, dest_offset, length,
+                            /*dest_uninitialized*/false);
     return true;
   }
 
@@ -4553,7 +4572,7 @@
 
   Node* original_dest      = dest;
   AllocateArrayNode* alloc = NULL;  // used for zeroing, if needed
-  bool  must_clear_dest    = false;
+  bool  dest_uninitialized = false;
 
   // See if this is the initialization of a newly-allocated array.
   // If so, we will take responsibility here for initializing it to zero.
@@ -4576,12 +4595,14 @@
     adr_type = TypeRawPtr::BOTTOM;  // all initializations are into raw memory
     // From this point on, every exit path is responsible for
     // initializing any non-copied parts of the object to zero.
-    must_clear_dest = true;
+    // Also, if this flag is set we make sure that arraycopy interacts properly
+    // with G1, eliding pre-barriers. See CR 6627983.
+    dest_uninitialized = true;
   } else {
     // No zeroing elimination here.
     alloc             = NULL;
     //original_dest   = dest;
-    //must_clear_dest = false;
+    //dest_uninitialized = false;
   }
 
   // Results are placed here:
@@ -4613,10 +4634,10 @@
   Node* checked_value   = NULL;
 
   if (basic_elem_type == T_CONFLICT) {
-    assert(!must_clear_dest, "");
+    assert(!dest_uninitialized, "");
     Node* cv = generate_generic_arraycopy(adr_type,
                                           src, src_offset, dest, dest_offset,
-                                          copy_length);
+                                          copy_length, dest_uninitialized);
     if (cv == NULL)  cv = intcon(-1);  // failure (no stub available)
     checked_control = control();
     checked_i_o     = i_o();
@@ -4636,7 +4657,7 @@
     }
 
     // copy_length is 0.
-    if (!stopped() && must_clear_dest) {
+    if (!stopped() && dest_uninitialized) {
       Node* dest_length = alloc->in(AllocateNode::ALength);
       if (_gvn.eqv_uncast(copy_length, dest_length)
           || _gvn.find_int_con(dest_length, 1) <= 0) {
@@ -4662,7 +4683,7 @@
     result_memory->init_req(zero_path, memory(adr_type));
   }
 
-  if (!stopped() && must_clear_dest) {
+  if (!stopped() && dest_uninitialized) {
     // We have to initialize the *uncopied* part of the array to zero.
     // The copy destination is the slice dest[off..off+len].  The other slices
     // are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
@@ -4698,7 +4719,7 @@
       { PreserveJVMState pjvms(this);
         didit = generate_block_arraycopy(adr_type, basic_elem_type, alloc,
                                          src, src_offset, dest, dest_offset,
-                                         dest_size);
+                                         dest_size, dest_uninitialized);
         if (didit) {
           // Present the results of the block-copying fast call.
           result_region->init_req(bcopy_path, control());
@@ -4774,7 +4795,7 @@
       Node* cv = generate_checkcast_arraycopy(adr_type,
                                               dest_elem_klass,
                                               src, src_offset, dest, dest_offset,
-                                              ConvI2X(copy_length));
+                                              ConvI2X(copy_length), dest_uninitialized);
       if (cv == NULL)  cv = intcon(-1);  // failure (no stub available)
       checked_control = control();
       checked_i_o     = i_o();
@@ -4797,7 +4818,7 @@
     PreserveJVMState pjvms(this);
     generate_unchecked_arraycopy(adr_type, copy_type, disjoint_bases,
                                  src, src_offset, dest, dest_offset,
-                                 ConvI2X(copy_length));
+                                 ConvI2X(copy_length), dest_uninitialized);
 
     // Present the results of the fast call.
     result_region->init_req(fast_path, control());
@@ -4876,7 +4897,7 @@
     set_memory(slow_mem, adr_type);
     set_i_o(slow_i_o);
 
-    if (must_clear_dest) {
+    if (dest_uninitialized) {
       generate_clear_array(adr_type, dest, basic_elem_type,
                            intcon(0), NULL,
                            alloc->in(AllocateNode::AllocSize));
@@ -4884,7 +4905,7 @@
 
     generate_slow_arraycopy(adr_type,
                             src, src_offset, dest, dest_offset,
-                            copy_length);
+                            copy_length, /*dest_uninitialized*/false);
 
     result_region->init_req(slow_call_path, control());
     result_i_o   ->init_req(slow_call_path, i_o());
@@ -5128,7 +5149,7 @@
                                          AllocateNode* alloc,
                                          Node* src,  Node* src_offset,
                                          Node* dest, Node* dest_offset,
-                                         Node* dest_size) {
+                                         Node* dest_size, bool dest_uninitialized) {
   // See if there is an advantage from block transfer.
   int scale = exact_log2(type2aelembytes(basic_elem_type));
   if (scale >= LogBytesPerLong)
@@ -5173,7 +5194,7 @@
 
   bool disjoint_bases = true;   // since alloc != NULL
   generate_unchecked_arraycopy(adr_type, T_LONG, disjoint_bases,
-                               sptr, NULL, dptr, NULL, countx);
+                               sptr, NULL, dptr, NULL, countx, dest_uninitialized);
 
   return true;
 }
@@ -5186,7 +5207,8 @@
 LibraryCallKit::generate_slow_arraycopy(const TypePtr* adr_type,
                                         Node* src,  Node* src_offset,
                                         Node* dest, Node* dest_offset,
-                                        Node* copy_length) {
+                                        Node* copy_length, bool dest_uninitialized) {
+  assert(!dest_uninitialized, "Invariant");
   Node* call = make_runtime_call(RC_NO_LEAF | RC_UNCOMMON,
                                  OptoRuntime::slow_arraycopy_Type(),
                                  OptoRuntime::slow_arraycopy_Java(),
@@ -5204,10 +5226,10 @@
                                              Node* dest_elem_klass,
                                              Node* src,  Node* src_offset,
                                              Node* dest, Node* dest_offset,
-                                             Node* copy_length) {
+                                             Node* copy_length, bool dest_uninitialized) {
   if (stopped())  return NULL;
 
-  address copyfunc_addr = StubRoutines::checkcast_arraycopy();
+  address copyfunc_addr = StubRoutines::checkcast_arraycopy(dest_uninitialized);
   if (copyfunc_addr == NULL) { // Stub was not generated, go slow path.
     return NULL;
   }
@@ -5245,9 +5267,9 @@
 LibraryCallKit::generate_generic_arraycopy(const TypePtr* adr_type,
                                            Node* src,  Node* src_offset,
                                            Node* dest, Node* dest_offset,
-                                           Node* copy_length) {
+                                           Node* copy_length, bool dest_uninitialized) {
+  assert(!dest_uninitialized, "Invariant");
   if (stopped())  return NULL;
-
   address copyfunc_addr = StubRoutines::generic_arraycopy();
   if (copyfunc_addr == NULL) { // Stub was not generated, go slow path.
     return NULL;
@@ -5268,7 +5290,7 @@
                                              bool disjoint_bases,
                                              Node* src,  Node* src_offset,
                                              Node* dest, Node* dest_offset,
-                                             Node* copy_length) {
+                                             Node* copy_length, bool dest_uninitialized) {
   if (stopped())  return;               // nothing to do
 
   Node* src_start  = src;
@@ -5283,7 +5305,7 @@
   const char* copyfunc_name = "arraycopy";
   address     copyfunc_addr =
       basictype2arraycopy(basic_elem_type, src_offset, dest_offset,
-                          disjoint_bases, copyfunc_name);
+                          disjoint_bases, copyfunc_name, dest_uninitialized);
 
   // Call it.  Note that the count_ix value is not scaled to a byte-size.
   make_runtime_call(RC_LEAF|RC_NO_FP,
--- a/hotspot/src/share/vm/opto/memnode.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/opto/memnode.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -1559,21 +1559,24 @@
             phase->C->has_unsafe_access(),
             "Field accesses must be precise" );
     // For oop loads, we expect the _type to be precise
-    if (OptimizeStringConcat && klass == phase->C->env()->String_klass() &&
+    if (klass == phase->C->env()->String_klass() &&
         adr->is_AddP() && off != Type::OffsetBot) {
-      // For constant Strings treat the fields as compile time constants.
+      // For constant Strings treat the final fields as compile time constants.
       Node* base = adr->in(AddPNode::Base);
       const TypeOopPtr* t = phase->type(base)->isa_oopptr();
       if (t != NULL && t->singleton()) {
-        ciObject* string = t->const_oop();
-        ciConstant constant = string->as_instance()->field_value_by_offset(off);
-        if (constant.basic_type() == T_INT) {
-          return TypeInt::make(constant.as_int());
-        } else if (constant.basic_type() == T_ARRAY) {
-          if (adr->bottom_type()->is_ptr_to_narrowoop()) {
-            return TypeNarrowOop::make_from_constant(constant.as_object());
-          } else {
-            return TypeOopPtr::make_from_constant(constant.as_object());
+        ciField* field = phase->C->env()->String_klass()->get_field_by_offset(off, false);
+        if (field != NULL && field->is_final()) {
+          ciObject* string = t->const_oop();
+          ciConstant constant = string->as_instance()->field_value(field);
+          if (constant.basic_type() == T_INT) {
+            return TypeInt::make(constant.as_int());
+          } else if (constant.basic_type() == T_ARRAY) {
+            if (adr->bottom_type()->is_ptr_to_narrowoop()) {
+              return TypeNarrowOop::make_from_constant(constant.as_object());
+            } else {
+              return TypeOopPtr::make_from_constant(constant.as_object());
+            }
           }
         }
       }
@@ -4077,6 +4080,7 @@
     n = base_memory();
     assert(Node::in_dump()
            || n == NULL || n->bottom_type() == Type::TOP
+           || n->adr_type() == NULL // address is TOP
            || n->adr_type() == TypePtr::BOTTOM
            || n->adr_type() == TypeRawPtr::BOTTOM
            || Compile::current()->AliasLevel() == 0,
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1805,6 +1805,10 @@
 
 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) {
   JavaThread* thread = JavaThread::current();
+  // In theory everyone coming thru here is in_vm but we need to be certain
+  // because a callee will do a vm->native transition
+  ThreadInVMfromUnknown __tiv;
+
   EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
                  ("JVMTI [%s] method dynamic code generated event triggered",
                  JvmtiTrace::safe_get_thread_name(thread)));
@@ -1826,19 +1830,18 @@
 }
 
 void JvmtiExport::post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) {
-  // In theory everyone coming thru here is in_vm but we need to be certain
-  // because a callee will do a vm->native transition
-  ThreadInVMfromUnknown __tiv;
   jvmtiPhase phase = JvmtiEnv::get_phase();
   if (phase == JVMTI_PHASE_PRIMORDIAL || phase == JVMTI_PHASE_START) {
     post_dynamic_code_generated_internal(name, code_begin, code_end);
-    return;
+  } else {
+    // It may not be safe to post the event from this thread.  Defer all
+    // postings to the service thread so that it can perform them in a safe
+    // context and in-order.
+    MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
+    JvmtiDeferredEvent event = JvmtiDeferredEvent::dynamic_code_generated_event(
+        name, code_begin, code_end);
+    JvmtiDeferredEventQueue::enqueue(event);
   }
-
-  // Blocks until everything now in the queue has been posted
-  JvmtiDeferredEventQueue::flush_queue(Thread::current());
-
-  post_dynamic_code_generated_internal(name, code_begin, code_end);
 }
 
 
--- a/hotspot/src/share/vm/prims/jvmtiExport.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -140,12 +140,12 @@
                                       char sig_type, jvalue *value);
 
 
- private:
   // posts a DynamicCodeGenerated event (internal/private implementation).
   // The public post_dynamic_code_generated* functions make use of the
-  // internal implementation.
+  // internal implementation.  Also called from JvmtiDeferredEvent::post()
   static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
 
+ private:
 
   // GenerateEvents support to allow posting of CompiledMethodLoad and
   // DynamicCodeGenerated events for a given environment.
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -918,7 +918,7 @@
 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
     nmethod* nm) {
   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
-  event.set_compiled_method_load(nm);
+  event._event_data.compiled_method_load = nm;
   nmethodLocker::lock_nmethod(nm); // will be unlocked when posted
   return event;
 }
@@ -926,23 +926,39 @@
 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
     jmethodID id, const void* code) {
   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
-  event.set_compiled_method_unload(id, code);
+  event._event_data.compiled_method_unload.method_id = id;
+  event._event_data.compiled_method_unload.code_begin = code;
+  return event;
+}
+JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
+      const char* name, const void* code_begin, const void* code_end) {
+  JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED);
+  event._event_data.dynamic_code_generated.name = name;
+  event._event_data.dynamic_code_generated.code_begin = code_begin;
+  event._event_data.dynamic_code_generated.code_end = code_end;
   return event;
 }
 
 void JvmtiDeferredEvent::post() {
+  assert(ServiceThread::is_service_thread(Thread::current()),
+         "Service thread must post enqueued events");
   switch(_type) {
-    case TYPE_COMPILED_METHOD_LOAD:
-      JvmtiExport::post_compiled_method_load(compiled_method_load());
-      nmethodLocker::unlock_nmethod(compiled_method_load());
+    case TYPE_COMPILED_METHOD_LOAD: {
+      nmethod* nm = _event_data.compiled_method_load;
+      JvmtiExport::post_compiled_method_load(nm);
+      nmethodLocker::unlock_nmethod(nm);
       break;
+    }
     case TYPE_COMPILED_METHOD_UNLOAD:
       JvmtiExport::post_compiled_method_unload(
-        compiled_method_unload_method_id(),
-        compiled_method_unload_code_begin());
+        _event_data.compiled_method_unload.method_id,
+        _event_data.compiled_method_unload.code_begin);
       break;
-    case TYPE_FLUSH:
-      JvmtiDeferredEventQueue::flush_complete(flush_state_addr());
+    case TYPE_DYNAMIC_CODE_GENERATED:
+      JvmtiExport::post_dynamic_code_generated_internal(
+        _event_data.dynamic_code_generated.name,
+        _event_data.dynamic_code_generated.code_begin,
+        _event_data.dynamic_code_generated.code_end);
       break;
     default:
       ShouldNotReachHere();
@@ -1065,54 +1081,4 @@
   }
 }
 
-enum {
-  // Random - used for debugging
-  FLUSHING  = 0x50403020,
-  FLUSHED   = 0x09080706
-};
-
-void JvmtiDeferredEventQueue::flush_queue(Thread* thread) {
-
-  volatile int flush_state = FLUSHING;
-
-  JvmtiDeferredEvent flush(JvmtiDeferredEvent::TYPE_FLUSH);
-  flush.set_flush_state_addr((int*)&flush_state);
-
-  if (ServiceThread::is_service_thread(thread)) {
-    // If we are the service thread we have to post all preceding events
-    // Use the flush event as a token to indicate when we can stop
-    JvmtiDeferredEvent event;
-    {
-      MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
-      enqueue(flush);
-      event = dequeue();
-    }
-    while (!event.is_flush_event() ||
-           event.flush_state_addr() != &flush_state) {
-      event.post();
-      {
-        MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
-        event = dequeue();
-      }
-    }
-  } else {
-    // Wake up the service thread so it will process events.  When it gets
-    // to the flush event it will set 'flush_complete' and notify us.
-    MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
-    enqueue(flush);
-    while (flush_state != FLUSHED) {
-      assert(flush_state == FLUSHING || flush_state == FLUSHED,
-             "only valid values for this");
-      Service_lock->wait(Mutex::_no_safepoint_check_flag);
-    }
-  }
-}
-
-void JvmtiDeferredEventQueue::flush_complete(int* state_addr) {
-  assert(state_addr != NULL && *state_addr == FLUSHING, "must be");
-  MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
-  *state_addr = FLUSHED;
-  Service_lock->notify_all();
-}
-
 #endif // ndef KERNEL
--- a/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -451,7 +451,7 @@
     TYPE_NONE,
     TYPE_COMPILED_METHOD_LOAD,
     TYPE_COMPILED_METHOD_UNLOAD,
-    TYPE_FLUSH // pseudo-event used to implement flush_queue()
+    TYPE_DYNAMIC_CODE_GENERATED
   } Type;
 
   Type _type;
@@ -461,49 +461,15 @@
       jmethodID method_id;
       const void* code_begin;
     } compiled_method_unload;
-    int* flush_state_addr;
+    struct {
+      const char* name;
+      const void* code_begin;
+      const void* code_end;
+    } dynamic_code_generated;
   } _event_data;
 
   JvmtiDeferredEvent(Type t) : _type(t) {}
 
-  void set_compiled_method_load(nmethod* nm) {
-    assert(_type == TYPE_COMPILED_METHOD_LOAD, "must be");
-    _event_data.compiled_method_load = nm;
-  }
-
-  nmethod* compiled_method_load() const {
-    assert(_type == TYPE_COMPILED_METHOD_LOAD, "must be");
-    return _event_data.compiled_method_load;
-  }
-
-  void set_compiled_method_unload(jmethodID id, const void* code) {
-    assert(_type == TYPE_COMPILED_METHOD_UNLOAD, "must be");
-    _event_data.compiled_method_unload.method_id = id;
-    _event_data.compiled_method_unload.code_begin = code;
-  }
-
-  jmethodID compiled_method_unload_method_id() const {
-    assert(_type == TYPE_COMPILED_METHOD_UNLOAD, "must be");
-    return _event_data.compiled_method_unload.method_id;
-  }
-
-  const void* compiled_method_unload_code_begin() const {
-    assert(_type == TYPE_COMPILED_METHOD_UNLOAD, "must be");
-    return _event_data.compiled_method_unload.code_begin;
-  }
-
-  bool is_flush_event() const { return _type == TYPE_FLUSH; }
-
-  int* flush_state_addr() const {
-    assert(is_flush_event(), "must be");
-    return _event_data.flush_state_addr;
-  }
-
-  void set_flush_state_addr(int* flag) {
-    assert(is_flush_event(), "must be");
-    _event_data.flush_state_addr = flag;
-  }
-
  public:
 
   JvmtiDeferredEvent() : _type(TYPE_NONE) {}
@@ -513,6 +479,9 @@
     KERNEL_RETURN_(JvmtiDeferredEvent());
   static JvmtiDeferredEvent compiled_method_unload_event(
       jmethodID id, const void* code) KERNEL_RETURN_(JvmtiDeferredEvent());
+  static JvmtiDeferredEvent dynamic_code_generated_event(
+      const char* name, const void* begin, const void* end)
+          KERNEL_RETURN_(JvmtiDeferredEvent());
 
   // Actually posts the event.
   void post() KERNEL_RETURN;
@@ -548,25 +517,12 @@
   // Transfers events from the _pending_list to the _queue.
   static void process_pending_events() KERNEL_RETURN;
 
-  static void flush_complete(int* flush_state) KERNEL_RETURN;
-
  public:
   // Must be holding Service_lock when calling these
   static bool has_events() KERNEL_RETURN_(false);
   static void enqueue(const JvmtiDeferredEvent& event) KERNEL_RETURN;
   static JvmtiDeferredEvent dequeue() KERNEL_RETURN_(JvmtiDeferredEvent());
 
-  // This call blocks until all events enqueued prior to this call
-  // have been posted.  The Service_lock is acquired and waited upon.
-  //
-  // Implemented by creating a "flush" event and placing it in the queue.
-  // When the flush event is "posted" it will call flush_complete(), which
-  // will release the caller.
-  //
-  // Can be called by any thread (maybe even the service thread itself).
-  // Not necessary for the caller to be a JavaThread.
-  static void flush_queue(Thread* current) KERNEL_RETURN;
-
   // Used to enqueue events without using a lock, for times (such as during
   // safepoint) when we can't or don't want to lock the Service_lock.
   //
--- a/hotspot/src/share/vm/prims/unsafe.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/prims/unsafe.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -110,6 +110,8 @@
 
 inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
   jlong byte_offset = field_offset_to_byte_offset(field_offset);
+  // Don't allow unsafe to be used to read or write the header word of oops
+  assert(p == NULL || field_offset >= oopDesc::header_size(), "offset must be outside of header");
 #ifdef ASSERT
   if (p != NULL) {
     assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -78,6 +78,7 @@
 const char*  Arguments::_java_vendor_url_bug    = DEFAULT_VENDOR_URL_BUG;
 const char*  Arguments::_sun_java_launcher      = DEFAULT_JAVA_LAUNCHER;
 int    Arguments::_sun_java_launcher_pid        = -1;
+bool   Arguments::_created_by_gamma_launcher    = false;
 
 // These parameters are reset in method parse_vm_init_args(JavaVMInitArgs*)
 bool   Arguments::_AlwaysCompileLoopMethods     = AlwaysCompileLoopMethods;
@@ -1656,6 +1657,9 @@
 
 void Arguments::process_java_launcher_argument(const char* launcher, void* extra_info) {
   _sun_java_launcher = strdup(launcher);
+  if (strcmp("gamma", _sun_java_launcher) == 0) {
+    _created_by_gamma_launcher = true;
+  }
 }
 
 bool Arguments::created_by_java_launcher() {
@@ -1663,6 +1667,10 @@
   return strcmp(DEFAULT_JAVA_LAUNCHER, _sun_java_launcher) != 0;
 }
 
+bool Arguments::created_by_gamma_launcher() {
+  return _created_by_gamma_launcher;
+}
+
 //===========================================================================================================
 // Parsing of main arguments
 
@@ -2790,10 +2798,6 @@
   if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) {
     FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1);
   }
-  // Temporary disable bulk zeroing reduction with G1. See CR 6627983.
-  if (UseG1GC) {
-    FLAG_SET_DEFAULT(ReduceBulkZeroing, false);
-  }
 #endif
 
   // If we are running in a headless jre, force java.awt.headless property
@@ -3155,6 +3159,16 @@
     }
   }
 
+  // set PauseAtExit if the gamma launcher was used and a debugger is attached
+  // but only if not already set on the commandline
+  if (Arguments::created_by_gamma_launcher() && os::is_debugger_attached()) {
+    bool set = false;
+    CommandLineFlags::wasSetOnCmdline("PauseAtExit", &set);
+    if (!set) {
+      FLAG_SET_DEFAULT(PauseAtExit, true);
+    }
+  }
+
   return JNI_OK;
 }
 
--- a/hotspot/src/share/vm/runtime/arguments.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/arguments.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -257,6 +257,9 @@
   // sun.java.launcher.pid, private property
   static int    _sun_java_launcher_pid;
 
+  // was this VM created by the gamma launcher
+  static bool   _created_by_gamma_launcher;
+
   // Option flags
   static bool   _has_profile;
   static bool   _has_alloc_profile;
@@ -444,6 +447,8 @@
   static const char* sun_java_launcher()    { return _sun_java_launcher; }
   // Was VM created by a Java launcher?
   static bool created_by_java_launcher();
+  // Was VM created by the gamma Java launcher?
+  static bool created_by_gamma_launcher();
   // -Dsun.java.launcher.pid
   static int sun_java_launcher_pid()        { return _sun_java_launcher_pid; }
 
--- a/hotspot/src/share/vm/runtime/globals.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -2610,9 +2610,6 @@
   develop(bool, CompileTheWorldPreloadClasses, true,                        \
           "Preload all classes used by a class before start loading")       \
                                                                             \
-  notproduct(bool, CompileTheWorldIgnoreInitErrors, false,                  \
-          "Compile all methods although class initializer failed")          \
-                                                                            \
   notproduct(intx, CompileTheWorldSafepointInterval, 100,                   \
           "Force a safepoint every n compiles so sweeper can keep up")      \
                                                                             \
@@ -3733,6 +3730,9 @@
           "The file to create and for whose removal to await when pausing " \
           "at startup. (default: ./vm.paused.<pid>)")                       \
                                                                             \
+  diagnostic(bool, PauseAtExit, false,                                      \
+          "Pause and wait for keypress on exit if a debugger is attached")  \
+                                                                            \
   product(bool, ExtendedDTraceProbes,    false,                             \
           "Enable performance-impacting dtrace probes")                     \
                                                                             \
--- a/hotspot/src/share/vm/runtime/java.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/java.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -551,6 +551,7 @@
 
 void vm_direct_exit(int code) {
   notify_vm_shutdown();
+  os::wait_for_keypress_at_exit();
   ::exit(code);
 }
 
@@ -577,11 +578,13 @@
 void vm_shutdown()
 {
   vm_perform_shutdown_actions();
+  os::wait_for_keypress_at_exit();
   os::shutdown();
 }
 
 void vm_abort(bool dump_core) {
   vm_perform_shutdown_actions();
+  os::wait_for_keypress_at_exit();
   os::abort(dump_core);
   ShouldNotReachHere();
 }
--- a/hotspot/src/share/vm/runtime/os.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/os.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -492,6 +492,12 @@
   static void print_location(outputStream* st, intptr_t x, bool verbose = false);
   static size_t lasterror(char *buf, size_t len);
 
+  // Determines whether the calling process is being debugged by a user-mode debugger.
+  static bool is_debugger_attached();
+
+  // wait for a key press if PauseAtExit is set
+  static void wait_for_keypress_at_exit(void);
+
   // The following two functions are used by fatal error handler to trace
   // native (C) frames. They are not part of frame.hpp/frame.cpp because
   // frame.hpp/cpp assume thread is JavaThread, and also because different
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -431,25 +431,24 @@
 // previous frame depending on the return address.
 
 address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* thread, address return_address) {
-  assert(frame::verify_return_pc(return_address), "must be a return pc");
-
-  // Reset MethodHandle flag.
+  assert(frame::verify_return_pc(return_address), err_msg("must be a return address: " INTPTR_FORMAT, return_address));
+
+  // Reset method handle flag.
   thread->set_is_method_handle_return(false);
 
-  // the fastest case first
+  // The fastest case first
   CodeBlob* blob = CodeCache::find_blob(return_address);
-  if (blob != NULL && blob->is_nmethod()) {
-    nmethod* code = (nmethod*)blob;
-    assert(code != NULL, "nmethod must be present");
-    // Check if the return address is a MethodHandle call site.
-    thread->set_is_method_handle_return(code->is_method_handle_return(return_address));
+  nmethod* nm = (blob != NULL) ? blob->as_nmethod_or_null() : NULL;
+  if (nm != NULL) {
+    // Set flag if return address is a method handle call site.
+    thread->set_is_method_handle_return(nm->is_method_handle_return(return_address));
     // native nmethods don't have exception handlers
-    assert(!code->is_native_method(), "no exception handler");
-    assert(code->header_begin() != code->exception_begin(), "no exception handler");
-    if (code->is_deopt_pc(return_address)) {
+    assert(!nm->is_native_method(), "no exception handler");
+    assert(nm->header_begin() != nm->exception_begin(), "no exception handler");
+    if (nm->is_deopt_pc(return_address)) {
       return SharedRuntime::deopt_blob()->unpack_with_exception();
     } else {
-      return code->exception_begin();
+      return nm->exception_begin();
     }
   }
 
@@ -462,22 +461,9 @@
     return Interpreter::rethrow_exception_entry();
   }
 
-  // Compiled code
-  if (CodeCache::contains(return_address)) {
-    CodeBlob* blob = CodeCache::find_blob(return_address);
-    if (blob->is_nmethod()) {
-      nmethod* code = (nmethod*)blob;
-      assert(code != NULL, "nmethod must be present");
-      // Check if the return address is a MethodHandle call site.
-      thread->set_is_method_handle_return(code->is_method_handle_return(return_address));
-      assert(code->header_begin() != code->exception_begin(), "no exception handler");
-      return code->exception_begin();
-    }
-    if (blob->is_runtime_stub()) {
-      ShouldNotReachHere();   // callers are responsible for skipping runtime stub frames
-    }
-  }
+  guarantee(blob == NULL || !blob->is_runtime_stub(), "caller should have skipped stub");
   guarantee(!VtableStubs::contains(return_address), "NULL exceptions in vtables should have been handled already!");
+
 #ifndef PRODUCT
   { ResourceMark rm;
     tty->print_cr("No exception handler found for exception at " INTPTR_FORMAT " - potential problems:", return_address);
@@ -485,6 +471,7 @@
     tty->print_cr("b) other problem");
   }
 #endif // PRODUCT
+
   ShouldNotReachHere();
   return NULL;
 }
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -80,30 +80,36 @@
 jint    StubRoutines::_fpu_subnormal_bias2[3]                   = { 0, 0, 0 };
 
 // Compiled code entry points default values
-// The dafault functions don't have separate disjoint versions.
+// The default functions don't have separate disjoint versions.
 address StubRoutines::_jbyte_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
 address StubRoutines::_jshort_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
 address StubRoutines::_jint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
 address StubRoutines::_jlong_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
 address StubRoutines::_oop_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
+address StubRoutines::_oop_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
 address StubRoutines::_jbyte_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
 address StubRoutines::_jshort_disjoint_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
 address StubRoutines::_jint_disjoint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
 address StubRoutines::_jlong_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
 address StubRoutines::_oop_disjoint_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
+address StubRoutines::_oop_disjoint_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
 
 address StubRoutines::_arrayof_jbyte_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
 address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
 address StubRoutines::_arrayof_jint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
 address StubRoutines::_arrayof_jlong_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
 address StubRoutines::_arrayof_oop_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
+address StubRoutines::_arrayof_oop_arraycopy_uninit      = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
 address StubRoutines::_arrayof_jbyte_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
 address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
 address StubRoutines::_arrayof_jint_disjoint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
 address StubRoutines::_arrayof_jlong_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
-address StubRoutines::_arrayof_oop_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
+address StubRoutines::_arrayof_oop_disjoint_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
+address StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
+
 
 address StubRoutines::_checkcast_arraycopy               = NULL;
+address StubRoutines::_checkcast_arraycopy_uninit        = NULL;
 address StubRoutines::_unsafe_arraycopy                  = NULL;
 address StubRoutines::_generic_arraycopy                 = NULL;
 
@@ -282,12 +288,12 @@
 // Default versions of arraycopy functions
 //
 
-static void gen_arraycopy_barrier_pre(oop* dest, size_t count) {
+static void gen_arraycopy_barrier_pre(oop* dest, size_t count, bool dest_uninitialized) {
     assert(count != 0, "count should be non-zero");
     assert(count <= (size_t)max_intx, "count too large");
     BarrierSet* bs = Universe::heap()->barrier_set();
     assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt");
-    bs->write_ref_array_pre(dest, (int)count);
+    bs->write_ref_array_pre(dest, (int)count, dest_uninitialized);
 }
 
 static void gen_arraycopy_barrier(oop* dest, size_t count) {
@@ -330,7 +336,17 @@
   SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
 #endif // !PRODUCT
   assert(count != 0, "count should be non-zero");
-  gen_arraycopy_barrier_pre(dest, count);
+  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/false);
+  Copy::conjoint_oops_atomic(src, dest, count);
+  gen_arraycopy_barrier(dest, count);
+JRT_END
+
+JRT_LEAF(void, StubRoutines::oop_copy_uninit(oop* src, oop* dest, size_t count))
+#ifndef PRODUCT
+  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
+#endif // !PRODUCT
+  assert(count != 0, "count should be non-zero");
+  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/true);
   Copy::conjoint_oops_atomic(src, dest, count);
   gen_arraycopy_barrier(dest, count);
 JRT_END
@@ -368,11 +384,20 @@
   SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
 #endif // !PRODUCT
   assert(count != 0, "count should be non-zero");
-  gen_arraycopy_barrier_pre((oop *) dest, count);
+  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/false);
   Copy::arrayof_conjoint_oops(src, dest, count);
   gen_arraycopy_barrier((oop *) dest, count);
 JRT_END
 
+JRT_LEAF(void, StubRoutines::arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count))
+#ifndef PRODUCT
+  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
+#endif // !PRODUCT
+  assert(count != 0, "count should be non-zero");
+  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/true);
+  Copy::arrayof_conjoint_oops(src, dest, count);
+  gen_arraycopy_barrier((oop *) dest, count);
+JRT_END
 
 address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) {
 #define RETURN_STUB(xxx_fill) { \
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -164,12 +164,12 @@
   static address _jshort_arraycopy;
   static address _jint_arraycopy;
   static address _jlong_arraycopy;
-  static address _oop_arraycopy;
+  static address _oop_arraycopy, _oop_arraycopy_uninit;
   static address _jbyte_disjoint_arraycopy;
   static address _jshort_disjoint_arraycopy;
   static address _jint_disjoint_arraycopy;
   static address _jlong_disjoint_arraycopy;
-  static address _oop_disjoint_arraycopy;
+  static address _oop_disjoint_arraycopy, _oop_disjoint_arraycopy_uninit;
 
   // arraycopy operands aligned on zero'th element boundary
   // These are identical to the ones aligned aligned on an
@@ -179,15 +179,15 @@
   static address _arrayof_jshort_arraycopy;
   static address _arrayof_jint_arraycopy;
   static address _arrayof_jlong_arraycopy;
-  static address _arrayof_oop_arraycopy;
+  static address _arrayof_oop_arraycopy, _arrayof_oop_arraycopy_uninit;
   static address _arrayof_jbyte_disjoint_arraycopy;
   static address _arrayof_jshort_disjoint_arraycopy;
   static address _arrayof_jint_disjoint_arraycopy;
   static address _arrayof_jlong_disjoint_arraycopy;
-  static address _arrayof_oop_disjoint_arraycopy;
+  static address _arrayof_oop_disjoint_arraycopy, _arrayof_oop_disjoint_arraycopy_uninit;
 
   // these are recommended but optional:
-  static address _checkcast_arraycopy;
+  static address _checkcast_arraycopy, _checkcast_arraycopy_uninit;
   static address _unsafe_arraycopy;
   static address _generic_arraycopy;
 
@@ -286,26 +286,36 @@
   static address jshort_arraycopy() { return _jshort_arraycopy; }
   static address jint_arraycopy()   { return _jint_arraycopy; }
   static address jlong_arraycopy()  { return _jlong_arraycopy; }
-  static address oop_arraycopy()    { return _oop_arraycopy; }
+  static address oop_arraycopy(bool dest_uninitialized = false) {
+    return dest_uninitialized ? _oop_arraycopy_uninit : _oop_arraycopy;
+  }
   static address jbyte_disjoint_arraycopy()  { return _jbyte_disjoint_arraycopy; }
   static address jshort_disjoint_arraycopy() { return _jshort_disjoint_arraycopy; }
   static address jint_disjoint_arraycopy()   { return _jint_disjoint_arraycopy; }
   static address jlong_disjoint_arraycopy()  { return _jlong_disjoint_arraycopy; }
-  static address oop_disjoint_arraycopy()    { return _oop_disjoint_arraycopy; }
+  static address oop_disjoint_arraycopy(bool dest_uninitialized = false) {
+    return dest_uninitialized ?  _oop_disjoint_arraycopy_uninit : _oop_disjoint_arraycopy;
+  }
 
   static address arrayof_jbyte_arraycopy()  { return _arrayof_jbyte_arraycopy; }
   static address arrayof_jshort_arraycopy() { return _arrayof_jshort_arraycopy; }
   static address arrayof_jint_arraycopy()   { return _arrayof_jint_arraycopy; }
   static address arrayof_jlong_arraycopy()  { return _arrayof_jlong_arraycopy; }
-  static address arrayof_oop_arraycopy()    { return _arrayof_oop_arraycopy; }
+  static address arrayof_oop_arraycopy(bool dest_uninitialized = false) {
+    return dest_uninitialized ? _arrayof_oop_arraycopy_uninit : _arrayof_oop_arraycopy;
+  }
 
   static address arrayof_jbyte_disjoint_arraycopy()  { return _arrayof_jbyte_disjoint_arraycopy; }
   static address arrayof_jshort_disjoint_arraycopy() { return _arrayof_jshort_disjoint_arraycopy; }
   static address arrayof_jint_disjoint_arraycopy()   { return _arrayof_jint_disjoint_arraycopy; }
   static address arrayof_jlong_disjoint_arraycopy()  { return _arrayof_jlong_disjoint_arraycopy; }
-  static address arrayof_oop_disjoint_arraycopy()    { return _arrayof_oop_disjoint_arraycopy; }
+  static address arrayof_oop_disjoint_arraycopy(bool dest_uninitialized = false) {
+    return dest_uninitialized ? _arrayof_oop_disjoint_arraycopy_uninit : _arrayof_oop_disjoint_arraycopy;
+  }
 
-  static address checkcast_arraycopy()     { return _checkcast_arraycopy; }
+  static address checkcast_arraycopy(bool dest_uninitialized = false) {
+    return dest_uninitialized ? _checkcast_arraycopy_uninit : _checkcast_arraycopy;
+  }
   static address unsafe_arraycopy()        { return _unsafe_arraycopy; }
   static address generic_arraycopy()       { return _generic_arraycopy; }
 
@@ -352,17 +362,19 @@
   // Default versions of the above arraycopy functions for platforms which do
   // not have specialized versions
   //
-  static void jbyte_copy (jbyte*  src, jbyte*  dest, size_t count);
-  static void jshort_copy(jshort* src, jshort* dest, size_t count);
-  static void jint_copy  (jint*   src, jint*   dest, size_t count);
-  static void jlong_copy (jlong*  src, jlong*  dest, size_t count);
-  static void oop_copy   (oop*    src, oop*    dest, size_t count);
+  static void jbyte_copy     (jbyte*  src, jbyte*  dest, size_t count);
+  static void jshort_copy    (jshort* src, jshort* dest, size_t count);
+  static void jint_copy      (jint*   src, jint*   dest, size_t count);
+  static void jlong_copy     (jlong*  src, jlong*  dest, size_t count);
+  static void oop_copy       (oop*    src, oop*    dest, size_t count);
+  static void oop_copy_uninit(oop*    src, oop*    dest, size_t count);
 
-  static void arrayof_jbyte_copy (HeapWord* src, HeapWord* dest, size_t count);
-  static void arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count);
-  static void arrayof_jint_copy  (HeapWord* src, HeapWord* dest, size_t count);
-  static void arrayof_jlong_copy (HeapWord* src, HeapWord* dest, size_t count);
-  static void arrayof_oop_copy   (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_jbyte_copy     (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_jshort_copy    (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_jint_copy      (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_jlong_copy     (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_oop_copy       (HeapWord* src, HeapWord* dest, size_t count);
+  static void arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count);
 };
 
 #endif // SHARE_VM_RUNTIME_STUBROUTINES_HPP
--- a/hotspot/src/share/vm/runtime/thread.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -3644,6 +3644,7 @@
   if (ShowMessageBoxOnError && is_error_reported()) {
     os::infinite_sleep();
   }
+  os::wait_for_keypress_at_exit();
 
   if (JDK_Version::is_jdk12x_version()) {
     // We are the last thread running, so check if finalizers should be run.
--- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -77,6 +77,7 @@
 # endif
 
 #ifdef LINUX
+#define __STDC_LIMIT_MACROS
 #include <inttypes.h>
 #include <signal.h>
 #include <ucontext.h>
--- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -148,6 +148,17 @@
 #endif
 #endif
 
+// On solaris 8, UINTPTR_MAX is defined as empty.
+// Everywhere else it's an actual value.
+#if UINTPTR_MAX - 1 == -1
+#undef UINTPTR_MAX
+#ifdef _LP64
+#define UINTPTR_MAX UINT64_MAX
+#else
+#define UINTPTR_MAX UINT32_MAX
+#endif /* ifdef _LP64 */
+#endif
+
 // Additional Java basic types
 
 typedef unsigned char      jubyte;
--- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -41,6 +41,7 @@
 # include <stdio.h> // for va_list
 # include <time.h>
 # include <fcntl.h>
+# include <limits.h>
 // Need this on windows to get the math constants (e.g., M_PI).
 #define _USE_MATH_DEFINES
 # include <math.h>
@@ -99,6 +100,14 @@
 typedef signed   int ssize_t;
 #endif
 
+#ifndef UINTPTR_MAX
+#ifdef _WIN64
+#define UINTPTR_MAX _UI64_MAX
+#else
+#define UINTPTR_MAX _UI32_MAX
+#endif
+#endif
+
 //----------------------------------------------------------------------------------------------------
 // Additional Java basic types
 
--- a/hotspot/src/share/vm/utilities/macros.hpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/utilities/macros.hpp	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -161,6 +161,14 @@
 #define NOT_WINDOWS(code) code
 #endif
 
+#ifdef _WIN64
+#define WIN64_ONLY(code) code
+#define NOT_WIN64(code)
+#else
+#define WIN64_ONLY(code)
+#define NOT_WIN64(code) code
+#endif
+
 #if defined(IA32) || defined(AMD64)
 #define X86
 #define X86_ONLY(code) code
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Fri Mar 18 17:56:47 2011 +0300
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Fri Mar 18 15:44:45 2011 -0700
@@ -802,7 +802,7 @@
     first_error_tid = mytid;
     set_error_reported();
 
-    if (ShowMessageBoxOnError) {
+    if (ShowMessageBoxOnError || PauseAtExit) {
       show_message_box(buffer, sizeof(buffer));
 
       // User has asked JVM to abort. Reset ShowMessageBoxOnError so the
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6942326/Test.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,409 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 6942326
+ * @summary x86 code in string_indexof() could read beyond reserved heap space
+ *
+ * @run main/othervm/timeout=300 -Xmx32m -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=exclude,Test,main -XX:CompileCommand=exclude,Test,test_varsub_indexof -XX:CompileCommand=exclude,Test,test_varstr_indexof -XX:CompileCommand=exclude,Test,test_missub_indexof -XX:CompileCommand=exclude,Test,test_consub_indexof -XX:CompileCommand=exclude,Test,test_conmis_indexof -XX:CompileCommand=exclude,Test,test_subcon Test
+ *
+ */
+
+public class Test {
+
+    static String[] strings = new String[1024];
+    private static final int ITERATIONS = 100000;
+
+    public static void main(String[] args) {
+
+        long start_total = System.currentTimeMillis();
+
+        // search variable size substring in string (33 chars).
+        String a = " 1111111111111xx1111111111111xx11y"; // +1 to execute a.substring(1) first
+        String b =  "1111111111111xx1111111111111xx11y";
+        test_varsub_indexof(a, b);
+
+        // search variable size substring in string (32 chars).
+        a = " 1111111111111xx1111111111111xx1y";
+        b =  "1111111111111xx1111111111111xx1y";
+        test_varsub_indexof(a, b);
+
+        // search variable size substring in string (17 chars).
+        a = " 1111111111111xx1y";
+        b =  "1111111111111xx1y";
+        test_varsub_indexof(a, b);
+
+        // search variable size substring in string (16 chars).
+        a = " 111111111111xx1y";
+        b =  "111111111111xx1y";
+        test_varsub_indexof(a, b);
+
+        // search variable size substring in string (8 chars).
+        a = " 1111xx1y";
+        b =  "1111xx1y";
+        test_varsub_indexof(a, b);
+
+        // search variable size substring in string (7 chars).
+        a = " 111xx1y";
+        b =  "111xx1y";
+        test_varsub_indexof(a, b);
+
+
+
+        // search substring (17 chars) in variable size string.
+        a =                 "1111111111111xx1x";
+        b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first
+        test_varstr_indexof(a, b);
+
+        // search substring (16 chars) in variable size string.
+        a =                  "111111111111xx1x";
+        b = " 1111111111111xx1111111111111xx1x";
+        test_varstr_indexof(a, b);
+
+        // search substring (9 chars) in variable size string.
+        a =                         "11111xx1x";
+        b = " 1111111111111xx1111111111111xx1x";
+        test_varstr_indexof(a, b);
+
+        // search substring (8 chars) in variable size string.
+        a =                          "1111xx1x";
+        b = " 1111111111111xx1111111111111xx1x";
+        test_varstr_indexof(a, b);
+
+        // search substring (4 chars) in variable size string.
+        a =                              "xx1x";
+        b = " 1111111111111xx1111111111111xx1x";
+        test_varstr_indexof(a, b);
+
+        // search substring (3 chars) in variable size string.
+        a =                               "x1x";
+        b = " 1111111111111xx1111111111111xx1x";
+        test_varstr_indexof(a, b);
+
+        // search substring (2 chars) in variable size string.
+        a =                                "1y";
+        b = " 1111111111111xx1111111111111xx1y";
+        test_varstr_indexof(a, b);
+
+
+
+        // search non matching variable size substring in string (33 chars).
+        a = " 1111111111111xx1111111111111xx11z"; // +1 to execute a.substring(1) first
+        b =  "1111111111111xx1111111111111xx11y";
+        test_missub_indexof(a, b);
+
+        // search non matching variable size substring in string (32 chars).
+        a = " 1111111111111xx1111111111111xx1z";
+        b =  "1111111111111xx1111111111111xx1y";
+        test_missub_indexof(a, b);
+
+        // search non matching variable size substring in string (17 chars).
+        a = " 1111111111111xx1z";
+        b =  "1111111111111xx1y";
+        test_missub_indexof(a, b);
+
+        // search non matching variable size substring in string (16 chars).
+        a = " 111111111111xx1z";
+        b =  "111111111111xx1y";
+        test_missub_indexof(a, b);
+
+        // search non matching variable size substring in string (8 chars).
+        a = " 1111xx1z";
+        b =  "1111xx1y";
+        test_missub_indexof(a, b);
+
+        // search non matching variable size substring in string (7 chars).
+        a = " 111xx1z";
+        b =  "111xx1y";
+        test_missub_indexof(a, b);
+
+
+
+        // Testing constant substring search in variable size string.
+
+        // search constant substring (17 chars).
+        b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first
+        TestCon tc = new TestCon17();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (16 chars).
+        b = " 1111111111111xx1111111111111xx1x";
+        tc = new TestCon16();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (9 chars).
+        b = " 1111111111111xx1111111111111xx1x";
+        tc = new TestCon9();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (8 chars).
+        b = " 1111111111111xx1111111111111xx1x";
+        tc = new TestCon8();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (4 chars).
+        b = " 1111111111111xx1111111111111xx1x";
+        tc = new TestCon4();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (3 chars).
+        b = " 1111111111111xx1111111111111xx1x";
+        tc = new TestCon3();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (2 chars).
+        b = " 1111111111111xx1111111111111xx1y";
+        tc = new TestCon2();
+        test_consub_indexof(tc, b);
+
+        // search constant substring (1 chars).
+        b = " 1111111111111xx1111111111111xx1y";
+        tc = new TestCon1();
+        test_consub_indexof(tc, b);
+
+
+        // search non matching constant substring (17 chars).
+        b = " 1111111111111xx1111111111111xx1z"; // +1 to execute b.substring(1) first
+        tc = new TestCon17();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (16 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon16();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (9 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon9();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (8 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon8();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (4 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon4();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (3 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon3();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (2 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon2();
+        test_conmis_indexof(tc, b);
+
+        // search non matching constant substring (1 chars).
+        b = " 1111111111111xx1111111111111xx1z";
+        tc = new TestCon1();
+        test_conmis_indexof(tc, b);
+
+        long end_total = System.currentTimeMillis();
+        System.out.println("End run time: " + (end_total - start_total));
+
+    }
+
+    public static long test_init(String a, String b) {
+        for (int i = 0; i < 512; i++) {
+            strings[i * 2] = new String(b.toCharArray());
+            strings[i * 2 + 1] = new String(a.toCharArray());
+        }
+        System.out.print(a.length() + " " + b.length() + " ");
+        return System.currentTimeMillis();
+    }
+
+    public static void test_end(String a, String b, int v, int expected, long start) {
+        long end = System.currentTimeMillis();
+        int res = (v/ITERATIONS);
+        System.out.print(" " + res);
+        System.out.println(" time:" + (end - start));
+        if (res != expected) {
+            System.out.println("wrong indexOf result: " + res + ", expected " + expected);
+            System.out.println("\"" + b + "\".indexOf(\"" + a + "\")");
+            System.exit(97);
+        }
+    }
+
+    public static int test_subvar() {
+        int s = 0;
+        int v = 0;
+        for (int i = 0; i < ITERATIONS; i++) {
+            v += strings[s].indexOf(strings[s + 1]);
+            s += 2;
+            if (s >= strings.length) s = 0;
+        }
+        return v;
+    }
+
+    public static void test_varsub_indexof(String a, String b) {
+        System.out.println("Start search variable size substring in string (" + b.length() + " chars)");
+        long start_it = System.currentTimeMillis();
+        int limit = 1; // last a.length() == 1
+        while (a.length() > limit) {
+            a = a.substring(1);
+            long start = test_init(a, b);
+            int v = test_subvar();
+            test_end(a, b, v, (b.length() - a.length()), start);
+        }
+        long end_it = System.currentTimeMillis();
+        System.out.println("End search variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it));
+    }
+
+    public static void test_varstr_indexof(String a, String b) {
+        System.out.println("Start search substring (" + a.length() + " chars) in variable size string");
+        long start_it = System.currentTimeMillis();
+        int limit = a.length();
+        while (b.length() > limit) {
+            b = b.substring(1);
+            long start = test_init(a, b);
+            int v = test_subvar();
+            test_end(a, b, v, (b.length() - a.length()), start);
+        }
+        long end_it = System.currentTimeMillis();
+        System.out.println("End search substring (" + a.length() + " chars) in variable size string, time: " + (end_it - start_it));
+    }
+
+    public static void test_missub_indexof(String a, String b) {
+        System.out.println("Start search non matching variable size substring in string (" + b.length() + " chars)");
+        long start_it = System.currentTimeMillis();
+        int limit = 1; // last a.length() == 1
+        while (a.length() > limit) {
+            a = a.substring(1);
+            long start = test_init(a, b);
+            int v = test_subvar();
+            test_end(a, b, v, (-1), start);
+        }
+        long end_it = System.currentTimeMillis();
+        System.out.println("End search non matching variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it));
+    }
+
+
+
+    public static void test_consub_indexof(TestCon tc, String b) {
+        System.out.println("Start search constant substring (" + tc.constr().length() + " chars)");
+        long start_it = System.currentTimeMillis();
+        int limit = tc.constr().length();
+        while (b.length() > limit) {
+            b = b.substring(1);
+            long start = test_init(tc.constr(), b);
+            int v = test_subcon(tc);
+            test_end(tc.constr(), b, v, (b.length() - tc.constr().length()), start);
+        }
+        long end_it = System.currentTimeMillis();
+        System.out.println("End search constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it));
+    }
+
+    public static void test_conmis_indexof(TestCon tc, String b) {
+        System.out.println("Start search non matching constant substring (" + tc.constr().length() + " chars)");
+        long start_it = System.currentTimeMillis();
+        int limit = tc.constr().length();
+        while (b.length() > limit) {
+            b = b.substring(1);
+            long start = test_init(tc.constr(), b);
+            int v = test_subcon(tc);
+            test_end(tc.constr(), b, v, (-1), start);
+        }
+        long end_it = System.currentTimeMillis();
+        System.out.println("End search non matching constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it));
+    }
+
+    public static int test_subcon(TestCon tc) {
+        int s = 0;
+        int v = 0;
+        for (int i = 0; i < ITERATIONS; i++) {
+            v += tc.indexOf(strings[s]);
+            s += 2;
+            if (s >= strings.length) s = 0;
+        }
+        return v;
+    }
+
+    private interface TestCon {
+        public String constr();
+        public int indexOf(String str);
+    }
+
+    // search constant substring (17 chars).
+    private final static class TestCon17 implements TestCon {
+        private static final String constr = "1111111111111xx1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (16 chars).
+    private final static class TestCon16 implements TestCon {
+        private static final String constr = "111111111111xx1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (9 chars).
+    private final static class TestCon9 implements TestCon {
+        private static final String constr = "11111xx1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (8 chars).
+    private final static class TestCon8 implements TestCon {
+        private static final String constr = "1111xx1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (4 chars).
+    private final static class TestCon4 implements TestCon {
+        private static final String constr = "xx1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (3 chars).
+    private final static class TestCon3 implements TestCon {
+        private static final String constr = "x1x";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+    // search constant substring (2 chars).
+    private final static class TestCon2 implements TestCon {
+        private static final String constr = "1y";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+
+
+    // search constant substring (1 chars).
+    private final static class TestCon1 implements TestCon {
+        private static final String constr = "y";
+        public String constr() { return constr; }
+        public int indexOf(String str) { return str.indexOf(constr); }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/6878713/Test6878713.sh	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+##
+## @test
+## @bug 6878713
+## @summary Verifier heap corruption, relating to backward jsrs
+## @run shell/timeout=120 Test6878713.sh
+##
+
+if [ "${TESTSRC}" = "" ]
+then TESTSRC=.
+fi
+
+if [ "${TESTJAVA}" = "" ]
+then
+  PARENT=`dirname \`which java\``
+  TESTJAVA=`dirname ${PARENT}`
+  echo "TESTJAVA not set, selecting " ${TESTJAVA}
+  echo "If this is incorrect, try setting the variable manually."
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+BIT_FLAG=""
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  SunOS | Linux )
+    NULL=/dev/null
+    PS=":"
+    FS="/"
+    ## for solaris, linux it's HOME
+    FILE_LOCATION=$HOME
+    if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
+    then
+        BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'`
+    fi
+    ;;
+  Windows_* )
+    NULL=NUL
+    PS=";"
+    FS="\\"
+    ;;
+  * )
+    echo "Unrecognized system!"
+    exit 1;
+    ;;
+esac
+
+JEMMYPATH=${CPAPPEND}
+CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
+
+THIS_DIR=`pwd`
+
+${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version
+
+${TESTJAVA}${FS}bin${FS}jar xvf ${TESTSRC}${FS}testcase.jar
+
+${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} OOMCrashClass1960_2 > test.out 2>&1
+
+if [ -s core -o -s "hs_*.log" ]
+then
+    cat hs*.log
+    echo "Test Failed"
+    exit 1
+else
+    echo "Test Passed"
+    exit 0
+fi
Binary file hotspot/test/runtime/6878713/testcase.jar has changed
--- a/jaxp/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/jaxp/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 f5b60c5a310f992c6ca627d17ca3e042f0e0b2c3 jdk7-b129
 ab107c1bc4b918404b191838c455e9b2892389f3 jdk7-b130
 eab6f27131e4e2f0af0016b35b18ae65cdd249d9 jdk7-b131
+abe04c59a556a3821c30bd8839e3c74f5d4281d1 jdk7-b132
+8e1148c7911b02e00a727461525f239da025cab7 jdk7-b133
--- a/jaxp/jaxp.properties	Fri Mar 18 17:56:47 2011 +0300
+++ b/jaxp/jaxp.properties	Fri Mar 18 15:44:45 2011 -0700
@@ -25,13 +25,13 @@
 
 drops.master.copy.base=${drops.dir}
 
-jaxp_src.bundle.name=jaxp-1_4_5-dev.zip
-jaxp_src.bundle.md5.checksum=84e2c26853262c9144133c6ff7ef5dc9
+jaxp_src.bundle.name=jaxp-1_4_5-dev1.zip
+jaxp_src.bundle.md5.checksum=53c95613c29852a12b93e7249f1aa227
 jaxp_src.master.bundle.dir=${drops.master.copy.base}
 jaxp_src.master.bundle.url.base=http://download.java.net/jaxp/1.4.5/dev
 
-jaxp_tests.bundle.name=jaxp-1_4_5-dev-unittests.zip
-jaxp_tests.bundle.md5.checksum=0377e715fa21814cb8006768c5967dc5
+jaxp_tests.bundle.name=jaxp-1_4_5-dev1-unittests.zip
+jaxp_tests.bundle.md5.checksum=754aaba2f4944f69bfea91dec11daf4c
 jaxp_tests.master.bundle.dir=${drops.master.copy.base}
 jaxp_tests.master.bundle.url.base=http://download.java.net/jaxp/1.4.5/dev
 
--- a/jaxp/make/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jaxp/make/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -136,7 +136,7 @@
 else
   ANT = ant
   ifneq ($(shell which $(ANT) > /dev/null; echo $$?), 0)
-    $(error "\"ant\" not found; please set ANT_HOME or put \"ant\" on your PATH")
+    $(error "'ant' not found; please set ANT_HOME or put 'ant' on your PATH")
   endif
 endif
 
--- a/jaxws/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/jaxws/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 0f7b39ad902424e949e3d2dca8411b884888a76f jdk7-b129
 ba1fac1c2083196422a12130db174334179a4d44 jdk7-b130
 438abc0356cd97d91b25f67cd1abc9883e22f6ed jdk7-b131
+0e57c3272d377eee04cc32c898e9a558051516b0 jdk7-b132
+359d0c8c00a02d3a094c19f8a485b2217c99a4e0 jdk7-b133
--- a/jaxws/make/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jaxws/make/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -136,7 +136,7 @@
 else
   ANT = ant
   ifneq ($(shell which $(ANT) > /dev/null; echo $$?), 0)
-    $(error "\"ant\" not found; please set ANT_HOME or put \"ant\" on your PATH")
+    $(error "'ant' not found; please set ANT_HOME or put 'ant' on your PATH")
   endif
 endif
 
--- a/jdk/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -107,3 +107,5 @@
 bdc069d3f9101f89ec3f81c2950ee2d68fa846d3 jdk7-b130
 8ac52c85f9e91336dc00b52ef90b42eecf3230b3 jdk7-b131
 6bbc7a4734952ae7604578f270e1566639fa8752 jdk7-b132
+5e5f68a01d12a4432172f384d5201f3a05254493 jdk7-b133
+554adcfb615e63e62af530b1c10fcf7813a75b26 jdk7-b134
--- a/jdk/make/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -74,7 +74,6 @@
 import_product    -- copy in the product components \n\
 import_fastdebug  -- copy in the fastdebug components \n\
 import_debug      -- copy in the debug components \n\
-modules           -- build the jdk and jre module images (experimental) \n\
 create_links      -- create softlinks in Solaris 32bit build to 64bit dirs \n\
 "
 
@@ -261,7 +260,6 @@
 # Release engineering targets.
 #
 include $(BUILDDIR)/common/Release.gmk
-include $(BUILDDIR)/common/Modules.gmk
 
 #
 # Cscope targets.
--- a/jdk/make/com/sun/crypto/provider/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/crypto/provider/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -249,7 +249,7 @@
 else
 $(JAR_DESTFILE): $(SIGNED_DIR)/sunjce_provider.jar
 endif
-	$(install-non-module-file)
+	$(install-file)
 
 ifndef OPENJDK
 install-prebuilt:
--- a/jdk/make/com/sun/java/pack/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/java/pack/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = pack200
 PACKAGE = com.sun.java.util.jar.pack
 LIBRARY = unpack
 PRODUCT = sun
@@ -156,7 +155,6 @@
 endif
 	$(CP) $(TEMPDIR)/unpack200$(EXE_SUFFIX) $(UNPACK_EXE)
 	@$(call binary_file_verification,$@)
-	$(install-module-file)
 
 ifeq ($(PLATFORM), windows) 
 $(RES):: $(VERSIONINFO_RESOURCE)
--- a/jdk/make/com/sun/java/pack/prop/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/java/pack/prop/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 # to a collision of rules with Classes.gmk and Library.gmk
 
 BUILDDIR = ../../../../..
-MODULE  = pack200
 PACKAGE = com.sun.java.util.jar.pack
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/jndi/cosnaming/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/jndi/cosnaming/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = jndi-cosnaming
 PACKAGE = com.sun.jndi.cosnaming
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/jndi/dns/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/jndi/dns/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = jndi-dns
 PACKAGE = com.sun.jndi.dns
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/jndi/ldap/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/jndi/ldap/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = jndi-ldap
 PACKAGE = com.sun.jndi.ldap
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/jndi/rmi/registry/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/jndi/rmi/registry/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../../..
-MODULE  = jndi-rmiregistry
 PACKAGE = com.sun.jndi.rmi.registry
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/nio/sctp/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/nio/sctp/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = sctp
 PACKAGE = com.sun.nio.sctp
 LIBRARY = sctp
 PRODUCT = sun
--- a/jdk/make/com/sun/org/apache/xml/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/org/apache/xml/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../../..
-MODULE  = security-xmldsig
 PACKAGE = com.sun.org.apache.xml
 PRODUCT = xml
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/rowset/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/rowset/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = jdbc-enterprise
 PACKAGE = com.sun.rowset
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/script/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/script/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -25,7 +25,6 @@
 
 
 BUILDDIR = ../../..
-MODULE  = scripting-rhino
 PACKAGE = com.sun.script
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/security/auth/module/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/security/auth/module/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -26,7 +26,6 @@
 # Makefile for building auth modules.
 
 BUILDDIR = ../../../../..
-MODULE  = security-auth
 PACKAGE = com.sun.security.auth.module
 PRODUCT = sun
 
--- a/jdk/make/com/sun/servicetag/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/servicetag/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -22,7 +22,6 @@
 # questions.
 
 BUILDDIR = ../../..
-MODULE  = servicetag
 PACKAGE = com.sun.servicetag
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/com/sun/tools/attach/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/com/sun/tools/attach/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -25,7 +25,6 @@
 
 
 BUILDDIR = ../../../..
-MODULE  = attach
 PACKAGE = com.sun.tools.attach
 LIBRARY = attach
 PRODUCT = sun
@@ -66,8 +65,7 @@
 	@$(MKDIR) -p $(@D)
 	@$(RM) $@
 	@$(CAT) $< | $(SED) -e "s/^#\[$(PLATFORM)\]//" > $@
-	@$(install-module-file)
-                                                                                                
+
 .PHONY: copy-files
 
 
--- a/jdk/make/common/Defs.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Defs.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -224,9 +224,6 @@
 # for generated class files
 CLASSBINDIR         = $(OUTPUTDIR)/classes
 DEMOCLASSDIR        = $(OUTPUTDIR)/democlasses
-# for modules
-MODULES_DIR         = $(OUTPUTDIR)/modules
-ABS_MODULES_DIR     = $(ABS_OUTPUTDIR)/modules
 # for generated tool class files
 BUILDTOOLCLASSDIR   = $(OUTPUTDIR)/btclasses
 # for build tool jar files
@@ -297,22 +294,6 @@
   endif
 endif
 
-#
-# Build units may or may not define MODULE.  Default to "other".
-#
-# MODULE variable defines the lowest-level module name that
-# might or might not be the name of the modules created in
-# the modules build (see make/modules/modules.config and
-# modules.group).
-#
-MODULES_TEMPDIR     = $(OUTPUTDIR)/tmp/modules
-ABS_MODULES_TEMPDIR = $(ABS_OUTPUTDIR)/tmp/modules
-
-ifndef MODULE
-  MODULE = other
-endif
-override MODULE_DEST_DIR = $(MODULES_TEMPDIR)/$(MODULE)
-
 # the use of += above makes a space separated list which we need to 
 # remove for filespecs.
 #
@@ -422,52 +403,13 @@
 #
 include $(JDK_MAKE_SHARED_DIR)/Defs-java.gmk
 
-#
-# Macros to find the module that $@ belongs to
-#
-
 UNIQUE_PATH_PATTERN = $(subst /,.,$(UNIQUE_PATH))
-MODULE_PATH_PATTERN = -e 's%.*\/classes\/%classes\/%' \
-		      -e 's%.*\/$(UNIQUE_PATH_PATTERN)\/%classes\/%' \
-		      -e 's%.*\/lib\/%lib\/%' \
-	              -e 's%.*\/bin\/%bin\/%' \
-	              -e 's%.*\/include\/%include\/%' \
-		      -e 's%.*\/demo\/%demo\/%' \
-		      -e 's%.*\/sample\/%sample\/%'
-
-# Install a file to its module
-define install-module-file
-dest=`echo $(@D)/ | $(SED) $(MODULE_PATH_PATTERN)` ; \
-$(MKDIR) -p $(MODULE_DEST_DIR)/$$dest; \
-$(CP) -f $@ $(MODULE_DEST_DIR)/$$dest
-endef
-
-# Install all files from the directory to its module
-define install-module-dir
-dest=`echo $(@D)/ | $(SED) $(MODULE_PATH_PATTERN)` ; \
-$(MKDIR) -p $(MODULE_DEST_DIR)/$$dest; \
-$(CP) -rf $(@D)/* $(MODULE_DEST_DIR)/$$dest
-endef
-
-# chmod the file in its module
-define chmod-module-file
-dest=`echo $@ | $(SED) $(MODULE_PATH_PATTERN)` ; \
-$(CHMOD) $1 $(MODULE_DEST_DIR)/$$dest
-endef
-
-# install a sym link in its module
-define install-module-sym-link
-dest=`echo $@ | $(SED) $(MODULE_PATH_PATTERN)` ; \
-$(LN) -sf $1 $(MODULE_DEST_DIR)/$$dest
-endef
-
 
 # Run MAKE $@ for a launcher:
 #   $(call make-launcher, name, mainclass, java-args, main-args)
 define make-launcher
 $(CD) $(BUILDDIR)/launchers && \
 $(MAKE) -f Makefile.launcher \
-        MODULE=$(MODULE) \
         PROGRAM=$(strip $1) \
         MAIN_CLASS=$(strip $2) \
         MAIN_JAVA_ARGS="$(strip $3)" \
@@ -488,28 +430,18 @@
 define install-file
 $(prep-target)
 $(CP) $< $@
-@$(install-module-file)
 endef
 
 define chmod-file
 $(CHMOD) $1 $@
-@$(call chmod-module-file, $1)
 endef
 
 define install-sym-link
 $(LN) -s $1 $@
-@$(call install-module-sym-link, $1)
-endef
-
-#
-# Marcos for files not belonging to any module 
-define install-non-module-file
-$(prep-target)
-$(CP) $< $@
 endef
 
 define install-manifest-file
-$(install-non-module-file)
+$(install-file)
 endef
 
 # Cleanup rule for after debug java run (hotspot.log file is left around)
@@ -577,7 +509,6 @@
 
 define install-import-file
 $(install-importonly-file)
-@$(install-module-file)
 endef
 
 .PHONY: all build clean clobber
--- a/jdk/make/common/Demo.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Demo.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -25,8 +25,6 @@
 
 # JDK Demo building jar file.
   
-MODULE = demos
-
 # Some names are defined with LIBRARY inside the Defs.gmk file
 LIBRARY=$(DEMONAME)
 OBJDIR=$(TEMPDIR)/$(DEMONAME)
@@ -120,8 +118,11 @@
 DEMO_ALL_NATIVE_SOURCES += $(filter %.hpp,$(DEMO_ALL_FILES))
 
 # If we have java sources, then define the jar file we will create
+ifndef DEMO_JAR_NAME
+  DEMO_JAR_NAME = $(DEMONAME).jar
+endif
 ifneq ($(strip $(DEMO_JAVA_SOURCES)),)
-  DEMO_JAR            = $(DEMO_DESTDIR)/$(DEMONAME).jar
+  DEMO_JAR            = $(DEMO_DESTDIR)/$(DEMO_JAR_NAME)
 endif
 
 # If we have native sources, define the native library we will create
@@ -254,6 +255,17 @@
 	$(MKDIR) -p $(DEMO_JAR_IMAGE)
 	$(JAVAC_CMD) -d $(DEMO_JAR_IMAGE) -sourcepath $(DEMO_BUILD_SRCDIR) \
 	    @$(DEMO_JAVAC_INPUT)
+  ifeq ($(DEMO_INCL_SRC),true)
+	$(CP) $(DEMO_JAVA_SOURCES:%=$(DEMO_BUILD_SRCDIR)/%) $(DEMO_JAR_IMAGE)
+  endif
+  ifeq ($(DEMO_ONLY_SRC),true)
+	$(RM) -r $(DEMO_JAR_IMAGE)
+	$(MKDIR) -p $(DEMO_JAR_IMAGE)
+	$(CP) -r $(DEMO_BUILD_SRCDIR)/* $(DEMO_JAR_IMAGE)
+    ifneq ($(DEMO_TOPFILES),)
+	$(CP) $(DEMO_ROOT)/$(DEMO_TOPFILES) $(DEMO_JAR_IMAGE)
+    endif
+  endif
 	$(BOOT_JAR_CMD) -cfm $@ $(DEMO_MANIFEST) \
 	     -C $(DEMO_JAR_IMAGE) . \
 	     $(BOOT_JAR_JFLAGS)
@@ -326,9 +338,9 @@
 ifdef DEMO_IS_APPLET
 	@$(ECHO) "Expanding jar file into demos area at $(DEMO_DESTDIR)"
 	( $(CD) $(DEMO_DESTDIR) && \
-	  $(BOOT_JAR_CMD) -xfv $(DEMONAME).jar \
+	  $(BOOT_JAR_CMD) -xfv $(DEMO_JAR_NAME) \
 	     $(BOOT_JAR_JFLAGS) && \
-	  $(RM) -r META-INF $(DEMONAME).jar  && \
+	  $(RM) -r META-INF $(DEMO_JAR_NAME) && \
 	  $(java-vm-cleanup) )
 	@( $(CD) $(DEMO_DESTDIR) && $(java-vm-cleanup) )
 	@$(ECHO) "Expanding source into demos area at $(DEMO_DESTDIR)"
--- a/jdk/make/common/Library.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Library.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -168,18 +168,9 @@
 	  $(OTHER_LCF) $(JAVALIB) $(LDLIBS)
 	$(CP) $(OBJDIR)/$(@F) $@
 	@$(call binary_file_verification,$@)
-	$(install-module-file)
 	$(CP) $(OBJDIR)/$(LIBRARY).map $(@D)
 	$(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D)
 
-$(ACTUAL_LIBRARY):: $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).map $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).pdb
-
-$(ACTUAL_LIBRARY_DIR)/%.map: FORCE
-	$(install-module-file)
-
-$(ACTUAL_LIBRARY_DIR)/%.pdb: FORCE
-	$(install-module-file)
-
 endif # LIBRARY
 
 $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m)
@@ -235,7 +226,6 @@
 else # LIBRARY
 	$(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS)
 	@$(call binary_file_verification,$@)
-	$(install-module-file)
 ifeq ($(WRITE_LIBVERSION),true)
 	$(MCS) -d -a "$(FULL_VERSION)" $@
 endif # WRITE_LIBVERSION
--- a/jdk/make/common/Modules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,454 +0,0 @@
-#
-# Copyright (c) 2009, 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.
-#
-
-JDK_MODULE_IMAGE_DIR = $(ABS_OUTPUTDIR)/jdk-module-image
-JRE_MODULE_IMAGE_DIR = $(ABS_OUTPUTDIR)/jre-module-image
-
-#
-# modules   Target to build jdk and jre module image
-#
-#           There is one jar file per module containing classes only.
-#           All module jars are currently placed under jre/lib directory.
-#
-# Open issues that need further investigation:
-# 1. Classes in jre/lib/ext/dnsns.jar are currently put in jre/lib/jndi-dns
-#    module.  META-INF/services file is not installed.
-# 2. Signed jars
-#    For JDK build, signed jars are copied to the build.
-#    All jars in the module image are unsigned.
-
-MODULE_IMAGEBINDIR = bin
-
-#
-# Targets.
-#
-INITIAL_MODULE_IMAGE_JRE=initial-module-image-jre
-INITIAL_MODULE_IMAGE_JDK=initial-module-image-jdk
-ifeq ($(PLATFORM), solaris)
-  ifeq ($(ARCH_DATA_MODEL), 64)
-    INITIAL_MODULE_IMAGE_JRE=initial-module-image-jre-sol64
-    INITIAL_MODULE_IMAGE_JDK=initial-module-image-jdk-sol64
-  endif
-endif
-
-modules modules-clobber \
-initial-module-image-jre initial-module-image-jdk \
-initial-module-image-jre-sol64 initial-module-image-jdk-sol64 \
-trim-module-image-jre trim-module-image-jdk \
-process-module-image-jre process-module-image-jdk ::
-	@$(ECHO) ">>>Making "$@" @ `$(DATE)` ..."
-
-# Order is important here, trim jre after jdk image is created
-modules:: gen-modules \
-	 sanity-module-images post-sanity-module-images  \
-	 $(INITIAL_MODULE_IMAGE_JRE) $(INITIAL_MODULE_IMAGE_JDK) \
-	 trim-module-image-jre trim-module-image-jdk \
-	 process-module-image-jre process-module-image-jdk
-
-# Don't use these
-module-image-jre:: initial-module-image-jre trim-module-image-jre process-module-image-jre
-module-image-jdk:: initial-module-image-jdk trim-module-image-jdk process-module-image-jdk
-
-#
-# Paths to these files we need
-JDK_MODULE_DOCFILES   = $(IMAGE_DOCLIST_JDK:%=$(JDK_MODULE_IMAGE_DIR)/%)
-JRE_MODULE_DOCFILES   = $(IMAGE_DOCLIST_JRE:%=$(JRE_MODULE_IMAGE_DIR)/%)
-
-###### RULES
-
-# JDK files
-$(JDK_MODULE_IMAGE_DIR)/%: $(SHARE_JDK_DOC_SRC)/%
-	$(process-doc-file)
-
-# JRE files 
-$(JRE_MODULE_IMAGE_DIR)/%: $(SHARE_JRE_DOC_SRC)/%
-	$(process-doc-file)
-ifeq ($(PLATFORM), windows)
-$(JRE_MODULE_IMAGE_DIR)/README.txt: $(SHARE_JRE_DOC_SRC)/README
-	$(process-doc-file)
-endif
-
-######################################################
-# JRE Image
-######################################################
-
-MODULES_LIST = $(MODULES_TEMPDIR)/classlist/modules.list
-
-# Modules in the jre/lib/security directory
-POLICY_MODULES = US_export_policy local_policy
-
-# Modules in the modules/ext directory
-EXT_MODULES = localedata security-sunec security-sunjce
-
-# Build PKCS#11 on all platforms except 64-bit Windows.
-PKCS11 = security-sunpkcs11
-ifeq ($(ARCH_DATA_MODEL), 64)
-  ifeq ($(PLATFORM), windows)
-    PKCS11 =
-  endif
-endif
-
-EXT_MODULES += $(PKCS11)
-
-# Build Microsoft CryptoAPI provider only on (non-64-bit) Windows platform.
-ifeq ($(PLATFORM), windows)
-  ifneq ($(ARCH_DATA_MODEL), 64)
-    EXT_MODULES += security-sunmscapi
-  endif
-endif
-
-# Modules for JDK only
-JDK_MODULES = tools
-
-gen-modules:
-	$(CD) modules; $(MAKE) all
-
-initial-module-image-jre-setup:
-	$(RM) -r $(JRE_MODULE_IMAGE_DIR)
-	$(MKDIR) -p $(JRE_MODULE_IMAGE_DIR)
-
-# 64-bit solaris jre image contains only the 64-bit add-on files.
-initial-module-image-jre-sol64:: initial-module-image-jre-setup
-	@# Use tar instead of cp to preserve the symbolic links
-	for dir in bin lib ; do \
-	  ( $(CD) $(OUTPUTDIR) && \
-		$(TAR) cf - `$(FIND) $$dir -name '$(ARCH)' -print` | \
-		($(CD) $(JRE_MODULE_IMAGE_DIR) && $(TAR) xf -) ) ; \
-	done
-	@# Remove some files from the jre area
-	for t in $(NOTJRETOOLS) ; do \
-	    $(RM) $(JRE_MODULE_IMAGE_DIR)/bin$(ISA_DIR)/$$t ; \
-	done
-	$(RM) `$(FIND) $(JRE_MODULE_IMAGE_DIR)/lib -name 'orb.idl'`
-	$(RM) `$(FIND) $(JRE_MODULE_IMAGE_DIR)/lib -name 'ir.idl'`
-
-# Construct an initial jre image (initial jdk jre) no trimming or stripping
-initial-module-image-jre:: initial-module-image-jre-setup \
-		    $(JRE_MODULE_DOCFILES) \
-		    $(BUILDMETAINDEX_JARFILE)
-	@# Copy in bin directory
-	$(CD) $(OUTPUTDIR) && $(FIND) bin -depth | $(CPIO) -pdum $(JRE_MODULE_IMAGE_DIR)
-	@# CTE plugin security change require new empty directory lib/applet
-	$(MKDIR) -p $(JRE_MODULE_IMAGE_DIR)/lib/applet
-	@# Copy files but not .jar in lib directory 
-	$(CD) $(OUTPUTDIR) && $(FIND) lib -depth | $(EGREP) -v ".jar$$" | $(CPIO) -pdum $(JRE_MODULE_IMAGE_DIR)
-	@#
-	@# copy modules to jre/lib
-	@#
-	for m in `$(NAWK) '{print $$1}' $(MODULES_LIST)` ; do \
-	    $(CP) $(MODULES_DIR)/$$m/lib/$$m.jar $(JRE_MODULE_IMAGE_DIR)/lib ; \
-	done
-	$(MKDIR) -p $(JRE_MODULE_IMAGE_DIR)/lib/ext
-	for m in $(EXT_MODULES) ; do \
-           $(MV) $(JRE_MODULE_IMAGE_DIR)/lib/$$m.jar $(JRE_MODULE_IMAGE_DIR)/lib/ext ; \
-        done
-	for m in $(POLICY_MODULES) ; do \
-           $(MV) $(JRE_MODULE_IMAGE_DIR)/lib/$$m.jar $(JRE_MODULE_IMAGE_DIR)/lib/security; \
-        done
-	@# Remove jdk modules
-	for m in $(JDK_MODULES) ; do \
-           $(RM) $(JRE_MODULE_IMAGE_DIR)/lib/$$m.jar ; \
-        done
-
-	@# Make sure all directories are read/execute for everyone
-	$(CHMOD) a+rx `$(FIND) $(JRE_MODULE_IMAGE_DIR) -type d`
-	@# Remove some files from the jre area
-	for t in $(NOTJRETOOLS) ; do \
-	    $(RM) $(JRE_MODULE_IMAGE_DIR)/bin$(ISA_DIR)/$$t ; \
-	done
-	@# Remove orb.idl and ir.idl from jre
-	$(FIND) $(JRE_MODULE_IMAGE_DIR)/lib -name 'orb.idl' -exec $(RM) \{} \;
-	$(FIND) $(JRE_MODULE_IMAGE_DIR)/lib -name 'ir.idl' -exec $(RM) \{} \;
-	@# Generate meta-index to make boot and extension class loaders lazier
-	$(CD) $(JRE_MODULE_IMAGE_DIR)/lib && \
-	    $(BOOT_JAVA_CMD) -jar $(BUILDMETAINDEX_JARFILE) \
-		-o meta-index *.jar
-	@$(CD) $(JRE_MODULE_IMAGE_DIR)/lib && $(java-vm-cleanup)
-	$(CD) $(JRE_MODULE_IMAGE_DIR)/lib/ext && \
-	    $(BOOT_JAVA_CMD) -jar $(BUILDMETAINDEX_JARFILE) \
-		-o meta-index *.jar
-	@$(CD) $(JRE_MODULE_IMAGE_DIR)/lib/ext && $(java-vm-cleanup)
-ifeq ($(PLATFORM), windows)
-	@# Remove certain *.lib files
-	$(CD) $(JRE_MODULE_IMAGE_DIR)/lib && \
-            $(RM) java.$(LIB_SUFFIX) jvm.$(LIB_SUFFIX) \
-                  awt.$(LIB_SUFFIX) jawt.$(LIB_SUFFIX)
-  ifeq ($(ARCH_DATA_MODEL), 32)
-	@# The Java Kernel JRE image ships with a special VM.  It is not included
-	@# in the full JRE image, so remove it.  Also, is it only for 32-bit windows.
-	$(CD) $(JRE_MODULE_IMAGE_DIR)/bin && $(RM) -r kernel
-  endif
-endif # Windows
-ifneq ($(PLATFORM), windows)
-	$(call copy-man-pages,$(JRE_MODULE_IMAGE_DIR),$(JRE_MAN_PAGES))
-endif # !windows
-
-# Trim out any extra files not for the jre shipment but wanted in the jdk jre.
-#   (Note the jdk WILL want the jre image before this trimming)
-#   Removes server VM on Windows 32bit.
-#   Remove certain shared libraries that should not be in the jre image
-#      but should be in the jdk jre image.
-trim-module-image-jre::
-ifeq ($(PLATFORM), windows)
-  ifeq ($(ARCH_DATA_MODEL), 32)
-	$(RM) -r $(JRE_MODULE_IMAGE_DIR)/bin/server
-  endif
-  ifdef NOTJRE_SHARED_LIBS
-	for l in $(NOTJRE_SHARED_LIBS) ; do \
-	    $(RM) $(JRE_MODULE_IMAGE_DIR)/bin/$$l ; \
-	done ;
-  endif
-else # PLATFORM
-  ifdef NOTJRE_SHARED_LIBS
-	for l in $(NOTJRE_SHARED_LIBS) ; do \
-	    $(RM) $(JRE_MODULE_IMAGE_DIR)/lib/$(LIBARCH)/$$l ; \
-	done ;
-  endif
-endif # PLATFORM
-
-# Get list of all Elf files in the jre
-JRE_MODULE_ELF_LIST=$(MODULES_TEMPDIR)/jre-elf-files.list
-$(JRE_MODULE_ELF_LIST):
-	@$(prep-target)
-ifneq ($(PLATFORM), windows)
-	$(RM) $@
-	$(FIND) $(JRE_MODULE_IMAGE_DIR)/lib -type f -name \*.$(LIB_SUFFIX) >> $@
-	$(FILE) `$(FIND) $(JRE_MODULE_IMAGE_DIR)/bin -type f -name \*$(EXE_SUFFIX)` \
-	    | $(EGREP) 'ELF' | $(CUT) -d':' -f1 >> $@
-endif
-
-# Post process the image (strips and mcs on Elf files we are shipping)
-#   (Note the jdk WILL want the jre image before this processing)
-process-module-image-jre:: $(JRE_MODULE_ELF_LIST)
-ifneq ($(POST_STRIP_PROCESS), )
-	for f in `$(CAT) $(JRE_MODULE_ELF_LIST)`; do \
-	  $(CHMOD) u+w $${f}; \
-	  $(ECHO) $(POST_STRIP_PROCESS) $${f}; \
-	  $(POST_STRIP_PROCESS) $${f}; \
-	  $(CHMOD) go-w $${f}; \
-	done
-endif
-ifneq ($(POST_MCS_PROCESS), )
-	for f in `$(CAT) $(JRE_MODULE_ELF_LIST)`; do \
-	  $(CHMOD) u+w $${f}; \
-	  $(ECHO) $(POST_MCS_PROCESS) $${f}; \
-	  $(POST_MCS_PROCESS) $${f}; \
-	  $(CHMOD) go-w $${f}; \
-	done
-endif
-	$(RM) $(JRE_MODULE_ELF_LIST)
-
-######################################################
-# JDK Image
-######################################################
-# Note: cpio ($(CPIO)) sometimes leaves directories without rx access.
-
-initial-module-image-jdk-setup:
-	$(RM) -r $(JDK_MODULE_IMAGE_DIR)
-	$(MKDIR) -p $(JDK_MODULE_IMAGE_DIR)/jre
-	($(CD) $(JRE_MODULE_IMAGE_DIR) && $(FIND) . -depth -print \
-	      | $(CPIO) -pdum $(JDK_MODULE_IMAGE_DIR)/jre )
-	$(RM) -rf $(JDK_MODULE_IMAGE_DIR)/jre/man
-	$(CHMOD) a+rx `$(FIND) $(JDK_MODULE_IMAGE_DIR) -type d`
-
-initial-module-image-jdk64-bindemos:
-	for dir in bin demo ; do \
-	  ( $(CD) $(OUTPUTDIR) && \
-		$(TAR) cf - `$(FIND) $$dir -name '$(LIBARCH)' -print` | \
-		($(CD) $(JDK_MODULE_IMAGE_DIR) && $(TAR) xf -) ) ; \
-        done
-
-# Solaris 64 bit image is special
-initial-module-image-jdk-sol64:: initial-module-image-jdk-setup \
-			  initial-module-image-jdk64-bindemos
-
-# DB files to add
-ifeq ($(OPENJDK),true)
-
-initial-module-image-jdk-db:
-
-else
-
-# Create the list of db *.zip files to bundle with jdk
-ABS_DB_PATH  :=$(call FullPath,$(CLOSED_SHARE_SRC)/db)
-DB_ZIP_LIST = $(shell $(LS) $(ABS_DB_PATH)/*.zip 2>/dev/null)
-
-initial-module-image-jdk-db: $(DB_ZIP_LIST)
-	$(MKDIR) -p $(JDK_MODULE_IMAGE_DIR)/db
-	for d in $(DB_ZIP_LIST); do \
-          ($(CD) $(JDK_MODULE_IMAGE_DIR)/db && $(UNZIP) -o $$d); \
-	done
-
-endif
-
-# Standard jdk image
-initial-module-image-jdk:: initial-module-image-jdk-setup \
-		    initial-module-image-jdk-db \
-		    $(JDK_MODULE_DOCFILES)
-	$(MKDIR) $(JDK_MODULE_IMAGE_DIR)/lib
-	@#
-	@# copy jdk modules to jdk/lib
-	@#
-	$(MKDIR) -p $(JDK_MODULE_IMAGE_DIR)/lib
-	for m in $(JDK_MODULES) ; do \
-	    $(CP) $(MODULES_DIR)/$$m/lib/$$m.jar $(JDK_MODULE_IMAGE_DIR)/lib ; \
-        done
-  ifeq ($(PLATFORM), windows)
-	@#
-	@# lib/
-	@#
-	$(CP) $(LIBDIR)/$(LIB_PREFIX)jvm.$(LIB_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/lib
-	$(CP) $(LIBDIR)/$(LIB_PREFIX)jawt.$(LIB_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/lib
-	@#
-	@# bin/
-	@#
-	@# copy all EXE files and only certain DLL files from BINDIR
-	$(MKDIR) -p $(JDK_MODULE_IMAGE_DIR)/bin
-	$(CP) $(BINDIR)/*$(EXE_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/bin
-	$(CP) $(BINDIR)/jli.$(LIBRARY_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/bin
-    ifeq ($(COMPILER_VERSION), VS2010)
-	$(CP) $(BINDIR)/msvc*100.$(LIBRARY_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/bin
-    endif
-    ifeq ($(ARCH_DATA_MODEL), 32)
-      ifeq ($(COMPILER_VERSION), VS2003)
-	$(CP) $(BINDIR)/msvc*71.$(LIBRARY_SUFFIX) $(JDK_MODULE_IMAGE_DIR)/bin
-      endif
-    endif
-  else # PLATFORM
-	@#
-	@# bin/
-	@#
-	($(CD) $(BINDIR)/.. && $(TAR) cf - \
-	    `$(FIND) bin \( -type f -o -type l \) -print `) | \
-	    ($(CD) $(JDK_MODULE_IMAGE_DIR) && $(TAR) xf -)
-  endif # PLATFORM
-	@#
-	@# lib/ct.sym
-	@#
-	$(MKDIR) -p $(OUTPUTDIR)/symbols/META-INF/sym
-	$(JAVAC_CMD) -XDprocess.packages -proc:only \
-	    -processor com.sun.tools.javac.sym.CreateSymbols \
-	    -Acom.sun.tools.javac.sym.Jar=$(RT_JAR) \
-	    -Acom.sun.tools.javac.sym.Dest=$(OUTPUTDIR)/symbols/META-INF/sym/rt.jar \
-	    $(CORE_PKGS) $(NON_CORE_PKGS) $(EXCLUDE_PROPWARN_PKGS)
-	$(BOOT_JAR_CMD) c0f $(LIBDIR)/ct.sym \
-	    -C $(OUTPUTDIR)/symbols META-INF $(BOOT_JAR_JFLAGS)
-	@$(java-vm-cleanup)
-	$(CP) $(LIBDIR)/ct.sym $(JDK_MODULE_IMAGE_DIR)/lib/ct.sym
-	@#
-	@# CORBA supported orb.idl and ir.idl should be copied to lib
-	@#
-	$(CP) $(LIBDIR)/orb.idl $(JDK_MODULE_IMAGE_DIR)/lib/orb.idl
-	$(CP) $(LIBDIR)/ir.idl $(JDK_MODULE_IMAGE_DIR)/lib/ir.idl
-  ifeq ($(PLATFORM), linux)
-	@#
-	@# on Linux copy jexec from jre/lib to /lib
-	@#
-	$(CP) $(LIBDIR)/jexec $(JDK_MODULE_IMAGE_DIR)/lib/jexec
-  endif # PLATFORM
-	@#
-	@# demo, include
-	@#
-	$(CP) -r -f $(DEMODIR) $(JDK_MODULE_IMAGE_DIR)
-	$(CP) -r -f $(SAMPLEDIR) $(JDK_MODULE_IMAGE_DIR)
-	$(CP) -r $(INCLUDEDIR) $(JDK_MODULE_IMAGE_DIR)
-	@#
-	@# Swing BeanInfo generation
-	@#
-	$(CD) javax/swing/beaninfo && $(MAKE) JDK_IMAGE_DIR=$(JDK_MODULE_IMAGE_DIR) swing-1.2-beans
-ifneq ($(PLATFORM), windows)
-	$(call copy-man-pages,$(JDK_MODULE_IMAGE_DIR),$(JDK_MAN_PAGES))
-endif # !windows
-
-# Trim out files we don't want to ship
-trim-module-image-jdk::
-	@# Remove tools that should not be part of SDK.
-	for t in $(NOTJDKTOOLS); do \
-	    $(RM) $(JDK_MODULE_IMAGE_DIR)/bin/$${t}$(EXE_SUFFIX); \
-	done
-
-# Get list of Elf files in the jdk
-JDK_MODULE_ELF_LIST=$(MODULES_TEMPDIR)/jdk-elf-files.list
-$(JDK_MODULE_ELF_LIST):
-	@$(prep-target)
-ifneq ($(PLATFORM), windows)
-	$(RM) $@
-	$(FIND) $(JDK_MODULE_IMAGE_DIR)/jre/lib -type f -name \*.$(LIB_SUFFIX) >> $@
-	$(FILE) `$(FIND) $(JDK_MODULE_IMAGE_DIR)/jre/bin -type f -name \*$(EXE_SUFFIX)` \
-	    | $(EGREP) 'ELF' | $(CUT) -d':' -f1 >> $@
-	file `$(FIND) $(JDK_MODULE_IMAGE_DIR)/bin -type f -name \*$(EXE_SUFFIX)` \
-	    | $(EGREP) 'ELF' | $(CUT) -d':' -f1 >> $@
-endif
-
-# Post process the image (strips and mcs on files we are shipping)
-process-module-image-jdk:: $(JDK_MODULE_ELF_LIST)
-ifneq ($(POST_STRIP_PROCESS), )
-	for f in `$(CAT) $(JDK_MODULE_ELF_LIST)`; do \
-	  $(CHMOD) u+w $${f}; \
-	  $(ECHO) $(POST_STRIP_PROCESS) $${f}; \
-	  $(POST_STRIP_PROCESS) $${f}; \
-	  $(CHMOD) go-w $${f}; \
-	done
-endif
-ifneq ($(POST_MCS_PROCESS), )
-	for f in `$(CAT) $(JDK_MODULE_ELF_LIST)`; do \
-	  $(CHMOD) u+w $${f}; \
-	  $(ECHO) $(POST_MCS_PROCESS) $${f}; \
-	  $(POST_MCS_PROCESS) $${f}; \
-	  $(CHMOD) go-w $${f}; \
-	done
-endif
-	$(RM) $(JDK_MODULE_ELF_LIST)
-
-######################################################
-# clobber
-######################################################
-modules-clobber::
-	$(RM) -r $(JDK_MODULE_IMAGE_DIR)
-	$(RM) -r $(JRE_MODULE_IMAGE_DIR)
-
-#
-# TODO - nop for now
-sanity-module-images post-sanity-module-images:
-
-modules modules-clobber::
-	@$(ECHO) ">>>Finished making "$@" @ `$(DATE)` ..."
-	@$(java-vm-cleanup)
-
-.PHONY: modules module-image-jre module-image-jdk \
-	initial-module-image-jre initial-module-image-jdk \
-	initial-module-image-jre-sol64 initial-module-image-jdk-sol64 \
-        initial-module-image-jdk-setup \
-	initial-module-image-jdk-db \
-        initial-module-image-jdk64-bindemos \
-        initial-module-image-jre-setup \
-	trim-module-image-jre trim-module-image-jdk \
-	process-module-image-jre process-module-image-jdk \
-	install-previous-jre install-previous-jdk \
-	modules-clobber
-
-# Force rule
-FRC:
-
--- a/jdk/make/common/Program.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Program.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -186,7 +186,6 @@
 	$(LINK_PRE_CMD) $(CC) $(CC_OBJECT_OUTPUT_FLAG)$@ $(LDFLAGS) \
 	    $(FILES_o) $(THREADLIBS) $(LDLIBS)
 	@$(call binary_file_verification,$@)
-	$(install-module-file)
 
 endif # PLATFORM
 
--- a/jdk/make/common/Release.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Release.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -60,9 +60,10 @@
 #
 # Include the exported private packages in ct.sym.
 # This is an interim solution until the ct.sym is replaced
-# with a new module system (being discussed for JDK 7).
+# with a new module system (being discussed for JDK 8).
 #
-EXPORTED_PRIVATE_PKGS = com.sun.servicetag
+EXPORTED_PRIVATE_PKGS = com.sun.servicetag \
+                        com.oracle.net
 
 # 64-bit solaris has a few special cases. We define the variable
 # SOLARIS64 for use in this Makefile to easily test those cases
@@ -86,8 +87,14 @@
   IMAGE_DOCLIST_JRE = LICENSE ASSEMBLY_EXCEPTION THIRD_PARTY_README
 else
   # Where to find these files
-  SHARE_JDK_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jdk
-  SHARE_JRE_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jre
+  ifeq ($(J4B), true)
+      SHARE_JDK_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jdkfb
+      SHARE_JRE_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jrefb
+  else
+      SHARE_JDK_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jdk
+      SHARE_JRE_DOC_SRC = $(CLOSED_SHARE_SRC)/doc/jre
+  endif
+
   IMAGE_DOCLIST_JDK = COPYRIGHT README.html  THIRDPARTYLICENSEREADME.txt
   IMAGE_DOCLIST_JRE = COPYRIGHT Welcome.html THIRDPARTYLICENSEREADME.txt
   ifeq ($(PLATFORM), windows)
@@ -125,10 +132,8 @@
 	unpack200.1
 
 ifndef OPENJDK
-ifeq ($(ARCH_DATA_MODEL),32)
   JRE_MAN_PAGES += javaws.1
 endif
-endif
 
 JDK_MAN_PAGES =            \
 	$(JRE_MAN_PAGES)   \
@@ -1100,7 +1105,7 @@
 
 # Common way to emit a line into the release or info file
 define info-file-item # name value
-$(PRINTF) "%s=\"%s\"\n" $1 $2 >> $@
+$(PRINTF) '%s="%s"\n' $1 $2 >> $@
 endef
 
 # Values to emit
--- a/jdk/make/common/Sanity.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Sanity.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -71,8 +71,7 @@
     sane-cacerts \
     sane-ant_version \
     sane-zip_version \
-    sane-msvcrt_path \
-    sane-build_modules
+    sane-msvcrt_path
 
 # The rules sanity-* have a one-to-one correspondence with the major targets
 # Each sanity-* rule should have no body to ensure that the post-sanity-* is the
--- a/jdk/make/common/Subdirs.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/Subdirs.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -40,9 +40,6 @@
 #
 # By default, subdirs specified in the SUBDIRS and all SUBDIRS_* 
 # variables will be built.
-# 
-# BUILD_MODULES variable can be used to specify one or more groups
-# to be built (BUILD_MODULES=all will build all groups).
 #
 # Variables of the currently supported groups are:
 #  SUBDIRS_desktop    
@@ -53,15 +50,12 @@
 # 
 # Change to the above list also need to update 
 # make/common/shared/Sanity.gmk.  NOTE: this list is subject
-# to change till the JDK 7 SE profiles/modules are finalized.
+# to change.
 # 
 # Eventually we want to restructure the make directory
 # according to these grouping (e.g. make/desktop/...) and
 # the SUBDIRS_<group> variables would not be needed.
 # 
-# To build the desktop and tools groups only, you can do:
-# gnumake BUILD_MODULES="desktop tools" ...
-# 
 
 # Iterate the subdirectories specified in $1.
 # - cd into each subdir and make them
@@ -96,77 +90,51 @@
 
 #
 # Iterate the list specified in SUBDIRS_<group> only if
-# SUBDIRS_<group> is set and <group> or "all" is specified
-# in the BUILD_MODULES variable
+# SUBDIRS_<group> is set.
 #
 ifdef SUBDIRS_desktop 
-  ifneq (,$(findstring desktop, $(BUILD_MODULES)))
-      define subdirs-desktop-loop
-         @$(call subdirs-group-loop,SUBDIRS_desktop)
-      endef
-  else
-    define subdirs-desktop-loop
-    endef
-  endif
+  define subdirs-desktop-loop
+      @$(call subdirs-group-loop,SUBDIRS_desktop)
+  endef
 else   
   define subdirs-desktop-loop
   endef
 endif   # SUBDIRS_desktop 
 
 ifdef SUBDIRS_enterprise 
-  ifneq (,$(findstring enterprise, $(BUILD_MODULES)))
-      define subdirs-enterprise-loop
-         @$(call subdirs-group-loop,SUBDIRS_enterprise)
-      endef
-  else
-    define subdirs-enterprise-loop
-    endef
-  endif
+  define subdirs-enterprise-loop
+      @$(call subdirs-group-loop,SUBDIRS_enterprise)
+  endef
 else   
 define subdirs-enterprise-loop
 endef
 endif   # SUBDIRS_enterprise 
 
 ifdef SUBDIRS_management 
-  ifneq (,$(findstring management, $(BUILD_MODULES)))
-      define subdirs-management-loop
-         @$(call subdirs-group-loop,SUBDIRS_management)
-      endef
-  else
-    define subdirs-management-loop
-    endef
-  endif
+  define subdirs-management-loop
+      @$(call subdirs-group-loop,SUBDIRS_management)
+  endef
 else   
-define subdirs-management-loop
-endef
+  define subdirs-management-loop
+  endef
 endif   # SUBDIRS_management 
 
 ifdef SUBDIRS_misc 
-  ifneq (,$(findstring misc, $(BUILD_MODULES)))
-      define subdirs-misc-loop
-         @$(call subdirs-group-loop,SUBDIRS_misc)
-      endef
-  else
-    define subdirs-misc-loop
-    endef
-  endif
+  define subdirs-misc-loop
+      @$(call subdirs-group-loop,SUBDIRS_misc)
+  endef
 else   
-define subdirs-misc-loop
-endef
+  define subdirs-misc-loop
+  endef
 endif   # SUBDIRS_misc 
 
 ifdef SUBDIRS_tools 
-  ifneq (,$(findstring tools, $(BUILD_MODULES)))
-      define subdirs-tools-loop
-         @$(call subdirs-group-loop,SUBDIRS_tools)
-      endef
-  else
-    define subdirs-tools-loop
-    endef
-  endif
+  define subdirs-tools-loop
+      @$(call subdirs-group-loop,SUBDIRS_tools)
+  endef
 else   
-define subdirs-tools-loop
-endef
+  define subdirs-tools-loop
+  endef
 endif   # SUBDIRS_tools 
 
 #
@@ -175,30 +143,6 @@
 SUBDIRS_all = $(SUBDIRS) $(SUBDIRS_desktop) $(SUBDIRS_enterprise) \
 	      $(SUBDIRS_management) $(SUBDIRS_misc) $(SUBDIRS_tools)
 
-ifndef BUILD_MODULES
-define SUBDIRS-loop
-  @$(call subdirs-group-loop,SUBDIRS_all)
-endef
-
-else
-
-ifneq (,$(findstring all, $(BUILD_MODULES)))
 define SUBDIRS-loop
   @$(call subdirs-group-loop,SUBDIRS_all)
 endef
-
-else # BUILD_MODULES set 
-#
-# Iterate SUBDIRS and the groups specified in BUILD_MODULES
-#
-define SUBDIRS-loop
-  @$(call subdirs-group-loop,SUBDIRS)
-  @$(subdirs-desktop-loop)
-  @$(subdirs-enterprise-loop)
-  @$(subdirs-management-loop)
-  @$(subdirs-misc-loop)
-  @$(subdirs-tools-loop)
-endef
-
-endif
-endif # BUILD_MODULES
--- a/jdk/make/common/shared/Compiler-msvc.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Compiler-msvc.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -153,6 +153,9 @@
   ifndef COMPILER_VERSION
     COMPILER_VERSION := $(error COMPILER_VERSION cannot be empty here)
   endif
+  ifneq ($(COMPILER_VERSION),VS2010)
+    COMPILER_VERSION := $(error COMPILER_VERSION must be VS2010)
+  endif
   
   # Shared library generation flag
   SHARED_LIBRARY_FLAG = -LD
--- a/jdk/make/common/shared/Defs-java.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Defs-java.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
   JAVA_MEM_FLAGS   += -Xms$(MIN_VM_MEMORY)m -XX:PermSize=32m -XX:MaxPermSize=160m
 endif
 
-# 
+#
 # All java tools (javac, javah, and javadoc) run faster with certain java
 #    options, this macro should be used with all these tools.
 #    In particular, the client VM makes these tools run faster when
@@ -122,6 +122,17 @@
   JAVACFLAGS  += -Werror
 endif
 
+#
+# Some licensees do not get the Security Source bundles.  We will
+# fall back on the prebuilt jce.jar so that we can do a best
+# attempt at building.  If sources exist, we always want to
+# build/use the most recent source instead of an older jce.jar, whether
+# built implicitly/explicitly.
+#
+ifeq ($(wildcard $(SHARE_SRC)/classes/javax/crypto/Cipher.java),)
+  JCEFLAGS = $(CLASSPATH_SEPARATOR)$(LIBDIR)/jce.jar
+endif
+
 # Add the source level
 SOURCE_LANGUAGE_VERSION = 7
 LANGUAGE_VERSION = -source $(SOURCE_LANGUAGE_VERSION)
@@ -132,11 +143,11 @@
 CLASS_VERSION = -target $(TARGET_CLASS_VERSION)
 JAVACFLAGS  += $(CLASS_VERSION)
 JAVACFLAGS  += -encoding ascii
-JAVACFLAGS  += "-Xbootclasspath:$(CLASSBINDIR)"
+JAVACFLAGS  += "-Xbootclasspath:$(CLASSBINDIR)$(JCEFLAGS)"
 JAVACFLAGS  += $(OTHER_JAVACFLAGS)
 
 # Needed for javah
-JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)
+JAVAHFLAGS += -bootclasspath "$(CLASSBINDIR)$(JCEFLAGS)"
 
 # Needed for javadoc to ensure it builds documentation
 # against the newly built classes
--- a/jdk/make/common/shared/Defs-javadoc.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Defs-javadoc.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -61,33 +61,11 @@
 EMPTY:=
 SPACE:=$(EMPTY) $(EMPTY)
 COPYRIGHT_SYMBOL = &\#x00a9;
-# Macros to handle the optional empty args.
+# Macro to construct the copyright line
 #   (The GNU make 3.78.1 "if" conditional is broken, fixed in GNU make 3.81)
-define OptionalCopyrightUrl # url
-$(shell \
-  if [ "$1" != "" ] ; then \
-    printf "<a href=\"%s\">Copyright</a>" "$1"; \
-  else \
-    printf "Copyright"; \
-  fi)
-endef
-define OptionalCopyrightFirstYear # year
-$(shell \
-  if [ "$1" != "" ] ; then \
-    printf "%s," "$1";\
-  fi)
-endef
-define OptionalCompanyAddress # address
-$(shell \
-  if [ "$1" != "" ] ; then \
-    printf "%s" "$1";\
-  fi)
-endef
 define CopyrightLine # optionalurl optionalfirstyear optionaladdress
-$(call OptionalCopyrightUrl,$1) $(COPYRIGHT_SYMBOL)\
-$(call OptionalCopyrightFirstYear,$2) $(COPYRIGHT_YEAR),\
-$(COMPANY_NAME).\
-$(call OptionalCompanyAddress,$3)\
-All rights reserved.
+$(if $(strip $1),<a href="$(strip $1)">Copyright</a>,Copyright) \
+$(COPYRIGHT_SYMBOL) $(if $2,$2${COMMA},) $(COPYRIGHT_YEAR),\
+$(FULL_COMPANY_NAME). $3 All rights reserved.
 endef
 
--- a/jdk/make/common/shared/Defs-utils.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Defs-utils.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -115,7 +115,6 @@
 PKGMK          = $(UTILS_COMMAND_PATH)pkgmk
 PRINTF         = $(UTILS_USR_BIN_PATH)printf
 PWD            = $(UTILS_COMMAND_PATH)pwd
-RC             = $(UTILS_COMMAND_PATH)rc
 READELF        = $(UTILS_USR_BIN_PATH)readelf
 RMDIR          = $(UTILS_COMMAND_PATH)rmdir
 RPM            = $(UTILS_COMMAND_PATH)rpm
@@ -135,6 +134,7 @@
 UNIQ           = $(UTILS_USR_BIN_PATH)uniq
 UNZIP          = $(UTILS_USR_BIN_PATH)unzip
 UNZIPSFX       = $(UTILS_DEVTOOL_PATH)unzipsfx
+XARGS          = $(UTILS_USR_BIN_PATH)xargs
 WC             = $(UTILS_USR_BIN_PATH)wc
 WHICH          = $(UTILS_USR_BIN_PATH)which
 YACC           = $(UTILS_CCS_BIN_PATH)yacc
--- a/jdk/make/common/shared/Defs.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Defs.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -218,7 +218,11 @@
 else
   LAUNCHER_NAME = java
   PRODUCT_NAME = Java(TM)
-  PRODUCT_SUFFIX = SE Runtime Environment
+  ifeq ($(J4B), true)
+    PRODUCT_SUFFIX = SE Runtime Environment for Business
+  else
+    PRODUCT_SUFFIX = SE Runtime Environment
+  endif
   JDK_RC_PLATFORM_NAME = Platform SE
   COMPANY_NAME = Oracle Corporation
 endif
--- a/jdk/make/common/shared/Platform.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Platform.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -148,7 +148,7 @@
   # Suffix for file bundles used in previous release
   BUNDLE_FILE_SUFFIX=.tar
   # How much RAM does this machine have:
-  MB_OF_MEMORY=$(shell /etc/prtconf | fgrep 'Memory size:' | expand | cut -d' ' -f3)
+  MB_OF_MEMORY=$(shell /usr/sbin/prtconf | fgrep 'Memory size:' | expand | cut -d' ' -f3)
 endif
 
 # Platform settings specific to Linux
--- a/jdk/make/common/shared/Sanity.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/common/shared/Sanity.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -113,7 +113,7 @@
   ALSA_INCLUDE=/usr/include/alsa/version.h
   ALSA_LIBRARY=/usr/lib/libasound.so
   _ALSA_VERSION := $(shell $(EGREP) SND_LIB_VERSION_STR $(ALSA_INCLUDE) | \
-           $(SED) -e 's@.*\"\(.*\)\".*@\1@' )
+           $(SED) -e 's@.*"\(.*\)".*@\1@' )
   ALSA_VERSION := $(call GetVersion,$(_ALSA_VERSION))
 endif
 
@@ -221,8 +221,7 @@
 	sane-zip_version \
 	sane-unzip_version \
  	sane-msvcrt_path \
-        sane-freetype \
-        sane-build_modules
+        sane-freetype
 
 ######################################################
 # check for COPYRIGHT_YEAR variable
@@ -334,12 +333,12 @@
 ifneq ($(PLATFORM), windows)
 	@if [ "$(LC_ALL)" != "" -a "$(LC_ALL)" != "C" ]; then \
 	  $(ECHO) "WARNING: LC_ALL has been set to $(LC_ALL), this can cause build failures. \n" \
-	    "        Try setting LC_ALL to \"C\". \n" \
+	    "        Try setting LC_ALL to 'C'. \n" \
 	    "" >> $(WARNING_FILE) ; \
         fi
 	@if [ "$(LANG)" != "" -a "$(LANG)" != "C" ]; then \
 	  $(ECHO) "WARNING: LANG has been set to $(LANG), this can cause build failures. \n" \
-	    "        Try setting LANG to \"C\". \n" \
+	    "        Try setting LANG to 'C'. \n" \
 	    "" >> $(WARNING_FILE) ; \
         fi
 endif
@@ -832,21 +831,6 @@
 endif
 
 ######################################################
-# if specified, BUILD_MODULES must contain valid values.
-######################################################
-MODULES_REGEX="all|base|desktop|management|enterprise|misc|tools"
-sane-build_modules:
-ifdef BUILD_MODULES
-	@for m in $(BUILD_MODULES) ; do \
-            valid=`$(ECHO) $$m | $(EGREP) $(MODULES_REGEX)`; \
-            if [ "x$$valid" = "x" ] ; then \
-                $(ECHO) "ERROR: $$m set in the BUILD_MODULES variable is invalid.\n" \
-                "" >> $(ERROR_FILE); \
-            fi \
-	done
-endif
-
-######################################################
 # CUPS_HEADERS_PATH must be valid
 ######################################################
 sane-cups:
@@ -1012,11 +996,6 @@
 	    "" >> $(ERROR_FILE) ; \
 	fi
   else
-    ifeq ($(wildcard $(REBASE)),)
-	@$(ECHO) "ERROR: Cannot find the REBASE utility from path: $(REBASE)\n" \
-	    "      This is normally obtained from the WINDOWSSDKDIR." \
-	    "" >> $(ERROR_FILE)
-    endif
     ifeq ($(wildcard $(RC)),)
 	@$(ECHO) "ERROR: Cannot find the RC utility from path: $(RC)\n" \
 	    "      This is normally obtained from the WINDOWSSDKDIR." \
@@ -1024,7 +1003,7 @@
     endif
     ifeq ($(wildcard $(DUMPBIN)),)
 	@$(ECHO) "ERROR: Cannot find the DUMPBIN utility from path: $(DUMPBIN)\n" \
-	    "      This is normally obtained from the WINDOWSSDKDIR." \
+	    "      This is normally obtained from the COMPILER_PATH." \
 	    "" >> $(ERROR_FILE)
     endif
   endif
@@ -1131,7 +1110,7 @@
 #    be checked when this represents a full control build (i.e. the
 #    HOTSPOT_IMPORT_PATH includes these files in it's 'include' directory).
 $(TEMPDIR)/%.h: $(SHARE_SRC)/javavm/export/%.h
-	@$(install-non-module-file)
+	@$(install-file)
 	@$(RM) $@.IMPORT
 	@if [ -r $(HOTSPOT_IMPORT_PATH)/include/$(@F) ]; then \
 	  $(CP) $(HOTSPOT_IMPORT_PATH)/include/$(@F) $@.IMPORT ; \
@@ -1145,7 +1124,7 @@
 	fi
 
 $(TEMPDIR)/%.h: $(PLATFORM_SRC)/javavm/export/%.h
-	@$(install-non-module-file)
+	@$(install-file)
 	@$(RM) $@.IMPORT
 	@if [ -r $(HOTSPOT_IMPORT_PATH)/include/$(PLATFORM_INCLUDE_NAME)/$(@F) ]; then \
 	  $(CP) $(HOTSPOT_IMPORT_PATH)/include/$(PLATFORM_INCLUDE_NAME)/$(@F) $@.IMPORT ; \
@@ -1348,9 +1327,9 @@
 	fi
 	@if [ "$(LINK_CHECK)" != "same" ]; then \
 	  $(ECHO) "WARNING: To build Java 2 SDK $(JDK_VERSION) you need : \n" \
-	    "      $(REQUIRED_COMPILER_VERSION) - link.exe version \"$(REQUIRED_LINK_VER)\" \n" \
+	    "      $(REQUIRED_COMPILER_VERSION) - link.exe version '$(REQUIRED_LINK_VER)' \n" \
 	      "      Specifically the $(REQUIRED_COMPILER_NAME) link.exe. \n " \
-	    "      $(YOU_ARE_USING) Linker version \"$(LINK_VER)\" \n" \
+	    "      $(YOU_ARE_USING) Linker version '$(LINK_VER)' \n" \
 	    "" >> $(WARNING_FILE) ; \
 	fi
 endif
--- a/jdk/make/docs/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/docs/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -43,7 +43,7 @@
 BUG_SUBMIT_URL = http://bugs.sun.com/services/bugreport/index.jsp
 
 # Common line for how to submit a bug or rfe
-BUG_SUBMIT_LINE = <a href=\"$(BUG_SUBMIT_URL)\">Submit a bug or feature</a>
+BUG_SUBMIT_LINE = <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a>
 
 # Url to devdocs page
 #   Was: http://java.sun.com/javase/6/webnotes/devdocs-vs-specs.html
@@ -166,24 +166,35 @@
 
 # Common bottom argument
 define CommonBottom # year
-<font size=\"-1\"><p> $(call CopyrightLine,,$1,)</font>
+<font size="-1"><br> $(call CopyrightLine,,$1,)</font>
 endef
 
 # Common trademark bottom argument (Not sure why this is used sometimes)
 define CommonTrademarkBottom # year
-<font size=\"-1\">\
+<font size="-1">\
 $(BUG_SUBMIT_LINE)<br>$(JAVA_TRADEMARK_LINE)<br>\
 $(call CopyrightLine,,$1,$(COMPANY_ADDRESS))\
 </font>
 endef
 
+# Common echo of option
+define OptionOnly # opt
+$(PRINTF) "%s\n" "$1"
+endef
+define OptionPair # opt arg
+$(PRINTF) "%s '%s'\n" "$1" '$2'
+endef
+define OptionTrip # opt arg arg
+$(PRINTF) "%s '%s' '%s'\n" "$1" '$2' '$3'
+endef
+
 # Core api bottom argument (with special sauce)
-COREAPI_BOTTOM = <font size=\"-1\"> $(BUG_SUBMIT_LINE)\
+COREAPI_BOTTOM = <font size="-1"> $(BUG_SUBMIT_LINE)\
 <br>For further API reference and developer documentation, \
-see <a href=\"$(DEV_DOCS_URL)\" target=\"_blank\">Java SE Documentation</a>. \
+see <a href="$(DEV_DOCS_URL)" target="_blank">Java SE Documentation</a>. \
 That documentation contains more detailed, developer-targeted descriptions, \
 with conceptual overviews, definitions of terms, workarounds, \
-and working code examples.<p>\
+and working code examples.<br>\
 $(call CopyrightLine,$(COPYRIGHT_URL),$(FIRST_COPYRIGHT_YEAR),)\
 </font>
 
@@ -212,11 +223,11 @@
     DRAFT_WINTITLE = $(BUILD_NUMBER)
     # Early access top text (not used in FCS releases)
     COREAPI_TOP_EARLYACCESS = \
-<div style=\"background-color: \#EEEEEE\"> \
-<div style=\"padding: 6px; margin-top: 2px; margin-bottom: 6px; \
+<div style="background-color: \#EEEEEE"> \
+<div style="padding: 6px; margin-top: 2px; margin-bottom: 6px; \
 margin-left: 6px; margin-right: 6px; text-align: justify; \
 font-size: 80%; font-family: Helvetica, Arial, sans-serif; \
-font-weight: normal;\"> \
+font-weight: normal;"> \
 Please note that the specifications and other information \
 contained herein are not final and are subject to change. \
 The information is being made available to you solely for purpose of \
@@ -281,15 +292,9 @@
 COREAPI_HEADER = \
 <strong>Java$(TRADEMARK)&nbsp;Platform<br>Standard&nbsp;Ed.&nbsp;$(JDK_MINOR_VERSION)</strong>
 
-# Ignored tags
-IGNORED_TAGS =	beaninfo revised since.unbundled spec specdefault Note ToDo
-
 # Java language specification cite
-JLS3_CITE = <a href=\"$(JLS3_URL)\"> \
-		The Java Language Specification, Third Edition</a>
-TAG_JLS3 = -tag 'jls3:a:See <cite>$(JLS3_CITE)</cite>:'
-
-TAGS = $(IGNORED_TAGS:%=-tag %:X) $(TAG_JLS3)
+TAG_JLS3 = jls3:a:See <cite><a href="$(JLS3_URL)"> \
+The Java Language Specification, Third Edition</a></cite>:
 
 # Overview file for core apis
 COREAPI_OVERVIEW = $(SHARE_SRC)/classes/overview-core.html
@@ -314,19 +319,26 @@
 # Create file with javadoc options in it
 $(COREAPI_OPTIONS_FILE): $(COREAPI_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "$(TAGS)"						; \
-	  $(ECHO) "-encoding ISO-8859-1"				; \
-	  $(ECHO) "-splitIndex"						; \
-	  $(ECHO) "-overview $(COREAPI_OVERVIEW)" 			; \
-	  $(ECHO) "-doctitle '$(COREAPI_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(COREAPI_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(COREAPI_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(COREAPI_BOTTOM)$(DRAFT_BOTTOM)'"		; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ISO-8859-1)			; \
+	  $(call OptionPair,-tag,beaninfo:X)				; \
+	  $(call OptionPair,-tag,revised:X)				; \
+	  $(call OptionPair,-tag,since.unbundled:X)			; \
+	  $(call OptionPair,-tag,spec:X)				; \
+	  $(call OptionPair,-tag,specdefault:X)				; \
+	  $(call OptionPair,-tag,Note:X)				; \
+	  $(call OptionPair,-tag,ToDo:X)				; \
+          $(call OptionPair,-tag,$(TAG_JLS3)) 				; \
+	  $(call OptionOnly,-splitIndex)				; \
+	  $(call OptionPair,-overview,$(COREAPI_OVERVIEW))		; \
+	  $(call OptionPair,-doctitle,$(COREAPI_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(COREAPI_WINDOWTITLE) $(DRAFT_WINTITLE)) ;\
+	  $(call OptionPair,-header,$(COREAPI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(COREAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
         ) >> $@
 ifdef COREAPI_TOP_EARLYACCESS
-	@$(ECHO) "-top '$(COREAPI_TOP_EARLYACCESS)'" >> $@
+	@$(call OptionPair,-top,$(COREAPI_TOP_EARLYACCESS)) >> $@
 endif
 
 # Create a file with the package names in it
@@ -375,16 +387,16 @@
 # Create file with javadoc options in it
 $(MIRROR_OPTIONS_FILE): $(MIRROR_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-overview $(MIRROR_OVERVIEW)" 			; \
-	  $(ECHO) "-doctitle '$(MIRROR_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(MIRROR_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(MIRROR_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(MIRROR_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-group $(MIRROR_GROUPNAME) $(MIRROR_REGEXP)"		; \
-	  $(ECHO) "-linkoffline $(MIRROR2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionPair,-overview,$(MIRROR_OVERVIEW))		; \
+	  $(call OptionPair,-doctitle,$(MIRROR_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(MIRROR_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(MIRROR_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(MIRROR_BOTTOM)$(DRAFT_BOTTOM)) 	; \
+	  $(call OptionTrip,-group,$(MIRROR_GROUPNAME),$(MIRROR_REGEXP)); \
+	  $(call OptionTrip,-linkoffline,$(MIRROR2COREAPI),$(COREAPI_DOCSDIR)); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -432,16 +444,16 @@
 # Create file with javadoc options in it
 $(DOCLETAPI_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-breakiterator"					; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-doctitle '$(DOCLETAPI_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(DOCLETAPI_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(DOCLETAPI_HEADER)$(DRAFT_HEADER)'"	; \
-	  $(ECHO) "-bottom '$(DOCLETAPI_BOTTOM)$(DRAFT_BOTTOM)'"	; \
-	  $(ECHO) "-group $(DOCLETAPI_GROUPNAME) $(DOCLETAPI_REGEXP)"	; \
-	  $(ECHO) "-linkoffline $(DOCLETAPI2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-breakiterator)				; \
+	  $(call OptionPair,-doctitle,$(DOCLETAPI_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(DOCLETAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(DOCLETAPI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(DOCLETAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-group,$(DOCLETAPI_GROUPNAME),$(DOCLETAPI_REGEXP)); \
+	  $(call OptionTrip,-linkoffline,$(DOCLETAPI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -492,13 +504,13 @@
 # Create file with javadoc options in it
 $(TAGLETAPI_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nonavbar"						; \
-	  $(ECHO) "-noindex"						; \
-	  $(ECHO) "-bottom '$(TAGLETAPI_BOTTOM)$(DRAFT_BOTTOM)'"			; \
-	  $(ECHO) "-linkoffline $(TAGLETAPI2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nonavbar)					; \
+	  $(call OptionOnly,-noindex)					; \
+	  $(call OptionPair,-bottom,$(TAGLETAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(TAGLETAPI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -543,16 +555,16 @@
 # Create file with javadoc options in it
 $(DOMAPI_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-splitIndex"						; \
-	  $(ECHO) "-doctitle '$(DOMAPI_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(DOMAPI_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(DOMAPI_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(DOMAPI_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-group $(DOMAPI_GROUPNAME) $(DOMAPI_REGEXP)"		; \
-	  $(ECHO) "-linkoffline $(DOMAPI2COREAPI) $(COREAPI_DOCSDIR)/" 	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-splitIndex)				; \
+	  $(call OptionPair,-doctitle,$(DOMAPI_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(DOMAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(DOMAPI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(DOMAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-group,$(DOMAPI_GROUPNAME),$(DOMAPI_REGEXP)); \
+	  $(call OptionTrip,-linkoffline,$(DOMAPI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -605,15 +617,15 @@
 # Create file with javadoc options in it
 $(JDI_OPTIONS_FILE): $(JDI_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-overview $(JDI_OVERVIEW)" 				; \
-	  $(ECHO) "-doctitle '$(JDI_DOCTITLE)'"				; \
-	  $(ECHO) "-windowtitle '$(JDI_WINDOWTITLE) $(DRAFT_WINTITLE)'"	; \
-	  $(ECHO) "-header '$(JDI_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(JDI_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(JDI2COREAPI) $(COREAPI_DOCSDIR)/" 	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionPair,-overview,$(JDI_OVERVIEW))			; \
+	  $(call OptionPair,-doctitle,$(JDI_DOCTITLE))			; \
+	  $(call OptionPair,-windowtitle,$(JDI_WINDOWTITLE) $(DRAFT_WINTITLE)); \
+	  $(call OptionPair,-header,$(JDI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(JDI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(JDI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -693,15 +705,15 @@
 # Create file with javadoc options in it
 $(JAAS_OPTIONS_FILE): $(JAAS_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-overview $(JAAS_OVERVIEW)" 				; \
-	  $(ECHO) "-doctitle '$(JAAS_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(JAAS_WINDOWTITLE) $(DRAFT_WINTITLE)'"; \
-	  $(ECHO) "-header '$(JAAS_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(JAAS_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(JAAS2COREAPI) $(COREAPI_DOCSDIR)/" 	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionPair,-overview,$(JAAS_OVERVIEW))			; \
+	  $(call OptionPair,-doctitle,$(JAAS_DOCTITLE))			; \
+	  $(call OptionPair,-windowtitle,$(JAAS_WINDOWTITLE) $(DRAFT_WINTITLE)); \
+	  $(call OptionPair,-header,$(JAAS_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(JAAS_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(JAAS2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -745,16 +757,16 @@
 # Create file with javadoc options in it
 $(JGSS_OPTIONS_FILE): $(JGSS_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-overview $(JGSS_OVERVIEW)" 				; \
-	  $(ECHO) "-doctitle '$(JGSS_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(JGSS_WINDOWTITLE) $(DRAFT_WINTITLE)'"; \
-	  $(ECHO) "-header '$(JGSS_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(JGSS_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(JGSS2COREAPI) $(COREAPI_DOCSDIR)/" 	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-overview,$(JGSS_OVERVIEW))			; \
+	  $(call OptionPair,-doctitle,$(JGSS_DOCTITLE))			; \
+	  $(call OptionPair,-windowtitle,$(JGSS_WINDOWTITLE) $(DRAFT_WINTITLE)); \
+	  $(call OptionPair,-header,$(JGSS_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(JGSS_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(JGSS2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -797,15 +809,15 @@
 # Create file with javadoc options in it
 $(SMARTCARDIO_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(SMARTCARDIO_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(SMARTCARDIO_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(SMARTCARDIO_HEADER)$(DRAFT_HEADER)'"	; \
-	  $(ECHO) "-bottom '$(SMARTCARDIO_BOTTOM)$(DRAFT_BOTTOM)'"	; \
-	  $(ECHO) "-linkoffline $(SMARTCARDIO2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(SMARTCARDIO_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(SMARTCARDIO_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(SMARTCARDIO_HEADER)$(DRAFT_HEADER)); \
+	  $(call OptionPair,-bottom,$(SMARTCARDIO_BOTTOM)$(DRAFT_BOTTOM)); \
+	  $(call OptionTrip,-linkoffline,$(SMARTCARDIO2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -847,15 +859,15 @@
 # Create file with javadoc options in it
 $(HTTPSERVER_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(HTTPSERVER_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(HTTPSERVER_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(HTTPSERVER_HEADER)$(DRAFT_HEADER)'"	; \
-	  $(ECHO) "-bottom '$(HTTPSERVER_BOTTOM)$(DRAFT_BOTTOM)'"	; \
-	  $(ECHO) "-linkoffline $(HTTPSERVER2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(HTTPSERVER_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(HTTPSERVER_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(HTTPSERVER_HEADER)$(DRAFT_HEADER)); \
+	  $(call OptionPair,-bottom,$(HTTPSERVER_BOTTOM)$(DRAFT_BOTTOM)); \
+	  $(call OptionTrip,-linkoffline,$(HTTPSERVER2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -907,16 +919,16 @@
 # Create file with javadoc options in it
 $(MGMT_OPTIONS_FILE): $(MGMT_OVERVIEW)
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-overview $(MGMT_OVERVIEW)" 				; \
-	  $(ECHO) "-doctitle '$(MGMT_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(MGMT_WINDOWTITLE) $(DRAFT_WINTITLE)'"; \
-	  $(ECHO) "-header '$(MGMT_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(MGMT_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(MGMT2COREAPI) $(COREAPI_DOCSDIR)/" 	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-overview,$(MGMT_OVERVIEW))			; \
+	  $(call OptionPair,-doctitle,$(MGMT_DOCTITLE))			; \
+	  $(call OptionPair,-windowtitle,$(MGMT_WINDOWTITLE) $(DRAFT_WINTITLE)); \
+	  $(call OptionPair,-header,$(MGMT_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(MGMT_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(MGMT2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -958,15 +970,15 @@
 # Create file with javadoc options in it
 $(ATTACH_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(ATTACH_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(ATTACH_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(ATTACH_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(ATTACH_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(ATTACH2COREAPI) $(COREAPI_DOCSDIR)/"	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(ATTACH_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(ATTACH_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(ATTACH_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(ATTACH_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(ATTACH2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -1008,15 +1020,15 @@
 # Create file with javadoc options in it
 $(JCONSOLE_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(JCONSOLE_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(JCONSOLE_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(JCONSOLE_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(JCONSOLE_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(JCONSOLE2COREAPI) $(COREAPI_DOCSDIR)/"; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(JCONSOLE_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(JCONSOLE_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(JCONSOLE_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(JCONSOLE_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(JCONSOLE2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -1063,15 +1075,15 @@
 # Create file with javadoc options in it
 $(TREEAPI_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-doctitle '$(TREEAPI_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(TREEAPI_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(TREEAPI_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(TREEAPI_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-group $(TREEAPI_GROUPNAME) $(TREEAPI_REGEXP)"	; \
-	  $(ECHO) "-linkoffline $(TREEAPI2COREAPI) $(COREAPI_DOCSDIR)/"	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionPair,-doctitle,$(TREEAPI_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(TREEAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(TREEAPI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(TREEAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-group,$(TREEAPI_GROUPNAME),$(TREEAPI_REGEXP)); \
+	  $(call OptionTrip,-linkoffline,$(TREEAPI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -1113,15 +1125,15 @@
 # Create file with javadoc options in it
 $(SCTPAPI_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(SCTPAPI_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(SCTPAPI_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(SCTPAPI_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(SCTPAPI_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(SCTPAPI2COREAPI) $(COREAPI_DOCSDIR)/"	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(SCTPAPI_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(SCTPAPI_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(SCTPAPI_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(SCTPAPI_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(SCTPAPI2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
@@ -1163,15 +1175,15 @@
 # Create file with javadoc options in it
 $(TRACING_OPTIONS_FILE):
 	$(prep-target)
-	@($(ECHO) "$(COMMON_JAVADOCFLAGS)"				; \
-	  $(ECHO) "-sourcepath \"$(RELEASEDOCS_SOURCEPATH)\""		; \
-	  $(ECHO) "-encoding ascii"					; \
-	  $(ECHO) "-nodeprecatedlist"					; \
-	  $(ECHO) "-doctitle '$(TRACING_DOCTITLE)'"			; \
-	  $(ECHO) "-windowtitle '$(TRACING_WINDOWTITLE) $(DRAFT_WINTITLE)'";\
-	  $(ECHO) "-header '$(TRACING_HEADER)$(DRAFT_HEADER)'"		; \
-	  $(ECHO) "-bottom '$(TRACING_BOTTOM)$(DRAFT_BOTTOM)'"		; \
-	  $(ECHO) "-linkoffline $(TRACING2COREAPI) $(COREAPI_DOCSDIR)/"	; \
+	@($(call OptionOnly,$(COMMON_JAVADOCFLAGS))			; \
+	  $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH))	; \
+	  $(call OptionPair,-encoding,ascii)				; \
+	  $(call OptionOnly,-nodeprecatedlist)				; \
+	  $(call OptionPair,-doctitle,$(TRACING_DOCTITLE))		; \
+	  $(call OptionPair,-windowtitle,$(TRACING_WINDOWTITLE) $(DRAFT_WINTITLE));\
+	  $(call OptionPair,-header,$(TRACING_HEADER)$(DRAFT_HEADER))	; \
+	  $(call OptionPair,-bottom,$(TRACING_BOTTOM)$(DRAFT_BOTTOM))	; \
+	  $(call OptionTrip,-linkoffline,$(TRACING2COREAPI),$(COREAPI_DOCSDIR)/); \
         ) >> $@
 
 # Create a file with the package names in it
--- a/jdk/make/docs/NON_CORE_PKGS.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/docs/NON_CORE_PKGS.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -91,8 +91,6 @@
 TRACING_PKGS     = com.sun.tracing         \
                    com.sun.tracing.dtrace
 
-ORACLENET_PKGS   = com.oracle.net
-
 # non-core packages in rt.jar
 NON_CORE_PKGS    = $(DOMAPI_PKGS) \
                    $(MGMT_PKGS) \
@@ -103,6 +101,5 @@
                    $(HTTPSERVER_PKGS) \
                    $(SMARTCARDIO_PKGS) \
                    $(TRACING_PKGS) \
-                   $(SCTPAPI_PKGS) \
-                   $(ORACLENET_PKGS)
+                   $(SCTPAPI_PKGS)
 
--- a/jdk/make/java/awt/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/awt/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = awt
 PACKAGE = java.awt
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/java/fdlibm/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/fdlibm/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -31,7 +31,6 @@
 #
 
 BUILDDIR     = ../..
-MODULE       = base
 LIBRARY      = fdlibm
 PRODUCT      = java
 
--- a/jdk/make/java/instrument/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/instrument/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,6 @@
 # agent, supporting java.lang.instrument
 
 BUILDDIR = ../..
-MODULE  = instrument
 PACKAGE = sun.instrument
 LIBRARY = instrument
 PRODUCT = sun
--- a/jdk/make/java/java/FILES_java.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/java/FILES_java.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -466,7 +466,6 @@
     java/security/ProtectionDomain.java \
     java/net/URLClassLoader.java \
     java/net/URLConnection.java \
-    sun/misc/BootClassLoaderHook.java \
     sun/misc/Launcher.java \
     sun/misc/MetaIndex.java \
     sun/misc/URLClassPath.java \
--- a/jdk/make/java/java/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/java/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = java.lang
 LIBRARY = java
 PRODUCT = java
@@ -244,7 +243,7 @@
 
 $(GENSRCDIR)/java/lang/UNIXProcess.java: \
     $(PLATFORM_SRC)/classes/java/lang/UNIXProcess.java.$(PLATFORM)
-	$(install-non-module-file)
+	$(install-file)
 
 clean:: 
 	$(RM) $(GENSRCDIR)/java/lang/UNIXProcess.java
@@ -318,7 +317,6 @@
 	$(BOOT_JAVA_CMD) -jar $(GENERATECURRENCYDATA_JARFILE) -o $@.temp \
 		< $(SHARE_SRC)/classes/java/util/CurrencyData.properties
 	$(MV) $@.temp $@
-	$(install-module-file)
 	$(call chmod-file, 444)
 
 clean:: 
@@ -373,7 +371,7 @@
 		-usecharforbyte 11 4 1
 
 $(GENSRCDIR)/java/lang/%.java : $(CHARACTERDATA)/%.java.template
-	$(install-non-module-file)
+	$(install-file)
 
 clean::
 	$(RM) $(GENSRCDIR)/java/lang/CharacterDataLatin1.java 
--- a/jdk/make/java/java_crw_demo/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/java_crw_demo/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -25,7 +25,6 @@
 
 BUILDDIR = ../..
 
-MODULE  = demos
 LIBRARY = java_crw_demo
 PRODUCT = sun
 LIBRARY_OUTPUT = java_crw_demo
--- a/jdk/make/java/java_hprof_demo/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/java_hprof_demo/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = instrument
 LIBRARY = hprof
 PRODUCT = sun
 LIBRARY_OUTPUT = hprof_jvmti
--- a/jdk/make/java/jli/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/jli/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -30,7 +30,6 @@
 # its manifestations (java, javaw, javac, ...).
 #
 BUILDDIR = ../..
-MODULE  = base
 LIBRARY = jli
 PRODUCT = java
 
--- a/jdk/make/java/jvm/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/jvm/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE   = base
 
 include $(BUILDDIR)/common/Defs.gmk
 
@@ -39,10 +38,10 @@
 	  $(INCLUDEDIR)/classfile_constants.h
 
 $(INCLUDEDIR)/%.h: $(SHARE_SRC)/javavm/export/%.h
-	$(install-non-module-file)
+	$(install-file)
 
 $(PLATFORM_INCLUDE)/%.h: $(PLATFORM_SRC)/javavm/export/%.h
-	$(install-non-module-file)
+	$(install-file)
 
 JVMCFG = $(LIBDIR)/$(LIBARCH)/jvm.cfg
 
--- a/jdk/make/java/logging/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/logging/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = logging
 PACKAGE = java.util.logging
 PRODUCT = java
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/java/main/java/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/main/java/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = base
 PROGRAM = java
 PRODUCT = java
 
--- a/jdk/make/java/main/javaw/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/main/javaw/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = base
 PROGRAM = javaw
 PRODUCT = java
 
--- a/jdk/make/java/management/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/management/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = management
 PACKAGE = java.lang.management
 LIBRARY = management
 PRODUCT = java
--- a/jdk/make/java/net/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/net/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = java.net
 LIBRARY = net
 PRODUCT = sun
--- a/jdk/make/java/nio/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/nio/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = nio
 PACKAGE = java.nio
 LIBRARY = nio
 PRODUCT = java
@@ -304,11 +303,7 @@
 # Rules
 #
 
-SUBDIRS_management = mxbean
-include $(BUILDDIR)/common/Subdirs.gmk
-
 build: sources
-	$(SUBDIRS-loop)
 
 clean clobber::
 	$(RM) -r $(NIO_GEN) $(SNIO_GEN)
@@ -821,7 +816,7 @@
 	$(NAWK) '/^.*Copyright.*Oracle/ { printf "%s %s",$$4,$$5 }') 
 
 $(TEMPDIR)/$(GENSOR_SRC) : $(GENSOR_SRC)
-	$(install-non-module-file)
+	$(install-file)
 
 $(GENSOR_EXE) : $(TEMPDIR)/$(GENSOR_SRC)
 	$(prep-target)
--- a/jdk/make/java/nio/mxbean/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-#
-# 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.
-#
-
-BUILDDIR = ../../..
-MODULE   = management
-PACKAGE  = java.nio
-PRODUCT  = java
-include $(BUILDDIR)/common/Defs.gmk
-
-FILES_java = java/nio/BufferPoolMXBean.java
-
-include $(BUILDDIR)/common/Classes.gmk
--- a/jdk/make/java/npt/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/npt/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -26,7 +26,6 @@
 BUILDDIR = ../..
 
 # It's currently used by jpda and hprof.  Put it in base module for now.
-MODULE  = base
 LIBRARY = npt
 PRODUCT = sun
 LIBRARY_OUTPUT = npt
--- a/jdk/make/java/redist/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/redist/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -35,7 +35,6 @@
 # 
 
 BUILDDIR = ../..
-MODULE   = base
 PRODUCT  = java
 include $(BUILDDIR)/common/Defs.gmk
 
@@ -122,32 +121,26 @@
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVMMAP_NAME):
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_CLIENT_PATH)/$(JVMMAP_NAME)  $@
-	@$(install-module-file)
 
 $(LIB_LOCATION)/$(KERNEL_LOCATION)/$(JVMMAP_NAME):
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_KERNEL_PATH)/$(JVMMAP_NAME)  $@
-	@$(install-module-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/$(JVMMAP_NAME):
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_SERVER_PATH)/$(JVMMAP_NAME) $@
-	@$(install-module-file)
 
 $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVMPDB_NAME):
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_CLIENT_PATH)/$(JVMPDB_NAME)  $@
-	@$(install-module-file)
 
 $(LIB_LOCATION)/$(KERNEL_LOCATION)/$(JVMPDB_NAME):
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_KERNEL_PATH)/$(JVMPDB_NAME)  $@
-	@$(install-module-file)
 
 $(LIB_LOCATION)/$(SERVER_LOCATION)/$(JVMPDB_NAME): 
 	@$(prep-target)
 	-$(CP) $(HOTSPOT_SERVER_PATH)/$(JVMPDB_NAME) $@
-	@$(install-module-file)
 
 #  Windows     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  Windows
 else # PLATFORM
@@ -291,7 +284,7 @@
 
 $(LIBDIR)/jce.jar: \
 	    $(BUILDDIR)/closed/tools/crypto/jce/jce.jar
-	$(install-non-module-file)
+	$(install-file)
 $(LIBDIR)/security/US_export_policy.jar: \
 	    $(BUILDDIR)/closed/tools/crypto/jce/US_export_policy.jar
 	$(install-file)
--- a/jdk/make/java/redist/fonts/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/redist/fonts/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE   = font
 PRODUCT  = java
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/java/redist/sajdi/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/redist/sajdi/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE   = sajdi
 PRODUCT  = java
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/java/security/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/security/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = java.security
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/java/sql/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/sql/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jdbc-base
 PACKAGE = java.sql
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/java/text/base/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/text/base/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = base
 PACKAGE = java.text
 PRODUCT = sun
 
--- a/jdk/make/java/verify/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/verify/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PRODUCT = java
 LIBRARY = verify
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/java/zip/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/java/zip/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -25,7 +25,6 @@
 
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = java.util.zip
 LIBRARY = zip
 PRODUCT = sun
--- a/jdk/make/javax/crypto/Defs-jce.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/crypto/Defs-jce.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -83,7 +83,7 @@
 
 define release-warning
 	@$(ECHO) \
-	    "\n***The jar files built by the \"release\" target must***" \
+	    "\n***The jar files built by the 'release' target must***" \
 	    "\n***still be checked into the closed workspace!     ***" \
 	    $(README-MAKEFILE_WARNING)
 endef
--- a/jdk/make/javax/crypto/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/crypto/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -108,7 +108,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = javax.crypto
 PRODUCT = sun
 
@@ -294,7 +293,7 @@
 
 $(UNSIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar:		\
 	    $(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar
-	$(install-non-module-file)
+	$(install-file)
 
 $(UNSIGNED_POLICY_BUILDDIR)/limited/local_policy.jar:			\
 	    policy/limited/default_local.policy				\
@@ -415,7 +414,7 @@
 else
 $(JAR_DESTFILE): $(SIGNED_DIR)/jce.jar
 endif
-	$(install-non-module-file)
+	$(install-file)
 
 #
 # Install the appropriate policy file, depending on the type of build.
@@ -435,7 +434,7 @@
 	    $(POLICY_DESTDIR)/local_policy.jar
 	$(CP) $^ $(POLICY_DESTDIR)
 
-install-limited: install-limited-jars install-module-files
+install-limited: install-limited-jars
 ifndef OPENJDK
 	$(release-warning)
 endif
@@ -449,7 +448,7 @@
 	    $(POLICY_DESTDIR)/local_policy.jar
 	$(CP) $^ $(POLICY_DESTDIR)
 
-install-unlimited: install-unlimited-jars install-module-files
+install-unlimited: install-unlimited-jars
 ifndef OPENJDK
 	$(release-warning)
 endif
@@ -466,16 +465,9 @@
 	    $(PREBUILT_DIR)/jce/local_policy.jar \
 	    $(POLICY_DESTDIR)
 
-install-prebuilt: install-prebuilt-jars install-module-files
+install-prebuilt: install-prebuilt-jars
 endif
 
-install-module-files: \
-	   $(POLICY_DESTDIR)/US_export_policy.jar \
-	   $(POLICY_DESTDIR)/local_policy.jar
-
-$(POLICY_DESTDIR)/%.jar :
-	$(install-module-file)
-
 # =====================================================
 # Support routines.
 #
--- a/jdk/make/javax/imageio/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/imageio/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = imageio
 PACKAGE = javax.imageio
 PRODUCT = jiio
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/javax/print/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/print/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = print
 PACKAGE = javax.print
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/javax/sound/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/sound/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = sound
 PACKAGE = javax.sound
 LIBRARY = jsound
 PRODUCT = sun
--- a/jdk/make/javax/sound/jsoundalsa/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/sound/jsoundalsa/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = sound
 PACKAGE = javax.sound
 LIBRARY = jsoundalsa
 PRODUCT = sun
--- a/jdk/make/javax/sound/jsoundds/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/sound/jsoundds/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = sound
 PACKAGE = javax.sound
 LIBRARY = jsoundds
 PRODUCT = sun
--- a/jdk/make/javax/sql/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/sql/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jdbc-enterprise
 PACKAGE = javax.sql
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/javax/swing/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/swing/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR  = ../..
-MODULE    = swing
 PACKAGE   = javax.swing
 PRODUCT   = com
 SWING_SRC = $(SHARE_SRC)/classes/javax/swing
--- a/jdk/make/javax/swing/plaf/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/javax/swing/plaf/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR  = ../../..
-MODULE    = swing
 PACKAGE   = javax.swing.plaf
 PRODUCT   = com
 SWING_SRC = $(SHARE_SRC)/classes/javax/swing
--- a/jdk/make/jpda/back/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/jpda/back/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = debugging
 LIBRARY = jdwp
 PRODUCT = jpda
 
--- a/jdk/make/jpda/transport/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/jpda/transport/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = debugging
 PRODUCT = jpda
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/jpda/transport/shmem/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/jpda/transport/shmem/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE   = debugging
 LIBRARY  = dt_shmem
 PRODUCT = jbug
 
--- a/jdk/make/jpda/transport/socket/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/jpda/transport/socket/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = debugging
 LIBRARY = dt_socket
 PRODUCT = jbug
 
--- a/jdk/make/jpda/tty/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/jpda/tty/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jdb
 PACKAGE = com.sun.tools.example.debug.tty
 PRODUCT = jpda
 PROGRAM = jdb
--- a/jdk/make/launchers/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/launchers/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ..
-MODULE  = tools
 PACKAGE = launchers
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
@@ -38,7 +37,6 @@
 define make-corba-launcher
 $(CD) $(BUILDDIR)/launchers && \
 $(MAKE) -f Makefile.launcher \
-        MODULE=corba \
         PROGRAM=$(strip $1) \
         MAIN_CLASS=$(strip $2) \
         MAIN_JAVA_ARGS="$(strip $3)" \
--- a/jdk/make/mkdemo/jfc/SwingSet2/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mkdemo/jfc/SwingSet2/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -37,6 +37,7 @@
 DEMO_MAINCLASS  = $(DEMONAME)
 DEMO_MANIFEST_ATTR = SplashScreen-Image: resources/images/splash.png
 DEMO_DESTDIR    = $(DEMODIR)/jfc/$(DEMONAME)
+DEMO_INCL_SRC   = true
 
 #
 # Demo jar building rules.
--- a/jdk/make/mkdemo/jpda/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mkdemo/jpda/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -32,6 +32,8 @@
 DEMO_PKGDIR     = com/sun/tools/example
 DEMO_TOPFILES   = ./com/sun/tools/example/README
 DEMO_DESTDIR    = $(DEMODIR)/jpda
+DEMO_JAR_NAME   = examples.jar
+DEMO_ONLY_SRC   = true
 
 #
 # Demo jar building rules.
--- a/jdk/make/mkdemo/jvmti/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mkdemo/jvmti/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = demos
 PRODUCT = demos
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/mkdemo/management/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mkdemo/management/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = demos
 PRODUCT = demos
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/mksample/dtrace/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/dtrace/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/jmx/jmx-scandir/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/jmx/jmx-scandir/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/nbproject/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/nbproject/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/nio/file/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/nio/file/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/nio/multicast/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/nio/multicast/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/nio/server/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/nio/server/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/scripting/scriptpad/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/scripting/scriptpad/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/webservices/EbayClient/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/webservices/EbayClient/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/mksample/webservices/EbayServer/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/mksample/webservices/EbayServer/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 
-MODULE  = samples
 PRODUCT = java
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/modules/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-#
-# Copyright (c) 2009, 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.
-#
-
-BUILDDIR = ..
-include $(BUILDDIR)/common/Defs.gmk
-
-#
-# Modularizing the JDK
-# - Post jdk build process until the source tree is restructured
-#   for modules build
-# - <outputdir>/modules/<module> will be created for each module.
-#
-# Steps:
-# 0. During jdk build before this makefile is invoked, classes, 
-#    resource files, and other non-class files such as native libraries,
-#    properties file, images, etc are created.
-#
-#    Non-class files are copied to <outputdir>/tmp/modules/<MODULE>
-#    directory in this step to prepare for the post-build modularization. 
-#
-#    The MODULE variable defined in other makefiles specifies 
-#    the lowest-level module that the non-class files belong to.
-#    The name might or might not be the same as the name of the modules 
-#    in the resulting <outputdir>/modules directory.
-#    
-# 1. Unpack all jars in the <builddir>/lib directory to a temporary 
-#    location (<outputdir>/tmp/modules/classes) to prepare for modules
-#    creation.
-#
-# 2. Run ClassAnalyzer tool to analyze all jdk classes and generate
-#    class list for all modules and also perform dependency analysis. 
-#
-#    Input configuration files :-
-#
-#    modules.config : defines the low-level modules and specifies 
-#       what classes and resource files each module includes.
-#    modules.group  : defines the module groups and its members.
-#    jdk7.depconfig : lists the dynamic dependencies including
-#       use of reflection Class.forName and JNI FindClass and
-#       service provider.
-#    optional.depconfig : lists the optional dependencies
-#
-# 3. Create one directory for each module (<outputdir>/modules/<module>)
-#    based on the output files from (2).
-#       
-#    modules.list lists the modules to be created for the modules
-#    build and its members. For each module (m) in modules.list,
-#    a. create $m/lib/$m.jar with all classes and resource files
-#       listed in $m.classlist and $m.resources respectively.
-#    b. copy all non-class files from its members to 
-#       <outputdir>/modules/$m.
-
-
-MAINMANIFEST=$(JDK_TOPDIR)/make/tools/manifest.mf
-MODULE_JAR_MANIFEST_FILE=$(ABS_TEMPDIR)/manifest.tmp
-
-TMP = $(ABS_MODULES_TEMPDIR)
-MODULE_CLASSLIST = $(ABS_MODULES_TEMPDIR)/classlist
-MODULE_CLASSES = $(ABS_MODULES_TEMPDIR)/classes
-MODULES_LIST = $(MODULE_CLASSLIST)/modules.list
-
-all:: unpack-jars gen-classlist modularize
-
-JAR_LIST := $(shell $(FIND) $(ABS_OUTPUTDIR)/lib -name \*.jar -print) 
-unpack-jars:
-	@$(ECHO) ">>>Making "$@" @ `$(DATE)` ..."
-	$(RM) -rf $(MODULE_CLASSES)
-	$(MKDIR) -p $(MODULE_CLASSES)
-	$(CP) -rf $(CLASSBINDIR)/* $(MODULE_CLASSES)
-	@for jf in  $(JAR_LIST) ; do \
-	   $(CD) $(MODULE_CLASSES) && $(BOOT_JAR_CMD) xf $$jf $(BOOT_JAR_JFLAGS);\
-	done
-	@$(ECHO) ">>>Finished making "$@" @ `$(DATE)` ..."
-
-gen-classlist:
-	$(CD) tools && $(MAKE) all
-
-modularize: $(MODULE_JAR_MANIFEST_FILE)
-	@$(ECHO) ">>>Making "$@" @ `$(DATE)` ..."
-	@$(RM) -rf $(MODULES_DIR)
-
-	@# create jar file for modules and
-	@# copy other files from all members of this module 
-	for m in `$(NAWK) '{print $$1}' $(MODULES_LIST)` ; do \
-   	   $(ECHO) "Creating module $$m" ; \
-   	   $(SED) -e 's%\\%\/%g' < $(MODULE_CLASSLIST)/$$m.classlist > $(TMP)/tmp.cf ; \
-	   if [ -f $(MODULE_CLASSLIST)/$$m.resources ] ; then \
-   	       $(SED) -e 's%\\%\/%g' < $(MODULE_CLASSLIST)/$$m.resources >> $(TMP)/tmp.cf ; \
-           fi ; \
-           $(MKDIR) -p $(ABS_MODULES_DIR)/$$m/lib; \
-	   $(CD) $(MODULE_CLASSES) && \
-               $(BOOT_JAR_CMD) c0mf $(MODULE_JAR_MANIFEST_FILE) \
-		   $(ABS_MODULES_DIR)/$$m/lib/$$m.jar \
-	           @$(TMP)/tmp.cf \
-                   $(BOOT_JAR_JFLAGS); \
-	   for s in `$(GREP) "^$$m" $(MODULES_LIST)` ; do \
-               if [ -d $(TMP)/$$s ] ; then \
-               	   $(CP) -rf $(TMP)/$$s/*  $(ABS_MODULES_DIR)/$$m; \
-		   $(RM) -rf $(ABS_MODULES_DIR)/$$m/classes; \
-	       fi \
-	   done \
-        done
-	@$(CD) $(MODULE_CLASSES) && $(java-vm-cleanup)
-	@$(ECHO) ">>>Finished making "$@" @ `$(DATE)` ..."
-
-$(MODULE_JAR_MANIFEST_FILE):
-	$(SED) -e "s/@@RELEASE@@/$(RELEASE)/" $(MAINMANIFEST) > $@
-
-clean clobber::
-	$(RM) -rf $(MODULE_CLASSLIST)
-	$(RM) -rf $(MODULES_DIR)
-	$(RM) $(MODULE_JAR_MANIFEST_FILE)
--- a/jdk/make/modules/bootmodule.roots	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,199 +0,0 @@
-#
-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# List of root classes/methods, each line of the following syntax:
-# <class name> 
-# <method name> <signature>|*
-# exclude <class>|<method> 
-
-# The boot module generated based on this rootset does not support
-# - security permission check
-# - non-standard charset
-# - logging output
-# - resource bundles
-#   including error output from the launcher 
-
-# VM preloaded classes
-java.lang.Object
-java.lang.String
-java.lang.Class
-java.lang.Cloneable
-java.lang.ClassLoader
-java.lang.System
-java.lang.Throwable
-java.lang.Error
-java.lang.ThreadDeath
-java.lang.Exception
-java.lang.RuntimeException
-java.security.ProtectionDomain
-java.security.AccessControlContext
-java.lang.ClassNotFoundException
-java.lang.NoClassDefFoundError
-java.lang.ClassCastException
-java.lang.ArrayStoreException
-java.lang.VirtualMachineError
-java.lang.OutOfMemoryError
-java.lang.StackOverflowError
-java.lang.IllegalMonitorStateException
-java.lang.ref.Reference
-java.lang.ref.SoftReference
-java.lang.ref.WeakReference
-java.lang.ref.FinalReference
-java.lang.ref.PhantomReference
-java.lang.ref.Finalizer
-java.lang.Runnable
-java.lang.Thread
-java.lang.ThreadGroup
-java.util.Properties
-java.lang.reflect.AccessibleObject
-java.lang.reflect.Member
-java.lang.reflect.Field
-java.lang.reflect.Method
-java.lang.reflect.Constructor
-java.lang.reflect.Type
-sun.reflect.MagicAccessorImpl
-sun.reflect.MethodAccessorImpl
-sun.reflect.ConstructorAccessorImpl
-sun.reflect.DelegatingClassLoader
-sun.reflect.ConstantPool
-sun.reflect.UnsafeStaticFieldAccessorImpl
-java.util.Vector
-java.lang.StringBuffer
-java.lang.StackTraceElement
-java.nio.Buffer
-java.lang.Boolean
-java.lang.Character
-java.lang.Float
-java.lang.Double
-java.lang.Byte
-java.lang.Short
-java.lang.Integer
-java.lang.Long
-java.lang.NullPointerException
-java.lang.ArithmeticException
-java.lang.Compiler
-
-
-# Root methods
-java.lang.ClassLoader.getSystemClassLoader ()Ljava/lang/ClassLoader;
-java.lang.System.initializeSystemClass ()V
-sun.launcher.LauncherHelper.checkAndLoadMain (ZZLjava/lang/String;)Ljava/lang/Object;
-
-# The tool doesn't automatically find superclasses and parse the method
-# if overridden as it tries to reduce unnecessary classes being pulled in.
-# The following forces the dependency to be included the result.
-sun.net.www.protocol.file.Handler.<init> ()V
-sun.net.www.protocol.jar.Handler.<init> ()V
-sun.net.www.protocol.file.Handler.openConnection *
-sun.net.www.protocol.jar.Handler.openConnection *
-sun.misc.URLClassPath$JarLoader.<init>  (Ljava/net/URL;Ljava/net/URLStreamHandler;Ljava/util/HashMap;)V
-sun.misc.URLClassPath$FileLoader.<init> (Ljava/net/URL;)V
-sun.misc.URLClassPath$FileLoader.getClassPath *
-sun.misc.URLClassPath$FileLoader.getResource *
-sun.misc.URLClassPath$JarLoader.getResource *
-sun.misc.URLClassPath$JarLoader.getClassPath *
-
-# permission collections
-java.io.FilePermission.newPermissionCollection ()Ljava/security/PermissionCollection;
-java.security.BasicPermission.newPermissionCollection ()Ljava/security/PermissionCollection;
-
-# native
-java.io.UnixFileSystem
-java.io.UnixFileSystem.<init> ()V
-java.io.UnixFileSystem.canonicalize *
-java.io.Win32FileSystem
-java.io.Win32FileSystem.<init> ()V
-java.io.Win32FileSystem.canonicalize *
-java.io.WinNTFileSystem
-java.io.WinNTFileSystem.<init> ()V
-java.io.WinNTFileSystem.canonicalize *
-
-# missing
-java.util.HashMap.<init> ()V
-java.util.HashMap$EntrySet.iterator *
-
-# Called from native GetStringPlatformChars (jni_util.c)
-java.lang.String.getBytes *
-
-# charset
-sun.nio.cs.US_ASCII.newEncoder ()Ljava/nio/charset/CharsetEncoder;
-sun.nio.cs.UTF_8.newEncoder ()Ljava/nio/charset/CharsetEncoder;
-sun.nio.cs.UTF_8.newDecoder  *
-sun.nio.cs.UTF_16.newEncoder ()Ljava/nio/charset/CharsetEncoder;
-sun.nio.cs.UTF_16.newDecoder  *
-sun.nio.cs.UTF_32.newEncoder ()Ljava/nio/charset/CharsetEncoder;
-sun.nio.cs.UTF_32.newDecoder  *
-
-# hashcode
-java.util.jar.Attributes$Name.hashCode *
-
-# nio
-sun.nio.ByteBuffered
-sun.nio.ch.DirectBuffer
-java.nio.DirectByteBuffer
-java.nio.MappedByteBuffer
-java.nio.DirectLongBufferU
-
-# resource files
-sun.launcher.resources.launcher
-
-sun.misc.Launcher$AppClassLoader.getPermissions *
-sun.misc.Launcher$AppClassLoader.loadClass  (Ljava/lang/String;)Ljava/lang/Class;
-sun.misc.Launcher$AppClassLoader.findClass  (Ljava/lang/String;)Ljava/lang/Class;
-sun.misc.Launcher$ExtClassLoader.getPermissions *
-sun.misc.Launcher$ExtClassLoader.loadClass  (Ljava/lang/String;)Ljava/lang/Class;
-sun.misc.Launcher$ExtClassLoader.findClass  (Ljava/lang/String;)Ljava/lang/Class;
-java.lang.ClassLoader.checkPackageAccess *
-java.lang.ClassLoader.findClass *
-java.lang.ClassLoader.defineClass *
-java.net.URLClassLoader.getPermissions *
-java.net.URLClassLoader.findClass *
-java.net.URLClassLoader.defineClass *
-java.security.SecureClassLoader.defineClass *
-# need to parse superclasses <init>
-java.security.SecureClassLoader.<init> ()V
-
-exclude sun.security.provider.PolicyFile.<init>
-exclude java.lang.ClassLoader.compareCerts
-exclude java.security.cert.Certificate.equals
-# unsigned jars - no verifier
-exclude java.util.jar.JarFile.initializeVerifier
-exclude java.util.jar.JarVerifier 
-exclude sun.security.util.SignatureFileVerifier.<init>
-
-
-# what about other charset
-exclude sun.misc.Service
-exclude java.util.ServiceLoader
-
-# exclude support for localized messages
-exclude java.util.ResourceBundle.getBundle
-exclude java.text.MessageFormat
-exclude sun.util.logging.PlatformLogger$LoggerProxy.format *
-
-# exclude nio and miscellaneous classes
-exclude java.nio.channels.**
-exclude sun.misc.FloatingDecimal
-exclude sun.misc.FormattedFloatingDecimal
-exclude sun.misc.FDBigInt 
--- a/jdk/make/modules/jdk7.depconfig	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,473 +0,0 @@
-#
-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# private java.lang.Object createInetSocketAddress(java.lang.String, int)
-@ClassForName
-  com.sun.jndi.ldap.Connection -> java.net.InetSocketAddress
-  com.sun.jndi.ldap.Connection -> java.net.SocketAddress
-
-# com.sun.jndi.ldap.VersionHelper
-@ClassForName(optional)
-  com.sun.jndi.ldap.VersionHelper -> com.sun.jndi.ldap.VersionHelper*
-
-# private static void initMethodHandles()
-@ClassForName
-  com.sun.jndi.toolkit.corba.CorbaUtils -> javax.rmi.CORBA.Stub
-  com.sun.jndi.toolkit.corba.CorbaUtils -> javax.rmi.PortableRemoteObject
-
-# com.sun.naming.internal.ResourceManager$AppletParameter
-@ClassForName(optional)
-  com.sun.naming.internal.ResourceManager$AppletParameter -> java.applet.Applet
-
-# private static boolean loadProviderAsService()
-@Provider
-  com.sun.net.httpserver.spi.HttpServerProvider -> META-INF/services/com.sun.net.httpserver.spi.HttpServerProvider
-
-# com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT
-@ClassForName
-  com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT -> javax.xml.XMLConstants
-
-# public static java.beans.PersistenceDelegate getPersistenceDelegate(java.lang.Class)
-@ClassForName
-  java.beans.MetaData -> java.beans.*_PersistenceDelegate
-
-# private static java.lang.reflect.Method getNanosMethod()
-@ClassForName(optional)
-  java.beans.java_sql_Timestamp_PersistenceDelegate -> java.sql.Timestamp
-
-# java.beans.java_util_Collections$CheckedCollection_PersistenceDelegate
-@ClassForName
-  java.beans.java_util_Collections$CheckedCollection_PersistenceDelegate -> java.util.Collections$CheckedCollection
-
-# java.beans.java_util_Collections$CheckedMap_PersistenceDelegate
-@ClassForName
-  java.beans.java_util_Collections$CheckedMap_PersistenceDelegate -> java.util.Collections$CheckedMap
-
-# private static java.lang.Object getType(java.lang.Object)
-@ClassForName
-  java.beans.java_util_EnumMap_PersistenceDelegate -> java.util.EnumMap
-
-# private java.lang.Integer getAxis(java.lang.Object)
-@ClassForName
-  java.beans.javax_swing_Box_PersistenceDelegate -> javax.swing.BoxLayout
-
-# java.lang.Double
-@Inline
-  java.lang.Double -> sun.misc.FloatConsts
-  java.lang.Double -> sun.misc.DoubleConsts
-
-# java.lang.Float
-@Inline
-  java.lang.Float -> sun.misc.FloatConsts
-  java.lang.Float -> sun.misc.DoubleConsts
-
-# java.net.DefaultDatagramSocketImplFactory
-@ClassForName(optional)
-  java.net.DefaultDatagramSocketImplFactory -> java.net.*DatagramSocketImpl
-
-# private static sun.net.spi.nameservice.NameService createNSProvider(java.lang.String)
-@Provider
-  java.net.InetAddress -> META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor
-
-# static java.net.InetAddressImpl create()
-@ClassForName
-  java.net.InetAddressImplFactory -> java.net.*Inet[46]AddressImpl
-
-# private static void init()
-@NativeFindClass
-  java.net.PlainDatagramSocketImpl -> java.io.FileDescriptor
-
-# java.net.ProxySelector
-@ClassForName
-  java.net.ProxySelector -> sun.net.spi.DefaultProxySelector
-
-# static java.net.URLStreamHandler getURLStreamHandler(java.lang.String)
-@ClassForName(optional)
-  java.net.URL -> sun.net.www.protocol.*.Handler
-
-# private java.net.ContentHandler lookupContentHandlerClassFor(java.lang.String)
-@ClassForName
-  java.net.URLConnection -> sun.net.www.content.*
-
-# private static java.nio.channels.spi.AsynchronousChannelProvider loadProviderAsService()
-@Provider
-  java.nio.channels.spi.AsynchronousChannelProvider$ProviderHolder -> META-INF/services/java.nio.channels.spi.AsynchronousChannelProvider
-
-# private static boolean loadProviderFromProperty()
-@ClassForName
-  java.nio.channels.spi.SelectorProvider -> sun.nio.ch.DefaultSelectorProvider
-
-# private static boolean loadProviderAsService()
-@Provider
-  java.nio.channels.spi.SelectorProvider -> META-INF/services/java.nio.channels.spi.SelectorProvider
-
-# private static java.util.Iterator providers()
-@Provider
-  java.nio.charset.Charset -> META-INF/services/java.nio.charset.spi.CharsetProvider
-
-# private static void probeExtendedProvider()
-@ClassForName(optional)
-  java.nio.charset.Charset -> sun.nio.cs.ext.ExtendedCharsets
-
-# public static java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map<java.lang.String, ?>, java.lang.ClassLoader)
-@Provider
-  java.nio.file.FileSystems -> META-INF/services/java.nio.file.FileSystemProvider
-
-# private static java.util.List<java.nio.file.spi.FileTypeDetector> loadInstalledDetectors()
-@Provider
-  java.nio.file.Files$DefaultFileTypeDetectorHolder -> META-INF/services/java.nio.file.spi.FileTypeDetector
-
-# public static java.util.List<java.nio.file.spi.FileSystemProvider> installedProviders()
-@Provider
-  java.nio.file.spi.FileSystemProvider -> META-INF/services/java.nio.file.FileSystemProvider
-
-# private static java.rmi.server.RMIClassLoaderSpi initializeProvider()
-@Provider
-  java.rmi.server.RMIClassLoader -> META-INF/services/java.rmi.server.RMIClassLoaderSpi
-
-# private static void initializeSystemScope()
-@ClassForName(optional)
-  java.security.IdentityScope -> sun.security.provider.IdentityDatabase
-
-# static java.security.Policy getPolicyNoCheck()
-@ClassForName
-  java.security.Policy -> sun.security.provider.PolicyFile
-
-# private static java.lang.Class getSpiClass(java.lang.String)
-@ClassForName
-  java.security.Security -> java.security.*Spi
-
-# private static void invalidateSMCache(java.lang.String)
-@ClassForName
-  java.security.Security -> java.lang.SecurityManager
-
-# private static void loadInitialDrivers()
-@Provider
-  java.sql.DriverManager -> META-INF/services/java.sql.Driver
-
-# private static java.text.BreakIterator createBreakInstance(java.util.Locale, int, java.lang.String, java.lang.String)
-@Provider
-  java.text.BreakIterator -> META-INF/services/java.util.spi.BreakIteratorProvider
-
-# public static java.text.Collator getInstance(java.util.Locale)
-@Provider
-  java.text.Collator -> META-INF/services/java.util.spi.CollatorProvider
-
-# private static java.text.DateFormat get(int, int, int, java.util.Locale)
-@Provider
-  java.text.DateFormat -> META-INF/services/java.util.spi.DateNameProvider
-
-# public static java.util.Locale[] getAvailableLocales()
-@Provider
-  java.text.DateFormatSymbols -> META-INF/services/java.util.spi.DateFormatSymbolsProvider
-
-# public static java.util.Locale[] getAvailableLocales()
-@Provider
-  java.text.DecimalFormatSymbols -> META-INF/services/java.util.spi.DecimalFormatSymbolsProvider
-
-# public static java.util.Locale[] getAvailableLocales()
-@Provider
-  java.text.NumberFormat -> META-INF/services/java.util.spi.NumberFormatProvider
-
-# public java.lang.String getDisplayName(java.util.Locale)
-@Provider
-  java.util.Currency -> META-INF/services/java.util.spi.CurrencyNameProvider
-
-# java.util.Formatter
-@Inline
-  java.util.Formatter -> sun.misc.DoubleConsts
-
-# java.util.Locale
-@Inline
-  java.util.Locale -> java.util.LocaleISOData
-
-# private java.lang.String getDisplayString(java.lang.String, java.util.Locale, int)
-@Provider
-  java.util.Locale -> META-INF/services/java.util.spi.LocaleNameProvider
-
-# private static java.util.prefs.PreferencesFactory factory1()
-@ClassForName
-  java.util.prefs.Preferences -> java.util.prefs.WindowsPreferencesFactory
-  java.util.prefs.Preferences -> java.util.prefs.FileSystemPreferencesFactory
-
-# private static java.util.prefs.PreferencesFactory factory1()
-@Provider
-  java.util.prefs.Preferences -> META-INF/services/java.util.prefs.PreferencesFactory
-
-# public void registerApplicationClasspathSpis()
-@Provider
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.IIOServiceProvider
-
-# private void registerInstalledProviders()
-@Provider
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageReaderSpi
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageWriterSpi
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageReaderWriterSpi
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageTranscoderSpi
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageInputStreamSpi
-  javax.imageio.spi.IIORegistry -> META-INF/services/javax.imageio.spi.ImageOutputStreamSpi
-
-# public javax.naming.ldap.ExtendedResponse createExtendedResponse(java.lang.String, byte[], int, int)
-@Provider
-  javax.naming.ldap.StartTlsRequest -> META-INF/services/javax.naming.ldap.StartTlsResponse
-
-# private static java.util.ArrayList getAllLookupServices()
-@Provider
-  javax.print.PrintServiceLookup -> META-INF/services/javax.print.PrintServiceLookup
-
-# private static java.util.ArrayList getAllFactories()
-@Provider
-  javax.print.StreamPrintServiceFactory -> META-INF/services/javax.print.StreamPrintServiceFactory
-
-# private void initEngines(java.lang.ClassLoader)
-@Provider
-  javax.script.ScriptEngineManager -> META-INF/services/javax.script.ScriptEngineFactory
-
-# private void initializeInputMethodLocatorList()
-@Provider
-  sun.awt.im.ExecutableInputMethodManager -> META-INF/services/java.awt.im.spi.InputMethodDescriptor
-
-# private static java.lang.Class getConverterClass(int, java.lang.String)
-@ClassForName(optional)
-  sun.io.Converters -> sun.io.*
-
-# public static sun.java2d.cmm.PCMM getModule()
-@Provider
-  sun.java2d.cmm.CMSManager -> META-INF/services/sun.java2d.cmm.PCMM
-
-# public static sun.java2d.pipe.RenderingEngine getInstance()
-@Provider
-  sun.java2d.pipe.RenderingEngine -> META-INF/services/sun.java2d.pipe.RenderingEngine
-
-# public static sun.java2d.pipe.RenderingEngine getInstance()
-@ClassForName(optional)
-  sun.java2d.pipe.RenderingEngine -> sun.dc.DuctusRenderingEngine
-
-# sun.misc.FloatingDecimal
-@Inline
-  sun.misc.FloatingDecimal -> sun.misc.FloatConsts
-  sun.misc.FloatingDecimal -> sun.misc.DoubleConsts
-
-# sun.misc.FormattedFloatingDecimal
-@Inline
-  sun.misc.FormattedFloatingDecimal -> sun.misc.FloatConsts
-  sun.misc.FormattedFloatingDecimal -> sun.misc.DoubleConsts
-
-# sun.misc.FpUtils
-@Inline
-  sun.misc.FpUtils -> sun.misc.FloatConsts
-  sun.misc.FpUtils -> sun.misc.DoubleConsts
-
-# public java.net.URLStreamHandler createURLStreamHandler(java.lang.String)
-@ClassForName(optional)
-  sun.misc.Launcher$Factory -> sun.net.www.protocol.*.Handler
-
-# private static sun.net.NetHooks$Provider loadProvider(java.lang.String)
-@ClassForName(optional)
-  sun.net.NetHooks -> sun.net.spi.SdpProvider
-
-# sun.net.idn.StringPrep
-@Inline
-  sun.net.idn.StringPrep -> sun.net.idn.UCharacterDirection
-
-# private static boolean init()
-@NativeFindClass
-  sun.net.spi.DefaultProxySelector -> java.net.Proxy
-  sun.net.spi.DefaultProxySelector -> java.net.Proxy$Type
-  sun.net.spi.DefaultProxySelector -> java.net.InetSocketAddress
-
-# private static java.nio.channels.Channel createChannel()
-@ClassForName
-  sun.nio.ch.InheritedChannel -> java.io.FileDescriptor
-
-# private static void initDBBConstructor()
-@ClassForName
-  sun.nio.ch.Util -> java.nio.DirectByteBuffer
-
-# private static void initDBBRConstructor()
-@ClassForName
-  sun.nio.ch.Util -> java.nio.DirectByteBufferR
-
-# private java.nio.charset.Charset lookup(java.lang.String)
-@ClassForName(optional)
-  sun.nio.cs.FastCharsetProvider -> sun.nio.cs.*
-
-# sun.nio.cs.ext.ExtendedCharsets
-@ClassForName(optional)
-  sun.nio.cs.ext.ExtendedCharsets -> sun.nio.cs.ext.*
-
-# sun.nio.cs.ext.ExtendedCharsets
-@ClassForName(optional)
-  sun.nio.cs.ext.ExtendedCharsets -> sun.nio.cs.ext.*
-
-# public static java.nio.file.spi.FileSystemProvider create()
-@ClassForName
-  sun.nio.fs.DefaultFileSystemProvider -> sun.nio.fs.SolarisFileSystemProvider
-  sun.nio.fs.DefaultFileSystemProvider -> sun.nio.fs.LinuxFileSystemProvider
-
-# sun.rmi.server.MarshalInputStream
-@ClassForName
-  sun.rmi.server.MarshalInputStream -> sun.rmi.server.Activation$ActivationSystemImpl_Stub
-  sun.rmi.server.MarshalInputStream -> sun.rmi.registry.RegistryImpl_Stub
-
-# private java.security.Provider doLoadProvider()
-@ClassForName(optional)
-  sun.security.jca.ProviderConfig -> sun.security.pkcs11.SunPKCS11
-  sun.security.jca.ProviderConfig -> sun.security.provider.Sun
-  sun.security.jca.ProviderConfig -> sun.security.rsa.SunRsaSign
-  sun.security.jca.ProviderConfig -> sun.security.ec.SunEC
-  sun.security.jca.ProviderConfig -> com.sun.net.ssl.internal.ssl.Provider
-  sun.security.jca.ProviderConfig -> com.sun.crypto.provider.SunJCE
-  sun.security.jca.ProviderConfig -> sun.security.jgss.SunProvider
-  sun.security.jca.ProviderConfig -> com.sun.security.sasl.Provider
-  sun.security.jca.ProviderConfig -> org.jcp.xml.dsig.internal.dom.XMLDSigRI
-  sun.security.jca.ProviderConfig -> sun.security.smartcardio.SunPCSC
-  sun.security.jca.ProviderConfig -> sun.security.mscapi.SunMSCAPI
-
-# public static java.security.Provider getSunProvider()
-@ClassForName
-  sun.security.jca.Providers -> sun.security.provider.Sun
-  sun.security.jca.Providers -> sun.security.provider.VerificationProvider
-
-# private static sun.security.jgss.spi.MechanismFactory getMechFactoryImpl(java.security.Provider, java.lang.String, org.ietf.jgss.Oid, sun.security.jgss.GSSCaller)
-@ClassForName
-  sun.security.jgss.ProviderList -> sun.security.jgss.spi.MechanismFactory
-
-# sun.security.jgss.wrapper.SunNativeProvider
-@NativeFindClass
-  sun.security.jgss.wrapper.SunNativeProvider -> org.ietf.jgss.Oid
-  sun.security.jgss.wrapper.SunNativeProvider -> org.ietf.jgss.GSSException
-  sun.security.jgss.wrapper.SunNativeProvider -> sun.security.jgss.wrapper.GSSNameElement
-  sun.security.jgss.wrapper.SunNativeProvider -> sun.security.jgss.wrapper.GSSCredElement
-  sun.security.jgss.wrapper.SunNativeProvider -> sun.security.jgss.wrapper.NativeGSSContext
-  sun.security.jgss.wrapper.SunNativeProvider -> sun.security.jgss.wrapper.SunNativeProvider
-  sun.security.jgss.wrapper.SunNativeProvider -> org.ietf.jgss.MessageProp
-  sun.security.jgss.wrapper.SunNativeProvider -> org.ietf.jgss.ChannelBinding
-  sun.security.jgss.wrapper.SunNativeProvider -> java.net.InetAddress
-  sun.security.jgss.wrapper.SunNativeProvider -> sun.security.jgss.wrapper.GSSLibStub
-
-# static void ensureLoaded()
-@NativeFindClass
-  sun.security.krb5.Credentials -> sun.security.krb5.internal.Krb5
-  sun.security.krb5.Credentials -> sun.security.krb5.internal.Ticket
-  sun.security.krb5.Credentials -> sun.security.krb5.PrincipalName
-  sun.security.krb5.Credentials -> sun.security.util.DerValue
-  sun.security.krb5.Credentials -> sun.security.krb5.EncryptionKey
-  sun.security.krb5.Credentials -> sun.security.krb5.internal.TicketFlags
-  sun.security.krb5.Credentials -> sun.security.krb5.internal.KerberosTime
-
-# public static java.lang.String getDefaultCacheName()
-@ClassForName(optional)
-  sun.security.krb5.internal.ccache.FileCredentialsCache -> com.sun.security.auth.module.UnixSystem
-
-# sun.security.pkcs.PKCS9Attribute
-@ClassForName
-  sun.security.pkcs.PKCS9Attribute -> sun.security.util.ObjectIdentifier
-  sun.security.pkcs.PKCS9Attribute -> java.util.Date
-  sun.security.pkcs.PKCS9Attribute -> sun.security.pkcs.SignerInfo
-  sun.security.pkcs.PKCS9Attribute -> sun.security.x509.CertificateExtensions
-
-# protected T engineGetKeySpec(java.security.Key, java.lang.Class<T>)
-@ClassForName
-  sun.security.provider.DSAKeyFactory -> java.security.spec.DSAPublicKeySpec
-  sun.security.provider.DSAKeyFactory -> java.security.spec.X509EncodedKeySpec
-  sun.security.provider.DSAKeyFactory -> java.security.spec.DSAPrivateKeySpec
-  sun.security.provider.DSAKeyFactory -> java.security.spec.PKCS8EncodedKeySpec
-
-# protected T engineGetParameterSpec(java.lang.Class<T>)
-@ClassForName
-  sun.security.provider.DSAParameters -> java.security.spec.DSAParameterSpec
-
-# sun.security.provider.VerificationProvider
-@ClassForName(optional)
-  sun.security.provider.VerificationProvider -> sun.security.provider.Sun
-  sun.security.provider.VerificationProvider -> sun.security.rsa.SunRsaSign
-
-# sun.security.provider.certpath.URICertStore$LDAP
-@ClassForName(optional)
-  sun.security.provider.certpath.URICertStore$LDAP -> sun.security.provider.certpath.ldap.LDAPCertStoreHelper
-
-# sun.security.smartcardio.PCSC
-@NativeFindClass
-  sun.security.smartcardio.PCSC -> sun.security.smartcardio.PCSCException
-
-# sun.security.ssl.HandshakeMessage
-@ClassForName
-  sun.security.ssl.HandshakeMessage -> java.security.MessageDigest$Delegate
-
-# sun.security.ssl.JsseJce
-@ClassForName(optional)
-  sun.security.ssl.JsseJce -> sun.security.krb5.PrincipalName
-
-# sun.security.x509.OIDMap$OIDInfo
-@ClassForName
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.SubjectKeyIdentifierExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.KeyUsageExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.PrivateKeyUsageExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.SubjectAlternativeNameExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.IssuerAlternativeNameExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.BasicConstraintsExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.CRLNumberExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.CRLReasonCodeExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.NameConstraintsExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.PolicyMappingsExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.AuthorityKeyIdentifierExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.PolicyConstraintsExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.NetscapeCertTypeExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.CertificatePoliciesExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.ExtendedKeyUsageExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.InhibitAnyPolicyExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.CRLDistributionPointsExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.CertificateIssuerExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.SubjectInfoAccessExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.AuthorityInfoAccessExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.IssuingDistributionPointExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.DeltaCRLIndicatorExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.FreshestCRLExtension
-  sun.security.x509.OIDMap$OIDInfo -> sun.security.x509.OCSPNoCheckExtension
-
-# sun.util.LocaleServiceProviderPool$AllAvailableLocales
-@Provider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.BreakIteratorProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.CollatorProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.DateFormatProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.DateFormatSymbolsProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.DecimalFormatSymbolsProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.text.spi.NumberFormatProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.util.spi.CurrencyNameProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.util.spi.LocaleNameProvider
-  sun.util.LocaleServiceProviderPool$AllAvailableLocales -> META-INF/services/java.util.spi.TimeZoneNameProvider
-
-# private static final java.lang.String[] retrieveDisplayNames(sun.util.resources.OpenListResourceBundle, java.lang.String, java.util.Locale)
-@Provider
-  sun.util.TimeZoneNameUtility -> META-INF/services/java.util.spi.TimeZoneNamePProvider
-
-# public static sun.util.calendar.CalendarSystem forName(java.lang.String)
-@ClassForName
-  sun.util.calendar.CalendarSystem -> sun.util.calendar.Gregorian
-  sun.util.calendar.CalendarSystem -> sun.util.calendar.LocalGregorianCalendar
-  sun.util.calendar.CalendarSystem -> sun.util.calendar.JulianCalendar
-
-# sun.util.logging.LoggingSupport
-@ClassForName(optional)
-  sun.util.logging.LoggingSupport -> java.util.logging.LoggingProxyImpl
--- a/jdk/make/modules/modules.config	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,928 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- *
- * 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.
- */
-
-// These classes are not referenced in the JDK but we can't
-// remove them for compatibility reason.  Define this module
-// first so that other modules don't need to exclude these clases
-module private-legacy {
-    include sun.misc.Cache*,
-            sun.misc.ClassLoaderUtil,
-            sun.misc.Compare,
-            sun.misc.ConditionLock,
-            sun.misc.CRC16,
-            sun.misc.Lock,
-            sun.misc.Regexp,
-            sun.misc.RequestProcessor,
-            sun.misc.Sort,
-            sun.misc.Request,
-            sun.misc.Timeable,
-            sun.misc.Timer,
-            sun.misc.TimerThread,
-            sun.misc.TimerTickThread,
-            sun.misc.UCDecoder,
-            sun.misc.UCEncoder,
-            sun.misc.UUDecoder,
-            sun.misc.UUEncoder,
-            com.sun.net.ssl.SSLContext,
-            sun.net.NetworkServer,
-            sun.net.URLCanonicalizer,
-            sun.reflect.misc.ConstructorUtil,
-            sun.reflect.FieldInfo,
-            sun.reflect.SignatureIterator,
-            sun.reflect.generics.reflectiveObjects.NotImplementedException,
-            sunw.io.Serializable,
-            sunw.util.EventListener,
-            sunw.util.EventObject;
-}
-
-// Deprecated classes that aren't referenced/used go here.
-module deprecated {
-    // add deprecated security classes once b78 is promoted
-}
-
-/**************************************************************************/
-
-module base {
-    // core classes
-    include java.lang.*,
-            java.lang.annotation.*,
-            java.lang.ref.*,
-            java.lang.reflect.*,
-            java.math.*,
-            java.net.*,
-            java.util.*,
-            java.util.concurrent.**,
-            java.util.jar.*,
-            java.util.regex.*,
-            java.util.spi.*,
-            java.util.zip.*,
-            java.text.**;
-
-    exclude java.util.jar.Pack200*,
-            java.util.XMLUtils,
-            java.text.Bidi;
-
-    include java.io.*, java.nio.*, java.nio.charset.**;
-    exclude java.io.TempFileHelper, java.nio.BufferPoolMXBean;
-
-    // security APIs
-    // javax.crypto and javax.security.auth are included to avoid inconsistent
-    // spliting of JCA and JAAS. This adds about 85k. Also note that some deprecated
-    // classes must be included for now (see 6876158, 6876170)
-    include java.security.*,
-            java.security.cert.*,
-            java.security.interfaces.*,
-            java.security.spec.*,
-            javax.security.auth.**,
-            javax.crypto.**;
-
-    // Sun and RSA security providers (except LDAP CertStore)
-    // roots sun.security.provider.* sun.security.provider.certpath.* sun.security.rsa.*
-    include com.sun.security.auth.PrincipalComparator,
-            com.sun.security.auth.SubjectCodeSource,
-            com.sun.security.auth.login.**,
-            com.sun.security.auth.Policy*,
-            sun.security.action.*,
-            sun.security.ec.*,
-            sun.security.jca.*,
-            sun.security.pkcs.*,
-            sun.security.provider.*,
-            sun.security.provider.certpath.*,
-            sun.security.rsa.*,
-            sun.security.util.*,
-            sun.security.validator.*,
-            sun.security.x509.*,
-            sun.security.timestamp.*;
-
-    // this list is based on the classlist generated from the rootset
-    // need investigation
-    exclude sun.security.ec.ECD*,
-            sun.security.ec.ECKeyPairGenerator,
-            sun.security.ec.SunEC*,
-            sun.security.pkcs.PKCS10*,
-            sun.security.pkcs.EncodingException,
-            sun.security.util.AuthResources_*,
-            sun.security.util.Resources_*,
-            sun.security.util.BigInt,
-            sun.security.util.HostnameChecker,
-            sun.security.x509.CertAndKeyGen,
-            sun.security.util.PathList;
-
-    // Kerberos not needed
-    exclude javax.security.auth.kerberos.**,
-            sun.security.jgss.**,
-            sun.security.krb5.**,
-            sun.security.ssl.Kerberos*,
-            org.ietf.jgss.**;
-
-   // property events and annotations
-   include java.beans.ChangeListenerMap,
-           java.beans.IndexedPropertyChangeEvent,
-           java.beans.PropertyChange*,
-           java.beans.PropertyVetoException,
-           java.beans.VetoableChange*,
-           java.beans.ConstructorProperties;
-
-    // mandatory charsets
-    include sun.nio.cs.*;
-
-    exclude sun.nio.cs.AbstractCharsetProvider,
-            sun.nio.cs.CharsetMapping,
-            sun.nio.cs.IBM*,
-            sun.nio.cs.ISO*,
-            sun.nio.cs.KOI8_*,
-            sun.nio.cs.MS125*,
-            sun.nio.cs.UTF_32*,
-            sun.nio.cs.SingleByteDecoder,
-            sun.nio.cs.SingleByteEncoder;
-
-    allow   sun.nio.cs.ISO_8859_1,
-            sun.nio.cs.ISO_8859_15,
-            sun.nio.cs.MS1252;
-
-    include sun.text.*,
-            sun.text.normalizer.*;
-
-    // resource files
-    include sun/text/resources/*.icu;
-
-    exclude sun.text.bidi.*,
-            sun.text.CharArrayCodePointIterator,
-            sun.text.CharSequenceCodePointIterator,
-            sun.text.CharacterIteratorCodePointIterator,
-            sun.text.CodePointIterator;
-
-    include sun.util.*,
-            sun.util.calendar.*,
-            sun.util.logging.*,
-            sun.util.resources.LocaleData,
-            sun.util.resources.LocaleNamesBundle,
-            sun.util.resources.OpenListResourceBundle;
-
-    // US_en locale
-    include sun.text.resources.BreakIteratorInfo,
-            sun.text.resources.FormatData,
-            sun.text.resources.FormatData_en_US,
-            sun.util.resources.CalendarData,
-            sun.util.resources.CalendarData_en,
-            sun.util.resources.TimeZoneNames,
-            sun.util.resources.TimeZoneNames_en,
-            sun.util.resources.TimeZoneNamesBundle,
-            sun.util.resources.LocaleNames,
-            sun.util.resources.LocaleNames_en,
-            sun.util.resources.LocalenamesBundles,
-            sun.util.resources.CurrencyNames,
-            sun.util.resources.CurrencyNames_en_US,
-            sun.util.EmptyListResourceBundle;
-
-    // resources file needed by
-    // - sun.misc.ExtensionInfo
-    // - sun.security.provider.PolicyFile
-    // - com.sun.security.auth.PolicyFile
-    include sun.misc.resources.Messages,
-            sun.security.util.Resources,
-            sun.security.util.AuthResources;
-
-    // java.nio.channels and java.nio.file not in base
-    include sun.nio.ch.Interruptible,
-            sun.nio.ch.DirectBuffer,
-            sun.nio.ByteBuffered;
-
-    include sun.reflect.**;
-
-    // protocol handlers
-    include sun.net.www.protocol.file.*,
-            sun.net.www.protocol.jar.*,
-            sun.net.www.protocol.http.*;
-
-    include sun.net.*,
-            sun.net.spi.*,
-            sun.net.idn.*,
-            sun.net.util.*,
-            sun.net.www.*,
-            sun.net.www.http.*,
-            sun.net.spi.nameservice.*;
-
-    // resource file for sun.net.idn
-    include sun/net/idn/*;
-
-    // classes in net-compat
-    exclude sun.net.Telnet*, sun.net.TransferProtocolClient;
-
-    // classes in deploy
-    exclude sun.net.www.protocol.http.AuthCacheBridge;
-
-    // classes in security-jsse
-    exclude java.net.SecureCacheResponse;
-
-    // launcher
-    include sun.launcher.LauncherHelper, sun.launcher.resources.launcher;
-
-    include sun.misc.*;
-    exclude sun.misc.FIFOQueueEnumerator,
-            sun.misc.LIFOQueueEnumerator,
-            sun.misc.GC,
-            sun.misc.PerformanceLogger,
-            sun.misc.Queue,
-            sun.misc.QueueElement,
-            sun.misc.Ref,
-            sun.misc.VMSupport;
-
-    // On Windows, OSEnvironment dependency
-    include sun.io.Win32ErrorMode;
-}
-
-/**************************************************************************/
-
-module charsets {
-    include sun.nio.cs.ext.**;
-
-    include sun.nio.cs.AbstractCharsetProvider,
-            sun.nio.cs.CharsetMapping,
-            sun.nio.cs.IBM*,
-            sun.nio.cs.ISO*,
-            sun.nio.cs.KOI8_*,
-            sun.nio.cs.MS125*,
-            sun.nio.cs.SingleByte*,
-            sun.nio.cs.UTF_32*;
-
-    exclude sun.nio.cs.ISO_8859_1,
-            sun.nio.cs.MS1252;
-
-    // legacy sun.io converters
-    include sun.io.*;
-}
-
-/**************************************************************************/
-
-// For now, retains the current JRE extensions where localedata.jar in jre/lib/ext 
-module localedata {
-    include sun.util.resources.*_ar,
-            sun.util.resources.*_ar_*,
-            sun.util.resources.*_hi,
-            sun.util.resources.*_hi_*,
-            sun.util.resources.*_iw,
-            sun.util.resources.*_iw_*,
-            sun.util.resources.*_ja,
-            sun.util.resources.*_ja_*,
-            sun.util.resources.*_ko,
-            sun.util.resources.*_ko_*,
-            sun.util.resources.*_th,
-            sun.util.resources.*_th_*,
-            sun.util.resources.*_vi,
-            sun.util.resources.*_vi_*,
-            sun.util.resources.*_zh,
-            sun.util.resources.*_zh_*;
-    include sun.text.resources.*_ar,
-            sun.text.resources.*_ar_*,
-            sun.text.resources.*_hi,
-            sun.text.resources.*_hi_*,
-            sun.text.resources.*_iw,
-            sun.text.resources.*_iw_*,
-            sun.text.resources.*_ja,
-            sun.text.resources.*_ja_*,
-            sun.text.resources.*_ko,
-            sun.text.resources.*_ko_*,
-            sun.text.resources.*_th,
-            sun.text.resources.*_th_*,
-            sun.text.resources.*_vi,
-            sun.text.resources.*_vi_*,
-            sun.text.resources.*_zh,
-            sun.text.resources.*_zh_*;
-}
-
-module resources {
-    include sun.text.resources.*, sun.util.resources.*, sun.misc.resources.*;
-}
-
-/**************************************************************************/
-
-module nio {
-    include java.nio.channels.**, java.nio.file.**, com.sun.nio.file.**;
-
-    // this is excluded from base
-    include java.io.TempFileHelper;
-
-    // provider implementations and their dependencies
-    include sun.nio.ch.*, sun.nio.fs.**;
-    exclude sun.nio.ch.Sctp*;
-}
-
-/**************************************************************************/
-
-module pack200 {
-    include java.util.jar.Pack200*, com.sun.java.util.jar.pack.**;
-}
-
-/**************************************************************************/
-
-module logging {
-    include java.util.logging.*, sun.util.logging.**;
-    exclude java.util.logging.PlatformLoggingMXBean;
-
-    // Formatter for HTTP messages
-    include sun.net.www.protocol.http.logging.*;
-}
-
-/**************************************************************************/
-
-module management-snmp {
-    include com.sun.jmx.snmp.**, sun.management.snmp.**;
-}
-
-module management-iiop {
-    include com.sun.jmx.remote.protocol.iiop.*;
-
-    // stubs and ties
-    include javax.management.remote.rmi._*,
-            org.omg.stub.javax.management.remote.rmi.**;
-}
-
-module management {
-    include java.lang.management.*, com.sun.management.**, sun.management.**;
-    include javax.management.**, com.sun.jmx.**;
-
-    // other management interfaces
-    include java.nio.BufferPoolMXBean;
-    include java.util.logging.PlatformLoggingMXBean;
-
-    // supporting classes in sun.misc
-    include sun.misc.VMSupport;
-}
-
-/**************************************************************************/
-
-module tracing {
-    // tracing
-    include com.sun.tracing.**, sun.tracing.**;
-}
-
-module instrument {
-    // java.lang.instrument
-    include java.lang.instrument.*, sun.instrument.*;
-
-    // HPROF support
-    include com.sun.demo.jvmti.hprof.*;
-
-    include tracing;
-}
-
-/**************************************************************************/
-
-module rmi-activation {
-    include java.rmi.activation.**,
-            sun.rmi.server.Act*,
-            sun.rmi.server.InactiveGroupException;
-}
-
-module rmic {
-    // rmic is included in tools
-    include sun.rmi.rmic.**;
-}
-
-module rmi {
-    include java.rmi.**, sun.rmi.**, com.sun.rmi.**;
-
-    // SSL factories are in rmi
-    include javax.rmi.ssl.**;
-
-    // supporting classes in sun.misc and dependencies
-    include sun.misc.GC;
-}
-
-/**************************************************************************/
-
-module prefs {
-    include java.util.prefs.*;
-}
-
-/**************************************************************************/
-
-module security-jsse {
-    include javax.net.**,
-            javax.security.cert.*,
-            java.net.SecureCacheResponse,
-            com.sun.net.ssl.**,
-            com.sun.security.cert.internal.x509.*,
-            sun.security.ssl.*,
-            sun.net.www.protocol.https.**,
-            sun.security.internal.interfaces.Tls*,
-            sun.security.internal.spec.Tls*,
-            sun.security.util.HostnameChecker;
-}
-
-module security-sunpkcs11 {
-    include sun.security.pkcs11.**;
-}
-
-module security-sunjce {
-    include com.sun.crypto.provider.*;
-}
-
-module security-sunec {
-    include sun.security.ec.*;
-}
-
-module security-sunmscapi {
-    include sun.security.mscapi.*;
-}
-
-module security-kerberos {
-    include javax.security.auth.kerberos.*,
-            com.sun.security.jgss.**,
-            com.sun.security.auth.module.Krb5LoginModule,
-            com.sun.security.sasl.gsskerb.**,             // GSSAPI SASL mechanism
-            sun.security.jgss.**,
-            sun.security.ssl.krb5.**,
-            sun.security.krb5.**,
-            org.ietf.jgss.**,
-            sun.net.www.protocol.http.spnego.*;
-}
-
-module security-sasl {
-    include javax.security.sasl.**,
-            com.sun.security.sasl.**;
-}
-
-module security-xmldsig {
-    include javax.xml.crypto.**,
-            org.jcp.xml.dsig.**,
-            com.sun.org.apache.xml.internal.security.**;
-}
-
-module security-smartcardio {
-    include javax.smartcardio.**, sun.security.smartcardio.**;
-}
-
-module security-auth {
-    include com.sun.security.auth.**, sun.security.util.AuthResources_*;
-}
-
-module security-misc {
-    include security-auth;
-
-    include sun.security.pkcs.*,
-            sun.security.pkcs12.*;
-
-    // this class is a candidate to be removed.
-    include sun.security.util.BigInt;
-}
-
-module security-resources {
-    include sun.security.util.Resources_*;
-}
-
-module security-compat {
-    include java.security.acl.*, sun.security.acl.*;
-}
-
-/**************************************************************************/
-
-module jndi-ldap {
-    include javax.naming.ldap.**,
-            com.sun.jndi.ldap.**,
-            com.sun.jndi.url.ldap.*,
-            com.sun.jndi.url.ldaps.*,
-            sun.security.provider.certpath.ldap.**;
-}
-
-module jndi-rmiregistry {
-    include com.sun.jndi.rmi.**, com.sun.jndi.url.rmi.**;
-}
-
-module jndi-dns {
-    include net-dns;
-    include com.sun.jndi.dns.**, com.sun.jndi.url.dns.**;
-}
-
-module jndi-cosnaming {
-    include com.sun.jndi.cosnaming.**,
-            com.sun.jndi.toolkit.corba.**,
-            com.sun.jndi.url.corbaname.**,
-            com.sun.jndi.url.iiop.**,
-            com.sun.jndi.url.iiopname.**;
-}
-
-// framework/API and classes used by providers
-module jndi {
-    include javax.naming.**,
-            com.sun.naming.**,
-            com.sun.jndi.toolkit.ctx.**,
-            com.sun.jndi.toolkit.dir.**,
-            com.sun.jndi.toolkit.url.**;
-}
-
-/**************************************************************************/
-
-module jdbc-base {
-    include java.sql.**, javax.sql.*;
-    exclude javax.sql.XA*;
-}
-
-module jdbc-enterprise {
-    include javax.sql.**, com.sun.rowset.**;
-}
-
-module jdbc-odbc {
-    include sun.jdbc.odbc.**;
-}
-
-/**************************************************************************/
-
-module scripting {
-    include javax.script.**;
-
-    // supporting classes for scripting engines
-    include com.sun.script.util.**;
-}
-
-module scripting-rhino {
-    include com.sun.script.javascript.**, sun.org.mozilla.javascript.**;
-}
-
-/**************************************************************************/
-
-module httpserver {
-    include com.sun.net.httpserver.**, sun.net.httpserver.**;
-}
-
-/**************************************************************************/
-
-module sctp {
-    // API and dependencies
-    include com.sun.nio.sctp.**, sun.nio.ch.Sctp*;
-}
-
-/**************************************************************************/
-
-module langtools {
-    include javax.tools.**, javax.lang.model.**, javax.annotation.processing.**;
-
-    // include mirror API for now
-    include com.sun.mirror.**;
-
-    // include the JSR292 APIs for now
-    include java.dyn.**, sun.dyn.**;
-}
-
-/**************************************************************************/
-
-module beans {
-    include java.beans.**, com.sun.beans.**, sun.beans.**;
-}
-
-/**************************************************************************/
-
-module jaxp-parsers-api {
-    include javax.xml.*, javax.xml.parsers.**,
-            org.w3c.dom.**, org.w3c.sax.**, org.xml.sax.**;
-}
-
-module jaxp-api {
-    include javax.xml.**;
-    exclude javax.xml.crypto.**,   // XML-DSIG
-            javax.xml.bind.**,     // JAX-WS
-            javax.xml.soap.**,
-            javax.xml.ws.**;
-}
-
-module jaxp-xerces-impl {
-    include com.sun.org.apache.xerces.internal.**;
-
-    // include in xerces-impl due to circular dependencies
-    include com.sun.org.apache.xml.internal.serialize.**,
-            com.sun.xml.internal.stream.**;
-    exclude com.sun.xml.internal.stream.buffer.**;  // JAX-WS
-}
-
-// required by Xerces and JAX-WS
-module jaxp-xerces-resolver {
-    include com.sun.org.apache.xml.internal.resolver.**;
-}
-
-module jaxp-xalan {
-    include com.sun.org.apache.xalan.internal.**,
-            com.sun.org.apache.xpath.internal.**,
-            com.sun.org.apache.xml.internal.dtm.**,
-            com.sun.org.apache.xml.internal.res.**,
-            com.sun.org.apache.xml.internal.serializer.**,
-            com.sun.org.apache.xml.internal.utils.**,
-            com.sun.org.apache.bcel.internal.**,
-            com.sun.org.apache.regexp.internal.**,
-            com.sun.java_cup.internal.**;
-}
-
-/**************************************************************************/
-
-module jaxws-tools {
-    include com.sun.codemodel.**,
-            com.sun.xml.internal.dtdparser.**,
-            com.sun.xml.internal.rngom.**,
-            com.sun.xml.internal.xsom.**,
-            com.sun.istack.internal.tools.**,
-            com.sun.istack.internal.ws.**,
-            com.sun.tools.internal.xjc.**,
-            com.sun.tools.internal.ws.**,
-            com.sun.tools.internal.jxc.**,
-            org.relaxng.datatype.**;
-}
-
-module jaxws {
-    include javax.jws.**,
-            javax.xml.bind.**,
-            javax.xml.soap.**,
-            javax.xml.ws.**,
-            org.relaxng.**,
-            com.sun.istack.internal.*,
-            com.sun.istack.internal.localization.*,
-            com.sun.xml.internal.**;
-
-    // include JAF in this module
-    include javax.activation.**, com.sun.activation.**;
-
-    include META-INF/mailcap.default,
-            META-INF/mimetypes.default;
-}
-
-/**************************************************************************/
-module enterprise-base {
-    include javax.transaction.**,  // JTA
-            javax.annotation.*;    // Common annotations (JSR-250)
-}
-
-/**************************************************************************/
-module corba {
-    include javax.activity.**,
-            javax.rmi.*,
-            javax.rmi.CORBA.*,
-            javax.transaction.**,
-            com.sun.corba.**,
-            com.sun.org.omg.**,
-            org.omg.**,
-            sun.corba.**;
-
-    // JMX remote API
-    exclude org.omg.stub.javax.management.**;
-}
-
-/**************************************************************************/
-
-module applet {
-    include java.applet.**,
-            sun.applet.**;
-}
-
-module awt {
-    include java.awt.**,
-            sun.awt.**,
-            com.sun.awt.**;
-}
-
-module font {
-    include sun.font.**;
-}
-
-module imageio {
-    include javax.imageio.**,
-            com.sun.imageio.**;
-}
-
-module java2d {
-    include sun.dc.**,
-            sun.java2d.**,
-            com.sun.image.**;
-}
-
-module media {
-    include com.sun.media.**;
-}
-
-module print {
-    include javax.print.**,
-            sun.print.**;
-}
-
-module sound {
-    include javax.sound.**;
-}
-
-module swing {
-    include javax.swing.**,
-            sun.swing.**,
-            // sajdi also contains classes in subpackages of com.sun.java.swing;
-            // so use '*' instead of '**' 
-            com.sun.java.swing.*,
-            com.sun.java.swing.plaf.**,
-            com.sun.swing.**;
-}
-
-module client {
-    include applet,
-            awt,
-            font,
-            imageio,
-            java2d,
-            media,
-            print,
-            sound,
-            swing;
-
-    include javax.accessibility.*,
-            sun.audio.**,
-            com.sun.accessibility.**;
-
-    // Bidi class in client module for now
-    include java.text.Bidi, sun.text.bidi.*;
-
-    // PerformanceLogger and dependencies
-    include sun.misc.Ref, sun.misc.PerformanceLogger;
-
-    // misc. dependencies that we need to examine
-    include sun.text.CodePointIterator,
-            sun.text.Char*,
-            sun.misc.Queue*,
-            sun.misc.FIFOQueueEnumerator,
-            sun.misc.LIFOQueueEnumerator;
-
-    // content handlers
-    include sun.net.www.content.audio.**,
-            sun.net.www.content.image.**;
-}
-
-/**************************************************************************/
-
-module deploy {
-
-    // For now, all plugin and JNLP
-    include com.sun.java.browser.**,
-            netscape.**,
-            sun.plugin.**,
-            sun.plugin2.**,,
-            com.sun.deploy.**,
-            com.sun.javaws.**,
-            javax.jnlp.*,
-            com.sun.jnlp.*;
-
-    // Hook for http authentication
-    include sun.net.www.protocol.http.AuthCacheBridge;
-}
-
-/**************************************************************************/
-
-module net-dns {
-    include sun.net.dns.**;                 // to access DNS config.
-    include sun.net.spi.nameservice.dns.**; // for DNS-only name service.
-}
-
-module net-compat {
-    // NTLM authentication support
-    include sun.net.www.protocol.http.ntlm.*;
-
-    // ftp and mail clients
-    include sun.net.ftp.**, sun.net.smtp.**;
-
-    // Legacy protocol handlers
-    include sun.net.www.protocol.**;
-
-    // Legacy content handlers
-    include sun.net.www.content.**;
-
-    include sun.net.Telnet*,
-            sun.net.TransferProtocolClient;
-}
-
-/**************************************************************************/
-
-// jar-tool and security-tools are JRE tools
-module jar-tool {
-    include sun.tools.jar.**;
-}
-
-module policytool {
-    include sun.security.tools.policytool.*;
-}
-
-module security-tools {
-    include sun.security.tools.**;
-
-    // Used by security tools
-    include sun.security.util.PathList, sun.security.x509.CertAndKeyGen;
-
-    exclude sun.security.tools.JarBASE64Encoder,
-            sun.security.tools.JarSigner,
-            sun.security.tools.JarSignerParameters,
-            sun.security.tools.JarSignerResources*,
-            sun.security.tools.SignatureFile,
-            sun.security.tools.TimestampedSigner;
-}
-
-module jconsole {
-    include sun.tools.jconsole.**,
-            com.sun.tools.jconsole.*;
-}
-
-module serialver {
-    include sun.tools.serialver.**;
-}
-
-module gui-tools {
-    include jconsole,
-            serialver;
-
-    include com.sun.tools.example.debug.bdi.**,
-            com.sun.tools.example.debug.gui.**,
-            com.sun.tools.internal.xjc.**;
-}
-
-module attach {
-    include com.sun.tools.attach.**,
-            sun.tools.attach.**;
-}
-
-module debugging {
-    include com.sun.jdi.**, com.sun.tools.jdi.**;
-}
-
-module jdb {
-    include com.sun.tools.example.debug.**;
-}
-
-module sajdi {
-    include sun.jvm.hotspot.**,
-            com.sun.java.swing.ui.**,
-            com.sun.java.swing.action.**;
-
-    include toolbarButtonGraphics/**;
-    include sa.properties;
-}
-
-module tools {
-    include attach,
-            debugging,
-            jaxws-tools,
-            jdb,
-            rmic,
-            sajdi;
-
-    // include gui-tools in tools module unless the tool binaries
-    // are modified to load the new gui-tools.jar
-    include gui-tools;
-
-    include com.sun.tools.**, sun.tools.**, sun.security.tools.**,
-            com.sun.jarsigner.**,
-            com.sun.javac.**,
-            com.sun.javadoc.**, com.sun.source.**,
-            sun.jvmstat.**;
-}
-
-/**************************************************************************/
-
-module servicetag {
-    include com.sun.servicetag.**;
-}
-
-/**************************************************************************/
-
-// these classes will be removed from JRE - see 6909002
-module inputmethods-ext {
-    include com.sun.inputmethods.internal.**;
-}
-
-/**************************************************************************/
-
-// Workaround for US export and local policy files 
-// They are currently in signed jars under the jre/lib/security directory
-module US_export_policy {
-    include default_US_export.policy;
-}
-
-module local_policy {
-    include default_local.policy,
-            exempt_local.policy;
-}
-
-/**************************************************************************/
-
-module other {
-    include **;
-}
--- a/jdk/make/modules/modules.group	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Example:
- *    module jdbc {
- *        include jdbc-base, jdbc-enterprise, jdbc-odbc;
- *    }
- */
--- a/jdk/make/modules/optional.depconfig	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-#
-# Copyright (c) 2009, 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.
-#
-
-# public final java.nio.channels.SocketChannel getChannel()
-@Optional
-  sun.security.ssl.BaseSSLSocketImpl -> java.nio.channels.SocketChannel
-
-# public XMLDecoder(java.io.InputStream)
-# public XMLDecoder(java.io.InputStream, java.lang.Object)
-# public XMLDecoder(java.io.InputStream, java.lang.Object, java.beans.ExceptionListener)
-# public XMLDecoder(java.io.InputStream, java.lang.Object, java.beans.ExceptionListener, java.lang.ClassLoader)
-# public XMLDecoder(org.xml.sax.InputSource)
-@Optional
-  java.beans.XMLDecoder -> com.sun.beans.decoder.DocumentHandler
-  java.beans.XMLDecoder -> org.xml.sax.InputSource
-
-# public static org.xml.sax.helpers.DefaultHandler createHandler(java.lang.Object, java.beans.ExceptionListener, java.lang.ClassLoader)
-@Optional
-  java.beans.XMLDecoder -> com.sun.beans.decoder.DocumentHandler
-  java.beans.XMLDecoder -> org.xml.sax.helpers.DefaultHandler
-
-# public final java.nio.channels.FileChannel getChannel()
-@Optional
-  java.net.SocketInputStream -> java.nio.channels.FileChannel
-
-# public final java.nio.channels.FileChannel getChannel()
-@Optional
-  java.net.SocketOutputStream -> java.nio.channels.FileChannel
-
-# public Scanner(java.io.File)
-# public Scanner(java.io.File, java.lang.String)
-@Optional
-  java.util.Scanner -> java.nio.channels.ReadableByteChannel
-  java.util.Scanner -> java.nio.channels.Channels
-
-# public Scanner(java.nio.file.FileRef)
-# public Scanner(java.nio.file.FileRef, java.lang.String)
-@Optional
-  java.util.Scanner -> java.nio.file.FileRef
-  java.util.Scanner -> java.nio.file.OpenOption
-
-# public Scanner(java.nio.channels.ReadableByteChannel)
-# public Scanner(java.nio.channels.ReadableByteChannel, java.lang.String)
-@Optional
-  java.util.Scanner -> java.nio.channels.ReadableByteChannel
-  java.util.Scanner -> java.nio.channels.Channels
-
-# private static void loadSnmpAgent(java.lang.String, java.util.Properties)
-@Optional
-  sun.management.Agent -> sun.management.snmp.AdaptorBootstrap
-
-# public void connect()
-@Optional
-  sun.net.www.protocol.http.HttpURLConnection -> java.net.SecureCacheResponse
-
-# private static sun.security.util.PermissionFactory<?> permissionFactory()
-@Optional
-  sun.security.util.SecurityConstants$AWT -> sun.awt.AWTPermissionFactory
-
-# sun.util.logging.LoggingSupport
-@Optional
-  sun.util.logging.LoggingSupport -> java.util.logging.LoggingProxyImpl
-
-# public java.nio.channels.DatagramChannel getChannel()
-@Optional
-  java.net.DatagramSocket -> java.nio.channels.DatagramChannel
-
-# public java.nio.channels.SocketChannel getChannel()
-@Optional
-  java.net.Socket -> java.nio.channels.SocketChannel
-
-# public java.nio.channels.ServerSocketChannel getChannel()
-@Optional
-  java.net.ServerSocket -> java.nio.channels.ServerSocketChannel
-
-# public final java.nio.channels.FileChannel getChannel()
-@Optional
-  java.io.RandomAccessFile -> java.nio.channels.FileChannel
-  java.io.RandomAccessFile -> sun.nio.ch.FileChannelImpl
-
-# public static sun.nio.cs.StreamDecoder forDecoder(java.nio.channels.ReadableByteChannel, java.nio.charset.CharsetDecoder, int)
-@Optional
-  sun.nio.cs.StreamDecoder -> java.nio.channels.ReadableByteChannel
-
-# private static java.nio.channels.FileChannel getChannel(java.io.FileInputStream)
-# StreamDecoder(java.io.InputStream, java.lang.Object, java.nio.charset.CharsetDecoder)
-@Optional
-  sun.nio.cs.StreamDecoder -> java.nio.channels.FileChannel
-
-# StreamDecoder(java.nio.channels.ReadableByteChannel, java.nio.charset.CharsetDecoder, int)
-@Optional
-  sun.nio.cs.StreamDecoder -> java.nio.channels.ReadableByteChannel
-
-# public static java.io.File createTemporaryFile(java.lang.String, java.lang.String, java.nio.file.attribute.FileAttribute<?>[])
-@Optional
-  java.io.File -> java.io.TempFileHelper
-  java.io.File -> java.nio.file.attribute.FileAttribute
-
-# public java.nio.file.Path toPath()
-@Optional
-  java.io.File -> java.nio.file.Paths
-  java.io.File -> java.nio.file.Path
-
-# public static sun.nio.cs.StreamEncoder forEncoder(java.nio.channels.WritableByteChannel, java.nio.charset.CharsetEncoder, int)
-# private StreamEncoder(java.nio.channels.WritableByteChannel, java.nio.charset.CharsetEncoder, int)
-@Optional
-  sun.nio.cs.StreamEncoder -> java.nio.channels.WritableByteChannel
-
-# public java.nio.channels.FileChannel getChannel()
-@Optional
-  java.io.FileOutputStream -> java.nio.channels.FileChannel
-  java.io.FileOutputStream -> sun.nio.ch.FileChannelImpl
-
-# public java.nio.channels.FileChannel getChannel()
-@Optional
-  java.io.FileInputStream -> java.nio.channels.FileChannel
-  java.io.FileInputStream -> sun.nio.ch.FileChannelImpl
-
-# public void loadFromXML(java.io.InputStream)
-# public void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String)
-@Optional
-  java.util.Properties -> java.util.XMLUtils
-
-# public static java.nio.channels.Channel inheritedChannel()
-@Optional
-  java.lang.System -> java.nio.channels.Channel
-  java.lang.System -> java.nio.channels.spi.SelectorProvider
--- a/jdk/make/modules/tools/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,154 +0,0 @@
-#
-# Copyright (c) 2009, 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.
-#
-
-#
-# Makefile for building the classanalyzer tool
-#
-
-BUILDDIR = ../..
-include $(BUILDDIR)/common/Defs.gmk
-
-PKGDIR = com/sun/classanalyzer
-BUILDTOOL_SOURCE_ROOT = src
-BUILDTOOL_MAIN        = $(PKGDIR)/ClassAnalyzer.java
-BUILTTOOL_MAINCLASS   = $(subst /,.,$(BUILDTOOL_MAIN:%.java=%))
-
-BUILDTOOL_MAIN_SOURCE_FILE = $(BUILDTOOL_SOURCE_ROOT)/$(BUILDTOOL_MAIN)
-BUILDTOOL_MANIFEST_FILE    = $(BUILDTOOLCLASSDIR)/classanalyzer_manifest.mf
-
-FILES_java := $(shell $(CD) $(BUILDTOOL_SOURCE_ROOT) \
-    && $(FIND) $(PKGDIR) -type f -print)
-
-FILES_class = $(FILES_java:%.java=$(BUILDTOOLCLASSDIR)/%.class)
-
-CLASSANALYZER_JAR_FILE     = $(BUILDTOOLJARDIR)/classanalyzer.jar
-
-#
-# ClassAnalyzer depends on the com.sun.tools.classfile API.
-# The tool is compiled with the latest version of the classfile 
-# library in the langtools repo to make sure that synchronized
-# change is made if the classfile API is changed. 
-#
-# If langtools repo exists, build its own copy of the
-# classfile library and use it for compile time and runtime.
-# If not exist (the top level repo is not a forest), use 
-# the built jdk tools that imports tools.jar from the latest
-# promoted build.
-#
-# If the classfile API is changed but not yet in a promoted build,
-# the build might fail and the tool would need the langtools repo
-# to build in that case.
-#
-ifndef LANGTOOLS_TOPDIR
-  LANGTOOLS_TOPDIR=$(JDK_TOPDIR)/../langtools
-endif
-
-LANGTOOLS_TOPDIR_EXISTS := $(shell \
-  if [ -d $(LANGTOOLS_TOPDIR) ] ; then \
-    echo true; \
-  else \
-    echo false; \
-  fi)
-
-CLASSFILE_SRC = $(LANGTOOLS_TOPDIR)/src/share/classes
-CLASSFILE_PKGDIR = com/sun/tools/classfile
-
-ifeq ($(LANGTOOLS_TOPDIR_EXISTS), true)
-  FILES_classfile_java := $(shell \
-       $(CD) $(CLASSFILE_SRC) && \
-           $(FIND) $(CLASSFILE_PKGDIR) -name '*.java' -print)
-  FILES_classfile_class = $(FILES_classfile_java:%.java=$(BUILDTOOLCLASSDIR)/%.class)
-  CLASSFILE_JAR_FILE = $(BUILDTOOLJARDIR)/classfile.jar
-  BUILDTOOL_JAVAC    = $(BOOT_JAVAC_CMD) $(JAVAC_JVM_FLAGS) \
-                          $(BOOT_JAVACFLAGS) -classpath $(CLASSFILE_JAR_FILE)
-  BUILDTOOL_JAVA     = $(BOOT_JAVA_CMD) $(JAVA_TOOLS_FLAGS) \
-                          -Xbootclasspath/p:$(CLASSFILE_JAR_FILE)
-else
-  # if langtools doesn't exist, use tools from the built jdk
-  BUILDTOOL_JAVAC = $(BINDIR)/javac $(JAVAC_JVM_FLAGS) \
-                       $(BOOT_JAVACFLAGS)
-  BUILDTOOL_JAVA  = $(BINDIR)/java $(JAVA_TOOLS_FLAGS)
-endif
-
-# Location of the output modules.list, <module>.classlist
-# and other output files generated by the class analyzer tool.
-#
-MODULE_CLASSLIST = $(MODULES_TEMPDIR)/classlist
-
-all build: classanalyzer gen-classlist
-
-classanalyzer: $(CLASSFILE_JAR_FILE) $(CLASSANALYZER_JAR_FILE) 
-
-gen-classlist:
-	@$(ECHO) ">>>Making "$@" @ `$(DATE)` ..."
-	@$(RM) -rf $(MODULE_CLASSLIST)
-	@$(MKDIR) -p $(MODULE_CLASSLIST)
-	$(BUILDTOOL_JAVA) \
-                -Dclassanalyzer.debug \
-                -jar $(CLASSANALYZER_JAR_FILE) \
-                -jdkhome $(OUTPUTDIR) \
-                -config ../modules.config \
-                -config ../modules.group \
-                -depconfig ../jdk7.depconfig \
-                -depconfig ../optional.depconfig \
-                -showdynamic \
-                -output $(MODULE_CLASSLIST)
-	@$(ECHO) ">>>Finished making "$@" @ `$(DATE)` ..."
-
-$(BUILDTOOL_MANIFEST_FILE): $(BUILDTOOL_MAIN_SOURCE_FILE)
-	@$(prep-target)
-	$(ECHO) "Main-Class: $(BUILTTOOL_MAINCLASS)" > $@
-
-$(BUILDTOOLCLASSDIR)/$(CLASSFILE_PKGDIR)/%.class : $(CLASSFILE_SRC)/$(CLASSFILE_PKGDIR)/%.java
-	@$(prep-target)
-	@$(BUILDTOOL_JAVAC) \
-            -sourcepath $(CLASSFILE_SRC) \
-            -d $(BUILDTOOLCLASSDIR) $<
-
-$(BUILDTOOLCLASSDIR)/%.class : $(BUILDTOOL_SOURCE_ROOT)/%.java
-	@$(prep-target)
-	$(BUILDTOOL_JAVAC) \
-            -sourcepath $(BUILDTOOL_SOURCE_ROOT) \
-            -d $(BUILDTOOLCLASSDIR) $<
-
-$(CLASSANALYZER_JAR_FILE): $(BUILDTOOL_MANIFEST_FILE) $(FILES_class)
-	@$(prep-target)
-	$(BOOT_JAR_CMD) cfm $@ $(BUILDTOOL_MANIFEST_FILE) \
-	    -C $(BUILDTOOLCLASSDIR) $(PKGDIR) $(BOOT_JAR_JFLAGS) || $(RM) $@
-	@$(java-vm-cleanup)
-
-$(BUILDTOOLJARDIR)/classfile.jar: $(FILES_classfile_class)
-	@$(prep-target)
-	$(CD) $(BUILDTOOLCLASSDIR) && \
-	    $(BOOT_JAR_CMD) cf $@ \
-	        $(CLASSFILE_PKGDIR) $(BOOT_JAR_JFLAGS) || $(RM) $@
-	@$(java-vm-cleanup)
-
-clean clobber::
-	@$(RM) -rf $(BUILDTOOLCLASSDIR)/$(PKGDIR)
-	@$(RM) -rf $(BUILDTOOLCLASSDIR)/$(CLASSFILE_PKGDIR)
-	@$(RM) $(BUILDTOOL_MANIFEST_FILE)
-	@$(RM) $(CLASSANALYZER_JAR_FILE)
-	@$(RM) $(CLASSFILE_JAR_FILE)
--- a/jdk/make/modules/tools/build.xml	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-
-  This code is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 2 only, as
-  published by the Free Software Foundation.  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.
--->
-
-<project name="classanalyzer" default="build" basedir=".">
-</project>
--- a/jdk/make/modules/tools/nbproject/project.properties	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-#
-# Copyright (c) 2009, 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.
-#
-
-application.title=classanalyzer
-application.vendor=mchung
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-
-cp.extra=${tools.jar} 
-
-debug.classpath=\
-    ${run.classpath}
-debug.test.classpath=\
-    ${run.test.classpath}
-
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/classanalyzer.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-
-excludes=
-
-file.reference.tools.jar=${jdk.home}/lib/tools.jar
-file.reference.tools-src=src
-includes=**
-jar.compress=false
-javac.classpath=\
-    ${file.reference.tools.jar}
-javac.deprecation=false
-javac.source=1.5
-javac.target=1.5
-javac.test.classpath=
-javadoc.author=false
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=false
-javadoc.use=false
-javadoc.version=false
-main.class=com.sun.classanalyzer.ClassAnalyzer
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-platform.active=JDK_1.6
-run.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
-# or test-sys-prop.name=value to set system properties for unit tests):
-run.jvmargs=-Xmx256m
-run.test.classpath=
-source.encoding=UTF-8
-src.dir=${file.reference.tools-src}
--- a/jdk/make/modules/tools/nbproject/project.xml	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- 
-  This code is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 2 only, as
-  published by the Free Software Foundation.  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.
--->
-
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.java.j2seproject</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>classanalyzer</name>
-            <explicit-platform explicit-source-supported="true"/>
-            <source-roots>
-                <root id="src.dir"/>
-            </source-roots>
-            <test-roots/>
-        </data>
-    </configuration>
-</project>
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/AnnotatedDependency.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,627 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.Map;
-
-import com.sun.classanalyzer.Module.Reference;
-import java.util.LinkedList;
-import java.util.TreeMap;
-
-/**
- *
- * @author Mandy Chung
- */
-public abstract class AnnotatedDependency implements Comparable<AnnotatedDependency> {
-
-    final Klass from;
-    final List<String> classes;
-    protected boolean optional;
-    String description;
-    Klass.Method method;
-    private List<Filter> filters = null;
-
-    public AnnotatedDependency(Klass klass) {
-        this(klass, false);
-    }
-
-    public AnnotatedDependency(Klass klass, boolean optional) {
-        this.from = klass;
-        this.classes = new ArrayList<String>();
-        this.optional = optional;
-    }
-
-    abstract String getTag();
-
-    abstract boolean isDynamic();
-
-    void setMethod(Klass.Method m) {
-        this.method = m;
-    }
-
-    void addElement(String element, List<String> value) {
-        if (element.equals("value")) {
-            addValue(value);
-        } else if (element.equals("description")) {
-            description = value.get(0);
-        } else if (element.equals("optional")) {
-            optional = value.get(0).equals("1") || Boolean.parseBoolean(value.get(0));
-        }
-    }
-
-    void addValue(List<String> value) {
-        for (String s : value) {
-            if ((s = s.trim()).length() > 0) {
-                classes.add(s);
-            }
-        }
-    }
-
-    List<String> getValue() {
-        return classes;
-    }
-
-    boolean isOptional() {
-        return optional;
-    }
-
-    boolean isEmpty() {
-        return classes.isEmpty();
-    }
-
-    boolean matches(String classname) {
-        synchronized (this) {
-            // initialize filters
-            if (filters == null) {
-                filters = new ArrayList<Filter>();
-                for (String pattern : classes) {
-                    filters.add(new Filter(pattern));
-                }
-
-            }
-        }
-
-        for (Filter f : filters) {
-            if (f.matches(classname)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        for (String v : getValue()) {
-            if (sb.length() == 0) {
-                sb.append(getTag());
-                sb.append("\n");
-            } else {
-                sb.append("\n");
-            }
-            sb.append("  ");
-            sb.append(from.getClassName()).append(" -> ");
-            sb.append(v);
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public int compareTo(AnnotatedDependency o) {
-        if (from == o.from) {
-            if (this.getClass().getName().equals(o.getClass().getName())) {
-                String s1 = classes.isEmpty() ? "" : classes.get(0);
-                String s2 = o.classes.isEmpty() ? "" : o.classes.get(0);
-                return s1.compareTo(s2);
-            } else {
-                return this.getClass().getName().compareTo(o.getClass().getName());
-            }
-
-        } else {
-            return from.compareTo(o.from);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int hashcode = 7 + 73 * from.hashCode();
-        for (String s : classes) {
-            hashcode ^= s.hashCode();
-        }
-        return hashcode;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof AnnotatedDependency)) {
-            return false;
-        }
-        AnnotatedDependency other = (AnnotatedDependency) obj;
-        boolean ret = this.from.equals(other.from) && this.classes.size() == other.classes.size();
-        if (ret == true) {
-            for (int i = 0; i < this.classes.size(); i++) {
-                ret = ret && this.classes.get(i).equals(other.classes.get(i));
-            }
-        }
-        return ret;
-    }
-
-    static class ClassForName extends AnnotatedDependency {
-
-        public ClassForName(Klass klass, boolean optional) {
-            super(klass, optional);
-        }
-
-        @Override
-        String getTag() {
-            if (this.optional) {
-                return TAG + "(optional)";
-            } else {
-                return TAG;
-            }
-        }
-
-        @Override
-        boolean isDynamic() {
-            return true;
-        }
-        static final String TYPE = "sun.annotation.ClassForName";
-        static final String TAG = "@ClassForName";
-    }
-
-    static class NativeFindClass extends AnnotatedDependency {
-
-        public NativeFindClass(Klass klass, boolean optional) {
-            super(klass, optional);
-        }
-
-        @Override
-        String getTag() {
-            if (this.optional) {
-                return TAG + "(optional)";
-            } else {
-                return TAG;
-            }
-        }
-
-        @Override
-        boolean isDynamic() {
-            return true;
-        }
-        static final String TYPE = "sun.annotation.NativeFindClass";
-        static final String TAG = "@NativeFindClass";
-    }
-
-    static class Provider extends AnnotatedDependency {
-
-        private List<String> services = new ArrayList<String>();
-
-        Provider(Klass klass) {
-            super(klass, true);
-        }
-
-        @Override
-        boolean isDynamic() {
-            return true;
-        }
-
-        public List<String> services() {
-            return services;
-        }
-
-        @Override
-        void addElement(String element, List<String> value) {
-            if (element.equals("service")) {
-                List<String> configFiles = new ArrayList<String>();
-                for (String s : value) {
-                    if ((s = s.trim()).length() > 0) {
-                        configFiles.add(metaInfPath + s);
-                    }
-                }
-                addValue(configFiles);
-            }
-        }
-
-        @Override
-        void addValue(List<String> value) {
-            for (String s : value) {
-                if ((s = s.trim()).length() > 0) {
-                    if (s.startsWith("META-INF")) {
-                        services.add(s);
-                        readServiceConfiguration(s, classes);
-                    } else {
-                        throw new RuntimeException("invalid value" + s);
-                    }
-                }
-            }
-        }
-
-        boolean isEmpty() {
-            return services.isEmpty();
-        }
-        static final String metaInfPath =
-                "META-INF" + File.separator + "services" + File.separator;
-
-        static void readServiceConfiguration(String config, List<String> names) {
-            BufferedReader br = null;
-            try {
-                InputStream is = ClassPath.open(config);
-                if (is != null) {
-                    // Properties doesn't perserve the order of the input file
-                    br = new BufferedReader(new InputStreamReader(is, "utf-8"));
-                    int lc = 1;
-                    while ((lc = parseLine(br, lc, names)) >= 0);
-                }
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (IOException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                }
-            }
-        }
-
-        // Parse a single line from the given configuration file, adding the name
-        // on the line to the names list.
-        //
-        private static int parseLine(BufferedReader r, int lc, List<String> names) throws IOException {
-            String ln = r.readLine();
-            if (ln == null) {
-                return -1;
-            }
-            int ci = ln.indexOf('#');
-            if (ci >= 0) {
-                ln = ln.substring(0, ci);
-            }
-            ln = ln.trim();
-            int n = ln.length();
-            if (n != 0) {
-                if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0)) {
-                    throw new RuntimeException("Illegal configuration-file syntax");
-                }
-                int cp = ln.codePointAt(0);
-                if (!Character.isJavaIdentifierStart(cp)) {
-                    throw new RuntimeException("Illegal provider-class name: " + ln);
-                }
-                for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) {
-                    cp = ln.codePointAt(i);
-                    if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) {
-                        throw new RuntimeException("Illegal provider-class name: " + ln);
-                    }
-                }
-                if (!names.contains(ln)) {
-                    names.add(ln);
-                }
-            }
-            return lc + 1;
-        }
-
-        @Override
-        String getTag() {
-            return TAG;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (!(obj instanceof AnnotatedDependency)) {
-                return false;
-            }
-            Provider other = (Provider) obj;
-            boolean ret = this.from.equals(other.from) &&
-                    this.services.size() == other.services.size();
-            if (ret == true) {
-                for (int i = 0; i < this.services.size(); i++) {
-                    ret = ret && this.services.get(i).equals(other.services.get(i));
-                }
-            }
-            return ret;
-        }
-
-        @Override
-        public int hashCode() {
-            int hashcode = 7 + 73 * from.hashCode();
-            for (String s : services) {
-                hashcode ^= s.hashCode();
-            }
-            return hashcode;
-        }
-
-        @Override
-        public List<String> getValue() {
-            List<String> result = new ArrayList<String>();
-            result.addAll(services);
-            return result;
-        }
-        static final String TYPE = "sun.annotation.Provider";
-        static final String TAG = "@Provider";
-    }
-
-    static class OptionalDependency extends AnnotatedDependency {
-
-        static boolean isOptional(Klass from, Klass to) {
-            synchronized (OptionalDependency.class) {
-                if (optionalDepsMap == null) {
-                    // Build a map of classes to its optional dependencies
-                    initDependencies();
-                }
-            }
-            for (Reference ref : optionalDepsMap.keySet()) {
-                if (ref.referrer() == from && ref.referree() == to) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        OptionalDependency(Klass klass) {
-            super(klass, true);
-        }
-
-        @Override
-        boolean isDynamic() {
-            return false;
-        }
-
-        @Override
-        String getTag() {
-            return TAG;
-        }
-        static final String TYPE = "sun.annotation.Optional";
-        static final String TAG = "@Optional";
-    }
-
-    static class CompilerInline extends AnnotatedDependency {
-
-        public CompilerInline(Klass klass) {
-            super(klass);
-        }
-
-        @Override
-        String getTag() {
-            return TAG;
-        }
-
-        @Override
-        boolean isDynamic() {
-            return false;
-        }
-        static final String TYPE = "sun.annotation.Inline";
-        static final String TAG = "@Inline";
-    }
-
-    static class Filter {
-
-        final String pattern;
-        final String regex;
-
-        Filter(String pattern) {
-            this.pattern = pattern;
-
-            boolean isRegex = false;
-            for (int i = 0; i < pattern.length(); i++) {
-                char p = pattern.charAt(i);
-                if (p == '*' || p == '[' || p == ']') {
-                    isRegex = true;
-                    break;
-                }
-            }
-
-            if (isRegex) {
-                this.regex = convertToRegex(pattern);
-            } else {
-                this.regex = null;
-            }
-        }
-
-        private String convertToRegex(String pattern) {
-            StringBuilder sb = new StringBuilder();
-            int i = 0;
-            int index = 0;
-            int plen = pattern.length();
-            while (i < plen) {
-                char p = pattern.charAt(i);
-                if (p == '*') {
-                    sb.append("(").append(pattern.substring(index, i)).append(")");
-                    if (i + 1 < plen && pattern.charAt(i + 1) == '*') {
-                        sb.append(".*");
-                        index = i + 2;
-                    } else {
-                        sb.append("[^\\.]*");
-                        index = i + 1;
-                    }
-                } else if (p == '[') {
-                    int j = i + 1;
-                    while (j < plen) {
-                        if (pattern.charAt(j) == ']') {
-                            break;
-                        }
-                        j++;
-                    }
-                    if (j >= plen || pattern.charAt(j) != ']') {
-                        throw new RuntimeException("Malformed pattern " + pattern);
-                    }
-                    sb.append("(").append(pattern.substring(index, i)).append(")");
-                    sb.append(pattern.substring(i, j + 1));
-                    index = j + 1;
-                    i = j;
-                }
-                i++;
-            }
-            if (index < plen) {
-                sb.append("(").append(pattern.substring(index, plen)).append(")");
-            }
-            return sb.toString();
-        }
-
-        boolean matches(String name) {
-            if (regex == null) {
-                // the pattern is not a regex
-                return name.equals(pattern);
-            } else {
-                return name.matches(regex);
-            }
-        }
-    }
-
-    static boolean isValidType(String type) {
-        if (type.endsWith("(optional)")) {
-            int len = type.length() - "(optional)".length();
-            type = type.substring(0, len);
-        }
-        return type.equals(ClassForName.TYPE) || type.equals(ClassForName.TAG) ||
-                type.equals(NativeFindClass.TYPE) || type.equals(NativeFindClass.TAG) ||
-                type.equals(Provider.TYPE) || type.equals(Provider.TAG) ||
-                type.equals(CompilerInline.TYPE) || type.equals(CompilerInline.TAG) ||
-                type.equals(OptionalDependency.TYPE) || type.equals(OptionalDependency.TAG);
-    }
-
-    static AnnotatedDependency newAnnotatedDependency(String tag, String value, Klass klass) {
-        AnnotatedDependency dep = newAnnotatedDependency(tag, klass);
-        if (dep != null) {
-            dep.addValue(Collections.singletonList(value));
-        }
-        return dep;
-    }
-    static List<AnnotatedDependency> annotatedDependencies = new LinkedList<AnnotatedDependency>();
-    static List<AnnotatedDependency> optionalDependencies = new LinkedList<AnnotatedDependency>();
-
-    static AnnotatedDependency newAnnotatedDependency(String type, Klass klass) {
-        boolean optional = false;
-        if (type.endsWith("(optional)")) {
-            optional = true;
-            int len = type.length() - "(optional)".length();
-            type = type.substring(0, len);
-        }
-
-        if (type.equals(OptionalDependency.TYPE) || type.equals(OptionalDependency.TAG)) {
-            return newOptionalDependency(klass);
-        }
-
-        AnnotatedDependency dep;
-        if (type.equals(ClassForName.TYPE) || type.equals(ClassForName.TAG)) {
-            dep = new ClassForName(klass, optional);
-        } else if (type.equals(NativeFindClass.TYPE) || type.equals(NativeFindClass.TAG)) {
-            dep = new NativeFindClass(klass, optional);
-        } else if (type.equals(Provider.TYPE) || type.equals(Provider.TAG)) {
-            dep = new Provider(klass);
-        } else if (type.equals(CompilerInline.TYPE) || type.equals(CompilerInline.TAG)) {
-            dep = new CompilerInline(klass);
-        } else {
-            return null;
-        }
-        klass.addAnnotatedDep(dep);
-        annotatedDependencies.add(dep);
-        return dep;
-    }
-
-    static OptionalDependency newOptionalDependency(Klass klass) {
-        OptionalDependency dep = new OptionalDependency(klass);
-        optionalDependencies.add(dep);
-        return dep;
-    }
-    static Map<Reference, Set<AnnotatedDependency>> annotatedDepsMap = null;
-    static Map<Reference, Set<AnnotatedDependency>> optionalDepsMap = null;
-
-    static Map<Reference, Set<AnnotatedDependency>> getReferences(Module m) {
-        // ensure it's initialized
-        initDependencies();
-
-        Map<Reference, Set<AnnotatedDependency>> result = new TreeMap<Reference, Set<AnnotatedDependency>>();
-        for (Reference ref : annotatedDepsMap.keySet()) {
-            if (m.contains(ref.referrer()) && m.isModuleDependence(ref.referree())) {
-                result.put(ref, annotatedDepsMap.get(ref));
-            }
-        }
-        return result;
-    }
-
-    static Set<Module.Dependency> getDependencies(Module m) {
-        // ensure it's initialized
-        initDependencies();
-
-        Set<Module.Dependency> deps = new TreeSet<Module.Dependency>();
-        for (Reference ref : annotatedDepsMap.keySet()) {
-            if (m.contains(ref.referrer())) {
-                Module other = m.getModuleDependence(ref.referree());
-                if (other != null) {
-                    for (AnnotatedDependency ad : annotatedDepsMap.get(ref)) {
-                        Module.Dependency d = new Module.Dependency(other, ad.isOptional(), ad.isDynamic());
-                        deps.add(d);
-                    }
-                }
-            }
-        }
-        return deps;
-    }
-
-    synchronized static void initDependencies() {
-        if (annotatedDepsMap != null) {
-            return;
-        }
-
-        // Build a map of references to its dependencies
-        annotatedDepsMap = new TreeMap<Reference, Set<AnnotatedDependency>>();
-        optionalDepsMap = new TreeMap<Reference, Set<AnnotatedDependency>>();
-
-        for (Klass k : Klass.getAllClasses()) {
-            for (AnnotatedDependency ad : annotatedDependencies) {
-                if (ad.matches(k.getClassName())) {
-                    Reference ref = new Reference(ad.from, k);
-                    Set<AnnotatedDependency> set = annotatedDepsMap.get(ref);
-                    if (set == null) {
-                        set = new TreeSet<AnnotatedDependency>();
-                        annotatedDepsMap.put(ref, set);
-                    }
-                    set.add(ad);
-                }
-            }
-
-            for (AnnotatedDependency ad : optionalDependencies) {
-                if (ad.matches(k.getClassName())) {
-                    Reference ref = new Reference(ad.from, k);
-                    Set<AnnotatedDependency> set = optionalDepsMap.get(ref);
-                    if (set == null) {
-                        set = new TreeSet<AnnotatedDependency>();
-                        optionalDepsMap.put(ref, set);
-                    }
-                    set.add(ad);
-                }
-            }
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/AnnotationParser.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import com.sun.tools.classfile.*;
-import com.sun.tools.classfile.Annotation;
-import com.sun.tools.classfile.ExtendedAnnotation;
-import com.sun.tools.classfile.Annotation.Annotation_element_value;
-import com.sun.tools.classfile.Annotation.Array_element_value;
-import com.sun.tools.classfile.Annotation.Class_element_value;
-import com.sun.tools.classfile.Annotation.Enum_element_value;
-import com.sun.tools.classfile.Annotation.Primitive_element_value;
-import com.sun.tools.classfile.ConstantPoolException;
-import com.sun.tools.classfile.Descriptor;
-import com.sun.tools.classfile.Descriptor.InvalidDescriptor;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.sun.classanalyzer.AnnotatedDependency.*;
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.Map;
-import java.util.Set;
-
-/**
- *
- * @author Mandy Chung
- */
-public class AnnotationParser {
-
-    static boolean parseAnnotation = false;
-    static void setParseAnnotation(boolean newValue) {
-        parseAnnotation = newValue;
-    }
-
-    private final ClassFileParser cfparser;
-    public AnnotationParser(ClassFileParser cfparser) {
-        this.cfparser = cfparser;
-    }
-
-    private AnnotatedDependency addAnnotation(Annotation annot, Klass.Method method) {
-        String type = getType(annot.type_index);
-        AnnotatedDependency dep = AnnotatedDependency.newAnnotatedDependency(type, cfparser.this_klass);
-        if (dep != null) {
-            for (int i = 0; i < annot.num_element_value_pairs; i++) {
-                Element element = getElement(annot.element_value_pairs[i]);
-                dep.addElement(element.name, element.value);
-            }
-            dep.setMethod(method);
-        }
-        return dep;
-    }
-
-    private AnnotatedDependency addAnnotation(ExtendedAnnotation annot, Klass.Method method) {
-        return addAnnotation(annot.annotation, method);
-    }
-
-    class Element {
-
-        String name;
-        List<String> value;
-
-        Element(String name) {
-            this.name = name;
-            this.value = new ArrayList<String>();
-        }
-
-        void add(String v) {
-            value.add(v);
-        }
-    }
-
-    Element getElement(Annotation.element_value_pair pair) {
-        Element element = new Element(getName(pair.element_name_index));
-        evp.parse(pair.value, element);
-        return element;
-    }
-
-    private String getType(int index) {
-        try {
-            Descriptor d = new Descriptor(index);
-            return d.getFieldType(cfparser.classfile.constant_pool);
-        } catch (ConstantPoolException ignore) {
-        } catch (InvalidDescriptor ignore) {
-        }
-        return "Unknown";
-    }
-
-    private String getName(int index) {
-        return cfparser.constantPoolParser.stringValue(index);
-    }
-    element_value_Parser evp = new element_value_Parser();
-
-    class element_value_Parser implements Annotation.element_value.Visitor<Void, Element> {
-
-        public Void parse(Annotation.element_value value, Element element) {
-            value.accept(this, element);
-            return null;
-        }
-
-        public Void visitPrimitive(Primitive_element_value ev, Element element) {
-            String value = getName(ev.const_value_index);
-            element.add(value);
-            return null;
-        }
-
-        public Void visitEnum(Enum_element_value ev, Element element) {
-            String value = getName(ev.type_name_index) + "." + getName(ev.const_name_index);
-            element.add(value);
-            return null;
-        }
-
-        public Void visitClass(Class_element_value ev, Element element) {
-            String value = getName(ev.class_info_index) + ".class";
-            element.add(value);
-            return null;
-        }
-
-        public Void visitAnnotation(Annotation_element_value ev, Element element) {
-            // AnnotationParser.this.addAnnotation(ev.annotation_value);
-            throw new UnsupportedOperationException("Not supported: " + ev);
-        }
-
-        public Void visitArray(Array_element_value ev, Element element) {
-            for (int i = 0; i < ev.num_values; i++) {
-                parse(ev.values[i], element);
-            }
-            return null;
-        }
-    }
-
-    void parseAttributes(Attributes attributes, Klass.Method method) {
-        if (!parseAnnotation) {
-            return;
-        }
-
-        visitRuntimeAnnotations((RuntimeVisibleAnnotations_attribute) attributes.get(Attribute.RuntimeVisibleAnnotations), method);
-        visitRuntimeAnnotations((RuntimeInvisibleAnnotations_attribute) attributes.get(Attribute.RuntimeInvisibleAnnotations), method);
-        visitRuntimeTypeAnnotations((RuntimeVisibleTypeAnnotations_attribute) attributes.get(Attribute.RuntimeVisibleTypeAnnotations), method);
-        visitRuntimeTypeAnnotations((RuntimeInvisibleTypeAnnotations_attribute) attributes.get(Attribute.RuntimeInvisibleTypeAnnotations), method);
-        visitRuntimeParameterAnnotations((RuntimeVisibleParameterAnnotations_attribute) attributes.get(Attribute.RuntimeVisibleParameterAnnotations), method);
-        visitRuntimeParameterAnnotations((RuntimeInvisibleParameterAnnotations_attribute) attributes.get(Attribute.RuntimeInvisibleParameterAnnotations), method);
-    }
-
-    public void visitRuntimeAnnotations(RuntimeAnnotations_attribute attr, Klass.Method method) {
-        if (attr == null) {
-            return;
-        }
-
-        for (int i = 0; i < attr.annotations.length; i++) {
-            addAnnotation(attr.annotations[i], method);
-        }
-    }
-
-    public void visitRuntimeTypeAnnotations(RuntimeTypeAnnotations_attribute attr, Klass.Method method) {
-        if (attr == null) {
-            return;
-        }
-
-        for (int i = 0; i < attr.annotations.length; i++) {
-            addAnnotation(attr.annotations[i], method);
-        }
-    }
-
-    public void visitRuntimeParameterAnnotations(RuntimeParameterAnnotations_attribute attr, Klass.Method method) {
-        if (attr == null) {
-            return;
-        }
-
-        for (int param = 0; param < attr.parameter_annotations.length; param++) {
-            for (int i = 0; i < attr.parameter_annotations[param].length; i++) {
-                addAnnotation(attr.parameter_annotations[param][i], method);
-            }
-        }
-    }
-
-    void parseAttributes(Attributes attributes) {
-        parseAttributes(attributes, null);
-    }
-
-    public static void main(String[] args) throws Exception {
-        String jdkhome = null;
-        String output = ".";
-
-        // process arguments
-        int i = 0;
-        while (i < args.length) {
-            String arg = args[i++];
-            if (arg.equals("-jdkhome")) {
-                if (i < args.length) {
-                    jdkhome = args[i++];
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-output")) {
-                output = args[i++];
-            } else {
-                usage();
-            }
-        }
-        if (jdkhome == null) {
-            usage();
-        }
-
-        // parse annotation and code attribute to find all references
-        // to Class.forName etc
-        CodeAttributeParser.setParseCodeAttribute(true);
-        AnnotationParser.setParseAnnotation(true);
-
-        ClassPath.setJDKHome(jdkhome);
-        ClassPath.parseAllClassFiles();
-
-        PrintWriter writer = new PrintWriter(new File(output, "jdk7.depconfig"));
-
-        try {
-            for (Klass k : Klass.getAllClasses()) {
-                for (AnnotatedDependency dep : k.getAnnotatedDeps()) {
-                    if (dep.isEmpty()) {
-                        continue;
-                    }
-                    writer.format("# %s \n", dep.method == null ? dep.from : dep.method);
-                    writer.format("%s\n\n", dep);
-                }
-            }
-        } finally {
-            writer.close();
-        }
-
-        writer = new PrintWriter(new File(output, "optional.depconfig"));
-        try {
-            AnnotatedDependency prev = null;
-            for (AnnotatedDependency dep : AnnotatedDependency.optionalDependencies) {
-                if (prev != null && !dep.equals(prev)) {
-                    writer.format("%s\n\n", prev);
-                }
-                writer.format("# %s \n", dep.method == null ? dep.from : dep.method);
-                prev = dep;
-            }
-            if (prev != null) {
-                writer.format("%s\n\n", prev);
-            }
-        } finally {
-            writer.close();
-        }
-
-        writer = new PrintWriter(new File(output, "runtime.references"));
-        try {
-            for (Map.Entry<String, Set<Klass.Method>> entry : CodeAttributeParser.runtimeReferences.entrySet()) {
-                writer.format("References to %s\n", entry.getKey());
-                Klass prev = null;
-                for (Klass.Method m : entry.getValue()) {
-                    if (prev == null || prev != m.getKlass()) {
-                        writer.format("  %-50s # %s\n", m.getKlass(), m);
-                    } else if (prev == m.getKlass()) {
-                        writer.format("  %-50s # %s\n", "", m);
-                    }
-                    prev = m.getKlass();
-                }
-            }
-        } finally {
-            writer.close();
-        }
-    }
-
-    private static void usage() {
-        System.out.println("Usage: AnnotationParser <options>");
-        System.out.println("Options: ");
-        System.out.println("\t-jdkhome <JDK home> where all jars will be parsed");
-        System.out.println("\t-depconfig <output file for annotated dependencies>");
-        System.out.println("\t-optional <output file for optional dependencies>");
-        System.exit(-1);
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/BootAnalyzer.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,819 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.File;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-import com.sun.tools.classfile.*;
-import com.sun.tools.classfile.ConstantPool.*;
-import static com.sun.tools.classfile.ConstantPool.*;
-import com.sun.tools.classfile.Instruction.TypeKind;
-import com.sun.tools.classfile.Type.*;
-
-/**
- * Generate the module config for the boot module with
- * a given set of roots (classes or methods) and exclude list.
- *
- * This tool does method-level dependency analysis starting
- * from the root set and follows references transitively as follows:
- * <ul>
- * <li>For a given class, it will parse the ClassFile to
- *     find its superclass and superinterfaces and also
- *     its static initializer &lt;clinit&gt;.</li>
- * <li>For each method, it will parse its Code attribute
- *     to look for a Methodref, Fieldref, and InterfaceMethodref.
- *     </li>
- * <li>For each Fieldref, it will include the type of
- *     the field in the dependency.</li>
- * <li>For each MethodRef, it will follow all references in
- *     that method.</li>
- * <li>For each InterfaceMethodref, it will follow all references in
- *     that method defined its implementation classes in
- *     the resulting dependency list.</li>
- * </ul>
- *
- * Limitation:
- * <ul>
- * <li>For each Methodref, it only parses the method of
- *     the specified type.  It doesn't analyze the class hierarchy
- *     and follow references of its subclasses since it ends up
- *     pulls in many unnecessary dependencies.  For now,
- *     the list of subclasses and methods need to be listed in
- *     the root set.</li>
- * </ul>
- *
- * @author Mandy Chung
- */
-public class BootAnalyzer {
-
-    public static void main(String[] args) throws Exception {
-        String jdkhome = null;
-        String config = null;
-        String output = ".";
-        boolean printClassList = false;
-
-        // process arguments
-        int i = 0;
-        while (i < args.length) {
-            String arg = args[i++];
-            if (arg.equals("-jdkhome")) {
-                if (i < args.length) {
-                    jdkhome = args[i++];
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-config")) {
-                config = args[i++];
-            } else if (arg.equals("-output")) {
-                output = args[i++];
-            } else if (arg.equals("-classlist")) {
-                printClassList = true;
-            } else {
-                usage();
-            }
-        }
-
-
-
-        if (jdkhome == null || config == null) {
-            usage();
-        }
-
-        File jre = new File(jdkhome, "jre");
-        if (jre.exists()) {
-            ClassPath.setJDKHome(jdkhome);
-        } else {
-            File classes = new File(jdkhome, "classes");
-            if (classes.exists()) {
-                ClassPath.setClassPath(classes.getCanonicalPath());
-            } else {
-                throw new RuntimeException("Invalid jdkhome: " + jdkhome);
-            }
-        }
-
-        parseConfigFile(config);
-        followRoots();
-
-        // create output directory if it doesn't exist
-        File dir = new File(output);
-        if (!dir.isDirectory()) {
-            if (!dir.exists()) {
-                boolean created = dir.mkdir();
-                if (!created) {
-                    throw new RuntimeException("Unable to create `" + dir + "'");
-                }
-            }
-        }
-
-        String bootmodule = "boot";
-        String bootconfig = resolve(dir, bootmodule, "config");
-        printBootConfig(bootconfig, bootmodule);
-
-        List<ModuleConfig> list = ModuleConfig.readConfigurationFile(bootconfig);
-        Module module = Module.addModule(list.get(0));
-        for (Klass k : Klass.getAllClasses()) {
-            module.addKlass(k);
-        }
-        module.fixupDependencies();
-
-        if (printClassList) {
-            module.printClassListTo(resolve(dir, bootmodule, "classlist"));
-            module.printSummaryTo(resolve(dir, bootmodule, "summary"));
-        }
-    }
-
-    // print boot.config file as an input to the ClassAnalyzer
-    private static void printBootConfig(String output, String bootmodule) throws IOException {
-
-        File f = new File(output);
-        PrintWriter writer = new PrintWriter(f);
-        try {
-            int count = 0;
-            writer.format("module %s {%n", bootmodule);
-            for (Klass k : Klass.getAllClasses()) {
-                if (count++ == 0) {
-                    writer.format("%4s%7s %s", "", "include", k);
-                } else {
-                    writer.format(",%n");
-                    writer.format("%4s%7s %s", "", "", k);
-                }
-            }
-            writer.format(";%n}%n");
-        } finally {
-            writer.close();
-        }
-    }
-
-    private static String resolve(File dir, String mname, String suffix) {
-        File f = new File(dir, mname + "." + suffix);
-        return f.toString();
-
-    }
-    static List<MethodDescriptor> methods = new LinkedList<MethodDescriptor>();
-    static Deque<MethodDescriptor> pending = new ArrayDeque<MethodDescriptor>();
-    static Deque<MethodDescriptor> interfaceMethodRefs = new ArrayDeque<MethodDescriptor>();
-    static Filter filter = new Filter();
-
-    private static void followRoots() throws IOException {
-        MethodDescriptor md = null;
-
-        while ((md = pending.poll()) != null) {
-            if (!methods.contains(md)) {
-                methods.add(md);
-                if (md.classname.isEmpty()) {
-                    trace("Warning: class missing %s%n", md);
-                    continue;
-                }
-
-                if (filter.isExcluded(md.classname)) {
-                    trace("excluded %s%n", md);
-                } else {
-                    KlassInfo kinfo = getKlassInfo(md.classname);
-                    if (kinfo.classname.contains("$")) {
-                        int pos = kinfo.classname.lastIndexOf('$');
-                        String outer = kinfo.classname.substring(0, pos);
-                        if (!cache.containsKey(outer)) {
-                            trace("  include outer class %s%n", outer);
-                            getKlassInfo(outer).ensureParse();
-                        }
-                    }
-
-                    kinfo.ensureParse();
-                    if (md.methodname.length() > 0) {
-                        if (filter.isExcluded(md.name)) {
-                            trace("excluded %s%n", md);
-                        } else {
-                            if (md.interfaceMethodRef) {
-                                trace("interface methodref %s%n", md);
-                                interfaceMethodRefs.add(md);
-                            } else {
-                                List<String> descriptors = kinfo.parse(md);
-                                if (descriptors.isEmpty()) {
-                                    if (kinfo.getSuperclass() != null) {
-                                        String sn = kinfo.getSuperclass().classname;
-                                        MethodDescriptor superMD = new MethodDescriptor(sn + "." + md.methodname, md.descriptor, false);
-                                        if (!methods.contains(superMD) && !pending.contains(superMD)) {
-                                            trace("  delegated %s to %s%n", md, superMD);
-                                            pending.add(superMD);
-                                        }
-                                    } else if (kinfo.isClass()) {
-                                        trace("  %s (not found)%n", md);
-                                    } else {
-                                        trace("  %s (interface)%n", md);
-                                    }
-                                } else {
-                                    if (md.descriptor.equals("*")) {
-                                        trace("  parsed %s : ", md.name);
-                                        for (String s : descriptors) {
-                                            trace(" %s", s);
-                                        }
-                                        trace("%n");
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            if (pending.isEmpty()) {
-                for (Klass k : Klass.getAllClasses()) {
-                    if (k.getFileSize() == 0) {
-                        getKlassInfo(k.getClassName()).ensureParse();
-                    }
-                }
-                while ((md = interfaceMethodRefs.poll()) != null) {
-                    addSubClassMethods(md);
-                }
-            }
-        }
-    }
-
-    static void addSubClassMethods(MethodDescriptor md) throws IOException {
-        for (KlassInfo kinfo : getSubClasses(md.classname)) {
-            String methodname = kinfo.classname + "." + md.methodname;
-            MethodDescriptor other = new MethodDescriptor(methodname, md.descriptor, false);
-            if (!methods.contains(other) && !pending.contains(other)) {
-                trace("Warning: subclass from %s to %s%n", md.classname, other);
-                pending.add(other);
-            }
-        }
-    }
-    private final static String privilegedActionInterf = "java.security.PrivilegedAction";
-    private final static String privilegedExceptionActionInterf = "java.security.PrivilegedExceptionAction";
-
-    static boolean isPrivilegedAction(String classname) {
-        if (classname.isEmpty()) {
-            return false;
-        }
-        KlassInfo kinfo = getKlassInfo(classname);
-        for (KlassInfo ki : kinfo.getInterfaces()) {
-            String interf = ki.classname;
-            if (interf.equals(privilegedActionInterf) ||
-                    interf.equals(privilegedExceptionActionInterf)) {
-                return true;
-            }
-        }
-        return false;
-    }
-    static Map<String, KlassInfo> cache = new HashMap<String, KlassInfo>();
-
-    static KlassInfo getKlassInfo(String classname) {
-        classname = classname.replace('/', '.');
-
-        KlassInfo kinfo = cache.get(classname);
-        if (kinfo == null) {
-            kinfo = new KlassInfo(classname);
-            cache.put(classname, kinfo);
-        }
-        return kinfo;
-    }
-
-    static class KlassInfo {
-
-        final String classname;
-        private ClassFileParser parser;
-        private KlassInfo superclass;
-        private List<KlassInfo> interfaces = new LinkedList<KlassInfo>();
-
-        KlassInfo(String classname) {
-            this.classname = classname;
-        }
-
-        boolean isClass() {
-            ensureParse();
-            return parser.classfile.isClass();
-        }
-
-        KlassInfo getSuperclass() {
-            ensureParse();
-            return superclass;
-        }
-
-        List<KlassInfo> getInterfaces() {
-            ensureParse();
-            return java.util.Collections.unmodifiableList(interfaces);
-        }
-
-        void ensureParse() {
-            try {
-                getClassFileParser();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        synchronized ClassFileParser getClassFileParser() throws IOException {
-            if (parser == null) {
-                parser = ClassPath.parserForClass(classname);
-                if (parser != null) {
-                    parseClassFile();
-                    List<String> descriptors = parse(new MethodDescriptor(classname + ".<clinit>", "()V", false));
-                }
-            }
-            return parser;
-        }
-
-        List<String> parse(MethodDescriptor md) {
-            ensureParse();
-            try {
-                List<String> descriptors = new LinkedList<String>();
-                for (Method m : parser.classfile.methods) {
-                    String name = m.getName(parser.classfile.constant_pool);
-                    String desc = parser.constantPoolParser.getDescriptor(m.descriptor.index);
-                    if (name.equals(md.methodname)) {
-                        if (md.descriptor.equals("*") || md.descriptor.equals(desc)) {
-                            parseMethod(parser, m);
-                            descriptors.add(desc);
-                        }
-                    }
-                }
-                return descriptors;
-            } catch (ConstantPoolException ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-
-        private void parseClassFile() throws IOException {
-            parser.parseClassInfo();
-
-            ClassFile classfile = parser.classfile;
-            try {
-                if (classfile.super_class > 0) {
-                    superclass = getKlassInfo(classfile.getSuperclassName());
-                }
-                if (classfile.interfaces != null) {
-                    for (int i = 0; i < classfile.interfaces.length; i++) {
-                        interfaces.add(getKlassInfo(classfile.getInterfaceName(i)));
-                    }
-                }
-            } catch (ConstantPoolException ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-    }
-
-    static List<KlassInfo> getSubClasses(String classname) throws IOException {
-        List<KlassInfo> result = new LinkedList<KlassInfo>();
-        List<KlassInfo> list = new LinkedList<KlassInfo>();
-        list.addAll(cache.values());
-        for (KlassInfo kinfo : list) {
-            if (kinfo.getSuperclass() != null && classname.equals(kinfo.getSuperclass().classname)) {
-                result.add(kinfo);
-            }
-            for (KlassInfo interf : kinfo.getInterfaces()) {
-                if (classname.equals(interf.classname)) {
-                    result.add(kinfo);
-                }
-            }
-        }
-        return result;
-    }
-
-    private static void parseConfigFile(String config) throws IOException {
-        FileInputStream in = new FileInputStream(config);
-        try {
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-            String line;
-            int lineNumber = 0;
-            while ((line = reader.readLine()) != null) {
-                lineNumber++;
-                if ((line = line.trim()).length() > 0) {
-                    if (line.startsWith("#")) {
-                        continue;
-                    }
-
-                    String[] s = line.split("\\s+");
-                    if ("exclude".equals(s[0])) {
-                        filter.exclude(s[1]);
-                    } else {
-                        String name = s[0].replace('/', '.');
-                        if (name.length() > 0) {
-                            String classname = name.replace('/', '.');
-                            if (s.length == 2) {
-                                // method name
-                                int pos = classname.lastIndexOf('.');
-                                classname = classname.substring(0, pos);
-                            }
-
-                            KlassInfo kinfo = getKlassInfo(classname);
-                            if (kinfo.getClassFileParser() != null) {
-                                // class exists
-                                MethodDescriptor md = (s.length == 1) ? new MethodDescriptor(name) : new MethodDescriptor(name, s[1], false);
-                                if (!pending.contains(md)) {
-                                    pending.add(md);
-                                }
-                            } else {
-                                // class not found
-                                trace("Class %s not found%n", classname);
-                            }
-                        }
-                    }
-                }
-            }
-
-        } finally {
-            in.close();
-        }
-    }
-
-    private static void parseMethod(ClassFileParser cfparser, Method m) {
-        Klass.Method kmethod = cfparser.parseMethod(m);
-        Code_attribute c_attr = (Code_attribute) m.attributes.get(Attribute.Code);
-        if (c_attr != null) {
-            LineNumberTable_attribute lineNumTable =
-                    (LineNumberTable_attribute) c_attr.attributes.get(Attribute.LineNumberTable);
-            InstructorVisitor visitor = new InstructorVisitor(cfparser, lineNumTable);
-            trace("parseMethod %s %s %n", cfparser.this_klass, kmethod);
-            for (Instruction instr : c_attr.getInstructions()) {
-                try {
-                    instr.accept(visitor, kmethod);
-                } catch (ArrayIndexOutOfBoundsException e) {
-                    throw new RuntimeException("error at or after byte " + instr.getPC());
-                }
-
-            }
-
-            if (c_attr.exception_table_langth > 0) {
-                for (int i = 0; i <
-                        c_attr.exception_table.length; i++) {
-                    Code_attribute.Exception_data handler = c_attr.exception_table[i];
-                    int catch_type = handler.catch_type;
-                    if (catch_type > 0) {
-                        visitor.addConstantPoolRef(catch_type, kmethod, handler.start_pc);
-                    }
-
-                }
-            }
-        }
-    }
-
-    static class MethodDescriptor {
-
-        final String name;
-        final String classname;
-        final String methodname;
-        final String descriptor;
-        final boolean interfaceMethodRef;
-
-        MethodDescriptor(String classname) {
-            this.classname = classname.replace('/', '.');
-            this.name = this.classname;
-            this.methodname = "";
-            this.descriptor = "";
-            this.interfaceMethodRef = false;
-            if (this.classname.length() == 1) {
-                throw new RuntimeException("invalid " + this);
-            }
-        }
-
-        MethodDescriptor(String name, String descriptor, boolean interfaceMethodRef) {
-            name = name.replace('/', '.');
-            this.name = name;
-            int pos = name.lastIndexOf('.');
-            this.classname = name.substring(0, pos);
-            this.methodname = name.substring(pos + 1, name.length());
-            this.descriptor = descriptor;
-            this.interfaceMethodRef = interfaceMethodRef;
-            if (this.classname.length() == 1) {
-                throw new RuntimeException("invalid " + this);
-            }
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            MethodDescriptor m = (MethodDescriptor) obj;
-
-            return this.name.equals(m.name) &&
-                    this.descriptor.equals(m.descriptor);
-        }
-
-        @Override
-        public int hashCode() {
-            int hash = 7;
-            hash = 97 * hash + (this.name != null ? this.name.hashCode() : 0);
-            hash = 97 * hash + (this.descriptor != null ? this.descriptor.hashCode() : 0);
-            return hash;
-        }
-
-        public String toString() {
-            if (descriptor.isEmpty()) {
-                return name;
-            } else {
-                return name + " : " + descriptor;
-            }
-        }
-    }
-
-    static class Filter {
-
-        private Set<String> excludes = new TreeSet<String>();
-
-        Filter exclude(String pattern) {
-            excludes.add(pattern);
-            return this;
-        }
-
-        boolean isExcluded(String klass) {
-            for (String pattern : excludes) {
-                if (matches(klass, pattern)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private boolean matches(String klass, String pattern) {
-            int pos = klass.lastIndexOf('.');
-            String packageName = pos > 0 ? klass.substring(0, pos) : "<unnamed>";
-            if (pattern.endsWith("**")) {
-                String p = pattern.substring(0, pattern.length() - 2);
-                return klass.startsWith(p);
-            } else if (pattern.endsWith("*")) {
-                pos = pattern.lastIndexOf('.');
-                String pkg = pos > 0 ? pattern.substring(0, pos) : "<unnamed>";
-                if (packageName.equals(pkg)) {
-                    // package name has to be exact match
-                    String p = pattern.substring(0, pattern.length() - 1);
-                    return klass.startsWith(p);
-                } else {
-                    return false;
-                }
-            } else {
-                // exact match or inner class
-                return klass.equals(pattern) || klass.startsWith(pattern + "$");
-            }
-        }
-    }
-
-    static class InstructorVisitor implements Instruction.KindVisitor<Void, Klass.Method> {
-
-        private final ClassFileParser parser;
-        private final LineNumberTable_attribute lineNumTable;
-
-        InstructorVisitor(ClassFileParser parser, LineNumberTable_attribute lineNumTable) {
-            this.parser = parser;
-            this.lineNumTable = lineNumTable;
-        }
-
-        int getLineNumber(int pc) {
-            if (lineNumTable != null) {
-                int start_pc = 0;
-                int lineno = 0;
-                for (int i = 0; i < lineNumTable.line_number_table_length; i++) {
-                    int cur_start_pc = lineNumTable.line_number_table[i].start_pc;
-                    if (pc == 0 && cur_start_pc == 0) {
-                        return lineNumTable.line_number_table[i].line_number;
-                    } else if (pc >= start_pc && pc < cur_start_pc) {
-                        return lineno;
-                    }
-                    start_pc = cur_start_pc;
-                    lineno = lineNumTable.line_number_table[i].line_number;
-                }
-            }
-            return 0;
-        }
-
-        void addConstantPoolRef(int index, Klass.Method m, int pc) {
-            try {
-                CPInfo cpInfo = parser.classfile.constant_pool.get(index);
-                String name = cpInfo.accept(typeFinder, null);
-                if (name != null) {
-                    trace("   %s %s at line %d%n", parser.constantPoolParser.tagName(index), name, getLineNumber(pc));
-                }
-            } catch (InvalidIndex ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-
-        public Void visitNoOperands(Instruction instr, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitArrayType(Instruction instr, TypeKind kind, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitBranch(Instruction instr, int offset, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitConstantPoolRef(Instruction instr, int index, Klass.Method m) {
-            addConstantPoolRef(index, m, instr.getPC());
-            return null;
-        }
-
-        public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Klass.Method m) {
-            addConstantPoolRef(index, m, instr.getPC());
-            return null;
-        }
-
-        public Void visitLocal(Instruction instr, int index, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitLocalAndValue(Instruction instr, int index, int value, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitValue(Instruction instr, int value, Klass.Method m) {
-            return null;
-        }
-
-        public Void visitUnknown(Instruction instr, Klass.Method m) {
-            return null;
-        }
-        private ConstantPool.Visitor<String, Void> typeFinder = new ConstantPool.Visitor<String, Void>() {
-
-            String getClassName(CPRefInfo info, Void p) {
-                try {
-                    return parser.checkClassName(info.getClassName()).replace('/', '.');
-                } catch (ConstantPoolException ex) {
-                    throw new RuntimeException(ex);
-                }
-            }
-
-            boolean addReferencedClass(String name) {
-                if (Klass.findKlass(name) == null) {
-                    MethodDescriptor md = new MethodDescriptor(name);
-                    if (!methods.contains(md) && !pending.contains(md)) {
-                        pending.add(md);
-                    }
-                    return true;
-                }
-                return false;
-            }
-            private String privilegedActionClass = "";
-
-            void cachePrivilegedAction(String classname) {
-                trace("   found PrivilegedAction %s%n", classname);
-                privilegedActionClass = classname;
-            }
-
-            void doPrivilegedCall(String method) {
-                if (privilegedActionClass.length() > 0) {
-                    MethodDescriptor md = new MethodDescriptor(privilegedActionClass + ".run", "*", false);
-                    if (!methods.contains(md) && !pending.contains(md)) {
-                        trace("   doPrivileged %s%n", md);
-                        pending.add(md);
-                    }
-                }
-            }
-
-            private String addMethodDescriptor(CPRefInfo info, Void p) {
-                try {
-                    String classname = getClassName(info, null);
-                    String method = classname + "." + info.getNameAndTypeInfo().getName();
-                    String descriptor = info.getNameAndTypeInfo().getType();
-
-                    if (method.endsWith(".<init>") && isPrivilegedAction(classname)) {
-                        cachePrivilegedAction(classname);
-                    }
-                    if (method.equals("java.security.AccessController.doPrivileged")) {
-                        doPrivilegedCall(method);
-                        return method;
-                    }
-
-                    boolean interfaceMethodRef = info instanceof CONSTANT_InterfaceMethodref_info;
-                    MethodDescriptor md = new MethodDescriptor(method, descriptor, interfaceMethodRef);
-                    if (!methods.contains(md) && !pending.contains(md)) {
-                        pending.add(md);
-                    }
-                    return method;
-                } catch (ConstantPoolException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            public String visitClass(CONSTANT_Class_info info, Void p) {
-                try {
-                    String classname = parser.checkClassName(info.getName()).replace('/', '.');
-                    if (classname.length() > 0) {
-                        addReferencedClass(classname);
-                    }
-                    return classname;
-                } catch (ConstantPoolException ex) {
-                    throw new RuntimeException(ex);
-                }
-            }
-
-            public String visitDouble(CONSTANT_Double_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitFieldref(CONSTANT_Fieldref_info info, Void p) {
-                try {
-                    String classname = getClassName(info, p);
-                    if (classname.length() > 0) {
-                        addReferencedClass(classname);
-                    }
-
-                    String type = info.getNameAndTypeInfo().getType();
-                    String fieldType = parser.checkClassName(type).replace('/', '.');
-                    if (fieldType.length() > 0) {
-                        addReferencedClass(classname);
-                    }
-                    return parser.constantPoolParser.stringValue(info);
-                } catch (ConstantPoolException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            public String visitFloat(CONSTANT_Float_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitInteger(CONSTANT_Integer_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
-                return addMethodDescriptor(info, p);
-            }
-
-            public String visitLong(CONSTANT_Long_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitMethodref(CONSTANT_Methodref_info info, Void p) {
-                return addMethodDescriptor(info, p);
-            }
-
-            public String visitString(CONSTANT_String_info info, Void p) {
-                // skip
-                return null;
-            }
-
-            public String visitUtf8(CONSTANT_Utf8_info info, Void p) {
-                return null;
-            }
-        };
-    }
-    static boolean traceOn = System.getProperty("classanalyzer.debug") != null;
-
-    private static void trace(String format, Object... args) {
-        if (traceOn) {
-            System.out.format(format, args);
-        }
-    }
-
-    private static void usage() {
-        System.out.println("Usage: BootAnalyzer <options>");
-        System.out.println("Options: ");
-        System.out.println("\t-jdkhome <JDK home> where all jars will be parsed");
-        System.out.println("\t-config  <roots for the boot module>");
-        System.out.println("\t-output  <output dir>");
-        System.out.println("\t-classlist print class list and summary");
-        System.exit(-1);
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/CheckDeps.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * A simple tool to check module dependencies against a known list of
- * dependencies. The tool fails (by throwing a RuntimeException) is an
- * unexpected dependency is detected.
- */
-
-public class CheckDeps {
-
-    /**
-     * Represents a dependency from one module to another module. The dependency
-     * may be optional.
-     */
-    static class Dependency {
-        private final String module;
-        private final String other;
-        private final boolean optional;
-
-        private Dependency(String module, String other, boolean optional) {
-            this.module = module;
-            this.other = other;
-            this.optional = optional;
-        }
-
-        String module()      { return module; }
-        String other()       { return other; }
-        boolean isOptional() { return optional; }
-
-        /**
-         * Parses a dependency in one of the following forms:
-         *   a -> b
-         *   [optional] a -> b
-         */
-        static Dependency fromString(String s) {
-            String[] components = s.split(" ");
-            int count = components.length;
-            if (count != 3 && count != 4)
-                throw new IllegalArgumentException(s);
-            boolean optional = (count == 4);
-            if (optional && !components[0].equals("[optional]"))
-                throw new IllegalArgumentException(s);
-            String arrow = optional ? components[2] : components[1];
-            if (!arrow.equals("->"))
-                throw new IllegalArgumentException(s);
-            String module = optional ? components[1] : components[0];
-            String other = optional ? components[3] : components[2];
-            return new Dependency(module, other, optional);
-        }
-
-        @Override public String toString() {
-            StringBuilder sb = new StringBuilder();
-            if (optional)
-                sb.append("[optional] ");
-            sb.append(module);
-            sb.append(" -> ");
-            sb.append(other);
-            return sb.toString();
-        }
-    }
-
-    /**
-     * Represents the "tail"
-     */
-    static class DependencyTail {
-        private final String module;
-        private final boolean optional;
-
-        DependencyTail(String module, boolean optional) {
-            this.module = module;
-            this.optional = optional;
-        }
-        String module()      { return module; }
-        boolean isOptional() { return optional; }
-    }
-
-    static void usage() {
-        System.out.println("java CheckDeps file1 file2");
-        System.out.println("  where file1 is the expected dependencies and file2 is");
-        System.out.println("  the actual dependencies. Both files are assumed to be");
-        System.out.println("  in modules.summary format (see ClassAnalyzer tool).");
-        System.out.println();
-        System.out.println("Example usages:");
-        System.out.println("  java CheckDeps make/modules/modules.summary " +
-            "$(OUTPUTDIR)/modules.summary");
-        System.exit(-1);
-    }
-
-    public static void main(String[] args) throws IOException {
-        if (args.length != 2)
-            usage();
-
-        // maps a module to the list of modules that it depends on
-        Map<String,List<DependencyTail>> expected =
-            new HashMap<String,List<DependencyTail>>();
-
-        // parse the expected dependencies file
-        Scanner s;
-        s = new Scanner(new FileInputStream(args[0]));
-        try {
-            while (s.hasNextLine()) {
-                Dependency ref = Dependency.fromString(s.nextLine());
-                if (ref != null) {
-                    String module = ref.module();
-                    List<DependencyTail> list = expected.get(module);
-                    if (list == null) {
-                        list = new ArrayList<DependencyTail>();
-                        expected.put(module, list);
-                    }
-                    list.add(new DependencyTail(ref.other(), ref.isOptional()));
-                }
-            }
-        } finally {
-            s.close();
-        }
-
-        // parse the actual dependencies file, checking each dependency
-        // against the expected list.
-        boolean fail = false;
-        s = new Scanner(new FileInputStream(args[1]));
-        try {
-            while (s.hasNextLine()) {
-                Dependency dep = Dependency.fromString(s.nextLine());
-
-                // check if this dependency is expected
-                List<DependencyTail> list = expected.get(dep.module());
-                DependencyTail tail = null;
-                if (list != null) {
-                    for (DependencyTail t: list) {
-                        if (t.module().equals(dep.other())) {
-                            tail = t;
-                            break;
-                        }
-                    }
-                }
-                if (tail == null) {
-                    System.err.println("Unexpected dependency: " + dep);
-                    fail = true;
-                } else {
-                    // hard dependency when optional dependency is expected
-                    if (tail.isOptional() != dep.isOptional()) {
-                        if (tail.isOptional()) {
-                            System.err.println("Unexpected dependency: " + dep);
-                            fail = true;
-                        }
-                    }
-                }
-            }
-        } finally {
-            s.close();
-        }
-
-        if (fail)
-            throw new RuntimeException("Unexpected dependencies found");
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ClassAnalyzer.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import com.sun.classanalyzer.AnnotatedDependency.*;
-import com.sun.classanalyzer.Module.Dependency;
-import com.sun.classanalyzer.Module.PackageInfo;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ClassAnalyzer {
-
-    public static void main(String[] args) throws Exception {
-        String jdkhome = null;
-        String cpath = null;
-        List<String> configs = new ArrayList<String>();
-        List<String> depconfigs = new ArrayList<String>();
-        String output = ".";
-        boolean mergeModules = true;
-        boolean showDynamic = false;
-
-        // process arguments
-        int i = 0;
-        while (i < args.length) {
-            String arg = args[i++];
-            if (arg.equals("-jdkhome")) {
-                if (i < args.length) {
-                    jdkhome = args[i++];
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-cpath")) {
-                if (i < args.length) {
-                    cpath = args[i++];
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-config")) {
-                if (i < args.length) {
-                    configs.add(args[i++]);
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-depconfig")) {
-                if (i < args.length) {
-                    depconfigs.add(args[i++]);
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-output")) {
-                if (i < args.length) {
-                    output = args[i++];
-                } else {
-                    usage();
-                }
-            } else if (arg.equals("-base")) {
-                ModuleConfig.setBaseModule(args[i++]);
-            } else if (arg.equals("-nomerge")) {
-                // analyze the fine-grained module dependencies
-                mergeModules = false;
-            } else if (arg.equals("-showdynamic")) {
-                showDynamic = true;
-            } else {
-                System.err.println("Invalid option: " + arg);
-                usage();
-            }
-        }
-
-        if ((jdkhome == null && cpath == null) || (jdkhome != null && cpath != null)) {
-            usage();
-        }
-        if (configs.isEmpty()) {
-            usage();
-        }
-
-        if (jdkhome != null) {
-            ClassPath.setJDKHome(jdkhome);
-        } else if (cpath != null) {
-            ClassPath.setClassPath(cpath);
-        }
-
-        // create output directory if it doesn't exist
-        File dir = new File(output);
-        if (!dir.isDirectory()) {
-            if (!dir.exists()) {
-                boolean created = dir.mkdir();
-                if (!created) {
-                    throw new RuntimeException("Unable to create `" + dir + "'");
-                }
-            }
-        }
-
-        buildModules(configs, depconfigs, mergeModules);
-
-        // generate output files
-        for (Module m : modules) {
-            // only generate reports for top-level modules
-            if (m.group() == m) {
-                m.printClassListTo(resolve(dir, m.name(), "classlist"));
-                m.printResourceListTo(resolve(dir, m.name(), "resources"));
-                m.printSummaryTo(resolve(dir, m.name(), "summary"));
-                m.printDependenciesTo(resolve(dir, m.name(), "dependencies"), showDynamic);
-            }
-        }
-
-        // Generate other summary reports
-        printModulesSummary(dir, showDynamic);
-        printModulesDot(dir, showDynamic);
-        printModulesList(dir);
-        printPackagesSummary(dir);
-    }
-    private static List<Module> modules = new ArrayList<Module>();
-
-    static void buildModules(List<String> configs,
-            List<String> depconfigs,
-            boolean mergeModules) throws IOException {
-        // create modules based on the input config files
-        for (String file : configs) {
-            for (ModuleConfig mconfig : ModuleConfig.readConfigurationFile(file)) {
-                modules.add(Module.addModule(mconfig));
-            }
-        }
-
-        // parse class files
-        ClassPath.parseAllClassFiles();
-
-        // Add additional dependencies if specified
-        if (depconfigs != null && depconfigs.size() > 0) {
-            DependencyConfig.parse(depconfigs);
-        }
-
-        // process the roots and dependencies to get the classes for each module
-        for (Module m : modules) {
-            m.processRootsAndReferences();
-        }
-
-        // update the dependencies for classes that were subsequently allocated
-        // to modules
-        for (Module m : modules) {
-            m.fixupDependencies();
-        }
-
-        if (mergeModules) {
-            Module.buildModuleMembers();
-        }
-    }
-
-    private static void printModulesSummary(File dir, boolean showDynamic) throws IOException {
-        // print summary of dependencies
-        PrintWriter writer = new PrintWriter(new File(dir, "modules.summary"));
-        try {
-            for (Module m : modules) {
-                // only show top-level module dependencies
-                if (m.group() == m) {
-                    for (Dependency dep : m.dependents()) {
-                        if (!showDynamic && dep.dynamic && dep.optional) {
-                            continue;
-                        }
-                        if (dep.module == null || !dep.module.isBase()) {
-
-                            String prefix = "";
-                            if (dep.optional) {
-                                if (dep.dynamic) {
-                                    prefix = "[dynamic] ";
-                                } else {
-                                    prefix = "[optional] ";
-                                }
-                            }
-
-                            Module other = dep != null ? dep.module : null;
-                            writer.format("%s%s -> %s%n", prefix, m, other);
-                        }
-                    }
-                }
-            }
-        } finally {
-            writer.close();
-        }
-    }
-
-    private static void printModulesDot(File dir, boolean showDynamic) throws IOException {
-        PrintWriter writer = new PrintWriter(new File(dir, "modules.dot"));
-        try {
-            writer.println("digraph jdk {");
-            for (Module m : modules) {
-                if (m.group() == m) {
-                    for (Dependency dep : m.dependents()) {
-                        if (!showDynamic && dep.dynamic && dep.optional) {
-                            continue;
-                        }
-                        if (dep.module == null || !dep.module.isBase()) {
-                            String style = "";
-                            String color = "";
-                            String property = "";
-                            if (dep.optional) {
-                                style = "style=dotted";
-                            }
-                            if (dep.dynamic) {
-                                color = "color=red";
-                            }
-                            if (style.length() > 0 || color.length() > 0) {
-                                String comma = "";
-                                if (style.length() > 0 && color.length() > 0) {
-                                    comma = ", ";
-                                }
-                                property = String.format(" [%s%s%s]", style, comma, color);
-                            }
-                            Module other = dep != null ? dep.module : null;
-                            writer.format("    \"%s\" -> \"%s\"%s;%n", m, other, property);
-                        }
-                    }
-                }
-            }
-            writer.println("}");
-        } finally {
-            writer.close();
-        }
-    }
-
-    private static void printMembers(Module m, PrintWriter writer) {
-        for (Module member : m.members()) {
-            if (!member.isEmpty()) {
-                writer.format("%s ", member);
-                printMembers(member, writer);
-            }
-        }
-    }
-
-    private static void printModulesList(File dir) throws IOException {
-        // print module group / members relationship
-        PrintWriter writer = new PrintWriter(new File(dir, "modules.list"));
-        try {
-            for (Module m : modules) {
-                if (m.group() == m && !m.isEmpty()) {
-                    writer.format("%s ", m);
-                    printMembers(m, writer);
-                    writer.println();
-                }
-            }
-        } finally {
-            writer.close();
-        }
-    }
-
-    private static void printPackagesSummary(File dir) throws IOException {
-        // print package / module relationship
-        PrintWriter writer = new PrintWriter(new File(dir, "modules.pkginfo"));
-        try {
-            Map<String, Set<Module>> packages = new TreeMap<String, Set<Module>>();
-            Set<String> splitPackages = new TreeSet<String>();
-
-            for (Module m : modules) {
-                if (m.group() == m) {
-                    for (PackageInfo info : m.getPackageInfos()) {
-                        Set<Module> value = packages.get(info.pkgName);
-                        if (value == null) {
-                            value = new TreeSet<Module>();
-                            packages.put(info.pkgName, value);
-                        } else {
-                            // package in more than one module
-                            splitPackages.add(info.pkgName);
-                        }
-                        value.add(m);
-                    }
-                }
-            }
-
-            // packages that are splitted among multiple modules
-            writer.println("Packages splitted across modules:-\n");
-            writer.format("%-60s  %s\n", "Package", "Module");
-
-            for (String pkgname : splitPackages) {
-                writer.format("%-60s", pkgname);
-                for (Module m : packages.get(pkgname)) {
-                    writer.format("  %s", m);
-                }
-                writer.println();
-            }
-
-            writer.println("\nPackage-private dependencies:-");
-            for (String pkgname : splitPackages) {
-                for (Klass k : Klass.getAllClasses()) {
-                    if (k.getPackageName().equals(pkgname)) {
-                        Module m = k.getModule();
-                        // check if this klass references a package-private
-                        // class that is in a different module
-                        for (Klass other : k.getReferencedClasses()) {
-                            if (other.getModule() != m &&
-                                    !other.isPublic() &&
-                                    other.getPackageName().equals(pkgname)) {
-                                String from = k.getClassName() + " (" + m + ")";
-                                writer.format("%-60s -> %s (%s)\n", from, other, other.getModule());
-                            }
-                        }
-                    }
-                }
-            }
-        } finally {
-            writer.close();
-        }
-
-    }
-
-    private static String resolve(File dir, String mname, String suffix) {
-        File f = new File(dir, mname + "." + suffix);
-        return f.toString();
-
-    }
-
-    private static void usage() {
-        System.out.println("Usage: ClassAnalyzer <options>");
-        System.out.println("Options: ");
-        System.out.println("\t-jdkhome <JDK home> where all jars will be parsed");
-        System.out.println("\t-cpath   <classpath> where classes and jars will be parsed");
-        System.out.println("\t         Either -jdkhome or -cpath option can be used.");
-        System.out.println("\t-config  <module config file>");
-        System.out.println("\t         This option can be repeated for multiple module config files");
-        System.out.println("\t-output  <output dir>");
-        System.out.println("\t-nomerge specify not to merge modules");
-        System.out.println("\t-showdynamic show dynamic dependencies in the reports");
-        System.exit(-1);
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ClassFileParser.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,629 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-package com.sun.classanalyzer;
-
-import com.sun.tools.classfile.*;
-import com.sun.tools.classfile.Type.*;
-import com.sun.tools.classfile.Descriptor.InvalidDescriptor;
-import static com.sun.tools.classfile.AccessFlags.*;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ClassFileParser {
-
-    final Klass this_klass;
-    final ClassFile classfile;
-    final ConstantPoolParser constantPoolParser;
-    final AnnotationParser annotationParser;
-    final CodeAttributeParser codeAttributeParser;
-    private final boolean buildDeps;
-
-    protected ClassFileParser(InputStream in, long size, boolean buildDeps) throws IOException {
-        try {
-            this.classfile = ClassFile.read(in);
-            this.this_klass = getKlass(this.classfile);
-            this.buildDeps = buildDeps;
-            this.constantPoolParser = new ConstantPoolParser(this);
-            this.annotationParser = new AnnotationParser(this);
-            this.codeAttributeParser = new CodeAttributeParser(this);
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private Klass getKlass(ClassFile cf) throws ConstantPoolException {
-        Klass k = Klass.getKlass(cf.getName());
-        k.setAccessFlags(cf.access_flags.flags);
-        k.setFileSize(cf.byteLength());
-        return k;
-    }
-
-    public static ClassFileParser newParser(InputStream in, long size, boolean buildDeps) throws IOException {
-        return new ClassFileParser(in, size, buildDeps);
-    }
-
-    public static ClassFileParser newParser(String classPathname, boolean buildDeps) throws IOException {
-        return newParser(new File(classPathname), buildDeps);
-    }
-
-    public static ClassFileParser newParser(File f, boolean buildDeps) throws IOException {
-        BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
-        try {
-            return newParser(in, f.length(), buildDeps);
-        } finally {
-            in.close();
-        }
-    }
-
-    public void parseDependency(boolean publicAPIs) throws IOException {
-        if (publicAPIs && !classfile.access_flags.is(ACC_PUBLIC)) {
-            // process public APIs only
-            return;
-        }
-
-        parseClassInfo();
-        if (!publicAPIs) {
-            // parse all references in the classfile
-            constantPoolParser.parseDependency();
-        }
-        parseMethods(publicAPIs);
-        parseFields(publicAPIs);
-    }
-
-    void parseClassInfo() throws IOException {
-        ConstantPool cpool = classfile.constant_pool;
-        try {
-            Signature_attribute sigAttr = (Signature_attribute) classfile.attributes.get(Attribute.Signature);
-            if (sigAttr == null) {
-                // use info from class file header
-                if (classfile.isClass() && classfile.super_class != 0) {
-                    String sn = classfile.getSuperclassName();
-                    addExtends(sn);
-                }
-                for (int i = 0; i < classfile.interfaces.length; i++) {
-                    String interf = classfile.getInterfaceName(i);
-                    if (classfile.isClass()) {
-                        addImplements(interf);
-                    } else {
-                        addExtends(interf);
-                    }
-                }
-            } else {
-                Type t = sigAttr.getParsedSignature().getType(cpool);
-                // The signature parser cannot disambiguate between a
-                // FieldType and a ClassSignatureType that only contains a superclass type.
-                if (t instanceof Type.ClassSigType) {
-                    Type.ClassSigType cst = Type.ClassSigType.class.cast(t);
-                    if (cst.superclassType != null) {
-                        for (Klass k : getKlass(cst.superclassType)) {
-                            addExtends(k);
-                        }
-                    }
-                    if (cst.superinterfaceTypes != null) {
-                        for (Type t1 : cst.superinterfaceTypes) {
-                            for (Klass k : getKlass(t1)) {
-                                addImplements(k);
-                            }
-                        }
-                    }
-                } else {
-                    for (Klass k : getKlass(t)) {
-                        addExtends(k);
-                    }
-                }
-            }
-            // parse attributes
-            annotationParser.parseAttributes(classfile.attributes);
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private void parseFields(boolean publicAPIs) throws IOException {
-        ConstantPool cpool = classfile.constant_pool;
-        for (Field f : classfile.fields) {
-            try {
-                AccessFlags flags = f.access_flags;
-                if (publicAPIs && !flags.is(ACC_PUBLIC) && !flags.is(ACC_PROTECTED)) {
-                    continue;
-                }
-                String fieldname = f.getName(cpool);
-                Signature_attribute sigAttr = (Signature_attribute) f.attributes.get(Attribute.Signature);
-
-                if (sigAttr == null) {
-                    Set<Klass> types = parseDescriptor(f.descriptor);
-                    String info = getFlag(flags) + " " + f.descriptor.getFieldType(cpool) + " " + fieldname;
-                    addFieldTypes(types, info, flags);
-                } else {
-                    Type t = sigAttr.getParsedSignature().getType(cpool);
-                    String info = getFlag(flags) + " " + t + " " + fieldname;
-                    addFieldTypes(getKlass(t), info, flags);
-                }
-                // parse attributes
-                annotationParser.parseAttributes(f.attributes);
-            } catch (ConstantPoolException ex) {
-                throw new RuntimeException(ex);
-            } catch (InvalidDescriptor ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-    }
-
-    private void parseMethods(boolean publicAPIs) {
-        for (Method m : classfile.methods) {
-            if (publicAPIs && !m.access_flags.is(ACC_PUBLIC) && !m.access_flags.is(ACC_PROTECTED)) {
-                // only interest in the API level
-                return;
-            }
-
-            parseMethod(m);
-        }
-    }
-
-    String checkClassName(String classname) {
-        int i = 0;
-        while (i < classname.length()) {
-            switch (classname.charAt(i)) {
-                case 'Z':
-                case 'B':
-                case 'C':
-                case 'S':
-                case 'I':
-                case 'J':
-                case 'F':
-                case 'D':
-                    return "";
-                case 'L':
-                    if (!classname.endsWith(";")) {
-                        throw new RuntimeException("Invalid classname " + classname);
-                    }
-                    return classname.substring(i + 1, classname.length() - 1);
-                case '[':
-                    i++;
-                    break;
-                default:
-                    if (classname.endsWith(";")) {
-                        throw new RuntimeException("Invalid classname " + classname);
-                    }
-                    return classname;
-
-            }
-        }
-        throw new RuntimeException("Invalid classname " + classname);
-    }
-
-    private void addExtends(String classname) throws IOException {
-        if (!buildDeps) {
-            return;
-        }
-
-        addExtends(Klass.getKlass(classname));
-    }
-
-    private void addExtends(Klass k) {
-        if (!buildDeps) {
-            return;
-        }
-
-        ResolutionInfo resInfo = ResolutionInfo.resolvedExtends(this_klass, k);
-        resInfo.setPublicAccess(classfile.access_flags.is(ACC_PUBLIC));
-        this_klass.addDep(k, resInfo);
-        k.addReferrer(this_klass, resInfo);
-    }
-
-    private void addImplements(String classname) throws IOException {
-        if (!buildDeps) {
-            return;
-        }
-
-        addImplements(Klass.getKlass(classname));
-    }
-
-    private void addImplements(Klass k) {
-        if (!buildDeps) {
-            return;
-        }
-
-        ResolutionInfo resInfo = ResolutionInfo.resolvedImplements(this_klass, k);
-        resInfo.setPublicAccess(classfile.access_flags.is(ACC_PUBLIC));
-
-        this_klass.addDep(k, resInfo);
-
-        k.addReferrer(this_klass, resInfo);
-    }
-
-    private Set<Klass> getKlass(Type type) throws IOException {
-        Set<Klass> refTypes = new TreeSet<Klass>();
-        if (!buildDeps) {
-            return refTypes;
-        }
-
-        type.accept(typevisitor, refTypes);
-        return refTypes;
-    }
-    private Type.Visitor<Void, Set<Klass>> typevisitor = new Type.Visitor<Void, Set<Klass>>() {
-
-        public Void visitSimpleType(SimpleType type, Set<Klass> klasses) {
-            // nop
-            return null;
-        }
-
-        public Void visitArrayType(ArrayType type, Set<Klass> klasses) {
-            try {
-                klasses.addAll(getKlass(type.elemType));
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
-            }
-            return null;
-
-        }
-
-        public Void visitMethodType(MethodType type, Set<Klass> klasses) {
-            throw new InternalError("Unexpected type " + type);
-        }
-
-        public Void visitClassSigType(ClassSigType type, Set<Klass> klasses) {
-            try {
-                if (type.superclassType != null) {
-                    klasses.addAll(getKlass(type.superclassType));
-                }
-                if (type.superinterfaceTypes != null) {
-                    for (Type t : type.superinterfaceTypes) {
-                        klasses.addAll(getKlass(t));
-                    }
-                }
-                if (type.typeParamTypes != null) {
-                    for (Type t : type.typeParamTypes) {
-                        klasses.addAll(getKlass(t));
-                    }
-                }
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
-            }
-            return null;
-        }
-
-        public Void visitClassType(ClassType type, Set<Klass> klasses) {
-            klasses.add(Klass.getKlass(type.getBinaryName()));
-            if (type.typeArgs != null) {
-                for (Type t : type.typeArgs) {
-                    try {
-                        klasses.addAll(getKlass(t));
-                    } catch (IOException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                }
-            }
-            return null;
-
-        }
-
-        public Void visitTypeParamType(TypeParamType type, Set<Klass> klasses) {
-            try {
-                if (type.classBound != null) {
-                    klasses.addAll(getKlass(type.classBound));
-                }
-                if (type.interfaceBounds != null) {
-                    for (Type t : type.interfaceBounds) {
-                        klasses.addAll(getKlass(t));
-                    }
-                }
-
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
-            }
-
-            return null;
-
-        }
-
-        public Void visitWildcardType(WildcardType type, Set<Klass> klasses) {
-            if (type.boundType != null) {
-                try {
-                    klasses.addAll(getKlass(type.boundType));
-                } catch (IOException ex) {
-                    throw new RuntimeException(ex);
-                }
-            }
-            return null;
-
-        }
-    };
-
-    private void printMethod(Method m) {
-        try {
-            System.out.println("parsing " + m.getName(classfile.constant_pool) + "(" +
-                    m.descriptor.getParameterTypes(classfile.constant_pool) + ") return type " +
-                    m.descriptor.getReturnType(classfile.constant_pool));
-
-        } catch (ConstantPoolException ex) {
-        } catch (InvalidDescriptor ex) {
-        }
-    }
-
-    private static StringBuilder appendWord(StringBuilder sb, String word) {
-        if (sb.length() > 0) {
-            sb.append(" ");
-        }
-        sb.append(word);
-        return sb;
-    }
-
-    private static String getFlag(AccessFlags flags) {
-        StringBuilder modifier = new StringBuilder();
-        if (flags.is(ACC_PUBLIC)) {
-            modifier.append("public");
-        }
-        if (flags.is(ACC_PRIVATE)) {
-            modifier.append("private");
-        }
-        if (flags.is(ACC_PROTECTED)) {
-            modifier.append("protected");
-        }
-        if (flags.is(ACC_STATIC)) {
-            appendWord(modifier, "static");
-        }
-        if (flags.is(ACC_FINAL)) {
-            appendWord(modifier, "final");
-        }
-        if (flags.is(ACC_SYNCHRONIZED)) {
-            // return "synchronized";
-        }
-        if (flags.is(0x80)) {
-            // return (t == Type.Field ? "transient" : null);
-            // return "transient";
-        }
-        if (flags.is(ACC_VOLATILE)) {
-            // return "volatile";
-        }
-        if (flags.is(ACC_NATIVE)) {
-            // return "native";
-        }
-        if (flags.is(ACC_ABSTRACT)) {
-            appendWord(modifier, "abstract");
-        }
-        if (flags.is(ACC_STRICT)) {
-            // return "strictfp";
-        }
-        if (flags.is(ACC_MODULE)) {
-            appendWord(modifier, "module");
-        }
-        return modifier.toString();
-    }
-
-    private Klass.Method toKlassMethod(Method m, Descriptor d) {
-        try {
-            ConstantPool cpool = classfile.constant_pool;
-            String methodname = m.getName(cpool);
-            StringBuilder sb = new StringBuilder();
-            sb.append(getFlag(m.access_flags));
-            if (methodname.equals("<init>")) {
-                String s = this_klass.getBasename() + d.getParameterTypes(cpool);
-                appendWord(sb, s);
-            } else if (methodname.equals("<clinit>")) {
-                // <clinit>
-                appendWord(sb, methodname);
-            } else {
-                String s = d.getReturnType(cpool) + " " + methodname + d.getParameterTypes(cpool);
-                appendWord(sb, s);
-            }
-            String signature = sb.toString().replace('/', '.');
-            return this_klass.getMethod(methodname, signature);
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        } catch (InvalidDescriptor ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    Klass.Method parseMethod(Method m) {
-        AccessFlags flags = m.access_flags;
-        Descriptor d;
-        List<? extends Type> methodExceptions = null;
-        try {
-            ConstantPool cpool = classfile.constant_pool;
-            Klass.Method kmethod;
-            Signature_attribute sigAttr = (Signature_attribute) m.attributes.get(Attribute.Signature);
-            if (sigAttr == null) {
-                d = m.descriptor;
-                Set<Klass> types = parseDescriptor(d);
-
-                kmethod = toKlassMethod(m, d);
-                addMethodTypes(types, kmethod, flags);
-            } else {
-                Type.MethodType methodType;
-                Signature methodSig = sigAttr.getParsedSignature();
-                d = methodSig;
-                try {
-                    kmethod = toKlassMethod(m, d);
-                    methodType = (Type.MethodType) methodSig.getType(cpool);
-                    addMethodTypes(getKlass(methodType.returnType), kmethod, flags);
-                    if (methodType.paramTypes != null) {
-                        for (Type t : methodType.paramTypes) {
-                            addMethodTypes(getKlass(t), kmethod, flags);
-                        }
-                    }
-                    if (methodType.typeParamTypes != null) {
-                        for (Type t : methodType.typeParamTypes) {
-                            addMethodTypes(getKlass(t), kmethod, flags);
-                        }
-                    }
-
-                    methodExceptions = methodType.throwsTypes;
-                    if (methodExceptions != null) {
-                        if (methodExceptions.size() == 0) {
-                            methodExceptions = null;
-                        } else {
-                            for (Type t : methodExceptions) {
-                                addCheckedExceptionTypes(getKlass(t), kmethod, flags);
-                            }
-                        }
-                    }
-                } catch (ConstantPoolException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-
-            Attribute e_attr = m.attributes.get(Attribute.Exceptions);
-            if (e_attr != null && methodExceptions == null) {
-                // if there are generic exceptions, there must be erased exceptions
-                if (e_attr instanceof Exceptions_attribute) {
-                    Exceptions_attribute exceptions = (Exceptions_attribute) e_attr;
-                    for (int i = 0; i < exceptions.number_of_exceptions; i++) {
-                        String classname = checkClassName(exceptions.getException(i, classfile.constant_pool));
-                        if (classname.length() > 0 && buildDeps) {
-                            Klass to = Klass.getKlass(classname);
-                            ResolutionInfo resInfo = ResolutionInfo.resolvedCheckedException(this_klass, to, kmethod);
-                            resInfo.setPublicAccess(flags.is(ACC_PUBLIC));
-
-                            this_klass.addDep(to, resInfo);
-                            to.addReferrer(this_klass, resInfo);
-                        }
-                    }
-                } else {
-                    throw new RuntimeException("Invalid attribute: " + e_attr);
-                }
-            }
-
-            Code_attribute c_attr = (Code_attribute) m.attributes.get(Attribute.Code);
-            if (c_attr != null) {
-                codeAttributeParser.parse(c_attr, kmethod);
-            }
-            kmethod.isAbstract = classfile.access_flags.is(ACC_ABSTRACT);
-            kmethod.setCodeLength(m.byteLength());
-
-            // parse annotation attributes
-            annotationParser.parseAttributes(m.attributes, kmethod);
-            return kmethod;
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        } catch (IOException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private void addFieldTypes(Set<Klass> types, String info, AccessFlags flags) {
-        if (types.isEmpty() || !buildDeps) {
-            return;
-        }
-
-        for (Klass to : types) {
-            ResolutionInfo resInfo = ResolutionInfo.resolvedField(this_klass, to, info);
-            resInfo.setPublicAccess(flags.is(ACC_PUBLIC));
-
-            this_klass.addDep(to, resInfo);
-            to.addReferrer(this_klass, resInfo);
-        }
-    }
-
-    private void addReferencedTypes(Method m, Descriptor d, AccessFlags flags) {
-        Set<Klass> types = parseDescriptor(d);
-
-        Klass.Method method = toKlassMethod(m, d);
-        addMethodTypes(types, method, flags);
-    }
-
-    private void addMethodTypes(Set<Klass> types, Klass.Method method, AccessFlags flags) {
-        if (types.isEmpty() || !buildDeps) {
-            return;
-        }
-        for (Klass to : types) {
-            ResolutionInfo resInfo = ResolutionInfo.resolvedMethodSignature(this_klass, to, method);
-            resInfo.setPublicAccess(flags.is(ACC_PUBLIC));
-
-            this_klass.addDep(to, resInfo);
-            to.addReferrer(this_klass, resInfo);
-        }
-    }
-
-    private void addCheckedExceptionTypes(Set<Klass> types, Klass.Method method, AccessFlags flags) {
-        if (types.isEmpty() || !buildDeps) {
-            return;
-        }
-        for (Klass to : types) {
-            ResolutionInfo resInfo = ResolutionInfo.resolvedCheckedException(this_klass, to, method);
-            resInfo.setPublicAccess(flags.is(ACC_PUBLIC));
-
-            this_klass.addDep(to, resInfo);
-            to.addReferrer(this_klass, resInfo);
-        }
-    }
-
-    private Set<Klass> parseDescriptor(Descriptor d) {
-        Set<Klass> types = new TreeSet<Klass>();
-        try {
-            String desc = d.getValue(classfile.constant_pool);
-            int p = 0;
-            while (p < desc.length()) {
-                String type;
-                char ch;
-                switch (ch = desc.charAt(p++)) {
-                    case '(':
-                    case ')':
-                    case '[':
-                    case 'B':
-                    case 'C':
-                    case 'D':
-                    case 'F':
-                    case 'I':
-                    case 'J':
-                    case 'S':
-                    case 'Z':
-                    case 'V':
-                        continue;
-                    case 'L':
-                        int sep = desc.indexOf(';', p);
-                        if (sep == -1) {
-                            throw new RuntimeException("Invalid descriptor: " + (p - 1) + " " + desc);
-                        }
-                        type = checkClassName(desc.substring(p, sep));
-                        p = sep + 1;
-                        break;
-                    default:
-                        throw new RuntimeException("Invalid descriptor: " + (p - 1) + " " + desc);
-                }
-
-                if (!type.isEmpty() && buildDeps) {
-                    Klass to = Klass.getKlass(type);
-                    types.add(to);
-
-                }
-            }
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-        return types;
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ClassPath.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,275 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-/**
- *
- * @author mchung
- */
-public class ClassPath {
-
-    public class FileInfo {
-
-        File file;
-        JarFile jarfile;
-        int classCount;
-        long filesize;
-
-        FileInfo(File f) throws IOException {
-            this.file = f;
-            this.classCount = 0;
-            if (file.getName().endsWith(".jar")) {
-                this.filesize = file.length();
-                jarfile = new JarFile(f);
-            }
-        }
-
-        File getFile() {
-            return file;
-        }
-
-        JarFile getJarFile() {
-            return jarfile;
-        }
-
-        String getName() throws IOException {
-            return file.getCanonicalPath();
-        }
-    }
-    private List<FileInfo> fileList = new ArrayList<FileInfo>();
-    private static ClassPath instance = new ClassPath();
-
-    static List<FileInfo> getFileInfos() {
-        return instance.fileList;
-    }
-
-    static ClassPath setJDKHome(String jdkhome) throws IOException {
-        List<File> files = new ArrayList<File>();
-        File jre = new File(jdkhome, "jre");
-        File lib = new File(jdkhome, "lib");
-        if (jre.exists() && jre.isDirectory()) {
-            listFiles(new File(jre, "lib"), ".jar", files);
-        } else if (lib.exists() && lib.isDirectory()) {
-            // either a JRE or a jdk build image
-            listFiles(lib, ".jar", files);
-
-            File classes = new File(jdkhome, "classes");
-            if (classes.exists() && classes.isDirectory()) {
-                // jdk build outputdir
-                instance.add(classes);
-            }
-        } else {
-            throw new RuntimeException("\"" + jdkhome + "\" not a JDK home");
-        }
-
-        for (File f : files) {
-            instance.add(f);
-        }
-        return instance;
-    }
-
-    static ClassPath setClassPath(String path) throws IOException {
-        if (path.endsWith(".class")) {
-            // one class file
-            File f = new File(path);
-            if (!f.exists()) {
-                throw new RuntimeException("Classfile \"" + f + "\" doesn't exist");
-            }
-
-            instance.add(f);
-        } else {
-            List<File> jarFiles = new ArrayList<File>();
-            String[] locs = path.split(File.pathSeparator);
-            for (String p : locs) {
-                File f = new File(p);
-                if (!f.exists()) {
-                    throw new RuntimeException("\"" + f + "\" doesn't exist");
-                }
-
-                if (f.isDirectory()) {
-                    instance.add(f);  // add the directory to look up .class files
-                    listFiles(f, ".jar", jarFiles);
-                } else if (p.endsWith(".jar")) {
-                    // jar files
-                    jarFiles.add(f);
-                } else {
-                    throw new RuntimeException("Invalid file \"" + f);
-                }
-            }
-            // add jarFiles if any
-            for (File f : jarFiles) {
-                instance.add(f);
-            }
-        }
-
-        return instance;
-    }
-
-    private void add(File f) throws IOException {
-        fileList.add(new FileInfo(f));
-    }
-
-    public static InputStream open(String pathname) throws IOException {
-        for (FileInfo fi : instance.fileList) {
-            if (fi.getName().endsWith(".jar")) {
-                String path = pathname.replace(File.separatorChar, '/');
-                JarEntry e = fi.jarfile.getJarEntry(path);
-                if (e != null) {
-                    return fi.jarfile.getInputStream(e);
-                }
-            } else if (fi.getFile().isDirectory()) {
-                File f = new File(fi.getFile(), pathname);
-                if (f.exists()) {
-                    return new FileInputStream(f);
-                }
-            } else if (fi.file.isFile()) {
-                if (fi.getName().endsWith(File.separator + pathname)) {
-                    return new FileInputStream(fi.file);
-                }
-            }
-        }
-        return null;
-    }
-
-    static ClassFileParser parserForClass(String classname) throws IOException {
-        String pathname = classname.replace('.', File.separatorChar) + ".class";
-
-        ClassFileParser cfparser = null;
-        for (FileInfo fi : instance.fileList) {
-            if (fi.getName().endsWith(".class")) {
-                if (fi.getName().endsWith(File.separator + pathname)) {
-                    cfparser = ClassFileParser.newParser(fi.getFile(), true);
-                    break;
-                }
-            } else if (fi.getName().endsWith(".jar")) {
-                JarEntry e = fi.jarfile.getJarEntry(classname.replace('.', '/') + ".class");
-                if (e != null) {
-                    cfparser = ClassFileParser.newParser(fi.jarfile.getInputStream(e), e.getSize(), true);
-                    break;
-                }
-            } else if (fi.getFile().isDirectory()) {
-                File f = new File(fi.getFile(), pathname);
-                if (f.exists()) {
-                    cfparser = ClassFileParser.newParser(f, true);
-                    break;
-                }
-            }
-        }
-        return cfparser;
-    }
-
-    public static void parseAllClassFiles() throws IOException {
-        instance.parseFiles();
-    }
-
-    private void parseFiles() throws IOException {
-        Set<Klass> classes = new HashSet<Klass>();
-
-        int count = 0;
-        for (FileInfo fi : fileList) {
-            // filter out public generated classes (i.e. not public API)
-            // javax.management.remote.rmi._RMIConnectionImpl_Tie
-            // javax.management.remote.rmi._RMIServerImpl_Tie
-            if (fi.getName().endsWith(".class")) {
-                parseClass(fi);
-            } else if (fi.getName().endsWith(".jar")) {
-                Enumeration<JarEntry> entries = fi.jarfile.entries();
-                while (entries.hasMoreElements()) {
-                    JarEntry e = entries.nextElement();
-                    if (e.getName().endsWith(".class")) {
-                        ClassFileParser cfparser = ClassFileParser.newParser(fi.jarfile.getInputStream(e), e.getSize(), true);
-                        cfparser.parseDependency(false);
-                        fi.classCount++;
-                    } else if (!e.isDirectory() && ResourceFile.isResource(e.getName())) {
-                        ResourceFile.addResource(e.getName(), fi.jarfile.getInputStream(e));
-                    }
-                }
-            } else if (fi.getFile().isDirectory()) {
-                List<File> files = new ArrayList<File>();
-                listFiles(fi.getFile(), "", files);
-                for (File f : files) {
-                    if (f.getName().endsWith(".class")) {
-                        parseClass(fi, f);
-                    } else if (!f.isDirectory() && ResourceFile.isResource(f.getCanonicalPath())) {
-                        String pathname = f.getCanonicalPath();
-                        String dir = fi.getName();
-                        if (!pathname.startsWith(dir)) {
-                            throw new RuntimeException("Incorrect pathname " + pathname);
-                        }
-                        String name = pathname.substring(dir.length() + 1, pathname.length());
-                        BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
-                        try {
-                            ResourceFile.addResource(name, in);
-                        } finally {
-                            in.close();
-                        }
-                    }
-                }
-            } else {
-                // should not reach here
-                throw new RuntimeException("Unexpected class path: " + fi.getFile());
-            }
-        }
-    }
-
-    private void parseClass(FileInfo fi) throws IOException {
-        parseClass(fi, fi.getFile());
-    }
-
-    private void parseClass(FileInfo fi, File f) throws IOException {
-        ClassFileParser cfparser = ClassFileParser.newParser(f, true);
-        cfparser.parseDependency(false);
-        fi.classCount++;
-        // need to update the filesize for this directory
-        fi.filesize += fi.getFile().length();
-
-    }
-
-    public static void listFiles(File path, String suffix, List<File> result) {
-        if (path.isDirectory()) {
-            File[] children = path.listFiles();
-            for (File c : children) {
-                listFiles(c, suffix, result);
-            }
-
-        } else {
-            if (suffix.isEmpty() || path.getName().endsWith(suffix)) {
-                result.add(path);
-            }
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/CodeAttributeParser.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-package com.sun.classanalyzer;
-
-import com.sun.classanalyzer.Klass.Method;
-
-import com.sun.tools.classfile.*;
-import com.sun.tools.classfile.Instruction.*;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- *
- * @author Mandy Chung
- */
-public class CodeAttributeParser {
-    private final ClassFileParser cfparser;
-    private final ConstantPool cpool;
-    private final ConstantPoolParser constantPoolParser;
-
-
-    static final Map<String, Set<Method>> runtimeReferences =
-            new HashMap<String, Set<Method>>();
-
-
-    CodeAttributeParser(ClassFileParser parser) {
-        this.cfparser = parser;
-        this.cpool = cfparser.classfile.constant_pool;
-        this.constantPoolParser = cfparser.constantPoolParser;
-    }
-
-    static boolean parseCodeAttribute = false; // by default don't parse code attribute
-    static void setParseCodeAttribute(boolean newValue) {
-        parseCodeAttribute = newValue;
-    }
-
-    void parse(Code_attribute attr, Klass.Method method) {
-        if (!parseCodeAttribute) {
-            return;
-        }
-
-        for (Instruction instr : attr.getInstructions()) {
-            try {
-                instr.accept(instructionVisitor, method);
-            } catch (ArrayIndexOutOfBoundsException e) {
-                throw new RuntimeException("error at or after byte " + instr.getPC());
-            }
-
-        }
-
-        if (attr.exception_table_langth > 0) {
-            for (int i = 0; i <
-                    attr.exception_table.length; i++) {
-                Code_attribute.Exception_data handler = attr.exception_table[i];
-                int catch_type = handler.catch_type;
-                if (catch_type > 0) {
-                    addMethodReference(catch_type, method);
-                }
-
-            }
-        }
-
-    }
-
-
-    private void addMethodReference(int index, Klass.Method m) {
-        String method = constantPoolParser.getMethodName(index);
-
-        if (method != null &&
-               (method.equals("java.lang.Class.forName") ||
-                method.equals("java.lang.Class.loadClass") ||
-                method.startsWith("java.util.ServiceLoader.load") ||
-                method.equals("sun.misc.Service.providers"))) {
-            Set<Method> refs = runtimeReferences.get(method);
-            if (refs == null) {
-                refs = new TreeSet<Method>();
-                runtimeReferences.put(method, refs);
-            }
-            refs.add(m);
-        }
-    }
-
-    Instruction.KindVisitor<Void, Klass.Method> instructionVisitor =
-            new Instruction.KindVisitor<Void, Klass.Method>() {
-
-                public Void visitNoOperands(Instruction instr, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitArrayType(Instruction instr, TypeKind kind, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitBranch(Instruction instr, int offset, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitConstantPoolRef(Instruction instr, int index, Klass.Method m) {
-                    addMethodReference(index, m);
-                    return null;
-                }
-
-                public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Klass.Method m) {
-                    addMethodReference(index, m);
-                    return null;
-                }
-
-                public Void visitLocal(Instruction instr, int index, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitLocalAndValue(Instruction instr, int index, int value, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitValue(Instruction instr, int value, Klass.Method m) {
-                    return null;
-                }
-
-                public Void visitUnknown(Instruction instr, Klass.Method m) {
-                    return null;
-                }
-            };
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ConstantPoolAnalyzer.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.classanalyzer;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ConstantPoolAnalyzer {
-    public static void main(String[] args) throws Exception {
-        String jdkhome = null;
-
-        // process arguments
-        int i = 0;
-        while (i < args.length) {
-            String arg = args[i++];
-            if (arg.equals("-jdkhome")) {
-                if (i < args.length) {
-                    jdkhome = args[i++];
-                } else {
-                    usage();
-                }
-            }
-        }
-        if (jdkhome == null) {
-            usage();
-        }
-        ClassPath.setJDKHome(jdkhome);
-        ClassPath.parseAllClassFiles();
-    }
-
-    private static void usage() {
-        System.out.println("Usage: ConstantPoolAnalyzer <options>");
-        System.out.println("Options: ");
-        System.out.println("\t-jdkhome <JDK home> where all jars will be parsed");
-        System.out.println("\t-cpath <classpath> where classes and jars will be parsed");
-        System.exit(-1);
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ConstantPoolParser.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,377 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import com.sun.tools.classfile.*;
-import com.sun.tools.classfile.ConstantPool.*;
-import static com.sun.tools.classfile.ConstantPool.*;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ConstantPoolParser {
-
-    private final ClassFileParser cfparser;
-    private final StringValueVisitor visitor;
-    private final ConstantPool cpool;
-
-    ConstantPoolParser(ClassFileParser parser) {
-        this.cfparser = parser;
-        this.cpool = cfparser.classfile.constant_pool;
-        this.visitor = new StringValueVisitor();
-    }
-
-    public String stringValue(CPInfo cpInfo) {
-        return visitor.visit(cpInfo);
-    }
-
-    public String stringValue(int constant_pool_index) {
-        try {
-            return stringValue(cpool.get(constant_pool_index));
-        } catch (ConstantPool.InvalidIndex e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void parseDependency() {
-        ConstantPool.Visitor<Integer, Void> v = new ConstantPool.Visitor<Integer, Void>() {
-
-            public Integer visitClass(CONSTANT_Class_info info, Void p) {
-                try {
-                    String classname = cfparser.checkClassName(info.getName());
-                    if (classname.isEmpty()) {
-                        return 1;
-                    }
-
-                    Klass from = cfparser.this_klass;
-                    Klass to = Klass.getKlass(classname);
-                    ResolutionInfo resInfo = ResolutionInfo.resolvedConstantPool(from, to, info.name_index);
-
-                    from.addDep(to, resInfo);
-                    to.addReferrer(from, resInfo);
-                } catch (ConstantPoolException ex) {
-                    throw new RuntimeException(ex);
-                }
-                return 1;
-            }
-
-            public Integer visitDouble(CONSTANT_Double_info info, Void p) {
-                // skip
-                return 2;
-            }
-
-            public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitFloat(CONSTANT_Float_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitInteger(CONSTANT_Integer_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitLong(CONSTANT_Long_info info, Void p) {
-                // skip
-                return 2;
-            }
-
-            public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitString(CONSTANT_String_info info, Void p) {
-                // skip
-                return 1;
-            }
-
-            public Integer visitUtf8(CONSTANT_Utf8_info info, Void p) {
-                // skip
-                return 1;
-            }
-        };
-        int cpx = 1;
-        while (cpx < cpool.size()) {
-            try {
-                CPInfo cpInfo = cpool.get(cpx);
-                cpx += cpInfo.accept(v, null);
-            } catch (ConstantPool.InvalidIndex ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-    }
-
-    int getTag(int index) {
-        try {
-            return cpool.get(index).getTag();
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    String getDescriptor(int index) {
-        CPInfo cpInfo;
-        try {
-            cpInfo = cpool.get(index);
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-
-        int tag = cpInfo.getTag();
-        switch (tag) {
-            case CONSTANT_Methodref:
-            case CONSTANT_InterfaceMethodref:
-            case CONSTANT_Fieldref:
-                // simplify references within this class
-                CPRefInfo ref = (CPRefInfo) cpInfo;
-                try {
-                    return ref.getNameAndTypeInfo().getType();
-                } catch (ConstantPoolException ex) {
-                }
-        }
-        return stringValue(cpInfo);
-    }
-
-    String getMethodName(int index) {
-        try {
-            CPInfo cpInfo = cpool.get(index);
-            if (cpInfo.getTag() == CONSTANT_Methodref ||
-                    cpInfo.getTag() == CONSTANT_InterfaceMethodref) {
-
-                // simplify references within this class
-                CPRefInfo ref = (CPRefInfo) cpInfo;
-                String classname;
-                if (ref.class_index == cfparser.classfile.this_class) {
-                    classname = cfparser.this_klass.getClassName();
-                } else {
-                    classname = cfparser.checkClassName(ref.getClassName()).replace('/', '.');
-                }
-                String methodname = ref.getNameAndTypeInfo().getName();
-                return classname + "." + methodname;
-            } else {
-                return null;
-            }
-        } catch (InvalidIndex ex) {
-            throw new RuntimeException(ex);
-        } catch (ConstantPoolException ex) {
-            throw new RuntimeException(ex);
-        }
-
-    }
-
-    class StringValueVisitor implements ConstantPool.Visitor<String, Void> {
-
-        public StringValueVisitor() {
-        }
-
-        public String visit(CPInfo info) {
-            return info.accept(this, null);
-        }
-
-        public String visitClass(CONSTANT_Class_info info, Void p) {
-            return getCheckedName(info);
-        }
-
-        String getCheckedName(CONSTANT_Class_info info) {
-            try {
-                return checkName(info.getName());
-            } catch (ConstantPoolException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public String visitDouble(CONSTANT_Double_info info, Void p) {
-            return info.value + "d";
-        }
-
-        public String visitFieldref(CONSTANT_Fieldref_info info, Void p) {
-            return visitRef(info, p);
-        }
-
-        public String visitFloat(CONSTANT_Float_info info, Void p) {
-            return info.value + "f";
-        }
-
-        public String visitInteger(CONSTANT_Integer_info info, Void p) {
-            return String.valueOf(info.value);
-        }
-
-        public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
-            return visitRef(info, p);
-        }
-
-        public String visitLong(CONSTANT_Long_info info, Void p) {
-            return info.value + "l";
-        }
-
-        public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
-            return getCheckedName(info) + ":" + getType(info);
-        }
-
-        String getCheckedName(CONSTANT_NameAndType_info info) {
-            try {
-                return checkName(info.getName());
-            } catch (ConstantPoolException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        String getType(CONSTANT_NameAndType_info info) {
-            try {
-                return info.getType();
-            } catch (ConstantPoolException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public String visitMethodref(CONSTANT_Methodref_info info, Void p) {
-            return visitRef(info, p);
-        }
-
-        public String visitString(CONSTANT_String_info info, Void p) {
-            try {
-                int string_index = info.string_index;
-                return cpool.getUTF8Info(string_index).accept(this, p);
-            } catch (ConstantPoolException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public String visitUtf8(CONSTANT_Utf8_info info, Void p) {
-            String s = info.value;
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < s.length(); i++) {
-                char c = s.charAt(i);
-                switch (c) {
-                    case '\t':
-                        sb.append('\\').append('t');
-                        break;
-                    case '\n':
-                        sb.append('\\').append('n');
-                        break;
-                    case '\r':
-                        sb.append('\\').append('r');
-                        break;
-                    case '\"':
-                        sb.append('\\').append('\"');
-                        break;
-                    default:
-                        sb.append(c);
-                }
-            }
-            return sb.toString();
-        }
-
-        String visitRef(CPRefInfo info, Void p) {
-            String cn = getCheckedClassName(info);
-            String nat;
-            try {
-                nat = info.getNameAndTypeInfo().accept(this, p);
-            } catch (ConstantPoolException e) {
-                nat = e.getMessage();
-            }
-            return cn + "." + nat;
-        }
-
-        String getCheckedClassName(CPRefInfo info) {
-            try {
-                return checkName(info.getClassName());
-            } catch (ConstantPoolException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-    /* If name is a valid binary name, return it; otherwise quote it. */
-
-    private static String checkName(String name) {
-        if (name == null) {
-            return "null";
-        }
-
-        int len = name.length();
-        if (len == 0) {
-            return "\"\"";
-        }
-
-        int cc = '/';
-        int cp;
-        for (int k = 0; k < len; k += Character.charCount(cp)) {
-            cp = name.codePointAt(k);
-            if ((cc == '/' && !Character.isJavaIdentifierStart(cp)) || (cp != '/' && !Character.isJavaIdentifierPart(cp))) {
-                return "\"" + name + "\"";
-            }
-            cc = cp;
-        }
-        return name;
-    }
-
-    String tagName(int index) {
-        try {
-            int tag = cpool.get(index).getTag();
-            switch (tag) {
-                case CONSTANT_Utf8:
-                    return "Utf8";
-                case CONSTANT_Integer:
-                    return "int";
-                case CONSTANT_Float:
-                    return "float";
-                case CONSTANT_Long:
-                    return "long";
-                case CONSTANT_Double:
-                    return "double";
-                case CONSTANT_Class:
-                    return "class";
-                case CONSTANT_String:
-                    return "String";
-                case CONSTANT_Fieldref:
-                    return "Field";
-                case CONSTANT_Methodref:
-                    return "Method";
-                case CONSTANT_InterfaceMethodref:
-                    return "InterfaceMethod";
-                case CONSTANT_NameAndType:
-                    return "NameAndType";
-                default:
-                    return "(unknown tag)";
-            }
-        } catch (InvalidIndex e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/DependencyConfig.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.List;
-
-/**
- * Config file specifying additional dependency
- * Each line consists of:
- * <tag> <classname> -> <value>
- * where <tag> can be:
- *    @ClassForName and <value> is its dependency
- *    @Provider and <value> is the service name
- *    @Providers and <value> is the list of the service names
- *
- * @author Mandy Chung
- */
-public class DependencyConfig {
-    private DependencyConfig() {
-    }
-
-    static void parse(List<String> configs) throws IOException {
-        for (String s : configs) {
-            parse(s);
-        }
-    }
-
-    private static void parse(String config) throws IOException {
-        // parse configuration file
-        FileInputStream in = new FileInputStream(config);
-        try {
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-            String line;
-            int lineNumber = 0;
-            String type = null;
-            while ((line = reader.readLine()) != null) {
-                lineNumber++;
-                line = line.trim();
-                if (line.length() == 0 || line.charAt(0) == '#') {
-                    continue;
-                }
-                if (line.charAt(0) == '@') {
-                    if (AnnotatedDependency.isValidType(line)) {
-                        type = line;
-                        continue;
-                    } else {
-                        throw new RuntimeException(config + ", line " +
-                            lineNumber + ", invalid annotation type.");
-                    }
-                }
-                String[] s = line.split("\\s+");
-                if (s.length < 3 || !s[1].equals("->")) {
-                    throw new RuntimeException(config + ", line " +
-                            lineNumber + ", is malformed");
-                }
-                String classname = s[0].trim();
-                String value = s[2].trim();
-
-                Klass k = Klass.findKlass(classname);
-                if (k == null) {
-                    // System.out.println("Warning: " + classname + " cannot be found");
-                    continue;
-                }
-                AnnotatedDependency dep = AnnotatedDependency.newAnnotatedDependency(type, value, k);
-                if (dep == null) {
-                    throw new RuntimeException(config + ", line " +
-                            lineNumber + ", is malformed. Fail to construct the dependency.");
-                }
-            }
-
-        } finally {
-            in.close();
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/Klass.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,357 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-package com.sun.classanalyzer;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import com.sun.tools.classfile.AccessFlags;
-
-/**
- *
- * @author Mandy Chung
- */
-public class Klass implements Comparable<Klass> {
-    private final String classname;
-    private final String packagename;
-    private Module module;
-    private boolean isJavaLangObject;
-    private String[] paths;
-    private Map<String, Set<Method>> methods;
-    private AccessFlags accessFlags;
-    private long filesize;
-
-    private SortedMap<Klass, Set<ResolutionInfo>> deps;
-    private SortedMap<Klass, Set<ResolutionInfo>> referrers;
-    private List<AnnotatedDependency> annotatedDeps;
-    private Set<String> classForNameRefs;
-
-    private Klass(String classname) {
-        this.classname = classname;
-        this.paths = classname.replace('.', '/').split("/");
-        this.isJavaLangObject = classname.equals("java.lang.Object");
-        this.deps = new TreeMap<Klass, Set<ResolutionInfo>>();
-        this.referrers = new TreeMap<Klass, Set<ResolutionInfo>>();
-        this.methods = new HashMap<String, Set<Method>>();
-        this.annotatedDeps = new ArrayList<AnnotatedDependency>();
-        this.classForNameRefs = new TreeSet<String>();
-
-        int pos = classname.lastIndexOf('.');
-        this.packagename = (pos > 0) ? classname.substring(0, pos) : "<unnamed>";
-    }
-
-    String getBasename() {
-        return paths[paths.length - 1];
-    }
-
-    String getClassName() {
-        return classname;
-    }
-
-    String getPackageName() {
-        return packagename;
-    }
-
-    String getClassFilePathname() {
-        StringBuilder sb = new StringBuilder(paths[0]);
-        for (int i = 1; i < paths.length; i++) {
-            String p = paths[i];
-            sb.append(File.separator).append(p);
-        }
-        return sb.append(".class").toString();
-    }
-
-    boolean isPublic() {
-        return accessFlags == null || accessFlags.is(AccessFlags.ACC_PUBLIC);
-    }
-
-    Module getModule() {
-        return module;
-    }
-
-    void setModule(Module m) {
-        if (module != null) {
-            throw new RuntimeException("Module for " + this + " already set");
-        }
-        this.module = m;
-    }
-
-    Set<Klass> getReferencedClasses() {
-        return deps.keySet();
-    }
-
-    Set<Klass> getReferencingClasses() {
-        return referrers.keySet();
-    }
-
-    void setAccessFlags(int flags) {
-        this.accessFlags = new AccessFlags(flags);
-    }
-
-    void setFileSize(long size) {
-        this.filesize = size;
-    }
-
-    long getFileSize() {
-        return this.filesize;
-    }
-
-    boolean exists() {
-        return filesize > 0;
-    }
-
-    boolean skip(Klass k) {
-        // skip if either class is a root or same class
-        return k.isJavaLangObject || this == k || k.classname.equals(classname);
-    }
-
-    void addDep(Method callee, ResolutionInfo resInfo) {
-        addDep(callee.getKlass(), resInfo);
-    }
-
-    void addDep(Klass ref, ResolutionInfo ri) {
-        if (skip(ref)) {
-            return;
-        }
-        Set<ResolutionInfo> resInfos;
-        if (!deps.containsKey(ref)) {
-            resInfos = new TreeSet<ResolutionInfo>();
-            deps.put(ref, resInfos);
-        } else {
-            resInfos = deps.get(ref);
-        }
-        resInfos.add(ri);
-    }
-
-    void addReferrer(Method caller, ResolutionInfo resInfo) {
-        addReferrer(caller.getKlass(), resInfo);
-    }
-
-    void addReferrer(Klass k, ResolutionInfo ri) {
-        if (skip(k)) {
-            return;
-        }
-        Set<ResolutionInfo> resInfos;
-        if (!referrers.containsKey(k)) {
-            resInfos = new TreeSet<ResolutionInfo>();
-            referrers.put(k, resInfos);
-        } else {
-            resInfos = referrers.get(k);
-        }
-        resInfos.add(ri);
-    }
-
-    Method getMethod(String name) {
-        return getMethod(name, "");
-    }
-
-    Method getMethod(String name, String signature) {
-        Set<Method> set;
-        if (methods.containsKey(name)) {
-            set = methods.get(name);
-        } else {
-            set = new TreeSet<Method>();
-            methods.put(name, set);
-        }
-
-        for (Method m : set) {
-            if (m.getName().equals(name) && m.getSignature().equals(signature)) {
-                return m;
-            }
-        }
-        Method m = new Method(this, name, signature);
-        set.add(m);
-        return m;
-    }
-
-    @Override
-    public String toString() {
-        return classname;
-    }
-
-    @Override
-    public int compareTo(Klass o) {
-        return classname.compareTo(o.classname);
-    }
-
-    void addAnnotatedDep(AnnotatedDependency dep) {
-        annotatedDeps.add(dep);
-    }
-
-    void addClassForNameReference(String method) {
-        classForNameRefs.add(method);
-    }
-
-    List<AnnotatedDependency> getAnnotatedDeps() {
-        return annotatedDeps;
-    }
-
-    private static Map<String, Klass> classes = new TreeMap<String, Klass>();
-    static Set<Klass> getAllClasses() {
-        return new TreeSet<Klass>(classes.values());
-    }
-
-    static Klass findKlassFromPathname(String filename) {
-        String name = filename;
-        if (filename.endsWith(".class")) {
-            name = filename.substring(0, filename.length() - 6);
-        }
-
-        // trim ".class"
-        name = name.replace('/', '.');
-        for (Klass k : classes.values()) {
-            if (name.endsWith(k.getClassName())) {
-                return k;
-            }
-        }
-        return null;
-    }
-
-    static Klass findKlass(String classname) {
-        return classes.get(classname);
-    }
-
-    static Klass getKlass(String name) {
-        Klass k;
-        String classname = name.replace('/', '.');
-        if (classname.charAt(classname.length() - 1) == ';') {
-            classname = classname.substring(0, classname.length() - 1);
-        }
-        if (classes.containsKey(classname)) {
-            k = classes.get(classname);
-        } else {
-            k = new Klass(classname);
-            classes.put(classname, k);
-        }
-        return k;
-    }
-
-    public class Method implements Comparable<Method> {
-
-        private final Klass k;
-        private final String method;
-        private final String signature;
-        private long codeLength;
-        // non-primitive types only
-        private final List<Klass> argTypes;
-        private final Klass returnType;
-        boolean isAbstract = false;
-        boolean marked = false;
-
-        public Method(Klass k, String method, String signature) {
-            this(k, method, signature, null, null);
-        }
-
-        public Method(Klass k, String method, String signature, Klass returnType, List<Klass> argTypes) {
-            this.k = k;
-            this.method = method;
-            this.signature = signature;
-            this.argTypes = argTypes;
-            this.returnType = returnType;
-            this.codeLength = 0;
-        }
-
-        public Klass getKlass() {
-            return k;
-        }
-
-        public String getName() {
-            return method;
-        }
-
-        public String getSignature() {
-            return signature;
-        }
-
-        public Klass getReturnType() {
-            return returnType;
-        }
-
-        public List<Klass> argTypes() {
-            return argTypes;
-        }
-
-        public void setCodeLength(long len) {
-            this.codeLength = len;
-        }
-
-        public long getCodeLength() {
-            return codeLength;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof Method) {
-                return compareTo((Method) o) == 0;
-            } else {
-                return false;
-            }
-        }
-
-        @Override
-        public int hashCode() {
-            int hash = 3;
-            hash = 71 * hash + (this.k != null ? this.k.hashCode() : 0);
-            hash = 71 * hash + (this.method != null ? this.method.hashCode() : 0);
-            return hash;
-        }
-
-        @Override
-        public String toString() {
-            if (signature.isEmpty()) {
-                return k.classname + "." + method;
-            } else {
-                return signature;
-            }
-        }
-
-        public String toHtmlString() {
-            return toString().replace("<", "&lt;").replace(">", "&gt;");
-        }
-
-        boolean isClinit() {
-            return method.equals("<clinit>");
-        }
-
-        public int compareTo(Method m) {
-            if (k == m.getKlass()) {
-                if (method.equals(m.method)) {
-                    return signature.compareTo(m.signature);
-                } else {
-                    return method.compareTo(m.method);
-                }
-            } else {
-                return k.compareTo(m.getKlass());
-            }
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/Module.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,693 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- *
- * 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.classanalyzer;
-
-import com.sun.classanalyzer.AnnotatedDependency.OptionalDependency;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- *
- * @author Mandy Chung
- */
-public class Module implements Comparable<Module> {
-
-    private static Map<String, Module> modules = new LinkedHashMap<String, Module>();
-
-    public static Module addModule(ModuleConfig config) {
-        String name = config.module;
-        if (modules.containsKey(name)) {
-            throw new RuntimeException("module \"" + name + "\" already exists");
-        }
-
-        Module m = new Module(config);
-        modules.put(name, m);
-        return m;
-    }
-
-    public static Module findModule(String name) {
-        return modules.get(name);
-    }
-
-    static Collection<Module> getAllModules() {
-        return Collections.unmodifiableCollection(modules.values());
-    }
-    private final String name;
-    private final ModuleConfig config;
-    private final Set<Klass> classes;
-    private final Set<ResourceFile> resources;
-    private final Set<Reference> unresolved;
-    private final Set<Dependency> dependents;
-    private final Map<String, PackageInfo> packages;
-    private final Set<Module> members;
-    private Module group;
-    private boolean isBaseModule;
-
-    private Module(ModuleConfig config) {
-        this.name = config.module;
-        this.isBaseModule = config.isBase;
-        this.classes = new TreeSet<Klass>();
-        this.resources = new TreeSet<ResourceFile>();
-        this.config = config;
-        this.unresolved = new HashSet<Reference>();
-        this.dependents = new TreeSet<Dependency>();
-        this.packages = new TreeMap<String, PackageInfo>();
-        this.members = new TreeSet<Module>();
-        this.group = this; // initialize to itself
-    }
-
-    String name() {
-        return name;
-    }
-
-    Module group() {
-        return group;
-    }
-
-    boolean isBase() {
-        return isBaseModule;
-    }
-
-    Set<Module> members() {
-        return members;
-    }
-
-    boolean contains(Klass k) {
-        return k != null && classes.contains(k);
-    }
-
-    boolean isEmpty() {
-        return classes.isEmpty() && resources.isEmpty();
-    }
-
-    /**
-     * Returns an Iterable of Dependency, only one for each dependent
-     * module of the strongest dependency (i.e.
-     * hard static > hard dynamic > optional static > optional dynamic
-     */
-    Iterable<Dependency> dependents() {
-        Map<Module, Dependency> deps = new LinkedHashMap<Module, Dependency>();
-        for (Dependency dep : dependents) {
-            Dependency d = deps.get(dep.module);
-            if (d == null || dep.compareTo(d) > 0) {
-                deps.put(dep.module, dep);
-            }
-        }
-        return deps.values();
-    }
-
-    @Override
-    public int compareTo(Module o) {
-        if (o == null) {
-            return -1;
-        }
-        return name.compareTo(o.name);
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
-
-    void addKlass(Klass k) {
-        classes.add(k);
-        k.setModule(this);
-
-        // update package statistics
-        String pkg = k.getPackageName();
-        PackageInfo pkginfo = packages.get(pkg);
-        if (pkginfo == null) {
-            pkginfo = new PackageInfo(pkg);
-            packages.put(pkg, pkginfo);
-        }
-        if (k.exists()) {
-            // only count the class that is parsed
-            pkginfo.add(k.getFileSize());
-        }
-    }
-
-    void addResource(ResourceFile res) {
-        resources.add(res);
-        res.setModule(this);
-    }
-
-    void processRootsAndReferences() {
-        // start with the root set
-        Deque<Klass> pending = new ArrayDeque<Klass>();
-        for (Klass k : Klass.getAllClasses()) {
-            if (k.getModule() != null) {
-                continue;
-            }
-            String classname = k.getClassName();
-            if (config.matchesRoot(classname) && !config.isExcluded(classname)) {
-                addKlass(k);
-                pending.add(k);
-            }
-        }
-
-        // follow all references
-        Klass k;
-        while ((k = pending.poll()) != null) {
-            if (!classes.contains(k)) {
-                addKlass(k);
-            }
-            for (Klass other : k.getReferencedClasses()) {
-                Module otherModule = other.getModule();
-                if (otherModule != null && otherModule != this) {
-                    // this module is dependent on otherModule
-                    addDependency(k, other);
-                    continue;
-                }
-
-                if (!classes.contains(other)) {
-                    if (config.isExcluded(other.getClassName())) {
-                        // reference to an excluded class
-                        unresolved.add(new Reference(k, other));
-                    } else {
-                        pending.add(other);
-                    }
-                }
-            }
-        }
-
-        // add other matching classes that don't require dependency analysis
-        for (Klass c : Klass.getAllClasses()) {
-            if (c.getModule() == null) {
-                String classname = c.getClassName();
-                if (config.matchesIncludes(classname) && !config.isExcluded(classname)) {
-                    addKlass(c);
-                    // dependencies
-                    for (Klass other : c.getReferencedClasses()) {
-                        Module otherModule = other.getModule();
-                        if (otherModule == null) {
-                            unresolved.add(new Reference(c, other));
-                        } else {
-                            if (otherModule != this) {
-                                // this module is dependent on otherModule
-                                addDependency(c, other);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-
-        // add other matching classes that don't require dependency analysis
-        for (ResourceFile res : ResourceFile.getAllResources()) {
-            if (res.getModule() == null) {
-                String name = res.getName();
-                if (config.matchesIncludes(name) && !config.isExcluded(name)) {
-                    addResource(res);
-                }
-            }
-        }
-    }
-
-    void addDependency(Klass from, Klass to) {
-        Dependency dep = new Dependency(from, to);
-        dependents.add(dep);
-    }
-
-    void fixupDependencies() {
-        // update dependencies for classes that were allocated to modules after
-        // this module was processed.
-        for (Reference ref : unresolved) {
-            Module m = ref.referree().getModule();
-            if (m == null || m != this) {
-                addDependency(ref.referrer, ref.referree);
-            }
-        }
-
-        fixupAnnotatedDependencies();
-    }
-
-    private void fixupAnnotatedDependencies() {
-        // add dependencies that this klass may depend on due to the AnnotatedDependency
-        dependents.addAll(AnnotatedDependency.getDependencies(this));
-    }
-
-    boolean isModuleDependence(Klass k) {
-        Module m = k.getModule();
-        return m == null || (!classes.contains(k) && !m.isBase());
-    }
-
-    Module getModuleDependence(Klass k) {
-        if (isModuleDependence(k)) {
-            Module m = k.getModule();
-            if (group == this && m != null) {
-                // top-level module
-                return m.group;
-            } else {
-                return m;
-            }
-        }
-        return null;
-    }
-
-    <P> void visit(Set<Module> visited, Visitor<P> visitor, P p) {
-        if (!visited.contains(this)) {
-            visited.add(this);
-            visitor.preVisit(this, p);
-            for (Module m : members) {
-                m.visit(visited, visitor, p);
-                visitor.postVisit(this, m, p);
-            }
-        } else {
-            throw new RuntimeException("Cycle detected: module " + this.name);
-        }
-    }
-
-    void addMember(Module m) {
-        // merge class list
-        for (Klass k : m.classes) {
-            classes.add(k);
-        }
-
-        // merge resource list
-        for (ResourceFile res : m.resources) {
-            resources.add(res);
-        }
-
-        // merge the package statistics
-        for (PackageInfo pinfo : m.getPackageInfos()) {
-            String packageName = pinfo.pkgName;
-            PackageInfo pkginfo = packages.get(packageName);
-            if (pkginfo == null) {
-                pkginfo = new PackageInfo(packageName);
-                packages.put(packageName, pkginfo);
-            }
-            pkginfo.add(pinfo);
-        }
-    }
-
-    static void buildModuleMembers() {
-        // set up module member relationship
-        for (Module m : modules.values()) {
-            m.group = m; // initialize to itself
-            for (String name : m.config.members()) {
-                Module member = modules.get(name);
-                if (member == null) {
-                    throw new RuntimeException("module \"" + name + "\" doesn't exist");
-                }
-                m.members.add(member);
-            }
-        }
-
-        // set up the top-level module
-        Visitor<Module> groupSetter = new Visitor<Module>() {
-
-            public void preVisit(Module m, Module p) {
-                m.group = p;
-                if (p.isBaseModule) {
-                    // all members are also base
-                    m.isBaseModule = true;
-                }
-            }
-
-            public void postVisit(Module m, Module child, Module p) {
-                // nop - breadth-first search
-            }
-        };
-
-        // propagate the top-level module to all its members
-        for (Module p : modules.values()) {
-            for (Module m : p.members) {
-                if (m.group == m) {
-                    m.visit(new TreeSet<Module>(), groupSetter, p);
-                }
-            }
-        }
-
-        Visitor<Module> mergeClassList = new Visitor<Module>() {
-
-            public void preVisit(Module m, Module p) {
-                // nop - depth-first search
-            }
-
-            public void postVisit(Module m, Module child, Module p) {
-                m.addMember(child);
-            }
-        };
-
-        Set<Module> visited = new TreeSet<Module>();
-        for (Module m : modules.values()) {
-            if (m.group() == m) {
-                if (m.members().size() > 0) {
-                    // merge class list from all its members
-                    m.visit(visited, mergeClassList, m);
-                }
-
-                // clear the dependencies before fixup
-                m.dependents.clear();
-
-                // fixup dependencies
-                for (Klass k : m.classes) {
-                    for (Klass other : k.getReferencedClasses()) {
-                        if (m.isModuleDependence(other)) {
-                            // this module is dependent on otherModule
-                            m.addDependency(k, other);
-                        }
-                    }
-                }
-
-                // add dependencies that this klass may depend on due to the AnnotatedDependency
-                m.fixupAnnotatedDependencies();
-            }
-        }
-    }
-
-    class PackageInfo implements Comparable {
-
-        final String pkgName;
-        int count;
-        long filesize;
-
-        PackageInfo(String name) {
-            this.pkgName = name;
-            this.count = 0;
-            this.filesize = 0;
-        }
-
-        void add(PackageInfo pkg) {
-            this.count += pkg.count;
-            this.filesize += pkg.filesize;
-        }
-
-        void add(long size) {
-            count++;
-            filesize += size;
-
-        }
-
-        @Override
-        public int compareTo(Object o) {
-            return pkgName.compareTo(((PackageInfo) o).pkgName);
-        }
-    }
-
-    Set<PackageInfo> getPackageInfos() {
-        return new TreeSet<PackageInfo>(packages.values());
-    }
-
-    void printSummaryTo(String output) throws IOException {
-        PrintWriter writer = new PrintWriter(output);
-        try {
-            long total = 0L;
-            int count = 0;
-            writer.format("%10s\t%10s\t%s\n", "Bytes", "Classes", "Package name");
-            for (String pkg : packages.keySet()) {
-                PackageInfo info = packages.get(pkg);
-                if (info.count > 0) {
-                    writer.format("%10d\t%10d\t%s\n", info.filesize, info.count, pkg);
-                    total += info.filesize;
-                    count += info.count;
-                }
-            }
-
-            writer.format("\nTotal: %d bytes (uncompressed) %d classes\n", total, count);
-        } finally {
-            writer.close();
-        }
-
-    }
-
-    void printClassListTo(String output) throws IOException {
-        // no file created if the module doesn't have any class nor resource
-        if (isEmpty()) {
-            return;
-        }
-
-        PrintWriter writer = new PrintWriter(output);
-        try {
-            for (Klass c : classes) {
-                if (c.exists()) {
-                    writer.format("%s\n", c.getClassFilePathname());
-                } else {
-                    trace("%s in module %s missing\n", c, this);
-                }
-            }
-
-        } finally {
-            writer.close();
-        }
-    }
-
-    void printResourceListTo(String output) throws IOException {
-        // no file created if the module doesn't have any resource file
-        if (resources.isEmpty()) {
-            return;
-        }
-
-        PrintWriter writer = new PrintWriter(output);
-        try {
-            for (ResourceFile res : resources) {
-                writer.format("%s\n", res.getPathname());
-            }
-        } finally {
-            writer.close();
-        }
-    }
-
-    void printDependenciesTo(String output, boolean showDynamic) throws IOException {
-        // no file created if the module doesn't have any class
-        if (isEmpty()) {
-            return;
-        }
-
-        PrintWriter writer = new PrintWriter(output);
-        try {
-            // classes that this klass may depend on due to the AnnotatedDependency
-            Map<Reference, Set<AnnotatedDependency>> annotatedDeps = AnnotatedDependency.getReferences(this);
-
-            for (Klass klass : classes) {
-                Set<Klass> references = klass.getReferencedClasses();
-                for (Klass other : references) {
-                    String classname = klass.getClassName();
-                    boolean optional = OptionalDependency.isOptional(klass, other);
-                    if (optional) {
-                        classname = "[optional] " + classname;
-                    }
-
-                    Module m = getModuleDependence(other);
-                    if (m != null || other.getModule() == null) {
-                        writer.format("%-40s -> %s (%s)", classname, other, m);
-                        Reference ref = new Reference(klass, other);
-                        if (annotatedDeps.containsKey(ref)) {
-                            for (AnnotatedDependency ad : annotatedDeps.get(ref)) {
-                                writer.format(" %s", ad.getTag());
-                            }
-                            // printed; so remove the dependency from the annotated deps list
-                            annotatedDeps.remove(ref);
-                        }
-                        writer.format("\n");
-                    }
-                }
-            }
-
-
-            // print remaining dependencies specified in AnnotatedDependency list
-            if (annotatedDeps.size() > 0) {
-                for (Map.Entry<Reference, Set<AnnotatedDependency>> entry : annotatedDeps.entrySet()) {
-                    Reference ref = entry.getKey();
-                    Module m = getModuleDependence(ref.referree);
-                    if (m != null || ref.referree.getModule() == null) {
-                        String classname = ref.referrer.getClassName();
-                        boolean optional = true;
-                        boolean dynamic = true;
-                        String tag = "";
-                        for (AnnotatedDependency ad : entry.getValue()) {
-                            if (optional && !ad.isOptional()) {
-                                optional = false;
-                                tag = ad.getTag();
-                            }
-                            if (!ad.isDynamic()) {
-                                dynamic = false;
-                            }
-                        }
-                        if (!showDynamic && optional && dynamic) {
-                            continue;
-                        }
-                        if (optional) {
-                            if (dynamic) {
-                                classname = "[dynamic] " + classname;
-                            } else {
-                                classname = "[optional] " + classname;
-                            }
-                        }
-                        writer.format("%-40s -> %s (%s) %s%n", classname, ref.referree, m, tag);
-                    }
-                }
-            }
-
-        } finally {
-            writer.close();
-        }
-    }
-
-    static class Dependency implements Comparable<Dependency> {
-
-        final Module module;
-        final boolean optional;
-        final boolean dynamic;
-
-        Dependency(Klass from, Klass to) {
-            // static dependency
-            this.module = to.getModule() != null ? to.getModule().group() : null;
-            this.optional = OptionalDependency.isOptional(from, to);
-            this.dynamic = false;
-        }
-
-        Dependency(Module m, boolean optional, boolean dynamic) {
-            this.module = m != null ? m.group() : null;
-            this.optional = optional;
-            this.dynamic = dynamic;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (!(obj instanceof Dependency)) {
-                return false;
-            }
-            if (this == obj) {
-                return true;
-            }
-
-            Dependency d = (Dependency) obj;
-            if (this.module != d.module) {
-                return false;
-            } else {
-                return this.optional == d.optional && this.dynamic == d.dynamic;
-            }
-        }
-
-        @Override
-        public int hashCode() {
-            int hash = 3;
-            hash = 19 * hash + (this.module != null ? this.module.hashCode() : 0);
-            hash = 19 * hash + (this.optional ? 1 : 0);
-            hash = 19 * hash + (this.dynamic ? 1 : 0);
-            return hash;
-        }
-
-        @Override
-        public int compareTo(Dependency d) {
-            if (this.equals(d)) {
-                return 0;
-            }
-
-            // Hard static > hard dynamic > optional static > optional dynamic
-            if (this.module == d.module) {
-                if (this.optional == d.optional) {
-                    return this.dynamic ? -1 : 1;
-                } else {
-                    return this.optional ? -1 : 1;
-                }
-            } else if (this.module != null && d.module != null) {
-                return (this.module.compareTo(d.module));
-            } else {
-                return (this.module == null) ? -1 : 1;
-            }
-        }
-
-        @Override
-        public String toString() {
-            String s = module.name();
-            if (dynamic && optional) {
-                s += " (dynamic)";
-            } else if (optional) {
-                s += " (optional)";
-            }
-            return s;
-        }
-    }
-
-    static class Reference implements Comparable<Reference> {
-
-        private final Klass referrer, referree;
-
-        Reference(Klass referrer, Klass referree) {
-            this.referrer = referrer;
-            this.referree = referree;
-        }
-
-        Klass referrer() {
-            return referrer;
-        }
-
-        Klass referree() {
-            return referree;
-        }
-
-        @Override
-        public int hashCode() {
-            return referrer.hashCode() ^ referree.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (!(obj instanceof Reference)) {
-                return false;
-            }
-            if (this == obj) {
-                return true;
-            }
-
-            Reference r = (Reference) obj;
-            return (this.referrer.equals(r.referrer) &&
-                    this.referree.equals(r.referree));
-        }
-
-        @Override
-        public int compareTo(Reference r) {
-            int ret = referrer.compareTo(r.referrer);
-            if (ret == 0) {
-                ret = referree.compareTo(r.referree);
-            }
-            return ret;
-        }
-    }
-
-    interface Visitor<P> {
-
-        public void preVisit(Module m, P param);
-
-        public void postVisit(Module m, Module child, P param);
-    }
-    private static boolean traceOn = System.getProperty("classanalyzer.debug") != null;
-
-    private static void trace(String format, Object... params) {
-        System.err.format(format, params);
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ModuleConfig.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,562 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ModuleConfig {
-
-    private static String baseModuleName = "base";
-    private final Set<String> roots;
-    private final Set<String> includes;
-    private final Filter filter;
-    private List<String> members;
-    final String module;
-    final boolean isBase;
-
-    private ModuleConfig(String name) throws IOException {
-        this.roots = new TreeSet<String>();
-        this.includes = new TreeSet<String>();
-        this.module = name;
-        this.isBase = name.equals(baseModuleName);
-        this.filter = new Filter(this);
-    }
-
-    List<String> members() {
-        if (members == null) {
-            members = new LinkedList<String>();
-
-            for (String s : includes) {
-                if (!s.contains("*") && Module.findModule(s) != null) {
-                    // module member
-                    members.add(s);
-                }
-            }
-        }
-        return members;
-    }
-
-    boolean matchesRoot(String name) {
-        for (String pattern : roots) {
-            if (matches(name, pattern)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    boolean matchesIncludes(String name) {
-        for (String pattern : includes) {
-            if (matches(name, pattern)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    boolean isExcluded(String name) {
-        return filter.isExcluded(name);
-    }
-
-    boolean matchesPackage(String packageName, String pattern) {
-        int pos = pattern.lastIndexOf('.');
-        String pkg = pos > 0 ? pattern.substring(0, pos) : "<unnamed>";
-        return packageName.equals(pkg);
-    }
-
-
-    boolean matches(String name, String pattern) {
-        if (pattern.contains("**") && !pattern.endsWith("**")) {
-            throw new UnsupportedOperationException("Not yet implemented");
-        }
-
-        String javaName = name;
-
-        boolean isResourceFile = name.indexOf('/') >= 0;
-        if (isResourceFile) {
-            // it's a resource file; convert the name as a java
-            javaName = name.replace('/', '.');
-        }
-        if (pattern.indexOf('/') < 0) {
-            // if the pattern doesn't contain '/
-            return matchesJavaName(javaName, pattern);
-        } else {
-            if (isResourceFile) {
-                // the pattern is for matching resource file
-                return matchesNameWithSlash(name, pattern);
-            } else {
-                return false;
-            }
-        }
-    }
-
-    boolean matchesJavaName(String name, String pattern) {
-        int pos = name.lastIndexOf('.');
-        String packageName = pos > 0 ? name.substring(0, pos) : "<unnamed>";
-        if (pattern.endsWith("**")) {
-            String p = pattern.substring(0, pattern.length() - 2);
-            return name.startsWith(p);
-        } else if (pattern.endsWith("*") && pattern.indexOf('*') == pattern.lastIndexOf('*')) {
-            if (matchesPackage(packageName, pattern)) {
-                // package name has to be exact match
-                String p = pattern.substring(0, pattern.length() - 1);
-                return name.startsWith(p);
-            } else {
-                return false;
-            }
-        } else if (pattern.contains("*")) {
-            String basename = pos > 0 ? name.substring(pos + 1, name.length()) : name;
-            pos = pattern.indexOf('*');
-            String prefix = pattern.substring(0, pos);
-            String suffix = pattern.substring(pos + 1, pattern.length());
-            if (name.startsWith(prefix) && matchesPackage(packageName, prefix)) {
-                // package name has to be exact match
-                if (suffix.contains("*")) {
-                    return name.matches(convertToRegex(pattern));
-                } else {
-                    return basename.endsWith(suffix);
-                }
-            } else {
-                // we don't support wildcard be used in the package name
-                return false;
-            }
-        } else {
-            // exact match or inner class
-            return name.equals(pattern) || name.startsWith(pattern + "$");
-        }
-    }
-
-    boolean matchesNameWithSlash(String name, String pattern) {
-        if (pattern.endsWith("**")) {
-            String p = pattern.substring(0, pattern.length() - 2);
-            return name.startsWith(p);
-        } else if (pattern.contains("*")) {
-            int pos = pattern.indexOf('*');
-            String prefix = pattern.substring(0, pos);
-            String suffix = pattern.substring(pos + 1, pattern.length());
-            String tail = name.substring(pos, name.length());
-
-            if (!name.startsWith(prefix)) {
-                // prefix has to exact match
-                return false;
-            }
-
-            if (pattern.indexOf('*') == pattern.lastIndexOf('*')) {
-                // exact match prefix with no '/' in the tail string
-                String wildcard = tail.substring(0, tail.length() - suffix.length());
-                return tail.indexOf('/') < 0 && tail.endsWith(suffix);
-            }
-
-            if (suffix.contains("*")) {
-                return matchesNameWithSlash(tail, suffix);
-            } else {
-                // tail ends with the suffix while no '/' in the wildcard matched string
-                String any = tail.substring(0, tail.length() - suffix.length());
-                return tail.endsWith(suffix) && any.indexOf('/') < 0;
-            }
-        } else {
-            // exact match
-            return name.equals(pattern);
-        }
-    }
-
-    private String convertToRegex(String pattern) {
-        StringBuilder sb = new StringBuilder();
-        int i = 0;
-        int index = 0;
-        int plen = pattern.length();
-        while (i < plen) {
-            char p = pattern.charAt(i);
-            if (p == '*') {
-                sb.append("(").append(pattern.substring(index, i)).append(")");
-                if (i + 1 < plen && pattern.charAt(i + 1) == '*') {
-                    sb.append(".*");
-                    index = i + 2;
-                } else {
-                    sb.append("[^\\.]*");
-                    index = i + 1;
-                }
-            }
-            i++;
-        }
-        if (index < plen) {
-            sb.append("(").append(pattern.substring(index, plen)).append(")");
-        }
-        return sb.toString();
-    }
-
-    static class Filter {
-
-        final ModuleConfig config;
-        final Set<String> exclude = new TreeSet<String>();
-        final Set<String> allow = new TreeSet<String>();
-
-        Filter(ModuleConfig config) {
-            this.config = config;
-        }
-
-        Filter exclude(String pattern) {
-            exclude.add(pattern);
-            return this;
-        }
-
-        Filter allow(String pattern) {
-            allow.add(pattern);
-            return this;
-        }
-
-        String allowedBy(String name) {
-            String allowedBy = null;
-            for (String pattern : allow) {
-                if (config.matches(name, pattern)) {
-                    if (name.equals(pattern)) {
-                        return pattern;  // exact match
-                    }
-                    if (allowedBy == null) {
-                        allowedBy = pattern;
-                    } else {
-                        if (pattern.length() > allowedBy.length()) {
-                            allowedBy = pattern;
-                        }
-                    }
-                }
-            }
-            return allowedBy;
-        }
-
-        String excludedBy(String name) {
-            String allowedBy = allowedBy(name);
-            String excludedBy = null;
-
-            if (allowedBy != null && name.equals(allowedBy)) {
-                return null;  // exact match
-            }
-            for (String pattern : exclude) {
-                if (config.matches(name, pattern)) {
-                    // not matched by allowed rule or exact match
-                    if (allowedBy == null || name.equals(pattern)) {
-                        return pattern;
-                    }
-                    if (excludedBy == null) {
-                        excludedBy = pattern;
-                    } else {
-                        if (pattern.length() > excludedBy.length()) {
-                            excludedBy = pattern;
-                        }
-                    }
-                }
-            }
-            return excludedBy;
-        }
-
-        boolean isExcluded(String name) {
-            String allowedBy = allowedBy(name);
-            String excludedBy = excludedBy(name);
-
-            if (excludedBy == null) {
-                return false;
-            }
-            // not matched by allowed rule or exact match
-            if (allowedBy == null || name.equals(excludedBy)) {
-                return true;
-            }
-
-            if (allowedBy == null) {
-                return true;
-            }
-            if (allowedBy != null &&
-                    excludedBy.length() > allowedBy.length()) {
-                return true;
-            }
-            return false;
-        }
-    }
-
-    private static String trimComment(String line) {
-        StringBuilder sb = new StringBuilder();
-
-        int pos = 0;
-        while (pos >= 0 && pos < line.length()) {
-            int c1 = line.indexOf("//", pos);
-            if (c1 > 0 && !Character.isWhitespace(line.charAt(c1-1))) {
-                // not a comment
-                c1 = -1;
-            }
-
-            int c2 = line.indexOf("/*", pos);
-            if (c2 > 0 && !Character.isWhitespace(line.charAt(c2-1))) {
-                // not a comment
-                c2 = -1;
-            }
-
-            int c = line.length();
-            int n = line.length();
-            if (c1 >= 0 || c2 >= 0) {
-                if (c1 >= 0) {
-                    c = c1;
-                }
-                if (c2 >= 0 && c2 < c) {
-                    c = c2;
-                }
-                int c3 = line.indexOf("*/", c2 + 2);
-                if (c == c2 && c3 > c2) {
-                    n = c3 + 2;
-                }
-            }
-            if (c > 0) {
-                if (sb.length() > 0) {
-                    // add a whitespace if multiple comments on one line
-                    sb.append(" ");
-                }
-                sb.append(line.substring(pos, c));
-            }
-            pos = n;
-        }
-        return sb.toString();
-    }
-
-    private static boolean beginBlockComment(String line) {
-        int pos = 0;
-        while (pos >= 0 && pos < line.length()) {
-            int c = line.indexOf("/*", pos);
-            if (c < 0) {
-                return false;
-            }
-
-            if (c > 0 && !Character.isWhitespace(line.charAt(c-1))) {
-                return false;
-            }
-
-            int c1 = line.indexOf("//", pos);
-            if (c1 >= 0 && c1 < c) {
-                return false;
-            }
-
-            int c2 = line.indexOf("*/", c + 2);
-            if (c2 < 0) {
-                return true;
-            }
-            pos = c + 2;
-        }
-        return false;
-    }
-
-    static void setBaseModule(String name) {
-        baseModuleName = name;
-    }
-    // TODO: we shall remove "-" from the regex once we define
-    // the naming convention for the module names without dashes
-    static final Pattern classNamePattern = Pattern.compile("[\\w\\.\\*_$-/]+");
-
-    static List<ModuleConfig> readConfigurationFile(String file) throws IOException {
-        List<ModuleConfig> result = new ArrayList<ModuleConfig>();
-        // parse configuration file
-        FileInputStream in = new FileInputStream(file);
-        try {
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-            String line;
-
-            int lineNumber = 0;
-            boolean inRoots = false;
-            boolean inIncludes = false;
-            boolean inAllows = false;
-            boolean inExcludes = false;
-            boolean inBlockComment = false;
-            ModuleConfig config = null;
-
-            while ((line = reader.readLine()) != null) {
-                lineNumber++;
-
-                if (inBlockComment) {
-                    int c = line.indexOf("*/");
-                    if (c >= 0) {
-                        line = line.substring(c + 2, line.length());
-                        inBlockComment = false;
-                    } else {
-                        // skip lines until end of comment block
-                        continue;
-                    }
-                }
-
-                inBlockComment = beginBlockComment(line);
-
-                line = trimComment(line).trim();
-                // ignore empty lines
-                if (line.length() == 0) {
-                    continue;
-                }
-
-                String values;
-                if (inRoots || inIncludes || inExcludes || inAllows) {
-                    values = line;
-                } else {
-                    String[] s = line.split("\\s+");
-                    String keyword = s[0].trim();
-                    if (keyword.equals("module")) {
-                        if (s.length != 3 || !s[2].trim().equals("{")) {
-                            throw new RuntimeException(file + ", line " +
-                                    lineNumber + ", is malformed");
-                        }
-                        config = new ModuleConfig(s[1].trim());
-                        result.add(config);
-                        // switch to a new module; so reset the flags
-                        inRoots = false;
-                        inIncludes = false;
-                        inExcludes = false;
-                        inAllows = false;
-                        continue;
-                    } else if (keyword.equals("roots")) {
-                        inRoots = true;
-                    } else if (keyword.equals("include")) {
-                        inIncludes = true;
-                    } else if (keyword.equals("exclude")) {
-                        inExcludes = true;
-                    } else if (keyword.equals("allow")) {
-                        inAllows = true;
-                    } else if (keyword.equals("}")) {
-                        if (config == null || s.length != 1) {
-                            throw new RuntimeException(file + ", line " +
-                                    lineNumber + ", is malformed");
-                        } else {
-                            // end of a module
-                            config = null;
-                            continue;
-                        }
-                    } else {
-                        throw new RuntimeException(file + ", \"" + keyword + "\" on line " +
-                                lineNumber + ", is not recognized");
-                    }
-                    values = line.substring(keyword.length(), line.length()).trim();
-                }
-
-                if (config == null) {
-                    throw new RuntimeException(file + ", module not specified");
-                }
-
-                int len = values.length();
-                if (len == 0) {
-                    continue;
-                }
-                char lastchar = values.charAt(len - 1);
-                if (lastchar != ',' && lastchar != ';') {
-                    throw new RuntimeException(file + ", line " +
-                            lineNumber + ", is malformed:" +
-                            " ',' or ';' is missing.");
-                }
-
-                values = values.substring(0, len - 1);
-                // parse the values specified for a keyword specified
-                for (String s : values.split(",")) {
-                    s = s.trim();
-                    if (s.length() > 0) {
-                        if (!classNamePattern.matcher(s).matches()) {
-                            throw new RuntimeException(file + ", line " +
-                                    lineNumber + ", is malformed: \"" + s + "\"");
-                        }
-                        if (inRoots) {
-                            config.roots.add(s);
-                        } else if (inIncludes) {
-                            config.includes.add(s);
-                        } else if (inExcludes) {
-                            config.filter.exclude(s);
-                        } else if (inAllows) {
-                            config.filter.allow(s);
-                        }
-
-                    }
-                }
-                if (lastchar == ';') {
-                    inRoots = false;
-                    inIncludes = false;
-                    inExcludes = false;
-                    inAllows = false;
-                }
-            }
-
-            if (inBlockComment) {
-                throw new RuntimeException(file + ", line " +
-                        lineNumber + ", missing \"*/\" to end a block comment");
-            }
-            if (config != null) {
-                throw new RuntimeException(file + ", line " +
-                        lineNumber + ", missing \"}\" to end module definition" +
-                        " for \"" + config.module + "\"");
-            }
-
-        } finally {
-            in.close();
-        }
-
-        return result;
-    }
-
-    private String format(String keyword, Collection<String> values) {
-        if (values.size() == 0) {
-            return "";
-        }
-
-        StringBuilder sb = new StringBuilder();
-        String format = "%4s%-9s";
-        String spaces = String.format(format, "", "");
-        sb.append(String.format(format, "", keyword));
-        int count = 0;
-        for (String s : values) {
-            if (count > 0) {
-                sb.append(",\n").append(spaces);
-            } else if (count++ > 0) {
-                sb.append(", ");
-            }
-            sb.append(s);
-        }
-        if (count > 0) {
-            sb.append(";\n");
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("module " + module).append(" {\n");
-        sb.append(format("include", includes));
-        sb.append(format("root", roots));
-        sb.append(format("allow", filter.allow));
-        sb.append(format("exclude", filter.exclude));
-        sb.append("}\n");
-        return sb.toString();
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ResolutionInfo.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-package com.sun.classanalyzer;
-
-import com.sun.classanalyzer.Klass.Method;
-
-/**
- *
- * @author mchung
- */
-public class ResolutionInfo implements Comparable<ResolutionInfo> {
-
-    enum Type {
-
-        REFLECTION("reflection", true),
-        NATIVE("native", true),
-        INTERFACE("interface", false),
-        SUPER("super", false),
-        EXPLICIT("explicit", false),
-        VERIFICATION("verification", false),
-        METHODTRACE("method trace", true),
-        CONSTANT_POOL("constant pool", true),
-        CHECKED_EXCEPTION("throws", true),
-        METHOD("method", true),
-        FIELD("field", true),
-        EXTENDS("extends", true),
-        IMPLEMENTS("implements", true),
-        NOINFO("No info", false);
-
-        private final String name;
-        private final boolean hasInfo;
-
-        private Type(String name, boolean hasInfo) {
-            this.name = name;
-            this.hasInfo = hasInfo;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public boolean hasInfo() {
-            return hasInfo;
-        }
-
-        public static Type getType(String s) {
-            if (s.isEmpty()) {
-                return NOINFO;
-            }
-            for (Type t : values()) {
-                if (s.equals(t.name)) {
-                    return t;
-                }
-            }
-            // Need to fix the VM output to add "native"
-            // throw new IllegalArgumentException("Invalid ResolutionInfo.type \"" + s + "\"");
-            System.out.println("WARNING: Invalid ResolutionInfo.type \"" + s + "\"");
-            return null;
-        }
-    }
-    final Klass fromClass;
-    final Method method;
-    final Klass toClass;
-    final int linenumber;
-    final Type type;
-    final String info;
-    private boolean isPublic = false;
-
-    private ResolutionInfo(Klass from, Klass to, int linenumber, Type type, String info) {
-        this.fromClass = from;
-        this.method = null;
-        this.toClass = to;
-        this.linenumber = linenumber;
-        this.type = type;
-        this.info = info;
-    }
-
-    private ResolutionInfo(Klass from, Method m, Klass to, int linenumber, Type type) {
-        this.fromClass = from;
-        this.method = m;
-        this.toClass = to;
-        this.linenumber = linenumber;
-        this.type = type;
-        this.info = m.toString();
-    }
-
-    public boolean isPublic() {
-        return isPublic;
-    }
-
-    public void setPublicAccess(boolean value) {
-        isPublic = value;
-    }
-    static ResolutionInfo resolved(Klass from, Klass to) {
-        return new ResolutionInfo(from, to, 0, Type.NOINFO, "");
-    }
-
-    static ResolutionInfo resolved(Klass from, Klass to, int linenumber) {
-        return new ResolutionInfo(from, to, linenumber, Type.NOINFO, "");
-    }
-
-    static ResolutionInfo resolved(Klass from, Klass to, int linenumber, String reason) {
-        String[] ss = reason.split("\\s+");
-        Type type;
-        String info;
-        if (linenumber == -1) {
-            type = Type.NATIVE;
-            info = ss[0];  // native method name
-        } else {
-            info = ss.length == 2 ? ss[1] : "";
-            type = Type.getType(ss[0]);
-            if (type == null) {
-                if (reason.isEmpty()) {
-                    throw new IllegalArgumentException("Invalid type: " + reason + " (" + ss[0] + ")" + ss.length);
-                }
-                // assume it's native
-                type = Type.NATIVE;
-                info = reason.isEmpty() ? ss[0] : reason;
-            }
-        }
-
-        return new ResolutionInfo(from, to, linenumber, type, info);
-    }
-
-    static ResolutionInfo resolved(Klass from, Klass to, Method callee) {
-        return new ResolutionInfo(from, callee, to, 0, Type.METHODTRACE);
-    }
-
-    static ResolutionInfo resolvedConstantPool(Klass from, Klass to, int index) {
-        return new ResolutionInfo(from, to, 0, Type.CONSTANT_POOL, "#" + index);
-    }
-
-    static ResolutionInfo resolvedField(Klass from, Klass to, String fieldname) {
-        return new ResolutionInfo(from, to, 0, Type.FIELD, fieldname);
-    }
-
-    static ResolutionInfo resolvedMethodSignature(Klass from, Klass to, Method m) {
-        return new ResolutionInfo(from, m, to, 0, Type.METHOD);
-    }
-
-    static ResolutionInfo resolvedCheckedException(Klass from, Klass to, Method m) {
-        return new ResolutionInfo(from, m, to, 0, Type.CHECKED_EXCEPTION);
-    }
-
-    static ResolutionInfo resolvedExtends(Klass from, Klass to) {
-        String info = from.getClassName() + " implements " + to.getClassName();
-        return new ResolutionInfo(from, to, 0, Type.EXTENDS, info);
-    }
-
-    static ResolutionInfo resolvedImplements(Klass from, Klass to) {
-        String info = from.getClassName() + " implements " + to.getClassName();
-        return new ResolutionInfo(from, to, 0, Type.IMPLEMENTS, info);
-    }
-
-    @Override
-    public int compareTo(ResolutionInfo ri) {
-        if (this.fromClass == ri.fromClass &&
-                this.toClass == ri.toClass &&
-                this.linenumber == ri.linenumber &&
-                this.type == ri.type &&
-                this.info.equals(ri.info)) {
-            return 0;
-        } else if (this.fromClass == ri.fromClass) {
-            if (this.linenumber > ri.linenumber) {
-                return 1;
-            } else if (this.linenumber < ri.linenumber) {
-                return -1;
-            } else if (this.type != ri.type) {
-                return this.type.getName().compareTo(ri.type.getName());
-            } else if (this.toClass != ri.toClass) {
-                return this.toClass.compareTo(ri.toClass);
-            } else {
-                return this.info.compareTo(ri.info);
-            }
-        } else {
-            return this.fromClass.compareTo(ri.fromClass);
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ResourceFile.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-package com.sun.classanalyzer;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- *
- * @author Mandy Chung
- */
-public class ResourceFile implements Comparable<ResourceFile> {
-
-    private final String pathname;
-    private Module module;
-
-    ResourceFile(String pathname) {
-        this.pathname = pathname.replace(File.separatorChar, '/');
-    }
-
-    Module getModule() {
-        return module;
-    }
-
-    void setModule(Module m) {
-        if (module != null) {
-            throw new RuntimeException("Module for " + this + " already set");
-        }
-        this.module = m;
-    }
-
-    String getName() {
-        return pathname;
-    }
-
-    String getPathname() {
-        return pathname;
-    }
-
-    @Override
-    public String toString() {
-        return pathname;
-    }
-
-    @Override
-    public int compareTo(ResourceFile o) {
-        return pathname.compareTo(o.pathname);
-    }
-    static Set<ResourceFile> resources = new TreeSet<ResourceFile>();
-
-    static boolean isResource(String pathname) {
-        String name = pathname.replace(File.separatorChar, '/');
-
-        if (name.endsWith("META-INF/MANIFEST.MF")) {
-            return false;
-        }
-        if (name.contains("META-INF/JCE_RSA.")) {
-            return false;
-        }
-
-        return true;
-    }
-
-    static void addResource(String name, InputStream in) {
-        ResourceFile res;
-        name = name.replace(File.separatorChar, '/');
-        if (name.startsWith("META-INF/services")) {
-            res = new ServiceProviderConfigFile(name, in);
-        } else {
-            res = new ResourceFile(name);
-        }
-        resources.add(res);
-    }
-
-    static Set<ResourceFile> getAllResources() {
-        return Collections.unmodifiableSet(resources);
-    }
-
-    static class ServiceProviderConfigFile extends ResourceFile {
-
-        private final List<String> providers = new ArrayList<String>();
-        private final String service;
-        ServiceProviderConfigFile(String pathname, InputStream in) {
-            super(pathname);
-            readServiceConfiguration(in, providers);
-            this.service = pathname.substring("META-INF/services".length() + 1, pathname.length());
-        }
-
-        @Override
-        String getName() {
-            if (providers.isEmpty()) {
-                return service;
-            } else {
-                // just use the first one for matching
-                return providers.get(0);
-            }
-        }
-
-        @SuppressWarnings("empty-statement")
-        void readServiceConfiguration(InputStream in, List<String> names) {
-            BufferedReader br = null;
-            try {
-                if (in != null) {
-                    // Properties doesn't perserve the order of the input file
-                    br = new BufferedReader(new InputStreamReader(in, "utf-8"));
-                    int lc = 1;
-                    while ((lc = parseLine(br, lc, names)) >= 0);
-                }
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (IOException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                }
-            }
-        }
-
-        // Parse a single line from the given configuration file, adding the name
-        // on the line to the names list.
-        //
-        private int parseLine(BufferedReader r, int lc, List<String> names) throws IOException {
-            String ln = r.readLine();
-            if (ln == null) {
-                return -1;
-            }
-            int ci = ln.indexOf('#');
-            if (ci >= 0) {
-                ln = ln.substring(0, ci);
-            }
-            ln = ln.trim();
-            int n = ln.length();
-            if (n != 0) {
-                if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0)) {
-                    throw new RuntimeException("Illegal configuration-file syntax");
-                }
-                int cp = ln.codePointAt(0);
-                if (!Character.isJavaIdentifierStart(cp)) {
-                    throw new RuntimeException("Illegal provider-class name: " + ln);
-                }
-                for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) {
-                    cp = ln.codePointAt(i);
-                    if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) {
-                        throw new RuntimeException("Illegal provider-class name: " + ln);
-                    }
-                }
-                if (!names.contains(ln)) {
-                    names.add(ln);
-                }
-            }
-            return lc + 1;
-        }
-    }
-}
--- a/jdk/make/modules/tools/src/com/sun/classanalyzer/ShowDeps.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.classanalyzer;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * A simple tool to print out the static dependencies for a given set of JAR,
- * class files, or combinations of. The tools supports an -ignore option to
- * ignore references to classes listed in the file (including .classlists
- * created by the ClassAnalyzer tool).
- */
-
-public class ShowDeps {
-
-    static void usage() {
-        System.out.println("java ShowDeps [-ignore <classlist>] file...");
-        System.out.println("   where <file> is a class or JAR file, or a directory");
-        System.out.println();
-        System.out.println("Example usages:");
-        System.out.println("  java ShowDeps Foo.jar");
-        System.out.println("  java ShowDeps -ignore base.classlist Foo.jar");
-        System.out.println("  java ShowDeps -ignore base.classlist -ignore " +
-            "jaxp-parsers.classlist <dir>");
-        System.exit(-1);
-    }
-
-    public static void main(String[] args) throws IOException {
-        // process -ignore options
-        int argi = 0;
-        Set<String> ignore = new HashSet<String>();
-        while (argi < args.length && args[argi].equals("-ignore")) {
-            argi++;
-            Scanner s = new Scanner(new File(args[argi++]));
-            try {
-                while (s.hasNextLine()) {
-                    String line = s.nextLine();
-                    if (!line.endsWith(".class"))
-                        continue;
-                    int len = line.length();
-                    // convert to class names
-                    String clazz = line.replace('\\', '.').replace('/', '.')
-                        .substring(0, len-6);
-                    ignore.add(clazz);
-                }
-            } finally {
-                s.close();
-            }
-        }
-
-        if (argi >= args.length)
-            usage();
-
-        // parse all classes
-        while (argi < args.length)
-            ClassPath.setClassPath(args[argi++]);
-        ClassPath.parseAllClassFiles();
-
-        // find the classes that don't exist
-        Set<Klass> unresolved = new TreeSet<Klass>();
-        for (Klass k : Klass.getAllClasses()) {
-            if (k.getFileSize() == 0)
-                unresolved.add(k);
-        }
-
-        // print references to classes that don't exist
-        for (Klass k: Klass.getAllClasses()) {
-            for (Klass other : k.getReferencedClasses()) {
-                if (unresolved.contains(other)) {
-                    String name = other.toString();
-                    if (!ignore.contains(name)) {
-                        System.out.format("%s -> %s\n", k, other);
-                    }
-                }
-            }
-        }
-    }
-}
--- a/jdk/make/sun/applet/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/applet/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = applet
 PACKAGE = sun.applet
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/awt/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/awt/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = awt
 PACKAGE = sun.awt
 LIBRARY = awt
 PRODUCT = sun
@@ -368,7 +367,7 @@
 FONTCONFIGS_SRC	= $(CLOSED_SRC)/solaris/classes/sun/awt/fontconfigs
 _FONTCONFIGS	= \
 	fontconfig.properties				\
-	fontconfig.RedHat.properties			\
+	fontconfig.RedHat.5.5.properties		\
 	fontconfig.Turbo.properties			\
 	fontconfig.SuSE.10.properties                   \
 	fontconfig.SuSE.11.properties
@@ -405,7 +404,6 @@
     $(COMPILEFONTCONFIG_JARFILE)
 	$(prep-target)
 	$(BOOT_JAVA_CMD) -jar $(COMPILEFONTCONFIG_JARFILE) $(COMPILEFONTCONFIG_FLAGS) $< $@
-	$(install-module-file)
 	$(call chmod-file, 444)
 	@$(java-vm-cleanup)
 
--- a/jdk/make/sun/awt/mapfile-mawt-vers	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/awt/mapfile-mawt-vers	Fri Mar 18 15:44:45 2011 -0700
@@ -424,6 +424,7 @@
 		Java_sun_java2d_xr_XRSurfaceData_initXRPicture;
 		Java_sun_java2d_xr_XRSurfaceData_initIDs;
 		Java_sun_java2d_xr_XRSurfaceData_XRInitSurface;
+		Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture;
 		Java_sun_java2d_xr_XRBackendNative_initIDs;
 		Java_sun_java2d_xr_XIDGenerator_bufferXIDs;
 		Java_sun_java2d_xr_XRBackendNative_freeGC;
--- a/jdk/make/sun/cmm/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/cmm/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE   = java2d
 PRODUCT  = sun
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/sun/cmm/kcms/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/cmm/kcms/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = java2d
 PACKAGE = sun.java2d.cmm.kcms
 LIBRARY = kcms
 PRODUCT = sun
--- a/jdk/make/sun/cmm/lcms/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/cmm/lcms/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = java2d
 PACKAGE = sun.java2d.cmm.lcms
 LIBRARY = lcms
 PRODUCT = sun
--- a/jdk/make/sun/dcpr/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/dcpr/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = java2d
 PACKAGE = sun.dc
 LIBRARY = dcpr
 PRODUCT = sun
--- a/jdk/make/sun/font/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/font/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = font
 PACKAGE = sun.font
 LIBRARY = fontmanager
 PRODUCT = sun
@@ -136,7 +135,6 @@
 
 $(FREETYPE_LIB):
 	$(CP) $(FREETYPE_LIB_PATH)/$(LIB_PREFIX)freetype.$(LIBRARY_SUFFIX) $@
-	$(install-module-file)
 endif
 
 #ifeq ($(PLATFORM), solaris)
--- a/jdk/make/sun/font/t2k/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/font/t2k/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = font
 PACKAGE = sun.font
 LIBRARY = t2k
 PRODUCT = sun
--- a/jdk/make/sun/headless/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/headless/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -30,7 +30,6 @@
 MOTIF_VERSION_STRING=none
 LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/headless
 
-MODULE  = awt
 PACKAGE = sun.awt
 LIBRARY = mawt
 LIBRARY_OUTPUT = headless
--- a/jdk/make/sun/image/generic/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/image/generic/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = media
 PACKAGE = sun.awt.medialib
 LIBRARY = mlib_image
 PRODUCT = sun
--- a/jdk/make/sun/image/vis/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/image/vis/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,6 @@
 # Makefile for building the VIS (solaris-only) version of medialib
 #
 BUILDDIR = ../../..
-MODULE  = media
 PACKAGE = sun.awt.medialib
 LIBRARY = mlib_image_v
 PRODUCT = sun
--- a/jdk/make/sun/jar/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jar/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jar-tool
 PACKAGE = sun.tools
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/javazic/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/javazic/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,6 @@
 
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = sun.javazic
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
@@ -70,7 +69,6 @@
 	$(RM) -r $(@D)
 	$(prep-target)
 	$(CP) -r $(WORKDIR)/* $(@D)
-	$(install-module-dir)
 
 clean clobber::
 	$(RM) -r $(TEMPDIR) $(INSTALLDIR)
--- a/jdk/make/sun/jawt/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jawt/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = awt
 PACKAGE = sun.awt
 LIBRARY = jawt
 PRODUCT = sun
--- a/jdk/make/sun/jconsole/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jconsole/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jconsole
 PACKAGE = sun.tools.jconsole
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/jdbc/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jdbc/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -33,7 +33,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = jdbc-odbc
 PACKAGE = sun.jdbc.odbc
 LIBRARY = JdbcOdbc
 PRODUCT = sun
--- a/jdk/make/sun/jdga/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jdga/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -25,7 +25,6 @@
 
 
 BUILDDIR = ../..
-MODULE  = java2d
 PACKAGE = sun.jdga
 LIBRARY = sunwjdga
 PRODUCT = sun
--- a/jdk/make/sun/jpeg/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/jpeg/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = java2d
 PACKAGE = sun.awt
 LIBRARY = jpeg
 PRODUCT = sun
--- a/jdk/make/sun/launcher/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/launcher/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = base
 PACKAGE = sun.launcher
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/management/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/management/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE   = management
 
 include $(BUILDDIR)/common/Defs.gmk
 
--- a/jdk/make/sun/native2ascii/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/native2ascii/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = tools
 PACKAGE = sun.tools.native2ascii
 PRODUCT = sun
 OTHER_JAVACFLAGS += -Xlint:serial -Werror
--- a/jdk/make/sun/net/others/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/net/others/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = base
 PACKAGE = sun.net
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/net/spi/nameservice/dns/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/net/spi/nameservice/dns/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -30,7 +30,6 @@
 BUILDDIR = ../../../../..
 
 # dns should probably be its own module
-MODULE  = net-dns
 PACKAGE = sun.net.spi.nameservice.dns
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/nio/cs/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/nio/cs/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -30,7 +30,6 @@
 BUILDDIR = ../../..
 
 # charsets should be separated from nio module 
-MODULE  = charsets
 PACKAGE = sun.nio
 PRODUCT = sun
 
--- a/jdk/make/sun/org/mozilla/javascript/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/org/mozilla/javascript/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = scripting-rhino
 PACKAGE = sun.org.mozilla.javascript.internal
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/pisces/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/pisces/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = java2d
 PACKAGE = sun.pisces
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/rmi/cgi/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/cgi/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../../..
 # java-rmi.cgi is a JDK tool
-MODULE  = tools
 PACKAGE = sun.rmi
 PRODUCT = sun
 PROGRAM = java-rmi
--- a/jdk/make/sun/rmi/oldtools/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/oldtools/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE   = oldjavac
 PRODUCT	 = oldjavac
 
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/rmi/registry/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/registry/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = rmi
 PACKAGE = sun.rmi.registry
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/rmi/rmi/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/rmi/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = rmi
 PACKAGE = sun.rmi
 PRODUCT = sun
 LIBRARY = rmi
--- a/jdk/make/sun/rmi/rmic/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/rmic/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = rmic
 PACKAGE = sun.rmi.rmic
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/rmi/rmid/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/rmi/rmid/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = rmi-activation
 PACKAGE = sun.rmi.activation
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/security/ec/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/ec/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -89,7 +89,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-sunec
 PACKAGE = sun.security.ec
 PRODUCT = sun
 
@@ -309,7 +308,7 @@
 else
 $(JAR_DESTFILE): $(SIGNED_DIR)/sunec.jar
 endif
-	$(install-non-module-file)
+	$(install-file)
 
 ifndef OPENJDK
 install-prebuilt:
--- a/jdk/make/sun/security/jgss/wrapper/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/jgss/wrapper/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../../..
-MODULE  = security-kerberos
 PACKAGE = sun.security.jgss.wrapper
 PRODUCT = sun
 
--- a/jdk/make/sun/security/krb5/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/krb5/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-kerberos
 PACKAGE = sun.security.krb5
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/security/mscapi/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/mscapi/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -89,7 +89,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-sunmscapi
 PACKAGE = sun.security.mscapi
 LIBRARY = sunmscapi
 PRODUCT = sun
@@ -273,7 +272,7 @@
 else
 $(JAR_DESTFILE): $(SIGNED_DIR)/sunmscapi.jar
 endif
-	$(install-non-module-file)
+	$(install-file)
 
 ifndef OPENJDK
 install-prebuilt:
--- a/jdk/make/sun/security/pkcs11/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/pkcs11/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -89,7 +89,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-sunpkcs11
 PACKAGE = sun.security.pkcs11
 LIBRARY = j2pkcs11
 PRODUCT = sun
@@ -288,7 +287,7 @@
 else
 $(JAR_DESTFILE): $(SIGNED_DIR)/sunpkcs11.jar
 endif
-	$(install-non-module-file)
+	$(install-file)
 
 ifndef OPENJDK
 install-prebuilt:
--- a/jdk/make/sun/security/smartcardio/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/smartcardio/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-smartcardio
 PACKAGE = sun.security.smartcardio
 LIBRARY = j2pcsc
 PRODUCT = sun
--- a/jdk/make/sun/security/tools/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/security/tools/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../../..
-MODULE  = security-tools
 PACKAGE = sun.security.tools
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/serialver/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/serialver/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = serialver
 PACKAGE = sun.tools.serialver
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/splashscreen/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/splashscreen/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = awt
 PACKAGE = sun.awt
 LIBRARY = splashscreen
 PRODUCT = sun
--- a/jdk/make/sun/text/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/text/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -29,7 +29,6 @@
 
 BUILDDIR = ../..
 
-MODULE  = localedata
 PACKAGE = sun.text
 PRODUCT = sun
 
--- a/jdk/make/sun/tools/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/tools/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -28,7 +28,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = tools
 PACKAGE = sun.tools
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
--- a/jdk/make/sun/tracing/dtrace/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/tracing/dtrace/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,6 @@
 # Makefile for building dtrace extension
 #
 BUILDDIR = ../../..
-MODULE  = tracing
 PACKAGE = sun.tracing.dtrace
 LIBRARY = jsdt
 PRODUCT = sun
--- a/jdk/make/sun/xawt/Makefile	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/xawt/Makefile	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,6 @@
 #
 
 BUILDDIR = ../..
-MODULE  = awt
 PACKAGE = sun.awt.X11
 LIBRARY = mawt
 LIBRARY_OUTPUT = xawt
--- a/jdk/make/sun/xawt/mapfile-vers	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/sun/xawt/mapfile-vers	Fri Mar 18 15:44:45 2011 -0700
@@ -374,6 +374,7 @@
         Java_sun_java2d_xr_XRSurfaceData_initXRPicture;
         Java_sun_java2d_xr_XRSurfaceData_initIDs;
         Java_sun_java2d_xr_XRSurfaceData_XRInitSurface;
+	Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture;
 	Java_sun_java2d_xr_XRBackendNative_initIDs;
 	Java_sun_java2d_xr_XRBackendNative_freeGC;
 	Java_sun_java2d_xr_XRBackendNative_createGC;
--- a/jdk/make/tools/manifest.mf	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/make/tools/manifest.mf	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Specification-Title: Java Platform API Specification
-Specification-Version: 1.6
+Specification-Version: 1.7
 Specification-Vendor: Oracle
 Implementation-Title: Java Runtime Environment
 Implementation-Version: @@RELEASE@@
--- a/jdk/src/share/classes/com/sun/jarsigner/ContentSignerParameters.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/jarsigner/ContentSignerParameters.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -26,9 +26,7 @@
 package com.sun.jarsigner;
 
 import java.net.URI;
-import java.security.cert.X509CRL;
 import java.security.cert.X509Certificate;
-import java.util.Set;
 import java.util.zip.ZipFile;
 
 /**
@@ -83,13 +81,6 @@
     public X509Certificate[] getSignerCertificateChain();
 
     /**
-     * Retrieves the signer's X.509 CRLs.
-     *
-     * @return An unmodifiable set of X.509 CRLs (never <code>null</code>)
-     */
-    public Set<X509CRL> getCRLs();
-
-    /**
      * Retrieves the content that was signed.
      * The content is the JAR file's signature file.
      *
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, 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
@@ -1011,7 +1011,7 @@
         return -1;
     }
 
-    Comparator<Entry> entryOutputOrder = new Comparator<>() {
+    Comparator<Entry> entryOutputOrder = new Comparator<Entry>() {
         public int compare(Entry  e0, Entry e1) {
             int k0 = getOutputIndex(e0);
             int k1 = getOutputIndex(e1);
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, 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
@@ -785,7 +785,7 @@
             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<Object>() {
                 public int compare(Object o0, Object o1) {
                     Map.Entry e0 = (Map.Entry) o0;
                     Map.Entry e1 = (Map.Entry) o1;
--- a/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -380,13 +380,19 @@
     }
 
     LdapRequest writeRequest(BerEncoder ber, int msgId) throws IOException {
-        return writeRequest(ber, msgId, false /* pauseAfterReceipt */);
+        return writeRequest(ber, msgId, false /* pauseAfterReceipt */, -1);
     }
 
-    LdapRequest writeRequest(BerEncoder ber, int msgId, boolean pauseAfterReceipt)
-        throws IOException {
+    LdapRequest writeRequest(BerEncoder ber, int msgId,
+        boolean pauseAfterReceipt) throws IOException {
+        return writeRequest(ber, msgId, pauseAfterReceipt, -1);
+    }
 
-        LdapRequest req = new LdapRequest(msgId, pauseAfterReceipt);
+    LdapRequest writeRequest(BerEncoder ber, int msgId,
+        boolean pauseAfterReceipt, int replyQueueCapacity) throws IOException {
+
+        LdapRequest req =
+            new LdapRequest(msgId, pauseAfterReceipt, replyQueueCapacity);
         addRequest(req);
 
         if (traceFile != null) {
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -516,7 +516,8 @@
     LdapResult search(String dn, int scope, int deref, int sizeLimit,
                       int timeLimit, boolean attrsOnly, String attrs[],
                       String filter, int batchSize, Control[] reqCtls,
-                      Hashtable binaryAttrs, boolean waitFirstReply)
+                      Hashtable binaryAttrs, boolean waitFirstReply,
+                      int replyQueueCapacity)
         throws IOException, NamingException {
 
         ensureOpen();
@@ -543,7 +544,8 @@
                 if (isLdapv3) encodeControls(ber, reqCtls);
             ber.endSeq();
 
-         LdapRequest req = conn.writeRequest(ber, curMsgId);
+         LdapRequest req =
+                conn.writeRequest(ber, curMsgId, false, replyQueueCapacity);
 
          res.msgId = curMsgId;
          res.status = LdapClient.LDAP_SUCCESS; //optimistic
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -191,6 +191,14 @@
     // Environment property for the domain name (derived from this context's DN)
     private static final String DOMAIN_NAME = "com.sun.jndi.ldap.domainname";
 
+    // Block until the first search reply is received
+    private static final String WAIT_FOR_REPLY =
+        "com.sun.jndi.ldap.search.waitForReply";
+
+    // Size of the queue of unprocessed search replies
+    private static final String REPLY_QUEUE_SIZE =
+        "com.sun.jndi.ldap.search.replyQueueSize";
+
     // ----------------- Fields that don't change -----------------------
     private static final NameParser parser = new LdapNameParser();
 
@@ -246,6 +254,8 @@
     private Hashtable binaryAttrs = null;    // attr values returned as byte[]
     private int connectTimeout = -1;         // no timeout value
     private int readTimeout = -1;            // no timeout value
+    private boolean waitForReply = true;     // wait for search response
+    private int replyQueueSize  = -1;        // unlimited queue size
     private boolean useSsl = false;          // true if SSL protocol is active
     private boolean useDefaultPortNumber = false; // no port number was supplied
 
@@ -1759,8 +1769,8 @@
                                          SearchControls cons,
                                          Continuation cont)
             throws NamingException {
-        return searchAux(name, filter, cloneSearchControls(cons), true, true,
-                         cont);
+        return searchAux(name, filter, cloneSearchControls(cons), true,
+                 waitForReply, cont);
     }
 
     protected NamingEnumeration c_search(Name name,
@@ -1928,7 +1938,7 @@
     }
 
     private LdapResult doSearch(Name name, String filter, SearchControls cons,
-        boolean relative, boolean waitFirstReply) throws NamingException {
+        boolean relative, boolean waitForReply) throws NamingException {
             ensureOpen();
             try {
                 int scope;
@@ -1984,7 +1994,8 @@
                         batchSize,
                         reqCtls,
                         binaryAttrs,
-                        waitFirstReply);
+                        waitForReply,
+                        replyQueueSize);
                 respCtls = answer.resControls; // retrieve response controls
                 return answer;
 
@@ -2170,6 +2181,10 @@
             connectTimeout = -1;
         } else if (propName.equals(READ_TIMEOUT)) {
             readTimeout = -1;
+        } else if (propName.equals(WAIT_FOR_REPLY)) {
+            waitForReply = true;
+        } else if (propName.equals(REPLY_QUEUE_SIZE)) {
+            replyQueueSize = -1;
 
 // The following properties affect the connection
 
@@ -2225,6 +2240,11 @@
                 setConnectTimeout((String)propVal);
             } else if (propName.equals(READ_TIMEOUT)) {
                 setReadTimeout((String)propVal);
+            } else if (propName.equals(WAIT_FOR_REPLY)) {
+                setWaitForReply((String)propVal);
+            } else if (propName.equals(REPLY_QUEUE_SIZE)) {
+                setReplyQueueSize((String)propVal);
+
 // The following properties affect the connection
 
             } else if (propName.equals(Context.SECURITY_PROTOCOL)) {
@@ -2312,6 +2332,13 @@
         // Set the read timeout
         setReadTimeout((String)envprops.get(READ_TIMEOUT));
 
+        // Set the flag that controls whether to block until the first reply
+        // is received
+        setWaitForReply((String)envprops.get(WAIT_FOR_REPLY));
+
+        // Set the size of the queue of unprocessed search replies
+        setReplyQueueSize((String)envprops.get(REPLY_QUEUE_SIZE));
+
         // When connection is created, it will use these and other
         // properties from the environment
     }
@@ -2442,6 +2469,34 @@
     }
 
     /**
+     * Sets the size of the queue of unprocessed search replies
+     */
+    private void setReplyQueueSize(String replyQueueSizeProp) {
+        if (replyQueueSizeProp != null) {
+           replyQueueSize = Integer.parseInt(replyQueueSizeProp);
+            // disallow an empty queue
+            if (replyQueueSize <= 0) {
+                replyQueueSize = -1;    // unlimited
+            }
+        } else {
+            replyQueueSize = -1;        // unlimited
+        }
+    }
+
+    /**
+     * Sets the flag that controls whether to block until the first search
+     * reply is received
+     */
+    private void setWaitForReply(String waitForReplyProp) {
+        if (waitForReplyProp != null &&
+            (waitForReplyProp.equalsIgnoreCase("false"))) {
+            waitForReply = false;
+        } else {
+            waitForReply = true;
+        }
+    }
+
+    /**
      * Sets the read timeout value
      */
     private void setReadTimeout(String readTimeoutProp) {
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapRequest.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapRequest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -26,7 +26,8 @@
 package com.sun.jndi.ldap;
 
 import java.io.IOException;
-import java.util.Vector;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 import javax.naming.CommunicationException;
 
 final class LdapRequest {
@@ -35,14 +36,26 @@
     int msgId;          // read-only
 
     private int gotten = 0;
-    private Vector replies = new Vector(3);
+    private BlockingQueue<BerDecoder> replies;
+    private int highWatermark = -1;
     private boolean cancelled = false;
     private boolean pauseAfterReceipt = false;
     private boolean completed = false;
 
     LdapRequest(int msgId, boolean pause) {
+        this(msgId, pause, -1);
+    }
+
+    LdapRequest(int msgId, boolean pause, int replyQueueCapacity) {
         this.msgId = msgId;
         this.pauseAfterReceipt = pause;
+        if (replyQueueCapacity == -1) {
+            this.replies = new LinkedBlockingQueue<BerDecoder>();
+        } else {
+            this.replies =
+                new LinkedBlockingQueue<BerDecoder>(replyQueueCapacity);
+            highWatermark = (replyQueueCapacity * 80) / 100; // 80% capacity
+        }
     }
 
     synchronized void cancel() {
@@ -57,7 +70,13 @@
         if (cancelled) {
             return false;
         }
-        replies.addElement(ber);
+
+        // Add a new reply to the queue of unprocessed replies.
+        try {
+            replies.put(ber);
+        } catch (InterruptedException e) {
+            // ignore
+        }
 
         // peek at the BER buffer to check if it is a SearchResultDone PDU
         try {
@@ -70,6 +89,14 @@
         ber.reset();
 
         notify(); // notify anyone waiting for reply
+        /*
+         * If a queue capacity has been set then trigger a pause when the
+         * queue has filled to 80% capacity. Later, when the queue has drained
+         * then the reader gets unpaused.
+         */
+        if (highWatermark != -1 && replies.size() >= highWatermark) {
+            return true; // trigger the pause
+        }
         return pauseAfterReceipt;
     }
 
@@ -79,14 +106,12 @@
                 " cancelled");
         }
 
-        if (gotten < replies.size()) {
-            BerDecoder answer = (BerDecoder)replies.elementAt(gotten);
-            replies.setElementAt(null, gotten); // remove reference
-            ++gotten; // skip to next
-            return answer;
-        } else {
-            return null;
-        }
+        /*
+         * Remove a reply if the queue is not empty.
+         * poll returns null if queue is empty.
+         */
+        BerDecoder reply = replies.poll();
+        return reply;
     }
 
     synchronized boolean hasSearchCompleted() {
--- a/jdk/src/share/classes/com/sun/media/sound/AiffFileWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/AiffFileWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -25,12 +25,10 @@
 
 package com.sun.media.sound;
 
-import java.util.Vector;
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
-import java.io.DataInputStream;
 
 import java.io.BufferedOutputStream;
 import java.io.DataOutputStream;
@@ -398,7 +396,8 @@
         header = baos.toByteArray();
         headerStream = new ByteArrayInputStream( header );
 
-        aiffStream = new SequenceInputStream(headerStream,codedAudioStream);
+        aiffStream = new SequenceInputStream(headerStream,
+                            new NoCloseInputStream(codedAudioStream));
 
         return aiffStream;
 
--- a/jdk/src/share/classes/com/sun/media/sound/AlawCodec.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/AlawCodec.java	Fri Mar 18 15:44:45 2011 -0700
@@ -52,9 +52,6 @@
     private static final short seg_end [] = {0xFF, 0x1FF, 0x3FF,
                                              0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
 
-    private static final int tempBufferSize = 64;
-    private byte tempBuffer [] = null;
-
     /**
      * Initializes the decode tables
      */
@@ -199,12 +196,9 @@
         AudioFormat inputFormat = stream.getFormat();
 
         if( inputFormat.matches(outputFormat) ) {
-
             cs = stream;
         } else {
-
             cs = (AudioInputStream) (new AlawCodecStream(stream, outputFormat));
-            tempBuffer = new byte[tempBufferSize];
         }
 
         return cs;
@@ -264,6 +258,10 @@
 
     class AlawCodecStream extends AudioInputStream {
 
+        // tempBuffer required only for encoding (when encode is true)
+        private static final int tempBufferSize = 64;
+        private byte tempBuffer [] = null;
+
         /**
          * True to encode to a-law, false to decode to linear
          */
@@ -303,6 +301,7 @@
                 encodeFormat = outputFormat;
                 decodeFormat = inputFormat;
                 PCMIsBigEndian = inputFormat.isBigEndian();
+                tempBuffer = new byte[tempBufferSize];
             }
 
             if (PCMIsBigEndian) {
--- a/jdk/src/share/classes/com/sun/media/sound/AuFileWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/AuFileWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -25,12 +25,10 @@
 
 package com.sun.media.sound;
 
-import java.util.Vector;
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
-import java.lang.IllegalArgumentException;
 
 import java.io.BufferedOutputStream;
 import java.io.DataOutputStream;
@@ -131,10 +129,10 @@
             // $$fb: 2001-07-13: done. Fixes Bug 4479981
             RandomAccessFile raf=new RandomAccessFile(out, "rw");
             if (raf.length()<=0x7FFFFFFFl) {
-                                // skip AU magic and data offset field
+                // skip AU magic and data offset field
                 raf.skipBytes(8);
                 raf.writeInt(bytesWritten-AuFileFormat.AU_HEADERSIZE);
-                                // that's all
+                // that's all
             }
             raf.close();
         }
@@ -303,7 +301,8 @@
         dos.close();
         header = baos.toByteArray();
         headerStream = new ByteArrayInputStream( header );
-        auStream = new SequenceInputStream(headerStream,codedAudioStream);
+        auStream = new SequenceInputStream(headerStream,
+                        new NoCloseInputStream(codedAudioStream));
 
         return auStream;
     }
--- a/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java	Fri Mar 18 15:44:45 2011 -0700
@@ -395,11 +395,7 @@
         protected volatile boolean noService = false; // do not run the nService method
 
         // Guards all native calls.
-        protected Object lockNative = new Object();
-        // Guards the lastOpened static variable in implOpen and implClose.
-        protected static Object lockLast = new Object();
-        // Keeps track of last opened line, see implOpen "trick".
-        protected static DirectDL lastOpened;
+        protected final Object lockNative = new Object();
 
         // CONSTRUCTOR
         protected DirectDL(DataLine.Info info,
@@ -501,48 +497,21 @@
             // align buffer to full frames
             bufferSize = ((int) bufferSize / format.getFrameSize()) * format.getFrameSize();
 
-            synchronized(lockLast) {
-                id = nOpen(mixerIndex, deviceID, isSource,
-                        encoding,
-                        hardwareFormat.getSampleRate(),
-                        hardwareFormat.getSampleSizeInBits(),
-                        hardwareFormat.getFrameSize(),
-                        hardwareFormat.getChannels(),
-                        hardwareFormat.getEncoding().equals(
-                            AudioFormat.Encoding.PCM_SIGNED),
-                        hardwareFormat.isBigEndian(),
-                        bufferSize);
+            id = nOpen(mixerIndex, deviceID, isSource,
+                    encoding,
+                    hardwareFormat.getSampleRate(),
+                    hardwareFormat.getSampleSizeInBits(),
+                    hardwareFormat.getFrameSize(),
+                    hardwareFormat.getChannels(),
+                    hardwareFormat.getEncoding().equals(
+                        AudioFormat.Encoding.PCM_SIGNED),
+                    hardwareFormat.isBigEndian(),
+                    bufferSize);
 
-                if (id == 0) {
-                    // Bah... Dirty trick. The most likely cause is an application
-                    // already having a line open for this particular hardware
-                    // format and forgetting about it. If so, silently close that
-                    // implementation and try again. Unfortuantely we can only
-                    // open one line per hardware format currently.
-                    if (lastOpened != null
-                            && hardwareFormat.matches(lastOpened.hardwareFormat)) {
-                        lastOpened.implClose();
-                        lastOpened = null;
-
-                        id = nOpen(mixerIndex, deviceID, isSource,
-                                encoding,
-                                hardwareFormat.getSampleRate(),
-                                hardwareFormat.getSampleSizeInBits(),
-                                hardwareFormat.getFrameSize(),
-                                hardwareFormat.getChannels(),
-                                hardwareFormat.getEncoding().equals(
-                                    AudioFormat.Encoding.PCM_SIGNED),
-                                hardwareFormat.isBigEndian(),
-                                bufferSize);
-                    }
-
-                    if (id == 0) {
-                        // TODO: nicer error messages...
-                        throw new LineUnavailableException(
-                            "line with format "+format+" not supported.");
-                    }
-                }
-                lastOpened = this;
+            if (id == 0) {
+                // TODO: nicer error messages...
+                throw new LineUnavailableException(
+                        "line with format "+format+" not supported.");
             }
 
             this.bufferSize = nGetBufferSize(id, isSource);
@@ -615,14 +584,13 @@
             }
             synchronized (lockNative) {
                 nStop(id, isSource);
-
+            }
+            // wake up any waiting threads
+            synchronized(lock) {
                 // need to set doIO to false before notifying the
                 // read/write thread, that's why isStartedRunning()
                 // cannot be used
                 doIO = false;
-            }
-            // wake up any waiting threads
-            synchronized(lock) {
                 lock.notifyAll();
             }
             setActive(false);
@@ -649,12 +617,8 @@
             doIO = false;
             long oldID = id;
             id = 0;
-            synchronized (lockLast) {
-                synchronized (lockNative) {
-                    nClose(oldID, isSource);
-                    if (lastOpened == this)
-                      lastOpened = null;
-                }
+            synchronized (lockNative) {
+                nClose(oldID, isSource);
             }
             bytePosition = 0;
             softwareConversionSize = 0;
@@ -667,10 +631,9 @@
             if (id == 0) {
                 return 0;
             }
-            int a = 0;
+            int a;
             synchronized (lockNative) {
-                if (doIO)
-                    a = nAvailable(id, isSource);
+                a = nAvailable(id, isSource);
             }
             return a;
         }
@@ -726,7 +689,7 @@
                     lock.notifyAll();
                 }
                 synchronized (lockNative) {
-                    if (id != 0 && doIO) {
+                    if (id != 0) {
                         // then flush native buffers
                         nFlush(id, isSource);
                     }
@@ -737,10 +700,9 @@
 
         // replacement for getFramePosition (see AbstractDataLine)
         public long getLongFramePosition() {
-            long pos = 0;
+            long pos;
             synchronized (lockNative) {
-                if (doIO)
-                    pos = nGetBytePosition(id, isSource, bytePosition);
+                pos = nGetBytePosition(id, isSource, bytePosition);
             }
             // hack because ALSA sometimes reports wrong framepos
             if (pos < 0) {
@@ -786,12 +748,11 @@
             }
             int written = 0;
             while (!flushing) {
-                int thisWritten = 0;
+                int thisWritten;
                 synchronized (lockNative) {
-                    if (doIO)
-                        thisWritten = nWrite(id, b, off, len,
-                                softwareConversionSize,
-                                leftGain, rightGain);
+                    thisWritten = nWrite(id, b, off, len,
+                            softwareConversionSize,
+                            leftGain, rightGain);
                     if (thisWritten < 0) {
                         // error in native layer
                         break;
@@ -1014,10 +975,9 @@
             }
             int read = 0;
             while (doIO && !flushing) {
-                int thisRead = 0;
+                int thisRead;
                 synchronized (lockNative) {
-                    if (doIO)
-                        thisRead = nRead(id, b, off, len, softwareConversionSize);
+                    thisRead = nRead(id, b, off, len, softwareConversionSize);
                     if (thisRead < 0) {
                         // error in native layer
                         break;
@@ -1252,8 +1212,7 @@
             // set new native position (if necessary)
             // this must come after the flush!
             synchronized (lockNative) {
-                if (doIO)
-                    nSetBytePosition(id, isSource, frames * frameSize);
+                nSetBytePosition(id, isSource, frames * frameSize);
             }
 
             if (Printer.debug) Printer.debug("  DirectClip.setFramePosition: "
--- a/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java	Fri Mar 18 15:44:45 2011 -0700
@@ -775,15 +775,22 @@
         Receiver rec = null;
         // first try to connect to the default synthesizer
         // IMPORTANT: this code needs to be synch'ed with
-        //            MidiSystem.getReceiver(boolean), because the same
+        //            MidiSystem.getSequencer(boolean), because the same
         //            algorithm needs to be used!
         try {
             Synthesizer synth = MidiSystem.getSynthesizer();
-            synth.open();
             if (synth instanceof ReferenceCountingDevice) {
                 rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting();
             } else {
-                rec = synth.getReceiver();
+                synth.open();
+                try {
+                    rec = synth.getReceiver();
+                } finally {
+                    // make sure that the synth is properly closed
+                    if (rec == null) {
+                        synth.close();
+                    }
+                }
             }
         } catch (Exception e) {
             // something went wrong with synth
--- a/jdk/src/share/classes/com/sun/media/sound/StandardMidiFileReader.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/StandardMidiFileReader.java	Fri Mar 18 15:44:45 2011 -0700
@@ -127,7 +127,7 @@
                 resolution = timing;
             } else {
                 // SMPTE based timing.  first decipher the frame code.
-                int frameCode = (-1 * timing) >> 8;
+                int frameCode = -1 * (timing >> 8);
                 switch(frameCode) {
                 case 24:
                     divisionType = Sequence.SMPTE_24;
--- a/jdk/src/share/classes/com/sun/media/sound/SunFileWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/SunFileWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -30,14 +30,9 @@
 import java.io.OutputStream;
 import java.io.IOException;
 import java.io.DataInputStream;
-import java.io.RandomAccessFile;
-import java.net.URL;
 
-import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioFileFormat;
 import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.UnsupportedAudioFileException;
 import javax.sound.sampled.spi.AudioFileWriter;
 
 
@@ -177,4 +172,62 @@
         return i;
     }
 
+    /**
+     * InputStream wrapper class which prevent source stream from being closed.
+     * The class is usefull for use with SequenceInputStream to prevent
+     * closing of the source input streams.
+     */
+    protected class NoCloseInputStream extends InputStream {
+        private final InputStream in;
+
+        public NoCloseInputStream(InputStream in) {
+            this.in = in;
+        }
+
+        @Override
+        public int read() throws IOException {
+            return in.read();
+        }
+
+        @Override
+        public int read(byte b[]) throws IOException {
+            return in.read(b);
+        }
+
+        @Override
+        public int read(byte b[], int off, int len) throws IOException {
+            return in.read(b, off, len);
+        }
+
+        @Override
+        public long skip(long n) throws IOException {
+            return in.skip(n);
+        }
+
+        @Override
+        public int available() throws IOException {
+            return in.available();
+        }
+
+        @Override
+        public void close() throws IOException {
+            // don't propagate the call
+        }
+
+        @Override
+        public void mark(int readlimit) {
+            in.mark(readlimit);
+        }
+
+        @Override
+        public void reset() throws IOException {
+            in.reset();
+        }
+
+        @Override
+        public boolean markSupported() {
+            return in.markSupported();
+        }
+
+    }
 }
--- a/jdk/src/share/classes/com/sun/media/sound/WaveFileWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/com/sun/media/sound/WaveFileWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -25,12 +25,10 @@
 
 package com.sun.media.sound;
 
-import java.util.Vector;
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
-import java.lang.IllegalArgumentException;
 
 import java.io.BufferedOutputStream;
 import java.io.DataOutputStream;
@@ -371,7 +369,8 @@
         dos.close();
         header = baos.toByteArray();
         headerStream = new ByteArrayInputStream( header );
-        waveStream = new SequenceInputStream(headerStream,codedAudioStream);
+        waveStream = new SequenceInputStream(headerStream,
+                            new NoCloseInputStream(codedAudioStream));
 
         return (InputStream)waveStream;
     }
--- a/jdk/src/share/classes/java/awt/Font.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/awt/Font.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1985,8 +1985,22 @@
      * @since 1.2
      */
     public int canDisplayUpTo(String str) {
-        return canDisplayUpTo(new StringCharacterIterator(str), 0,
-            str.length());
+        Font2D font2d = getFont2D();
+        int len = str.length();
+        for (int i = 0; i < len; i++) {
+            char c = str.charAt(i);
+            if (font2d.canDisplay(c)) {
+                continue;
+            }
+            if (!Character.isHighSurrogate(c)) {
+                return i;
+            }
+            if (!font2d.canDisplay(str.codePointAt(i))) {
+                return i;
+            }
+            i++;
+        }
+        return -1;
     }
 
     /**
@@ -2009,11 +2023,21 @@
      * @since 1.2
      */
     public int canDisplayUpTo(char[] text, int start, int limit) {
-        while (start < limit && canDisplay(text[start])) {
-            ++start;
+        Font2D font2d = getFont2D();
+        for (int i = start; i < limit; i++) {
+            char c = text[i];
+            if (font2d.canDisplay(c)) {
+                continue;
+            }
+            if (!Character.isHighSurrogate(c)) {
+                return i;
+            }
+            if (!font2d.canDisplay(Character.codePointAt(text, i, limit))) {
+                return i;
+            }
+            i++;
         }
-
-        return start == limit ? -1 : start;
+        return -1;
     }
 
     /**
@@ -2034,13 +2058,26 @@
      * @since 1.2
      */
     public int canDisplayUpTo(CharacterIterator iter, int start, int limit) {
-        for (char c = iter.setIndex(start);
-             iter.getIndex() < limit && canDisplay(c);
-             c = iter.next()) {
+        Font2D font2d = getFont2D();
+        char c = iter.setIndex(start);
+        for (int i = start; i < limit; i++, c = iter.next()) {
+            if (font2d.canDisplay(c)) {
+                continue;
+            }
+            if (!Character.isHighSurrogate(c)) {
+                return i;
+            }
+            char c2 = iter.next();
+            // c2 could be CharacterIterator.DONE which is not a low surrogate.
+            if (!Character.isLowSurrogate(c2)) {
+                return i;
+            }
+            if (!font2d.canDisplay(Character.toCodePoint(c, c2))) {
+                return i;
+            }
+            i++;
         }
-
-        int result = iter.getIndex();
-        return result == limit ? -1 : result;
+        return -1;
     }
 
     /**
--- a/jdk/src/share/classes/java/awt/color/ICC_Profile.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/awt/color/ICC_Profile.java	Fri Mar 18 15:44:45 2011 -0700
@@ -58,7 +58,6 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
-import sun.misc.BootClassLoaderHook;
 
 /**
  * A representation of color profile data for device independent and
@@ -865,8 +864,7 @@
         case ColorSpace.CS_PYCC:
             synchronized(ICC_Profile.class) {
                 if (PYCCprofile == null) {
-                    if (BootClassLoaderHook.getHook() != null ||
-                        standardProfileExists("PYCC.pf"))
+                    if (standardProfileExists("PYCC.pf"))
                     {
                         ProfileDeferralInfo pInfo =
                             new ProfileDeferralInfo("PYCC.pf",
--- a/jdk/src/share/classes/java/io/File.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/io/File.java	Fri Mar 18 15:44:45 2011 -0700
@@ -2055,7 +2055,7 @@
      *
      * @return  a {@code Path} constructed from this abstract path
      *
-     * @throws  InvalidPathException
+     * @throws  java.nio.file.InvalidPathException
      *          if a {@code Path} object cannot be constructed from the abstract
      *          path (see {@link java.nio.file.FileSystem#getPath FileSystem.getPath})
      *
--- a/jdk/src/share/classes/java/lang/ClassLoader.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/lang/ClassLoader.java	Fri Mar 18 15:44:45 2011 -0700
@@ -51,7 +51,6 @@
 import java.util.Hashtable;
 import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
-import sun.misc.BootClassLoaderHook;
 import sun.misc.ClassFileTransformer;
 import sun.misc.CompoundEnumeration;
 import sun.misc.Resource;
@@ -1300,7 +1299,6 @@
      * Find resources from the VM's built-in classloader.
      */
     private static URL getBootstrapResource(String name) {
-        BootClassLoaderHook.preLoadResource(name);
         URLClassPath ucp = getBootstrapClassPath();
         Resource res = ucp.getResource(name);
         return res != null ? res.getURL() : null;
@@ -1814,7 +1812,6 @@
     // Invoked in the java.lang.Runtime class to implement load and loadLibrary.
     static void loadLibrary(Class fromClass, String name,
                             boolean isAbsolute) {
-        BootClassLoaderHook.preLoadLibrary(name);
         ClassLoader loader =
             (fromClass == null) ? null : fromClass.getClassLoader();
         if (sys_paths == null) {
--- a/jdk/src/share/classes/java/lang/Package.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/lang/Package.java	Fri Mar 18 15:44:45 2011 -0700
@@ -576,12 +576,10 @@
      * Returns the Manifest for the specified JAR file name.
      */
     private static Manifest loadManifest(String fn) {
-        try {
-            FileInputStream fis = new FileInputStream(fn);
-            JarInputStream jis = new JarInputStream(fis, false);
-            Manifest man = jis.getManifest();
-            jis.close();
-            return man;
+        try (FileInputStream fis = new FileInputStream(fn);
+             JarInputStream jis = new JarInputStream(fis, false))
+        {
+            return jis.getManifest();
         } catch (IOException e) {
             return null;
         }
--- a/jdk/src/share/classes/java/net/HttpURLConnection.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/net/HttpURLConnection.java	Fri Mar 18 15:44:45 2011 -0700
@@ -400,7 +400,8 @@
      * @exception ProtocolException if the method cannot be reset or if
      *              the requested method isn't valid for HTTP.
      * @exception SecurityException if a security manager is set and the
-     *              "allowHttpTrace" NetPermission is not granted.
+     *              method is "TRACE", but the "allowHttpTrace"
+     *              NetPermission is not granted.
      * @see #getRequestMethod()
      */
     public void setRequestMethod(String method) throws ProtocolException {
--- a/jdk/src/share/classes/java/net/NetPermission.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/net/NetPermission.java	Fri Mar 18 15:44:45 2011 -0700
@@ -73,6 +73,13 @@
  *   </tr>
  *
  * <tr>
+ *  <td>getNetworkInformation</td>
+ *  <td>The ability to retrieve all information about local network interfaces.</td>
+ *  <td>Malicious code can read information about network hardware such as
+ *  MAC addresses, which could be used to construct local IPv6 addresses.</td>
+ * </tr>
+ *
+ * <tr>
  *   <td>getProxySelector</td>
  *   <td>The ability to get the proxy selector used to make decisions
  *   on which proxies to use when making network connections.</td>
--- a/jdk/src/share/classes/java/net/URI.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/net/URI.java	Fri Mar 18 15:44:45 2011 -0700
@@ -991,7 +991,7 @@
      *   authority and path are taken from the given URI. </p></li>
      *
      *   <li><p> Otherwise the new URI's authority component is copied from
-     *   this URI, and its path is computed as follows: </p></li>
+     *   this URI, and its path is computed as follows: </p>
      *
      *   <ol type=a>
      *
@@ -1005,7 +1005,7 @@
      *     path and then normalizing the result as if by invoking the {@link
      *     #normalize() normalize} method. </p></li>
      *
-     *   </ol>
+     *   </ol></li>
      *
      * </ol>
      *
@@ -1511,7 +1511,7 @@
      *   fragments. </p></li>
      *
      *   <li><p> Two hierarchical URIs with identical schemes are ordered
-     *   according to the ordering of their authority components: </p></li>
+     *   according to the ordering of their authority components: </p>
      *
      *   <ul type=disc>
      *
@@ -1526,7 +1526,7 @@
      *     the URIs are ordered according to the ordering of their authority
      *     components. </p></li>
      *
-     *   </ul>
+     *   </ul></li>
      *
      *   <li><p> Finally, two hierarchical URIs with identical schemes and
      *   authority components are ordered according to the ordering of their
--- a/jdk/src/share/classes/java/net/package.html	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/net/package.html	Fri Mar 18 15:44:45 2011 -0700
@@ -31,18 +31,18 @@
 
 <p> The java.net package can be roughly divided in two sections:</p>
 <ul>
-    <li> <p><i>A Low Level API</i>, which deals with the following abstractions:</p></li>
+    <li> <p><i>A Low Level API</i>, which deals with the following abstractions:</p>
     <ul>
       <li><p><i>Addresses</i>, which are networking identifiers, like IP addresses.</p></li>
       <li><p><i>Sockets</i>, which are basic bidirectional data communication mechanisms.</p></li>
       <li><p><i>Interfaces</i>, which describe network interfaces. </p></li>
-    </ul>
-    <li> <p><i>A High Level API</i>, which deals with the following abstractions:</p></li>
+    </ul></li>
+    <li> <p><i>A High Level API</i>, which deals with the following abstractions:</p>
     <ul>
       <li><p><i>URIs</i>, which represent Universal Resource Identifiers.</p></li>
       <li><p><i>URLs</i>, which represent Universal Resource Locators.</p></li>
       <li><p><i>Connections</i>, which represents connections to the resource pointed to by <i>URLs</i>.</p></li>
-      </ul>
+      </ul></li>
 </ul>
 <h2>Addresses</h2>
 <p>Addresses are used throughout the java.net APIs as either host identifiers, or socket endpoint identifiers.</p>
--- a/jdk/src/share/classes/java/nio/channels/AsynchronousFileChannel.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/nio/channels/AsynchronousFileChannel.java	Fri Mar 18 15:44:45 2011 -0700
@@ -48,12 +48,12 @@
  *
  * <p> An asynchronous file channel does not have a <i>current position</i>
  * within the file. Instead, the file position is specified to each read and
- * write methd that initiate asynchronous operations. A {@link CompletionHandler}
+ * write method that initiates asynchronous operations. A {@link CompletionHandler}
  * is specified as a parameter and is invoked to consume the result of the I/O
  * operation. This class also defines read and write methods that initiate
  * asynchronous operations, returning a {@link Future} to represent the pending
  * result of the operation. The {@code Future} may be used to check if the
- * operation has completed, to wait for its completion.
+ * operation has completed, wait for its completion, and retrieve the result.
  *
  * <p> In addition to read and write operations, this class defines the
  * following operations: </p>
@@ -73,13 +73,13 @@
  * which tasks are submitted to handle I/O events and dispatch to completion
  * handlers that consume the results of I/O operations on the channel. The
  * completion handler for an I/O operation initiated on a channel is guaranteed
- * to be invoked by one threads in the thread pool (This ensures that the
+ * to be invoked by one of the threads in the thread pool (This ensures that the
  * completion handler is run by a thread with the expected <em>identity</em>).
  * Where an I/O operation completes immediately, and the initiating thread is
  * itself a thread in the thread pool, then the completion handler may be invoked
  * directly by the initiating thread. When an {@code AsynchronousFileChannel} is
  * created without specifying a thread pool then the channel is associated with
- * a system-dependent and default thread pool that may be shared with other
+ * a system-dependent default thread pool that may be shared with other
  * channels. The default thread pool is configured by the system properties
  * defined by the {@link AsynchronousChannelGroup} class.
  *
--- a/jdk/src/share/classes/java/nio/channels/SocketChannel.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/nio/channels/SocketChannel.java	Fri Mar 18 15:44:45 2011 -0700
@@ -182,10 +182,13 @@
         SocketChannel sc = open();
         try {
             sc.connect(remote);
-        } finally {
-            if (!sc.isConnected()) {
-                try { sc.close(); } catch (IOException x) { }
+        } catch (Throwable x) {
+            try {
+                sc.close();
+            } catch (Throwable suppressed) {
+                x.addSuppressed(suppressed);
             }
+            throw x;
         }
         assert sc.isConnected();
         return sc;
--- a/jdk/src/share/classes/java/nio/file/CopyMoveHelper.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/nio/file/CopyMoveHelper.java	Fri Mar 18 15:44:45 2011 -0700
@@ -135,11 +135,13 @@
                 view.setTimes(attrs.lastModifiedTime(),
                               attrs.lastAccessTime(),
                               attrs.creationTime());
-            } catch (IOException x) {
+            } catch (Throwable x) {
                 // rollback
                 try {
                     Files.delete(target);
-                } catch (IOException ignore) { }
+                } catch (Throwable suppressed) {
+                    x.addSuppressed(suppressed);
+                }
                 throw x;
             }
         }
--- a/jdk/src/share/classes/java/nio/file/Files.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/nio/file/Files.java	Fri Mar 18 15:44:45 2011 -0700
@@ -129,17 +129,18 @@
      * <pre>
      *     Path path = ...
      *
-     *     // replace an existing file or create the file if it doesn't initially exist
+     *     // truncate and overwrite an existing file, or create the file if
+     *     // it doesn't initially exist
      *     OutputStream out = Files.newOutputStream(path);
      *
      *     // append to an existing file, fail if the file does not exist
      *     out = Files.newOutputStream(path, APPEND);
      *
      *     // append to an existing file, create file if it doesn't initially exist
-     *     out = Files.newOutputStream(CREATE, APPEND);
+     *     out = Files.newOutputStream(path, CREATE, APPEND);
      *
      *     // always create new file, failing if it already exists
-     *     out = Files.newOutputStream(CREATE_NEW);
+     *     out = Files.newOutputStream(path, CREATE_NEW);
      * </pre>
      *
      * @param   path
@@ -793,7 +794,8 @@
                                       FileAttribute<?>... attrs)
         throws IOException
     {
-        return TempFileHelper.createTempFile(dir, prefix, suffix, attrs);
+        return TempFileHelper.createTempFile(Objects.requireNonNull(dir),
+                                             prefix, suffix, attrs);
     }
 
     /**
@@ -890,13 +892,14 @@
                                            FileAttribute<?>... attrs)
         throws IOException
     {
-        return TempFileHelper.createTempDirectory(dir, prefix, attrs);
+        return TempFileHelper.createTempDirectory(Objects.requireNonNull(dir),
+                                                  prefix, attrs);
     }
 
     /**
      * Creates a new directory in the default temporary-file directory, using
-     * the given prefix and suffix to generate its name. The resulting {@code
-     * Path} is associated with the default {@code FileSystem}.
+     * the given prefix to generate its name. The resulting {@code Path} is
+     * associated with the default {@code FileSystem}.
      *
      * <p> This method works in exactly the manner specified by {@link
      * #createTempDirectory(Path,String,FileAttribute[])} method for the case
@@ -2583,7 +2586,7 @@
      * walkFileTree(start, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor)
      * </pre></blockquote>
      * In other words, it does not follow symbolic links, and visits all levels
-     * of the file level.
+     * of the file tree.
      *
      * @param   start
      *          the starting file
@@ -3005,7 +3008,7 @@
      * or after some bytes have been written to the file.
      *
      * <p> <b>Usage example</b>: By default the method creates a new file or
-     * overrides an existing file. Suppose you instead want to append bytes
+     * overwrites an existing file. Suppose you instead want to append bytes
      * to an existing file:
      * <pre>
      *     Path path = ...
--- a/jdk/src/share/classes/java/security/CodeSigner.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/security/CodeSigner.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -26,10 +26,7 @@
 package java.security;
 
 import java.io.*;
-import java.security.cert.CRL;
 import java.security.cert.CertPath;
-import sun.misc.JavaSecurityCodeSignerAccess;
-import sun.misc.SharedSecrets;
 
 /**
  * This class encapsulates information about a code signer.
@@ -167,44 +164,6 @@
         return sb.toString();
     }
 
-    // A private attribute attached to this CodeSigner object. Can be accessed
-    // through SharedSecrets.getJavaSecurityCodeSignerAccess().[g|s]etCRLs
-    //
-    // Currently called in SignatureFileVerifier.getSigners
-    private transient CRL[] crls;
-
-    /**
-     * Sets the CRLs attached
-     * @param crls, null to clear
-     */
-    void setCRLs(CRL[] crls) {
-        this.crls = crls;
-    }
-
-    /**
-     * Returns the CRLs attached
-     * @return the crls, initially null
-     */
-    CRL[] getCRLs() {
-        return crls;
-    }
-
-    // Set up JavaSecurityCodeSignerAccess in SharedSecrets
-    static {
-        SharedSecrets.setJavaSecurityCodeSignerAccess(
-                new JavaSecurityCodeSignerAccess() {
-            @Override
-            public void setCRLs(CodeSigner signer, CRL[] crls) {
-                signer.setCRLs(crls);
-            }
-
-            @Override
-            public CRL[] getCRLs(CodeSigner signer) {
-                return signer.getCRLs();
-            }
-        });
-    }
-
     // Explicitly reset hash code value to -1
     private void readObject(ObjectInputStream ois)
         throws IOException, ClassNotFoundException {
--- a/jdk/src/share/classes/java/util/Calendar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/Calendar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2011, 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
@@ -554,7 +554,7 @@
 
     /**
      * Field number for <code>get</code> and <code>set</code> indicating the
-     * daylight savings offset in milliseconds.
+     * daylight saving offset in milliseconds.
      * <p>
      * This field reflects the correct daylight saving offset value of
      * the time zone of this <code>Calendar</code> if the
--- a/jdk/src/share/classes/java/util/Currency.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/Currency.java	Fri Mar 18 15:44:45 2011 -0700
@@ -233,7 +233,9 @@
                                              "currency.properties");
                     if (propFile.exists()) {
                         Properties props = new Properties();
-                        props.load(new FileReader(propFile));
+                        try (FileReader fr = new FileReader(propFile)) {
+                            props.load(fr);
+                        }
                         Set<String> keys = props.stringPropertyNames();
                         Pattern propertiesPattern =
                             Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])");
--- a/jdk/src/share/classes/java/util/GregorianCalendar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/GregorianCalendar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2011, 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
@@ -260,7 +260,7 @@
  * // create a Pacific Standard Time time zone
  * SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
  *
- * // set up rules for daylight savings time
+ * // set up rules for Daylight Saving Time
  * pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
  * pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
  *
--- a/jdk/src/share/classes/java/util/TimeZone.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/TimeZone.java	Fri Mar 18 15:44:45 2011 -0700
@@ -339,8 +339,9 @@
     /**
      * Returns a name in the specified {@code style} of this {@code TimeZone}
      * suitable for presentation to the user in the default locale. If the
-     * specified {@code daylight} is {@code true}, a daylight saving time name
-     * is returned. Otherwise, a standard time name is returned.
+     * specified {@code daylight} is {@code true}, a Daylight Saving Time name
+     * is returned (even if this {@code TimeZone} doesn't observe Daylight Saving
+     * Time). Otherwise, a Standard Time name is returned.
      *
      * <p>This method is equivalent to:
      * <pre><blockquote>
@@ -348,7 +349,8 @@
      *                Locale.getDefault({@link Locale.Category#DISPLAY}))
      * </blockquote></pre>
      *
-     * @param daylight if {@code true}, return the daylight saving time name.
+     * @param daylight {@code true} specifying a Daylight Saving Time name, or
+     *                 {@code false} specifying a Standard Time name
      * @param style either {@link #LONG} or {@link #SHORT}
      * @return the human-readable name of this time zone in the default locale.
      * @exception IllegalArgumentException if {@code style} is invalid.
@@ -356,6 +358,7 @@
      * @see #getDisplayName(boolean, int, Locale)
      * @see Locale#getDefault(Locale.Category)
      * @see Locale.Category
+     * @see java.text.DateFormatSymbols#getZoneStrings()
      */
     public final String getDisplayName(boolean daylight, int style) {
         return getDisplayName(daylight, style,
@@ -365,8 +368,9 @@
     /**
      * Returns a name in the specified {@code style} of this {@code TimeZone}
      * suitable for presentation to the user in the specified {@code
-     * locale}. If the specified {@code daylight} is {@code true}, a daylight
-     * saving time name is returned. Otherwise, a standard time name is
+     * locale}. If the specified {@code daylight} is {@code true}, a Daylight
+     * Saving Time name is returned (even if this {@code TimeZone} doesn't
+     * observe Daylight Saving Time). Otherwise, a Standard Time name is
      * returned.
      *
      * <p>When looking up a time zone name, the {@linkplain
@@ -379,13 +383,15 @@
      * found, the name is returned. Otherwise, a string in the
      * <a href="#NormalizedCustomID">normalized custom ID format</a> is returned.
      *
-     * @param daylight if {@code true}, return the daylight saving time name.
+     * @param daylight {@code true} specifying a Daylight Saving Time name, or
+     *                 {@code false} specifying a Standard Time name
      * @param style either {@link #LONG} or {@link #SHORT}
-     * @param locale the locale in which to supply the display name.
+     * @param locale   the locale in which to supply the display name.
      * @return the human-readable name of this time zone in the given locale.
      * @exception IllegalArgumentException if {@code style} is invalid.
      * @exception NullPointerException if {@code locale} is {@code null}.
      * @since 1.2
+     * @see java.text.DateFormatSymbols#getZoneStrings()
      */
     public String getDisplayName(boolean daylight, int style, Locale locale) {
         if (style != SHORT && style != LONG) {
@@ -526,10 +532,10 @@
 
     /**
      * Queries if the given {@code date} is in Daylight Saving Time in
-     * this {@code TimeZone}.
+     * this time zone.
      *
-     * @param date the given {@code Date}.
-     * @return {@code true} if the given {@code date} is in Daylight Saving Time,
+     * @param date the given Date.
+     * @return {@code true} if the given date is in Daylight Saving Time,
      *         {@code false}, otherwise.
      */
     abstract public boolean inDaylightTime(Date date);
@@ -566,7 +572,7 @@
      * @param rawOffset the given time zone GMT offset in milliseconds.
      * @return an array of IDs, where the time zone for that ID has
      * the specified GMT offset. For example, "America/Phoenix" and "America/Denver"
-     * both have GMT-07:00, but differ in daylight savings behavior.
+     * both have GMT-07:00, but differ in daylight saving behavior.
      * @see #getRawOffset()
      */
     public static synchronized String[] getAvailableIDs(int rawOffset) {
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java	Fri Mar 18 15:44:45 2011 -0700
@@ -272,13 +272,6 @@
 
     private static final Node<Object> PREV_TERMINATOR, NEXT_TERMINATOR;
 
-    static {
-        PREV_TERMINATOR = new Node<Object>(null);
-        PREV_TERMINATOR.next = PREV_TERMINATOR;
-        NEXT_TERMINATOR = new Node<Object>(null);
-        NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
-    }
-
     @SuppressWarnings("unchecked")
     Node<E> prevTerminator() {
         return (Node<E>) PREV_TERMINATOR;
@@ -294,6 +287,9 @@
         volatile E item;
         volatile Node<E> next;
 
+        Node() {  // default constructor for NEXT_TERMINATOR, PREV_TERMINATOR
+        }
+
         /**
          * Constructs a new node.  Uses relaxed write because item can
          * only be seen after publication via casNext or casPrev.
@@ -324,14 +320,25 @@
 
         // Unsafe mechanics
 
-        private static final sun.misc.Unsafe UNSAFE =
-            sun.misc.Unsafe.getUnsafe();
-        private static final long prevOffset =
-            objectFieldOffset(UNSAFE, "prev", Node.class);
-        private static final long itemOffset =
-            objectFieldOffset(UNSAFE, "item", Node.class);
-        private static final long nextOffset =
-            objectFieldOffset(UNSAFE, "next", Node.class);
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long prevOffset;
+        private static final long itemOffset;
+        private static final long nextOffset;
+
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = Node.class;
+                prevOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("prev"));
+                itemOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("item"));
+                nextOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("next"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /**
@@ -1422,14 +1429,6 @@
         initHeadTail(h, t);
     }
 
-    // Unsafe mechanics
-
-    private static final sun.misc.Unsafe UNSAFE =
-        sun.misc.Unsafe.getUnsafe();
-    private static final long headOffset =
-        objectFieldOffset(UNSAFE, "head", ConcurrentLinkedDeque.class);
-    private static final long tailOffset =
-        objectFieldOffset(UNSAFE, "tail", ConcurrentLinkedDeque.class);
 
     private boolean casHead(Node<E> cmp, Node<E> val) {
         return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
@@ -1439,15 +1438,25 @@
         return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
     }
 
-    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
-                                  String field, Class<?> klazz) {
+    // Unsafe mechanics
+
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long headOffset;
+    private static final long tailOffset;
+    static {
+        PREV_TERMINATOR = new Node<Object>();
+        PREV_TERMINATOR.next = PREV_TERMINATOR;
+        NEXT_TERMINATOR = new Node<Object>();
+        NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = ConcurrentLinkedDeque.class;
+            headOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("head"));
+            tailOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("tail"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
 }
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java	Fri Mar 18 15:44:45 2011 -0700
@@ -194,12 +194,22 @@
 
         // Unsafe mechanics
 
-        private static final sun.misc.Unsafe UNSAFE =
-            sun.misc.Unsafe.getUnsafe();
-        private static final long nextOffset =
-            objectFieldOffset(UNSAFE, "next", Node.class);
-        private static final long itemOffset =
-            objectFieldOffset(UNSAFE, "item", Node.class);
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long itemOffset;
+        private static final long nextOffset;
+
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = Node.class;
+                itemOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("item"));
+                nextOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("next"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /**
@@ -790,14 +800,6 @@
             throw new NullPointerException();
     }
 
-    // Unsafe mechanics
-
-    private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-    private static final long headOffset =
-        objectFieldOffset(UNSAFE, "head", ConcurrentLinkedQueue.class);
-    private static final long tailOffset =
-        objectFieldOffset(UNSAFE, "tail", ConcurrentLinkedQueue.class);
-
     private boolean casTail(Node<E> cmp, Node<E> val) {
         return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
     }
@@ -806,15 +808,21 @@
         return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
     }
 
-    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
-                                  String field, Class<?> klazz) {
+    // Unsafe mechanics
+
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long headOffset;
+    private static final long tailOffset;
+    static {
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = ConcurrentLinkedQueue.class;
+            headOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("head"));
+            tailOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("tail"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
 }
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java	Fri Mar 18 15:44:45 2011 -0700
@@ -507,13 +507,24 @@
             return new AbstractMap.SimpleImmutableEntry<K,V>(key, v);
         }
 
-        // Unsafe mechanics
-        private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-        private static final long valueOffset =
-            objectFieldOffset(UNSAFE, "value", Node.class);
-        private static final long nextOffset =
-            objectFieldOffset(UNSAFE, "next", Node.class);
+        // UNSAFE mechanics
+
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long valueOffset;
+        private static final long nextOffset;
 
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = Node.class;
+                valueOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("value"));
+                nextOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("next"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /* ---------------- Indexing -------------- */
@@ -580,10 +591,18 @@
         }
 
         // Unsafe mechanics
-        private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-        private static final long rightOffset =
-            objectFieldOffset(UNSAFE, "right", Index.class);
-
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long rightOffset;
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = Index.class;
+                rightOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("right"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /* ---------------- Head nodes -------------- */
@@ -3082,20 +3101,16 @@
     }
 
     // Unsafe mechanics
-    private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-    private static final long headOffset =
-        objectFieldOffset(UNSAFE, "head", ConcurrentSkipListMap.class);
-
-    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
-                                  String field, Class<?> klazz) {
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long headOffset;
+    static {
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = ConcurrentSkipListMap.class;
+            headOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("head"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
-
 }
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java	Fri Mar 18 15:44:45 2011 -0700
@@ -470,16 +470,20 @@
     }
 
     // Support for resetting map in clone
-    private static final Unsafe unsafe = Unsafe.getUnsafe();
+    private void setMap(ConcurrentNavigableMap<E,Object> map) {
+        UNSAFE.putObjectVolatile(this, mapOffset, map);
+    }
+
+    private static final sun.misc.Unsafe UNSAFE;
     private static final long mapOffset;
     static {
         try {
-            mapOffset = unsafe.objectFieldOffset
-                (ConcurrentSkipListSet.class.getDeclaredField("m"));
-        } catch (Exception ex) { throw new Error(ex); }
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = ConcurrentSkipListSet.class;
+            mapOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("m"));
+        } catch (Exception e) {
+            throw new Error(e);
+        }
     }
-    private void setMap(ConcurrentNavigableMap<E,Object> map) {
-        unsafe.putObjectVolatile(this, mapOffset, map);
-    }
-
 }
--- a/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1318,16 +1318,19 @@
     }
 
     // Support for resetting lock while deserializing
-    private static final Unsafe unsafe = Unsafe.getUnsafe();
+    private void resetLock() {
+        UNSAFE.putObjectVolatile(this, lockOffset, new ReentrantLock());
+    }
+    private static final sun.misc.Unsafe UNSAFE;
     private static final long lockOffset;
     static {
         try {
-            lockOffset = unsafe.objectFieldOffset
-                (CopyOnWriteArrayList.class.getDeclaredField("lock"));
-            } catch (Exception ex) { throw new Error(ex); }
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = CopyOnWriteArrayList.class;
+            lockOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("lock"));
+        } catch (Exception e) {
+            throw new Error(e);
+        }
     }
-    private void resetLock() {
-        unsafe.putObjectVolatile(this, lockOffset, new ReentrantLock());
-    }
-
 }
--- a/jdk/src/share/classes/java/util/concurrent/LinkedTransferQueue.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/LinkedTransferQueue.java	Fri Mar 18 15:44:45 2011 -0700
@@ -525,16 +525,27 @@
             return false;
         }
 
+        private static final long serialVersionUID = -3375979862319811754L;
+
         // Unsafe mechanics
-        private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-        private static final long nextOffset =
-            objectFieldOffset(UNSAFE, "next", Node.class);
-        private static final long itemOffset =
-            objectFieldOffset(UNSAFE, "item", Node.class);
-        private static final long waiterOffset =
-            objectFieldOffset(UNSAFE, "waiter", Node.class);
-
-        private static final long serialVersionUID = -3375979862319811754L;
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long itemOffset;
+        private static final long nextOffset;
+        private static final long waiterOffset;
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = Node.class;
+                itemOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("item"));
+                nextOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("next"));
+                waiterOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("waiter"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /** head of the queue; null until first enqueue */
@@ -1312,23 +1323,22 @@
 
     // Unsafe mechanics
 
-    private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-    private static final long headOffset =
-        objectFieldOffset(UNSAFE, "head", LinkedTransferQueue.class);
-    private static final long tailOffset =
-        objectFieldOffset(UNSAFE, "tail", LinkedTransferQueue.class);
-    private static final long sweepVotesOffset =
-        objectFieldOffset(UNSAFE, "sweepVotes", LinkedTransferQueue.class);
-
-    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
-                                  String field, Class<?> klazz) {
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long headOffset;
+    private static final long tailOffset;
+    private static final long sweepVotesOffset;
+    static {
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = LinkedTransferQueue.class;
+            headOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("head"));
+            tailOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("tail"));
+            sweepVotesOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("sweepVotes"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
 }
--- a/jdk/src/share/classes/java/util/concurrent/Phaser.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/Phaser.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1137,18 +1137,16 @@
 
     // Unsafe mechanics
 
-    private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-    private static final long stateOffset =
-        objectFieldOffset("state", Phaser.class);
-
-    private static long objectFieldOffset(String field, Class<?> klazz) {
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long stateOffset;
+    static {
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = Phaser.class;
+            stateOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("state"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
 }
--- a/jdk/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java	Fri Mar 18 15:44:45 2011 -0700
@@ -963,21 +963,16 @@
     }
 
     // Unsafe mechanics
-    private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-    private static final long allocationSpinLockOffset =
-        objectFieldOffset(UNSAFE, "allocationSpinLock",
-                          PriorityBlockingQueue.class);
-
-    static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
-                                  String field, Class<?> klazz) {
+    private static final sun.misc.Unsafe UNSAFE;
+    private static final long allocationSpinLockOffset;
+    static {
         try {
-            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
-        } catch (NoSuchFieldException e) {
-            // Convert Exception to corresponding Error
-            NoSuchFieldError error = new NoSuchFieldError(field);
-            error.initCause(e);
-            throw error;
+            UNSAFE = sun.misc.Unsafe.getUnsafe();
+            Class k = PriorityBlockingQueue.class;
+            allocationSpinLockOffset = UNSAFE.objectFieldOffset
+                (k.getDeclaredField("allocationSpinLock"));
+        } catch (Exception e) {
+            throw new Error(e);
         }
     }
-
 }
--- a/jdk/src/share/classes/java/util/concurrent/SynchronousQueue.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/concurrent/SynchronousQueue.java	Fri Mar 18 15:44:45 2011 -0700
@@ -279,12 +279,22 @@
             }
 
             // Unsafe mechanics
-            private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-            private static final long nextOffset =
-                objectFieldOffset(UNSAFE, "next", SNode.class);
-            private static final long matchOffset =
-                objectFieldOffset(UNSAFE, "match", SNode.class);
+            private static final sun.misc.Unsafe UNSAFE;
+            private static final long matchOffset;
+            private static final long nextOffset;
 
+            static {
+                try {
+                    UNSAFE = sun.misc.Unsafe.getUnsafe();
+                    Class k = SNode.class;
+                    matchOffset = UNSAFE.objectFieldOffset
+                        (k.getDeclaredField("match"));
+                    nextOffset = UNSAFE.objectFieldOffset
+                        (k.getDeclaredField("next"));
+                } catch (Exception e) {
+                    throw new Error(e);
+                }
+            }
         }
 
         /** The head (top) of the stack */
@@ -498,10 +508,18 @@
         }
 
         // Unsafe mechanics
-        private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-        private static final long headOffset =
-            objectFieldOffset(UNSAFE, "head", TransferStack.class);
-
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long headOffset;
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = TransferStack.class;
+                headOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("head"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /** Dual Queue */
@@ -558,11 +576,22 @@
             }
 
             // Unsafe mechanics
-            private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-            private static final long nextOffset =
-                objectFieldOffset(UNSAFE, "next", QNode.class);
-            private static final long itemOffset =
-                objectFieldOffset(UNSAFE, "item", QNode.class);
+            private static final sun.misc.Unsafe UNSAFE;
+            private static final long itemOffset;
+            private static final long nextOffset;
+
+            static {
+                try {
+                    UNSAFE = sun.misc.Unsafe.getUnsafe();
+                    Class k = QNode.class;
+                    itemOffset = UNSAFE.objectFieldOffset
+                        (k.getDeclaredField("item"));
+                    nextOffset = UNSAFE.objectFieldOffset
+                        (k.getDeclaredField("next"));
+                } catch (Exception e) {
+                    throw new Error(e);
+                }
+            }
         }
 
         /** Head of queue */
@@ -791,15 +820,24 @@
             }
         }
 
-        // unsafe mechanics
-        private static final sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe();
-        private static final long headOffset =
-            objectFieldOffset(UNSAFE, "head", TransferQueue.class);
-        private static final long tailOffset =
-            objectFieldOffset(UNSAFE, "tail", TransferQueue.class);
-        private static final long cleanMeOffset =
-            objectFieldOffset(UNSAFE, "cleanMe", TransferQueue.class);
-
+        private static final sun.misc.Unsafe UNSAFE;
+        private static final long headOffset;
+        private static final long tailOffset;
+        private static final long cleanMeOffset;
+        static {
+            try {
+                UNSAFE = sun.misc.Unsafe.getUnsafe();
+                Class k = TransferQueue.class;
+                headOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("head"));
+                tailOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("tail"));
+                cleanMeOffset = UNSAFE.objectFieldOffset
+                    (k.getDeclaredField("cleanMe"));
+            } catch (Exception e) {
+                throw new Error(e);
+            }
+        }
     }
 
     /**
--- a/jdk/src/share/classes/java/util/jar/JarFile.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/jar/JarFile.java	Fri Mar 18 15:44:45 2011 -0700
@@ -376,9 +376,9 @@
      */
     private byte[] getBytes(ZipEntry ze) throws IOException {
         byte[] b = new byte[(int)ze.getSize()];
-        DataInputStream is = new DataInputStream(super.getInputStream(ze));
-        is.readFully(b, 0, b.length);
-        is.close();
+        try (DataInputStream is = new DataInputStream(super.getInputStream(ze))) {
+            is.readFully(b, 0, b.length);
+        }
         return b;
     }
 
@@ -480,10 +480,10 @@
             JarEntry manEntry = getManEntry();
             if (manEntry != null) {
                 byte[] b = new byte[(int)manEntry.getSize()];
-                DataInputStream dis = new DataInputStream(
-                                                          super.getInputStream(manEntry));
-                dis.readFully(b, 0, b.length);
-                dis.close();
+                try (DataInputStream dis = new DataInputStream(
+                         super.getInputStream(manEntry))) {
+                    dis.readFully(b, 0, b.length);
+                }
 
                 int last = b.length - src.length;
                 int i = 0;
--- a/jdk/src/share/classes/java/util/zip/ZipEntry.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java	Fri Mar 18 15:44:45 2011 -0700
@@ -26,7 +26,6 @@
 package java.util.zip;
 
 import java.util.Date;
-import sun.misc.BootClassLoaderHook;
 
 /**
  * This class is used to represent a ZIP file entry.
--- a/jdk/src/share/classes/javax/crypto/SecretKeyFactory.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/crypto/SecretKeyFactory.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -61,7 +61,6 @@
  * <p> Every implementation of the Java platform is required to support the
  * following standard <code>SecretKeyFactory</code> algorithms:
  * <ul>
- * <li><tt>AES</tt></li>
  * <li><tt>DES</tt></li>
  * <li><tt>DESede</tt></li>
  * </ul>
--- a/jdk/src/share/classes/javax/sound/midi/MidiSystem.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/sound/midi/MidiSystem.java	Fri Mar 18 15:44:45 2011 -0700
@@ -441,13 +441,6 @@
                 Synthesizer synth = getSynthesizer();
                 if (synth instanceof ReferenceCountingDevice) {
                     rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting();
-                    // only use MixerSynth if it could successfully load a soundbank
-                    if (synth.getClass().toString().contains("com.sun.media.sound.MixerSynth")
-                        && (synth.getDefaultSoundbank() == null)) {
-                        // don't use this receiver if no soundbank available
-                        rec = null;
-                        synth.close();
-                    }
                 } else {
                     synth.open();
                     try {
--- a/jdk/src/share/classes/javax/swing/DefaultDesktopManager.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/DefaultDesktopManager.java	Fri Mar 18 15:44:45 2011 -0700
@@ -174,6 +174,8 @@
         if(!wasIcon(f)) {
             Rectangle r = getBoundsForIconOf(f);
             desktopIcon.setBounds(r.x, r.y, r.width, r.height);
+            // we must validate the hierarchy to not break the hw/lw mixing
+            desktopIcon.revalidate();
             setWasIcon(f, Boolean.TRUE);
         }
 
@@ -453,11 +455,9 @@
 
     /** This moves the <code>JComponent</code> and repaints the damaged areas. */
     public void setBoundsForFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
-        boolean didResize = (f.getWidth() != newWidth || f.getHeight() != newHeight);
         f.setBounds(newX, newY, newWidth, newHeight);
-        if(didResize) {
-            f.validate();
-        }
+        // we must validate the hierarchy to not break the hw/lw mixing
+        f.revalidate();
     }
 
     /** Convenience method to remove the desktopIcon of <b>f</b> is necessary. */
--- a/jdk/src/share/classes/javax/swing/JComponent.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/JComponent.java	Fri Mar 18 15:44:45 2011 -0700
@@ -5158,31 +5158,30 @@
                 }
             }
         }
-
         try {
-            g = safelyGetGraphics(paintingComponent, c);
-            try {
-                if (hasBuffer) {
-                    RepaintManager rm = RepaintManager.currentManager(
-                                               bufferedComponent);
-                    rm.beginPaint();
-                    try {
-                        rm.paint(paintingComponent, bufferedComponent, g,
-                                 paintImmediatelyClip.x,
-                                 paintImmediatelyClip.y,
-                                 paintImmediatelyClip.width,
-                                 paintImmediatelyClip.height);
-                    } finally {
-                        rm.endPaint();
+            if ((g = safelyGetGraphics(paintingComponent, c)) != null) {
+                try {
+                    if (hasBuffer) {
+                        RepaintManager rm = RepaintManager.currentManager(
+                                bufferedComponent);
+                        rm.beginPaint();
+                        try {
+                            rm.paint(paintingComponent, bufferedComponent, g,
+                                    paintImmediatelyClip.x,
+                                    paintImmediatelyClip.y,
+                                    paintImmediatelyClip.width,
+                                    paintImmediatelyClip.height);
+                        } finally {
+                            rm.endPaint();
+                        }
+                    } else {
+                        g.setClip(paintImmediatelyClip.x, paintImmediatelyClip.y,
+                                paintImmediatelyClip.width, paintImmediatelyClip.height);
+                        paintingComponent.paint(g);
                     }
+                } finally {
+                    g.dispose();
                 }
-                else {
-                    g.setClip(paintImmediatelyClip.x,paintImmediatelyClip.y,
-                       paintImmediatelyClip.width,paintImmediatelyClip.height);
-                    paintingComponent.paint(g);
-                }
-            } finally {
-                g.dispose();
             }
         }
         finally {
--- a/jdk/src/share/classes/javax/swing/JViewport.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/JViewport.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1111,6 +1111,8 @@
                 view.setLocation(newX, newY);
                 repaintAll = false;
             }
+            // we must validate the hierarchy to not break the hw/lw mixing
+            revalidate();
             fireStateChanged();
         }
     }
--- a/jdk/src/share/classes/javax/swing/text/Utilities.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/text/Utilities.java	Fri Mar 18 15:44:45 2011 -0700
@@ -390,11 +390,15 @@
             }
             if ((x >= currX) && (x < nextX)) {
                 // found the hit position... return the appropriate side
-                if ((round == false) || ((x - currX) < (nextX - x))) {
-                    return i - txtOffset;
-                } else {
-                    return i + 1 - txtOffset;
+                int offset = ((round == false) || ((x - currX) < (nextX - x))) ?
+                        (i - txtOffset) : (i + 1 - txtOffset);
+                // the length of the string measured as a whole may differ from
+                // the sum of individual character lengths, for example if
+                // fractional metrics are enabled; and we must guard from this.
+                while (metrics.charsWidth(txt, txtOffset, offset + 1) > (x - x0)) {
+                    offset--;
                 }
+                return (offset < 0 ? 0 : offset);
             }
             currX = nextX;
         }
@@ -404,24 +408,6 @@
     }
 
     /**
-     * Adjust text offset so that the length of a resulting string as a whole
-     * fits into the specified width.
-     */
-    static int adjustOffsetForFractionalMetrics(
-            Segment s, FontMetrics fm, int offset, int width) {
-        // Sometimes the offset returned by getTabbedTextOffset is beyond the
-        // available area, when fractional metrics are enabled. We should
-        // guard against this.
-        if (offset < s.count) {
-            while (offset > 0 &&
-                    fm.charsWidth(s.array, s.offset, offset + 1) > width) {
-                offset--;
-            }
-        }
-        return offset;
-    }
-
-    /**
      * Determine where to break the given text to fit
      * within the given span. This tries to find a word boundary.
      * @param s  the source of the text
@@ -443,7 +429,6 @@
         int txtCount = s.count;
         int index = Utilities.getTabbedTextOffset(s, metrics, x0, x,
                                                   e, startOffset, false);
-        index = adjustOffsetForFractionalMetrics(s, metrics, index, x - x0);
 
         if (index >= txtCount - 1) {
             return txtCount;
--- a/jdk/src/share/classes/javax/swing/text/WrappedPlainView.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/text/WrappedPlainView.java	Fri Mar 18 15:44:45 2011 -0700
@@ -239,11 +239,9 @@
                                                 tabBase, tabBase + currentWidth,
                                                 this, p0);
         } else {
-            int offset = Utilities.getTabbedTextOffset(segment, metrics,
-                    tabBase, tabBase + currentWidth, this, p0, false);
-            offset = Utilities.adjustOffsetForFractionalMetrics(
-                    segment, metrics, offset, currentWidth);
-            p = p0 + offset;
+            p = p0 + Utilities.getTabbedTextOffset(segment, metrics,
+                                                   tabBase, tabBase + currentWidth,
+                                                   this, p0, false);
         }
         SegmentCache.releaseSharedSegment(segment);
         return p;
--- a/jdk/src/share/classes/javax/swing/text/html/CSSBorder.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/javax/swing/text/html/CSSBorder.java	Fri Mar 18 15:44:45 2011 -0700
@@ -203,10 +203,11 @@
 
     public void paintBorder(Component c, Graphics g,
                                         int x, int y, int width, int height) {
-        assert (g instanceof Graphics2D) : "need Graphics2D instanse";
-        Graphics2D g2 = (Graphics2D) g;
-        Color savedColor = g2.getColor();
-        Shape savedClip = g2.getClip();
+        if (!(g instanceof Graphics2D)) {
+            return;
+        }
+
+        Graphics2D g2 = (Graphics2D) g.create();
 
         int[] widths = getWidths();
 
@@ -238,16 +239,16 @@
                 BorderPainter painter = getBorderPainter(i);
 
                 double angle = i * Math.PI / 2;
+                g2.setClip(g.getClip()); // Restore initial clip
                 g2.translate(intCorners[i][0], intCorners[i][1]);
                 g2.rotate(angle);
-                g2.setClip(shape);
-                painter.paint(shape, g, color, i);
+                g2.clip(shape);
+                painter.paint(shape, g2, color, i);
                 g2.rotate(-angle);
                 g2.translate(-intCorners[i][0], -intCorners[i][1]);
             }
         }
-        g2.setColor(savedColor);
-        g2.setClip(savedClip);
+        g2.dispose();
     }
 
 
--- a/jdk/src/share/classes/sun/font/StrikeCache.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/font/StrikeCache.java	Fri Mar 18 15:44:45 2011 -0700
@@ -319,8 +319,7 @@
                 ArrayList<Long> gids = null;
 
                 for (int i = 0; i < glyphPtrs.length; i++) {
-                    if (glyphPtrs[i] != 0 && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0
-                            && unsafe.getInt(glyphPtrs[i] + cacheCellOffset) != 0) {
+                    if (glyphPtrs[i] != 0 && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0) {
 
                         if (gids == null) {
                             gids = new ArrayList<Long>();
@@ -330,6 +329,8 @@
                 }
 
                 if (gids != null) {
+                    // Any reference by the disposers to the native glyph ptrs
+                    // must be done before this returns.
                     notifyDisposeListeners(gids);
                 }
             }
@@ -345,8 +346,7 @@
 
                 for (int i=0; i < glyphPtrs.length; i++) {
                     if (glyphPtrs[i] != 0
-                            && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0
-                            && unsafe.getInt(glyphPtrs[i] + cacheCellOffset) != 0) {
+                            && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0) {
 
                         if (gids == null) {
                             gids = new ArrayList<Long>();
@@ -356,6 +356,8 @@
                 }
 
                 if (gids != null) {
+                    // Any reference by the disposers to the native glyph ptrs
+                    // must be done before this returns.
                     notifyDisposeListeners(gids);
                 }
         }
--- a/jdk/src/share/classes/sun/java2d/pipe/AAShapePipe.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/java2d/pipe/AAShapePipe.java	Fri Mar 18 15:44:45 2011 -0700
@@ -109,7 +109,7 @@
         Region clip = sg.getCompClip();
         int abox[] = new int[4];
         AATileGenerator aatg =
-            renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0,
+            renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, lw1, lw2,
                                             clip, abox);
         if (aatg == null) {
             // Nothing to render
--- a/jdk/src/share/classes/sun/misc/BootClassLoaderHook.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2009, 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 sun.misc;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URLStreamHandlerFactory;
-import sun.misc.URLClassPath;
-
-/**
- * BootClassLoaderHook defines an interface for a hook to inject
- * into the bootstrap class loader.
- *
- * With jkernel now removed, no hook is set
- */
-public abstract class BootClassLoaderHook {
-    private static BootClassLoaderHook bootLoaderHook = null;
-    public static synchronized BootClassLoaderHook getHook() {
-        return bootLoaderHook;
-    }
-
-    public static synchronized void setHook(BootClassLoaderHook hook) {
-        if (!VM.isBooted()) {
-            throw new InternalError("hook can only be set after VM is booted");
-        }
-        if (bootLoaderHook != null) {
-            throw new InternalError("hook should not be reinitialized");
-        }
-        bootLoaderHook = hook;
-    }
-
-    protected BootClassLoaderHook() {
-    }
-
-    /**
-     * A method to be invoked before a class loader loads
-     * a bootstrap class.
-     *
-     * @param classname the binary name of the class
-     */
-    public static void preLoadClass(String classname) {
-        BootClassLoaderHook hook = getHook();
-        if (hook != null) {
-            hook.loadBootstrapClass(classname);
-        }
-    }
-
-    /**
-     * A method to be invoked before a class loader loads
-     * a resource.
-     *
-     * @param resourcename the resource name
-     */
-    public static void preLoadResource(String resourcename) {
-        BootClassLoaderHook hook = getHook();
-        if (hook != null) {
-            hook.getBootstrapResource(resourcename);
-        }
-    }
-
-    /**
-     * A method to be invoked before a library is loaded.
-     *
-     * @param libname the name of the library
-     */
-    public static void preLoadLibrary(String libname) {
-        BootClassLoaderHook hook = getHook();
-        if (hook != null) {
-            hook.loadLibrary(libname);
-        }
-    }
-
-    /**
-     * Returns a pathname of a JAR or class that the hook loads
-     * per this loadClass request; or null.
-     *
-     * @param classname the binary name of the class
-     */
-    public abstract String loadBootstrapClass(String className);
-
-    /**
-     * Returns a pathname of a resource file that the hook loads
-     * per this getResource request; or null.
-     *
-     * @param resourceName the resource name
-     */
-    public abstract String getBootstrapResource(String resourceName);
-
-    /**
-     * Returns true if the hook successfully performs an operation per
-     * this loadLibrary request; or false if it fails.
-     *
-     * @param libname the name of the library
-     */
-    public abstract boolean loadLibrary(String libname);
-
-    /**
-     * Returns a bootstrap class path constructed by the hook.
-     *
-     * @param bcp VM's bootstrap class path
-     * @param factory Launcher's URL stream handler
-     */
-    public abstract URLClassPath getBootstrapClassPath(URLClassPath bcp,
-            URLStreamHandlerFactory factory);
-
-    /**
-     * Returns true if the current thread is in the process of doing
-     * a prefetching operation.
-     */
-    public abstract boolean isCurrentThreadPrefetching();
-
-    /**
-     * Returns true if the hook successfully prefetches the specified file.
-     *
-     * @param name a platform independent pathname
-     */
-    public abstract boolean prefetchFile(String name);
-}
--- a/jdk/src/share/classes/sun/misc/JavaSecurityCodeSignerAccess.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * 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 sun.misc;
-
-import java.security.CodeSigner;
-import java.security.cert.CRL;
-
-public interface JavaSecurityCodeSignerAccess {
-    void setCRLs(CodeSigner signer, CRL[] crls);
-    CRL[] getCRLs(CodeSigner signer);
-}
--- a/jdk/src/share/classes/sun/misc/Launcher.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/misc/Launcher.java	Fri Mar 18 15:44:45 2011 -0700
@@ -38,7 +38,6 @@
 import java.util.Set;
 import java.util.Vector;
 import java.security.AccessController;
-import java.security.AllPermission;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedExceptionAction;
 import java.security.AccessControlContext;
@@ -117,18 +116,6 @@
         return loader;
     }
 
-    public static void addURLToAppClassLoader(URL u) {
-        AccessController.checkPermission(new AllPermission());
-        ClassLoader loader = Launcher.getLauncher().getClassLoader();
-        ((Launcher.AppClassLoader) loader).addAppURL(u);
-    }
-
-    public static void addURLToExtClassLoader(URL u) {
-        AccessController.checkPermission(new AllPermission());
-        ClassLoader loader = Launcher.getLauncher().getClassLoader();
-        ((Launcher.ExtClassLoader) loader.getParent()).addExtURL(u);
-    }
-
     /*
      * The class loader used for loading installed extensions.
      */
@@ -247,11 +234,6 @@
             return null;
         }
 
-        protected Class findClass(String name) throws ClassNotFoundException {
-            BootClassLoaderHook.preLoadClass(name);
-            return super.findClass(name);
-        }
-
         private static AccessControlContext getContext(File[] dirs)
             throws IOException
         {
@@ -316,7 +298,6 @@
         public Class loadClass(String name, boolean resolve)
             throws ClassNotFoundException
         {
-            BootClassLoaderHook.preLoadClass(name);
             int i = name.lastIndexOf('.');
             if (i != -1) {
                 SecurityManager sm = System.getSecurityManager();
@@ -373,10 +354,6 @@
 
             return acc;
         }
-
-        void addAppURL(URL url) {
-            super.addURL(url);
-        }
     }
 
     private static class BootClassPathHolder {
@@ -413,11 +390,7 @@
     }
 
     public static URLClassPath getBootstrapClassPath() {
-        URLClassPath bcp = BootClassPathHolder.bcp;
-        // if DownloadManager is installed, return the bootstrap class path
-        // maintained by the Java kernel
-        BootClassLoaderHook hook = BootClassLoaderHook.getHook();
-        return hook == null ? bcp : hook.getBootstrapClassPath(bcp, factory);
+        return BootClassPathHolder.bcp;
     }
 
     private static URL[] pathToURLs(File[] path) {
--- a/jdk/src/share/classes/sun/misc/SharedSecrets.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/misc/SharedSecrets.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
 import java.util.jar.JarFile;
 import java.io.Console;
 import java.io.FileDescriptor;
-import java.security.CodeSigner;
 import java.security.ProtectionDomain;
 
 /** A repository of "shared secrets", which are a mechanism for
@@ -49,7 +48,6 @@
     private static JavaNioAccess javaNioAccess;
     private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
     private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess;
-    private static JavaSecurityCodeSignerAccess javaSecurityCodeSignerAccess;
 
     public static JavaUtilJarAccess javaUtilJarAccess() {
         if (javaUtilJarAccess == null) {
@@ -127,16 +125,4 @@
                 unsafe.ensureClassInitialized(ProtectionDomain.class);
             return javaSecurityProtectionDomainAccess;
     }
-
-    public static void setJavaSecurityCodeSignerAccess
-            (JavaSecurityCodeSignerAccess jscsa) {
-        javaSecurityCodeSignerAccess = jscsa;
-    }
-
-    public static JavaSecurityCodeSignerAccess
-            getJavaSecurityCodeSignerAccess() {
-        if (javaSecurityCodeSignerAccess == null)
-            unsafe.ensureClassInitialized(CodeSigner.class);
-        return javaSecurityCodeSignerAccess;
-    }
 }
--- a/jdk/src/share/classes/sun/net/httpserver/ChunkedInputStream.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/net/httpserver/ChunkedInputStream.java	Fri Mar 18 15:44:45 2011 -0700
@@ -69,32 +69,33 @@
      */
     private int readChunkHeader () throws IOException {
         boolean gotCR = false;
-        char c;
+        int c;
         char[] len_arr = new char [16];
         int len_size = 0;
         boolean end_of_len = false;
 
-        while ((c=(char)in.read())!= -1) {
+        while ((c=in.read())!= -1) {
+            char ch = (char) c;
             if (len_size == len_arr.length -1) {
                 throw new IOException ("invalid chunk header");
             }
             if (gotCR) {
-                if (c == LF) {
+                if (ch == LF) {
                     int l = numeric (len_arr, len_size);
                     return l;
                 } else {
                     gotCR = false;
                 }
                 if (!end_of_len) {
-                    len_arr[len_size++] = c;
+                    len_arr[len_size++] = ch;
                 }
             } else {
-                if (c == CR) {
+                if (ch == CR) {
                     gotCR = true;
-                } else if (c == ';') {
+                } else if (ch == ';') {
                     end_of_len = true;
                 } else if (!end_of_len) {
-                    len_arr[len_size++] = c;
+                    len_arr[len_size++] = ch;
                 }
             }
         }
--- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -475,8 +475,8 @@
                 assert !target.isOpen();
                 try {
                     close();
-                } catch (IOException ignore) {
-                    // nothing we can do
+                } catch (Throwable suppressed) {
+                    e.addSuppressed(suppressed);
                 }
                 throw e;
             } catch (IOException ioe) {
--- a/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -42,14 +42,12 @@
  * Cipher implementation class. This class currently supports
  * DES, DESede, AES, ARCFOUR, and Blowfish.
  *
- * This class is designed to support ECB and CBC with NoPadding and
- * PKCS5Padding for both. It will use its own padding impl if the
- * native mechanism does not support padding.
+ * This class is designed to support ECB, CBC, CTR with NoPadding
+ * and ECB, CBC with PKCS5Padding. It will use its own padding impl
+ * if the native mechanism does not support padding.
  *
- * Note that PKCS#11 current only supports ECB and CBC. There are no
- * provisions for other modes such as CFB, OFB, PCBC, or CTR mode.
- * However, CTR could be implemented relatively easily (and efficiently)
- * on top of ECB mode in this class, if need be.
+ * Note that PKCS#11 currently only supports ECB, CBC, and CTR.
+ * There are no provisions for other modes such as CFB, OFB, and PCBC.
  *
  * @author  Andreas Sterbenz
  * @since   1.5
@@ -60,6 +58,8 @@
     private final static int MODE_ECB = 3;
     // mode constant for CBC mode
     private final static int MODE_CBC = 4;
+    // mode constant for CTR mode
+    private final static int MODE_CTR = 5;
 
     // padding constant for NoPadding
     private final static int PAD_NONE = 5;
@@ -157,7 +157,7 @@
     private byte[] padBuffer;
     private int padBufferLen;
 
-    // original IV, if in MODE_CBC
+    // original IV, if in MODE_CBC or MODE_CTR
     private byte[] iv;
 
     // number of bytes buffered internally by the native mechanism and padBuffer
@@ -213,6 +213,8 @@
                         ("CBC mode not supported with stream ciphers");
             }
             result = MODE_CBC;
+        } else if (mode.equals("CTR")) {
+            result = MODE_CTR;
         } else {
             throw new NoSuchAlgorithmException("Unsupported mode " + mode);
         }
@@ -228,6 +230,10 @@
         if (padding.equals("NOPADDING")) {
             paddingType = PAD_NONE;
         } else if (padding.equals("PKCS5PADDING")) {
+            if (this.blockMode == MODE_CTR) {
+                throw new NoSuchPaddingException
+                    ("PKCS#5 padding not supported with CTR mode");
+            }
             paddingType = PAD_PKCS5;
             if (mechanism != CKM_DES_CBC_PAD && mechanism != CKM_DES3_CBC_PAD &&
                     mechanism != CKM_AES_CBC_PAD) {
@@ -348,11 +354,14 @@
                             ("IV not used in ECB mode");
                 }
             }
-        } else { // MODE_CBC
+        } else { // MODE_CBC or MODE_CTR
             if (iv == null) {
                 if (encrypt == false) {
-                    throw new InvalidAlgorithmParameterException
-                            ("IV must be specified for decryption in CBC mode");
+                    String exMsg =
+                        (blockMode == MODE_CBC ?
+                         "IV must be specified for decryption in CBC mode" :
+                         "IV must be specified for decryption in CTR mode");
+                    throw new InvalidAlgorithmParameterException(exMsg);
                 }
                 // generate random IV
                 if (random == null) {
@@ -410,13 +419,15 @@
         if (session == null) {
             session = token.getOpSession();
         }
+        CK_MECHANISM mechParams = (blockMode == MODE_CTR?
+            new CK_MECHANISM(mechanism, new CK_AES_CTR_PARAMS(iv)) :
+            new CK_MECHANISM(mechanism, iv));
+
         try {
             if (encrypt) {
-                token.p11.C_EncryptInit(session.id(),
-                        new CK_MECHANISM(mechanism, iv), p11Key.keyID);
+                token.p11.C_EncryptInit(session.id(), mechParams, p11Key.keyID);
             } else {
-                token.p11.C_DecryptInit(session.id(),
-                        new CK_MECHANISM(mechanism, iv), p11Key.keyID);
+                token.p11.C_DecryptInit(session.id(), mechParams, p11Key.keyID);
             }
         } catch (PKCS11Exception ex) {
             // release session when initialization failed
--- a/jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -62,6 +62,11 @@
     // mode constant for public key decryption (verifying)
     private final static int MODE_VERIFY  = 4;
 
+    // padding type constant for NoPadding
+    private final static int PAD_NONE = 1;
+    // padding type constant for PKCS1Padding
+    private final static int PAD_PKCS1 = 2;
+
     // token instance
     private final Token token;
 
@@ -77,6 +82,9 @@
     // mode, one of MODE_* above
     private int mode;
 
+    // padding, one of PAD_* above
+    private int padType;
+
     private byte[] buffer;
     private int bufOfs;
 
@@ -113,8 +121,10 @@
     protected void engineSetPadding(String padding)
             throws NoSuchPaddingException {
         String lowerPadding = padding.toLowerCase(Locale.ENGLISH);
-        if (lowerPadding.equals("pkcs1Padding")) {
-            // empty
+        if (lowerPadding.equals("pkcs1padding")) {
+            padType = PAD_PKCS1;
+        } else if (lowerPadding.equals("nopadding")) {
+            padType = PAD_NONE;
         } else {
             throw new NoSuchPaddingException("Unsupported padding " + padding);
         }
@@ -209,7 +219,8 @@
         int n = (p11Key.keyLength() + 7) >> 3;
         outputSize = n;
         buffer = new byte[n];
-        maxInputSize = encrypt ? (n - PKCS1_MIN_PADDING_LENGTH) : n;
+        maxInputSize = ((padType == PAD_PKCS1 && encrypt) ?
+                            (n - PKCS1_MIN_PADDING_LENGTH) : n);
         try {
             initialize();
         } catch (PKCS11Exception e) {
--- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -621,12 +621,16 @@
                 m(CKM_AES_CBC_PAD, CKM_AES_CBC));
         d(CIP, "AES/ECB",                       P11Cipher,      s("AES"),
                 m(CKM_AES_ECB));
+        d(CIP, "AES/CTR/NoPadding",             P11Cipher,
+                m(CKM_AES_CTR));
         d(CIP, "Blowfish/CBC",                  P11Cipher,
                 m(CKM_BLOWFISH_CBC));
 
         // XXX RSA_X_509, RSA_OAEP not yet supported
-        d(CIP, "RSA/ECB/PKCS1Padding",          P11RSACipher,
+        d(CIP, "RSA/ECB/PKCS1Padding",          P11RSACipher,   s("RSA"),
                 m(CKM_RSA_PKCS));
+        d(CIP, "RSA/ECB/NoPadding",             P11RSACipher,
+                m(CKM_RSA_X_509));
 
         d(SIG, "RawDSA",        P11Signature,           s("NONEwithDSA"),
                 m(CKM_DSA));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011, 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 sun.security.pkcs11.wrapper;
+
+/**
+ * This class represents the necessary parameters required by
+ * the CKM_AES_CTR mechanism as defined in CK_AES_CTR_PARAMS structure.<p>
+ * <B>PKCS#11 structure:</B>
+ * <PRE>
+ * typedef struct CK_AES_CTR_PARAMS {
+ *   CK_ULONG ulCounterBits;
+ *   CK_BYTE cb[16];
+ * } CK_AES_CTR_PARAMS;
+ * </PRE>
+ *
+ * @author Yu-Ching Valerie Peng
+ * @since   1.7
+ */
+public class CK_AES_CTR_PARAMS {
+
+    private final long ulCounterBits;
+    private final byte cb[];
+
+    public CK_AES_CTR_PARAMS(byte[] cb) {
+        ulCounterBits = 128;
+        this.cb = cb.clone();
+    }
+
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+
+        buffer.append(Constants.INDENT);
+        buffer.append("ulCounterBits: ");
+        buffer.append(ulCounterBits);
+        buffer.append(Constants.NEWLINE);
+
+        buffer.append(Constants.INDENT);
+        buffer.append("cb: ");
+        buffer.append(Functions.toHexString(cb));
+
+        return buffer.toString();
+    }
+}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -48,6 +48,7 @@
 package sun.security.pkcs11.wrapper;
 
 import java.math.BigInteger;
+import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
 /**
  * class CK_MECHANISM specifies a particular mechanism and any parameters it
@@ -127,6 +128,10 @@
         init(mechanism, params);
     }
 
+    public CK_MECHANISM(long mechanism, CK_AES_CTR_PARAMS params) {
+        init(mechanism, params);
+    }
+
     private void init(long mechanism, Object pParameter) {
         this.mechanism = mechanism;
         this.pParameter = pParameter;
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -47,8 +47,6 @@
 
 package sun.security.pkcs11.wrapper;
 
-
-
 /**
  * This interface holds constants of the PKCS#11 v2.11 standard.
  * This is mainly the content of the 'pkcs11t.h' header file.
@@ -306,6 +304,10 @@
 
     public static final long  CKK_VENDOR_DEFINED  = 0x80000000L;
 
+    // new for v2.20 amendment 3
+    //public static final long  CKK_CAMELLIA          = 0x00000025L;
+    //public static final long  CKK_ARIA              = 0x00000026L;
+
     // pseudo key type ANY (for template manager)
     public static final long  PCKK_ANY            = 0x7FFFFF22L;
 
@@ -690,6 +692,34 @@
 
     public static final long  CKM_VENDOR_DEFINED             = 0x80000000L;
 
+    // new for v2.20 amendment 3
+    public static final long  CKM_SHA224                     = 0x00000255L;
+    public static final long  CKM_SHA224_HMAC                = 0x00000256L;
+    public static final long  CKM_SHA224_HMAC_GENERAL        = 0x00000257L;
+    public static final long  CKM_SHA224_KEY_DERIVATION      = 0x00000396L;
+    public static final long  CKM_SHA224_RSA_PKCS            = 0x00000046L;
+    public static final long  CKM_SHA224_RSA_PKCS_PSS        = 0x00000047L;
+    public static final long  CKM_AES_CTR                    = 0x00001086L;
+    /*
+    public static final long  CKM_CAMELLIA_KEY_GEN           = 0x00000550L;
+    public static final long  CKM_CAMELLIA_ECB               = 0x00000551L;
+    public static final long  CKM_CAMELLIA_CBC               = 0x00000552L;
+    public static final long  CKM_CAMELLIA_MAC               = 0x00000553L;
+    public static final long  CKM_CAMELLIA_MAC_GENERAL       = 0x00000554L;
+    public static final long  CKM_CAMELLIA_CBC_PAD           = 0x00000555L;
+    public static final long  CKM_CAMELLIA_ECB_ENCRYPT_DATA  = 0x00000556L;
+    public static final long  CKM_CAMELLIA_CBC_ENCRYPT_DATA  = 0x00000557L;
+    public static final long  CKM_CAMELLIA_CTR               = 0x00000558L;
+    public static final long  CKM_ARIA_KEY_GEN               = 0x00000560L;
+    public static final long  CKM_ARIA_ECB                   = 0x00000561L;
+    public static final long  CKM_ARIA_CBC                   = 0x00000562L;
+    public static final long  CKM_ARIA_MAC                   = 0x00000563L;
+    public static final long  CKM_ARIA_MAC_GENERAL           = 0x00000564L;
+    public static final long  CKM_ARIA_CBC_PAD               = 0x00000565L;
+    public static final long  CKM_ARIA_ECB_ENCRYPT_DATA      = 0x00000566L;
+    public static final long  CKM_ARIA_CBC_ENCRYPT_DATA      = 0x00000567L;
+    */
+
     // NSS private
     public static final long  CKM_NSS_TLS_PRF_GENERAL        = 0x80000373L;
 
@@ -881,7 +911,8 @@
 
     /* The following MGFs are defined */
     public static final long  CKG_MGF1_SHA1       =  0x00000001L;
-
+    // new for v2.20 amendment 3
+    public static final long  CKG_MGF1_SHA224     = 0x00000005L;
 
     /* The following encoding parameter sources are defined */
     public static final long  CKZ_DATA_SPECIFIED   = 0x00000001L;
--- a/jdk/src/share/classes/sun/security/tools/JarSigner.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/tools/JarSigner.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -26,7 +26,6 @@
 package sun.security.tools;
 
 import java.io.*;
-import java.security.cert.X509CRL;
 import java.util.*;
 import java.util.zip.*;
 import java.util.jar.*;
@@ -36,7 +35,6 @@
 import java.text.Collator;
 import java.text.MessageFormat;
 import java.security.cert.Certificate;
-import java.security.cert.CRL;
 import java.security.cert.X509Certificate;
 import java.security.cert.CertificateException;
 import java.security.*;
@@ -58,7 +56,6 @@
 import sun.security.x509.*;
 import sun.security.util.*;
 import sun.misc.BASE64Encoder;
-import sun.misc.SharedSecrets;
 
 
 /**
@@ -117,13 +114,11 @@
     static final int SIGNED_BY_ALIAS = 0x08;    // signer is in alias list
 
     X509Certificate[] certChain;    // signer's cert chain (when composing)
-    Set<X509CRL> crls;                 // signer provided CRLs
     PrivateKey privateKey;          // private key
     KeyStore store;                 // the keystore specified by -keystore
                                     // or the default keystore, never null
 
     String keystore; // key store file
-    List<String> crlfiles = new ArrayList<>();  // CRL files to add
     boolean nullStream = false; // null keystore input stream (NONE)
     boolean token = false; // token-based keystore
     String jarfile;  // jar files to sign or verify
@@ -151,7 +146,6 @@
     boolean signManifest = true; // "sign" the whole manifest
     boolean externalSF = true; // leave the .SF out of the PKCS7 block
     boolean strict = false;  // treat warnings as error
-    boolean autoCRL = false;    // Automatcially add CRL defined in cert
 
     // read zip entry raw bytes
     private ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
@@ -232,29 +226,6 @@
             } else {
                 loadKeyStore(keystore, true);
                 getAliasInfo(alias);
-                crls = new HashSet<X509CRL>();
-                if (crlfiles.size() > 0 || autoCRL) {
-                    CertificateFactory fac =
-                            CertificateFactory.getInstance("X509");
-                    List<CRL> list = new ArrayList<>();
-                    for (String file: crlfiles) {
-                        Collection<? extends CRL> tmp = KeyTool.loadCRLs(file);
-                        for (CRL crl: tmp) {
-                            if (crl instanceof X509CRL) {
-                                crls.add((X509CRL)crl);
-                            }
-                        }
-                    }
-                    if (autoCRL) {
-                        List<CRL> crlsFromCert =
-                                KeyTool.readCRLsFromCert(certChain[0]);
-                        for (CRL crl: crlsFromCert) {
-                            if (crl instanceof X509CRL) {
-                                crls.add((X509CRL)crl);
-                            }
-                        }
-                    }
-                }
 
                 // load the alternative signing mechanism
                 if (altSignerClass != null) {
@@ -396,13 +367,6 @@
             } else if (collator.compare(flags, "-digestalg") ==0) {
                 if (++n == args.length) usageNoArg();
                 digestalg = args[n];
-            } else if (collator.compare(flags, "-crl") ==0) {
-                if ("auto".equals(modifier)) {
-                    autoCRL = true;
-                } else {
-                    if (++n == args.length) usageNoArg();
-                    crlfiles.add(args[n]);
-                }
             } else if (collator.compare(flags, "-certs") ==0) {
                 showcerts = true;
             } else if (collator.compare(flags, "-strict") ==0) {
@@ -549,9 +513,6 @@
                 (".sigalg.algorithm.name.of.signature.algorithm"));
         System.out.println();
         System.out.println(rb.getString
-                (".crl.auto.file.include.CRL.in.signed.jar"));
-        System.out.println();
-        System.out.println(rb.getString
                 (".verify.verify.a.signed.JAR.file"));
         System.out.println();
         System.out.println(rb.getString
@@ -691,20 +652,6 @@
                             if (showcerts) {
                                 sb.append(si);
                                 sb.append('\n');
-                                CRL[] crls = SharedSecrets
-                                        .getJavaSecurityCodeSignerAccess()
-                                        .getCRLs(signer);
-                                if (crls != null) {
-                                    for (CRL crl: crls) {
-                                        if (crl instanceof X509CRLImpl) {
-                                            sb.append(tab).append("[");
-                                            sb.append(String.format(
-                                                    rb.getString("with.a.CRL.including.d.entries"),
-                                                    ((X509CRLImpl)crl).getRevokedCertificates().size()))
-                                                .append("]\n");
-                                        }
-                                    }
-                                }
                             }
                         }
                     } else if (showcerts && !verbose.equals("all")) {
@@ -1284,7 +1231,7 @@
 
             try {
                 block =
-                    sf.generateBlock(privateKey, sigalg, certChain, crls,
+                    sf.generateBlock(privateKey, sigalg, certChain,
                         externalSF, tsaUrl, tsaCert, signingMechanism, args,
                         zipFile);
             } catch (SocketTimeoutException e) {
@@ -2249,7 +2196,6 @@
     public Block generateBlock(PrivateKey privateKey,
                                String sigalg,
                                X509Certificate[] certChain,
-                               Set<X509CRL> crls,
                                boolean externalSF, String tsaUrl,
                                X509Certificate tsaCert,
                                ContentSigner signingMechanism,
@@ -2257,7 +2203,7 @@
         throws NoSuchAlgorithmException, InvalidKeyException, IOException,
             SignatureException, CertificateException
     {
-        return new Block(this, privateKey, sigalg, certChain, crls, externalSF,
+        return new Block(this, privateKey, sigalg, certChain, externalSF,
                 tsaUrl, tsaCert, signingMechanism, args, zipFile);
     }
 
@@ -2271,8 +2217,7 @@
          * Construct a new signature block.
          */
         Block(SignatureFile sfg, PrivateKey privateKey, String sigalg,
-            X509Certificate[] certChain, Set<X509CRL> crls,
-            boolean externalSF, String tsaUrl,
+            X509Certificate[] certChain, boolean externalSF, String tsaUrl,
             X509Certificate tsaCert, ContentSigner signingMechanism,
             String[] args, ZipFile zipFile)
             throws NoSuchAlgorithmException, InvalidKeyException, IOException,
@@ -2359,7 +2304,7 @@
             // Assemble parameters for the signing mechanism
             ContentSignerParameters params =
                 new JarSignerParameters(args, tsaUri, tsaCert, signature,
-                    signatureAlgorithm, certChain, crls, content, zipFile);
+                    signatureAlgorithm, certChain, content, zipFile);
 
             // Generate the signature block
             block = signingMechanism.generateSignedData(
@@ -2400,7 +2345,6 @@
     private byte[] signature;
     private String signatureAlgorithm;
     private X509Certificate[] signerCertificateChain;
-    private Set<X509CRL> crls;
     private byte[] content;
     private ZipFile source;
 
@@ -2409,8 +2353,7 @@
      */
     JarSignerParameters(String[] args, URI tsa, X509Certificate tsaCertificate,
         byte[] signature, String signatureAlgorithm,
-        X509Certificate[] signerCertificateChain, Set<X509CRL> crls,
-        byte[] content,
+        X509Certificate[] signerCertificateChain, byte[] content,
         ZipFile source) {
 
         if (signature == null || signatureAlgorithm == null ||
@@ -2423,7 +2366,6 @@
         this.signature = signature;
         this.signatureAlgorithm = signatureAlgorithm;
         this.signerCertificateChain = signerCertificateChain;
-        this.crls = crls;
         this.content = content;
         this.source = source;
     }
@@ -2499,13 +2441,4 @@
     public ZipFile getSource() {
         return source;
     }
-
-    @Override
-    public Set<X509CRL> getCRLs() {
-        if (crls == null) {
-            return Collections.emptySet();
-        } else {
-            return Collections.unmodifiableSet(crls);
-        }
-    }
 }
--- a/jdk/src/share/classes/sun/security/tools/JarSignerResources.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/tools/JarSignerResources.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, 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
@@ -74,8 +74,6 @@
                 "[-digestalg <algorithm>]    name of digest algorithm"},
         {".sigalg.algorithm.name.of.signature.algorithm",
                 "[-sigalg <algorithm>]       name of signature algorithm"},
-        {".crl.auto.file.include.CRL.in.signed.jar",
-                "[-crl[:auto| <file>]        include CRL in signed jar"},
         {".verify.verify.a.signed.JAR.file",
                 "[-verify]                   verify a signed JAR file"},
         {".verbose.suboptions.verbose.output.when.signing.verifying.",
@@ -193,7 +191,6 @@
         {"using.an.alternative.signing.mechanism",
                 "using an alternative signing mechanism"},
         {"entry.was.signed.on", "entry was signed on {0}"},
-        {"with.a.CRL.including.d.entries", "with a CRL including %d entries"},
         {"Warning.", "Warning: "},
         {"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.",
                 "This jar contains unsigned entries which have not been integrity-checked. "},
--- a/jdk/src/share/classes/sun/security/tools/KeyTool.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
 
 package sun.security.tools;
 
-import sun.misc.SharedSecrets;
 import java.io.*;
 import java.security.CodeSigner;
 import java.security.KeyStore;
@@ -2311,16 +2310,6 @@
                                     out.println();
                                 }
                             }
-                            CRL[] crls = SharedSecrets
-                                    .getJavaSecurityCodeSignerAccess()
-                                    .getCRLs(signer);
-                            if (crls != null) {
-                                out.println(rb.getString("CRLs."));
-                                out.println();
-                                for (CRL crl: crls) {
-                                    printCRL(crl, out);
-                                }
-                            }
                         }
                     }
                 }
--- a/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,6 @@
 import java.util.List;
 
 import com.sun.jarsigner.*;
-import java.security.cert.X509CRL;
 import java.util.Arrays;
 import sun.security.pkcs.*;
 import sun.security.timestamp.*;
@@ -238,9 +237,8 @@
         AlgorithmId[] algorithms = {digestAlgorithmId};
 
         // Create the PKCS #7 signed data message
-        PKCS7 p7 =
-            new PKCS7(algorithms, contentInfo, signerCertificateChain,
-                    parameters.getCRLs().toArray(new X509CRL[parameters.getCRLs().size()]), signerInfos);
+        PKCS7 p7 = new PKCS7(algorithms, contentInfo, signerCertificateChain,
+                null, signerInfos);
         ByteArrayOutputStream p7out = new ByteArrayOutputStream();
         p7.encodeSignedData(p7out);
 
--- a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java	Fri Mar 18 15:44:45 2011 -0700
@@ -37,7 +37,6 @@
 import sun.security.pkcs.*;
 import sun.security.timestamp.TimestampToken;
 import sun.misc.BASE64Decoder;
-import sun.misc.SharedSecrets;
 
 import sun.security.jca.Providers;
 
@@ -486,12 +485,7 @@
                 signers = new ArrayList<CodeSigner>();
             }
             // Append the new code signer
-            CodeSigner signer = new CodeSigner(certChain, getTimestamp(info));
-            if (block.getCRLs() != null) {
-                SharedSecrets.getJavaSecurityCodeSignerAccess().setCRLs(
-                        signer, block.getCRLs());
-            }
-            signers.add(signer);
+            signers.add(new CodeSigner(certChain, getTimestamp(info)));
 
             if (debug != null) {
                 debug.println("Signature Block Certificate: " +
--- a/jdk/src/share/classes/sun/tools/native2ascii/Main.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/tools/native2ascii/Main.java	Fri Mar 18 15:44:45 2011 -0700
@@ -94,7 +94,7 @@
      * Run the converter
      */
     public synchronized boolean convert(String argv[]){
-        Vector v = new Vector(2);
+        List<String> v = new ArrayList<>(2);
         File outputFile = null;
         boolean createOutputFile = false;
 
@@ -115,7 +115,7 @@
                     usage();
                     return false;
                 }
-                v.addElement(argv[i]);
+                v.add(argv[i]);
             }
         }
         if (encodingString == null)
@@ -126,11 +126,11 @@
             initializeConverter();
 
             if (v.size() == 1)
-                inputFileName = (String)v.elementAt(0);
+                inputFileName = v.get(0);
 
             if (v.size() == 2) {
-                inputFileName = (String)v.elementAt(0);
-                outputFileName = (String)v.elementAt(1);
+                inputFileName = v.get(0);
+                outputFileName = v.get(1);
                 createOutputFile = true;
             }
 
@@ -363,9 +363,7 @@
 
     private String formatMsg(String key, String arg) {
         String msg = getMsg(key);
-        String[] args = new String[1];
-        args[0] = arg;
-        return MessageFormat.format(msg, (Object)args);
+        return MessageFormat.format(msg, arg);
     }
 
 
--- a/jdk/src/share/classes/sun/util/calendar/LocalGregorianCalendar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/util/calendar/LocalGregorianCalendar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -127,7 +127,9 @@
             calendarProps = (Properties) AccessController.doPrivileged(new PrivilegedExceptionAction() {
                 public Object run() throws IOException {
                     Properties props = new Properties();
-                    props.load(new FileInputStream(fname));
+                    try (FileInputStream fis = new FileInputStream(fname)) {
+                        props.load(fis);
+                    }
                     return props;
                 }
             });
--- a/jdk/src/share/classes/sun/util/calendar/ZoneInfo.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/classes/sun/util/calendar/ZoneInfo.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, 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
@@ -266,7 +266,7 @@
         int index = getTransitionIndex(date, type);
 
         // prior to the transition table, returns the raw offset.
-        // should support LMT.
+        // FIXME: should support LMT.
         if (index < 0) {
             int offset = getLastRawOffset();
             if (offsets != null) {
@@ -297,7 +297,13 @@
             if (type != UTC_TIME) {
                 msec -= rawOffset;
             }
-            int dstoffset = tz.inDaylightTime(new Date(msec)) ? tz.getDSTSavings() : 0;
+            int dstoffset = tz.getOffset(msec) - rawOffset;
+
+            // Check if it's in a standard-to-daylight transition.
+            if (dstoffset > 0 && tz.getOffset(msec - dstoffset) == rawoffset) {
+                dstoffset = 0;
+            }
+
             if (offsets != null) {
                 offsets[0] = rawoffset;
                 offsets[1] = dstoffset;
@@ -452,6 +458,36 @@
         return (simpleTimeZoneParams != null);
     }
 
+    @Override
+    public boolean observesDaylightTime() {
+        if (simpleTimeZoneParams != null) {
+            return true;
+        }
+        if (transitions == null) {
+            return false;
+        }
+
+        // Look up the transition table to see if it's in DST right
+        // now or if there's any standard-to-daylight transition at
+        // any future.
+        long utc = System.currentTimeMillis() - rawOffsetDiff;
+        int index = getTransitionIndex(utc, UTC_TIME);
+
+        // before transitions in the transition table
+        if (index < 0) {
+            return false;
+        }
+
+        // the time is in the table range.
+        for (int i = index; i < transitions.length; i++) {
+            if ((transitions[i] & DST_MASK) != 0) {
+                return true;
+            }
+        }
+        // No further DST is observed.
+        return false;
+    }
+
     /**
      * Queries if the specified date is in Daylight Saving Time.
      */
--- a/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipDirectoryStream.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipDirectoryStream.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -76,7 +76,7 @@
         } catch (IOException e) {
             throw new IllegalStateException(e);
         }
-        return new Iterator<>() {
+        return new Iterator<Path>() {
             private Path next;
             @Override
             public boolean hasNext() {
--- a/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystem.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystem.java	Fri Mar 18 15:44:45 2011 -0700
@@ -112,11 +112,8 @@
         }
         // sm and existence check
         zfpath.getFileSystem().provider().checkAccess(zfpath, AccessMode.READ);
-        try {
-            zfpath.getFileSystem().provider().checkAccess(zfpath, AccessMode.WRITE);
-        } catch (AccessDeniedException x) {
+        if (!Files.isWritable(zfpath))
             this.readOnly = true;
-        }
         this.zc = ZipCoder.get(nameEncoding);
         this.defaultdir = new ZipPath(this, getBytes(defaultDir));
         this.ch = Files.newByteChannel(zfpath, READ);
--- a/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipPath.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipPath.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -590,7 +590,7 @@
 
     @Override
     public Iterator<Path> iterator() {
-        return new Iterator<>() {
+        return new Iterator<Path>() {
             private int i = 0;
 
             @Override
--- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -695,6 +695,46 @@
 }
 
 /*
+ * converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS structure
+ *
+ * @param env - used to call JNI funktions to get the Java classes and objects
+ * @param jParam - the Java CK_AES_CTR_PARAMS object to convert
+ * @param ckpParam - pointer to the new CK_AES_CTR_PARAMS structure
+ */
+void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam,
+                                  CK_AES_CTR_PARAMS_PTR ckpParam) {
+    jclass jAesCtrParamsClass;
+    jfieldID fieldID;
+    jlong jCounterBits;
+    jobject jCb;
+    CK_BYTE_PTR ckBytes;
+    CK_ULONG ckTemp;
+
+    /* get ulCounterBits */
+    jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
+    if (jAesCtrParamsClass == NULL) { return; }
+    fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J");
+    if (fieldID == NULL) { return; }
+    jCounterBits = (*env)->GetLongField(env, jParam, fieldID);
+
+    /* get cb */
+    fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "cb", "[B");
+    if (fieldID == NULL) { return; }
+    jCb = (*env)->GetObjectField(env, jParam, fieldID);
+
+    /* populate java values */
+    ckpParam->ulCounterBits = jLongToCKULong(jCounterBits);
+    jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp);
+    if ((*env)->ExceptionCheck(env)) { return; }
+    if (ckTemp != 16) {
+        TRACE1("ERROR: WRONG CTR IV LENGTH %d", ckTemp);
+    } else {
+        memcpy(ckpParam->cb, ckBytes, ckTemp);
+        free(ckBytes);
+    }
+}
+
+/*
  * converts a Java CK_MECHANISM object into a CK_MECHANISM structure
  *
  * @param env - used to call JNI funktions to get the values out of the Java object
@@ -937,12 +977,10 @@
 {
     /* get all Java mechanism parameter classes */
     jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass;
-    jclass jTlsPrfParamsClass, jRsaPkcsOaepParamsClass, jPbeParamsClass;
-    jclass jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
+    jclass jTlsPrfParamsClass, jAesCtrParamsClass, jRsaPkcsOaepParamsClass;
+    jclass jPbeParamsClass, jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
     jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass;
     jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass;
-
-    /* get all Java mechanism parameter classes */
     TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter");
 
     /* most common cases, i.e. NULL/byte[]/long, are already handled by
@@ -1046,6 +1084,33 @@
         return;
     }
 
+    jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
+    if (jAesCtrParamsClass == NULL) { return; }
+    if ((*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) {
+        /*
+         * CK_AES_CTR_PARAMS
+         */
+        CK_AES_CTR_PARAMS_PTR ckpParam;
+
+        ckpParam = (CK_AES_CTR_PARAMS_PTR) malloc(sizeof(CK_AES_CTR_PARAMS));
+        if (ckpParam == NULL) {
+            JNU_ThrowOutOfMemoryError(env, 0);
+            return;
+        }
+
+        /* convert jParameter to CKParameter */
+        jAesCtrParamsToCKAesCtrParam(env, jParam, ckpParam);
+        if ((*env)->ExceptionCheck(env)) {
+            free(ckpParam);
+            return;
+        }
+
+        /* get length and pointer of parameter */
+        *ckpLength = sizeof(CK_AES_CTR_PARAMS);
+        *ckpParamPtr = ckpParam;
+        return;
+    }
+
     jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
     if (jRsaPkcsOaepParamsClass == NULL) { return; }
     if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs-11v2-20a3.h	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,124 @@
+/* pkcs-11v2-20a3.h include file for the PKCS #11 Version 2.20 Amendment 3
+   document. */
+
+/* $Revision: 1.4 $ */
+
+/* License to copy and use this software is granted provided that it is
+ * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface
+ * (Cryptoki) Version 2.20 Amendment 3" in all material mentioning or
+ * referencing this software.
+
+ * RSA Security Inc. makes no representations concerning either the
+ * merchantability of this software or the suitability of this software for
+ * any particular purpose. It is provided "as is" without express or implied
+ * warranty of any kind.
+ */
+
+/* This file is preferably included after inclusion of pkcs11.h */
+
+#ifndef _PKCS_11V2_20A3_H_
+#define _PKCS_11V2_20A3_H_ 1
+
+/* Are the definitions of this file already included in pkcs11t.h ? */
+#ifndef CKK_CAMELLIA
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Key types */
+
+/* Camellia is new for PKCS #11 v2.20 amendment 3 */
+#define CKK_CAMELLIA                   0x00000025
+/* ARIA is new for PKCS #11 v2.20 amendment 3 */
+#define CKK_ARIA                       0x00000026
+
+
+/* Mask-generating functions */
+
+/* SHA-224 is new for PKCS #11 v2.20 amendment 3 */
+#define CKG_MGF1_SHA224                0x00000005
+
+
+/* Mechanism Identifiers */
+
+/* SHA-224 is new for PKCS #11 v2.20 amendment 3 */
+#define CKM_SHA224                     0x00000255
+#define CKM_SHA224_HMAC                0x00000256
+#define CKM_SHA224_HMAC_GENERAL        0x00000257
+
+/* SHA-224 key derivation is new for PKCS #11 v2.20 amendment 3 */
+#define CKM_SHA224_KEY_DERIVATION      0x00000396
+
+/* SHA-224 RSA mechanisms are new for PKCS #11 v2.20 amendment 3 */
+#define CKM_SHA224_RSA_PKCS            0x00000046
+#define CKM_SHA224_RSA_PKCS_PSS        0x00000047
+
+/* AES counter mode is new for PKCS #11 v2.20 amendment 3 */
+#define CKM_AES_CTR                    0x00001086
+
+/* Camellia is new for PKCS #11 v2.20 amendment 3 */
+#define CKM_CAMELLIA_KEY_GEN           0x00000550
+#define CKM_CAMELLIA_ECB               0x00000551
+#define CKM_CAMELLIA_CBC               0x00000552
+#define CKM_CAMELLIA_MAC               0x00000553
+#define CKM_CAMELLIA_MAC_GENERAL       0x00000554
+#define CKM_CAMELLIA_CBC_PAD           0x00000555
+#define CKM_CAMELLIA_ECB_ENCRYPT_DATA  0x00000556
+#define CKM_CAMELLIA_CBC_ENCRYPT_DATA  0x00000557
+#define CKM_CAMELLIA_CTR               0x00000558
+
+/* ARIA is new for PKCS #11 v2.20 amendment 3 */
+#define CKM_ARIA_KEY_GEN               0x00000560
+#define CKM_ARIA_ECB                   0x00000561
+#define CKM_ARIA_CBC                   0x00000562
+#define CKM_ARIA_MAC                   0x00000563
+#define CKM_ARIA_MAC_GENERAL           0x00000564
+#define CKM_ARIA_CBC_PAD               0x00000565
+#define CKM_ARIA_ECB_ENCRYPT_DATA      0x00000566
+#define CKM_ARIA_CBC_ENCRYPT_DATA      0x00000567
+
+
+/* Mechanism parameters */
+
+/* CK_AES_CTR_PARAMS is new for PKCS #11 v2.20 amendment 3 */
+typedef struct CK_AES_CTR_PARAMS {
+    CK_ULONG ulCounterBits;
+    CK_BYTE cb[16];
+} CK_AES_CTR_PARAMS;
+
+typedef CK_AES_CTR_PARAMS CK_PTR CK_AES_CTR_PARAMS_PTR;
+
+/* CK_CAMELLIA_CTR_PARAMS is new for PKCS #11 v2.20 amendment 3 */
+typedef struct CK_CAMELLIA_CTR_PARAMS {
+    CK_ULONG ulCounterBits;
+    CK_BYTE cb[16];
+} CK_CAMELLIA_CTR_PARAMS;
+
+typedef CK_CAMELLIA_CTR_PARAMS CK_PTR CK_CAMELLIA_CTR_PARAMS_PTR;
+
+/* CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS is new for PKCS #11 v2.20 amendment 3 */
+typedef struct CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS {
+    CK_BYTE      iv[16];
+    CK_BYTE_PTR  pData;
+    CK_ULONG     length;
+} CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS;
+
+typedef CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS CK_PTR CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS_PTR;
+
+/* CK_ARIA_CBC_ENCRYPT_DATA_PARAMS is new for PKCS #11 v2.20 amendment 3 */
+typedef struct CK_ARIA_CBC_ENCRYPT_DATA_PARAMS {
+    CK_BYTE      iv[16];
+    CK_BYTE_PTR  pData;
+    CK_ULONG     length;
+} CK_ARIA_CBC_ENCRYPT_DATA_PARAMS;
+
+typedef CK_ARIA_CBC_ENCRYPT_DATA_PARAMS CK_PTR CK_ARIA_CBC_ENCRYPT_DATA_PARAMS_PTR;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif
--- a/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -153,6 +153,7 @@
 #include "p11_md.h"
 
 #include "pkcs11.h"
+#include "pkcs-11v2-20a3.h"
 #include <jni.h>
 #include <jni_util.h>
 
@@ -272,6 +273,7 @@
 #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS"
 #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS"
 #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS"
+#define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS"
 
 /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception
  * or to throw a PKCS11RuntimeException
--- a/jdk/src/solaris/classes/java/util/prefs/FileSystemPreferences.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/classes/java/util/prefs/FileSystemPreferences.java	Fri Mar 18 15:44:45 2011 -0700
@@ -571,9 +571,9 @@
                     long newLastSyncTime = 0;
                     try {
                         newLastSyncTime = prefsFile.lastModified();
-                        FileInputStream fis = new FileInputStream(prefsFile);
-                        XmlSupport.importMap(fis, m);
-                        fis.close();
+                        try (FileInputStream fis = new FileInputStream(prefsFile)) {
+                            XmlSupport.importMap(fis, m);
+                        }
                     } catch(Exception e) {
                         if (e instanceof InvalidPreferencesFormatException) {
                             getLogger().warning("Invalid preferences format in "
@@ -618,9 +618,9 @@
                         if (!dir.exists() && !dir.mkdirs())
                             throw new BackingStoreException(dir +
                                                              " create failed.");
-                        FileOutputStream fos = new FileOutputStream(tmpFile);
-                        XmlSupport.exportMap(fos, prefsCache);
-                        fos.close();
+                        try (FileOutputStream fos = new FileOutputStream(tmpFile)) {
+                            XmlSupport.exportMap(fos, prefsCache);
+                        }
                         if (!tmpFile.renameTo(prefsFile))
                             throw new BackingStoreException("Can't rename " +
                             tmpFile + " to " + prefsFile);
--- a/jdk/src/solaris/classes/sun/font/XRGlyphCache.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/classes/sun/font/XRGlyphCache.java	Fri Mar 18 15:44:45 2011 -0700
@@ -70,9 +70,14 @@
         try {
             SunToolkit.awtLock();
 
-            ArrayList<Integer> glyphIDList = new ArrayList<Integer>(glyphPtrList.size());
+            GrowableIntArray glyphIDList = new GrowableIntArray(1, glyphPtrList.size());
             for (long glyphPtr : glyphPtrList) {
-                glyphIDList.add(XRGlyphCacheEntry.getGlyphID(glyphPtr));
+                int glyphID = XRGlyphCacheEntry.getGlyphID(glyphPtr);
+
+                //Check if glyph hasn't been freed already
+                if (glyphID != 0) {
+                   glyphIDList.addInt(glyphID);
+                }
             }
             freeGlyphs(glyphIDList);
         } finally {
@@ -83,7 +88,6 @@
     protected int getFreeGlyphID() {
         if (freeGlyphIDs.size() > 0) {
             int newID = freeGlyphIDs.remove(freeGlyphIDs.size() - 1);
-            ;
             return newID;
         }
         return nextID++;
@@ -246,7 +250,7 @@
             glyph.setPinned();
         }
 
-        ArrayList<Integer> deleteGlyphList = new ArrayList<Integer>();
+        GrowableIntArray deleteGlyphList = new GrowableIntArray(1, 10);
         int pixelsToRelease = cachedPixels - MAX_CACHED_PIXELS;
 
         for (int i = cacheList.size() - 1; i >= 0 && pixelsToRelease > 0; i--) {
@@ -254,7 +258,7 @@
 
             if (!entry.isPinned()) {
                 pixelsToRelease -= entry.getPixelCnt();
-                deleteGlyphList.add(new Integer(entry.getGlyphID()));
+                deleteGlyphList.addInt(entry.getGlyphID());
             }
         }
 
@@ -265,26 +269,23 @@
         freeGlyphs(deleteGlyphList);
     }
 
-    private void freeGlyphs(List<Integer> glyphIdList) {
-
-        freeGlyphIDs.addAll(glyphIdList);
+    private void freeGlyphs(GrowableIntArray glyphIdList) {
+        GrowableIntArray removedLCDGlyphs = new GrowableIntArray(1, 10);
+        GrowableIntArray removedGrayscaleGlyphs = new GrowableIntArray(1, 10);
 
-        GrowableIntArray removedLCDGlyphs = new GrowableIntArray(1, 1);
-        GrowableIntArray removedGrayscaleGlyphs = new GrowableIntArray(1, 1);
+        for (int i=0; i < glyphIdList.getSize(); i++) {
+            int glyphId = glyphIdList.getInt(i);
+            freeGlyphIDs.add(glyphId);
 
-        for (Integer glyphId : glyphIdList) {
-            tmp.setValue(glyphId.intValue());
+            tmp.setValue(glyphId);
             XRGlyphCacheEntry entry = cacheMap.get(tmp);
             cachedPixels -= entry.getPixelCnt();
-
-            int removedGlyphID = entry.getGlyphID();
-            tmp.setValue(removedGlyphID);
             cacheMap.remove(tmp);
 
             if (entry.getGlyphSet() == grayGlyphSet) {
-                removedGrayscaleGlyphs.addInt(removedGlyphID);
+                removedGrayscaleGlyphs.addInt(glyphId);
             } else {
-                removedLCDGlyphs.addInt(removedGlyphID);
+                removedLCDGlyphs.addInt(glyphId);
             }
 
             entry.setGlyphID(0);
--- a/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java	Fri Mar 18 15:44:45 2011 -0700
@@ -55,6 +55,8 @@
 
     native void initXRPicture(long xsdo, int pictForm);
 
+    native void freeXSDOPicture(long xsdo);
+
     public static final String DESC_BYTE_A8_X11 = "Byte A8 Pixmap";
     public static final String DESC_INT_RGB_X11 = "Integer RGB Pixmap";
     public static final String DESC_INT_ARGB_X11 = "Integer ARGB-Pre Pixmap";
@@ -531,6 +533,17 @@
         public Object getDestination() {
             return peer.getTarget();
         }
+
+       public void invalidate() {
+           try {
+               SunToolkit.awtLock();
+               freeXSDOPicture(getNativeOps());
+           }finally {
+               SunToolkit.awtUnlock();
+           }
+
+           super.invalidate();
+       }
     }
 
     public static class XRInternalSurfaceData extends XRSurfaceData {
--- a/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -236,7 +236,9 @@
         } catch (SecurityException x) {
             try {
                 ch.close();
-            } catch (IOException ignore) { }
+            } catch (Throwable suppressed) {
+                x.addSuppressed(suppressed);
+            }
             throw x;
         }
         return ch;
--- a/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -137,7 +137,7 @@
         return port;
     }
 
-    // register for events if there are outstanding I/O operations
+    // register events for outstanding I/O operations, caller already owns updateLock
     private void updateEvents() {
         assert Thread.holdsLock(updateLock);
         int events = 0;
@@ -149,6 +149,13 @@
             port.startPoll(fdVal, events);
     }
 
+    // register events for outstanding I/O operations
+    private void lockAndUpdateEvents() {
+        synchronized (updateLock) {
+            updateEvents();
+        }
+    }
+
     // invoke to finish read and/or write operations
     private void finish(boolean mayInvokeDirect,
                         boolean readable,
@@ -255,10 +262,11 @@
             // close channel if connection cannot be established
             try {
                 close();
-            } catch (IOException ignore) { }
+            } catch (Throwable suppressed) {
+                e.addSuppressed(suppressed);
+            }
         }
 
-
         // invoke handler and set result
         CompletionHandler<Void,Object> handler = connectHandler;
         Object att = connectAttachment;
@@ -345,7 +353,9 @@
         if (e != null) {
             try {
                 close();
-            } catch (IOException ignore) { }
+            } catch (Throwable suppressed) {
+                e.addSuppressed(suppressed);
+            }
         }
         if (handler == null) {
             return CompletedFuture.withResult(null, e);
@@ -399,9 +409,8 @@
             exc = x;
         } finally {
             // restart poll in case of concurrent write
-            synchronized (updateLock) {
-                updateEvents();
-            }
+            if (!(exc instanceof AsynchronousCloseException))
+                lockAndUpdateEvents();
             end();
         }
 
@@ -595,9 +604,8 @@
             exc = x;
         } finally {
             // restart poll in case of concurrent write
-            synchronized (updateLock) {
-                updateEvents();
-            }
+            if (!(exc instanceof AsynchronousCloseException))
+                lockAndUpdateEvents();
             end();
         }
 
--- a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -77,22 +77,24 @@
          */
 #endif /* __linux__ */
         struct hostent res, res2, *hp;
-        char buf[HENT_BUF_SIZE];
-        char buf2[HENT_BUF_SIZE];
+        // these buffers must be pointer-aligned so they are declared
+        // with pointer type
+        char *buf[HENT_BUF_SIZE/(sizeof (char *))];
+        char *buf2[HENT_BUF_SIZE/(sizeof (char *))];
         int h_error=0;
 
 #ifdef __GLIBC__
-        gethostbyname_r(hostname, &res, buf, sizeof(buf), &hp, &h_error);
+        gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &hp, &h_error);
 #else
-        hp = gethostbyname_r(hostname, &res, buf, sizeof(buf), &h_error);
+        hp = gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &h_error);
 #endif
         if (hp) {
 #ifdef __GLIBC__
             gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET,
-                            &res2, buf2, sizeof(buf2), &hp, &h_error);
+                            &res2, (char*)buf2, sizeof(buf2), &hp, &h_error);
 #else
             hp = gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET,
-                                 &res2, buf2, sizeof(buf2), &h_error);
+                                 &res2, (char*)buf2, sizeof(buf2), &h_error);
 #endif
             if (hp) {
                 /*
@@ -136,7 +138,9 @@
     const char *hostname;
     jobjectArray ret = 0;
     struct hostent res, *hp = 0;
-    char buf[HENT_BUF_SIZE];
+    // this buffer must be pointer-aligned so is declared
+    // with pointer type
+    char *buf[HENT_BUF_SIZE/(sizeof (char *))];
 
     /* temporary buffer, on the off chance we need to expand */
     char *tmp = NULL;
@@ -176,9 +180,9 @@
 
     /* Try once, with our static buffer. */
 #ifdef __GLIBC__
-    gethostbyname_r(hostname, &res, buf, sizeof(buf), &hp, &h_error);
+    gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &hp, &h_error);
 #else
-    hp = gethostbyname_r(hostname, &res, buf, sizeof(buf), &h_error);
+    hp = gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &h_error);
 #endif
 
     /* With the re-entrant system calls, it's possible that the buffer
@@ -251,7 +255,9 @@
     jstring ret = NULL;
     jint addr;
     struct hostent hent, *hp = 0;
-    char buf[HENT_BUF_SIZE];
+    // this buffer must be pointer-aligned so is declared
+    // with pointer type
+    char *buf[HENT_BUF_SIZE/(sizeof (char *))];
     int h_error = 0;
     char *tmp = NULL;
 
@@ -273,10 +279,10 @@
     addr = htonl(addr);
 #ifdef __GLIBC__
     gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent,
-                    buf, sizeof(buf), &hp, &h_error);
+                    (char*)buf, sizeof(buf), &hp, &h_error);
 #else
     hp = gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent,
-                         buf, sizeof(buf), &h_error);
+                         (char*)buf, sizeof(buf), &h_error);
 #endif
     /* With the re-entrant system calls, it's possible that the buffer
      * we pass to it is not large enough to hold an exceptionally
--- a/jdk/src/solaris/native/java/net/NetworkInterface.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c	Fri Mar 18 15:44:45 2011 -0700
@@ -45,7 +45,6 @@
 #ifdef __linux__
 #include <sys/ioctl.h>
 #include <bits/ioctls.h>
-#include <linux/sockios.h>
 #include <sys/utsname.h>
 #include <stdio.h>
 #endif
@@ -1100,7 +1099,7 @@
 #ifdef AF_INET6
 static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) {
     FILE *f;
-    char addr6[40], devname[20];
+    char addr6[40], devname[21];
     char addr6p[8][5];
     int plen, scope, dad_status, if_idx;
     uint8_t ipv6addr[16];
--- a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Fri Mar 18 15:44:45 2011 -0700
@@ -34,8 +34,8 @@
 #include <fcntl.h>
 #endif
 #ifdef __linux__
-#include <linux/unistd.h>
-#include <linux/sysctl.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
 #include <sys/utsname.h>
 #include <netinet/ip.h>
 
--- a/jdk/src/solaris/native/java/net/PlainSocketImpl.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/PlainSocketImpl.c	Fri Mar 18 15:44:45 2011 -0700
@@ -42,8 +42,8 @@
 #include <fcntl.h>
 #endif
 #ifdef __linux__
-#include <linux/unistd.h>
-#include <linux/sysctl.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
 #endif
 
 #include "jvm.h"
--- a/jdk/src/solaris/native/java/net/linux_close.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/linux_close.c	Fri Mar 18 15:44:45 2011 -0700
@@ -112,7 +112,7 @@
  */
 static inline fdEntry_t *getFdEntry(int fd)
 {
-    if (fd < 0 || fd > fdCount) {
+    if (fd < 0 || fd >= fdCount) {
         return NULL;
     }
     return &fdTable[fd];
--- a/jdk/src/solaris/native/java/net/net_util_md.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/java/net/net_util_md.c	Fri Mar 18 15:44:45 2011 -0700
@@ -608,7 +608,7 @@
     {
         /* now find the scope_id for "lo" */
 
-        char devname[20];
+        char devname[21];
         char addr6p[8][5];
         int plen, scope, dad_status, if_idx;
 
@@ -651,7 +651,7 @@
 static void initLocalIfs () {
     FILE *f;
     unsigned char staddr [16];
-    char ifname [32];
+    char ifname [33];
     struct localinterface *lif=0;
     int index, x1, x2, x3;
     unsigned int u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,ua,ub,uc,ud,ue,uf;
@@ -660,7 +660,7 @@
         return ;
     }
     while (fscanf (f, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x "
-                "%d %x %x %x %s",&u0,&u1,&u2,&u3,&u4,&u5,&u6,&u7,
+                "%d %x %x %x %32s",&u0,&u1,&u2,&u3,&u4,&u5,&u6,&u7,
                 &u8,&u9,&ua,&ub,&uc,&ud,&ue,&uf,
                 &index, &x1, &x2, &x3, ifname) == 21) {
         staddr[0] = (unsigned char)u0;
@@ -1102,7 +1102,7 @@
      * index.
      */
     if (match) {
-        char devname[20];
+        char devname[21];
         char addr6p[8][5];
         int plen, scope, dad_status, if_idx;
 
--- a/jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c	Fri Mar 18 15:44:45 2011 -0700
@@ -375,6 +375,12 @@
     AWT_LOCK();
 
     xsdo->invalid = JNI_TRUE;
+
+    if (xsdo->xrPic != None) {
+        XRenderFreePicture(awt_display, xsdo->xrPic);
+        xsdo->xrPic = None;
+     }
+
     if (xsdo->isPixmap == JNI_TRUE && xsdo->drawable != 0) {
 #ifdef MITSHM
         if (xsdo->shmPMData.shmSegInfo != NULL) {
--- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c	Fri Mar 18 15:44:45 2011 -0700
@@ -304,23 +304,27 @@
     color.blue = blue;
 
     if (rectCnt <= 256) {
-      xRects = &sRects[0];
+        xRects = &sRects[0];
     } else {
-      xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
-      if (xRects == NULL) {
-        return;
-      }
+        xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
+        if (xRects == NULL) {
+            return;
+        }
     }
 
-    if ((rects = (jint *) (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
-      return;
+    if ((rects = (jint *)
+         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
+        if (xRects != &sRects[0]) {
+            free(xRects);
+        }
+        return;
     }
 
     for (i=0; i < rectCnt; i++) {
-      xRects[i].x = rects[i*4 + 0];
-      xRects[i].y = rects[i*4 + 1];
-      xRects[i].width = rects[i*4 + 2];
-      xRects[i].height = rects[i*4 + 3];
+        xRects[i].x = rects[i*4 + 0];
+        xRects[i].y = rects[i*4 + 1];
+        xRects[i].width = rects[i*4 + 2];
+        xRects[i].height = rects[i*4 + 3];
     }
 
     XRenderFillRectangles(awt_display, op,
@@ -328,7 +332,7 @@
 
     (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
     if (xRects != &sRects[0]) {
-      free(xRects);
+        free(xRects);
     }
 }
 
@@ -610,17 +614,30 @@
     Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
 
     if (xginfo == NULL || gid == NULL) {
-      return;
+        if (xginfo != NULL) {
+            free(xginfo);
+        }
+        if (gid != NULL) {
+            free(gid);
+        }
+        return;
     }
 
-    if ((glyphInfoPtrs = (jlong *) (*env)->GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL) {
+    if ((glyphInfoPtrs = (jlong *)(*env)->
+        GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
+    {
+        free(xginfo);
+        free(gid);
         return;
     }
 
     if ((pixelData = (unsigned char *)
-        (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL) {
+        (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
+    {
         (*env)->ReleasePrimitiveArrayCritical(env,
-                                  glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
+                                glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
+        free(xginfo);
+        free(gid);
         return;
     }
 
@@ -637,7 +654,7 @@
     }
 
     XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
-                     pixelData, pixelDataLength);
+                     (const char*)pixelData, pixelDataLength);
 
     (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
     (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
@@ -684,22 +701,44 @@
       xelts = &selts[0];
     }else {
       xelts = (XGlyphElt32 *) malloc(sizeof(XGlyphElt32) * eltCnt);
+      if (xelts == NULL) {
+          return;
+      }
     }
 
     if (glyphCnt <= 256) {
       xids = &sids[0];
-    }else {
+    } else {
       xids = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
+      if (xids == NULL) {
+          if (xelts != &selts[0]) {
+            free(xelts);
+          }
+          return;
+      }
     }
 
-    if ((ids = (jint *) (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
-      return;
+    if ((ids = (jint *)
+         (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
+        if (xelts != &selts[0]) {
+            free(xelts);
+        }
+        if (xids != &sids[0]) {
+            free(xids);
+        }
+        return;
     }
     if ((elts = (jint *)
           (*env)->GetPrimitiveArrayCritical(env, eltArray, NULL)) == NULL) {
         (*env)->ReleasePrimitiveArrayCritical(env,
                                               glyphIDArray, ids, JNI_ABORT);
-      return;
+        if (xelts != &selts[0]) {
+            free(xelts);
+        }
+        if (xids != &sids[0]) {
+            free(xids);
+        }
+        return;
     }
 
     for (i=0; i < glyphCnt; i++) {
@@ -724,11 +763,11 @@
     (*env)->ReleasePrimitiveArrayCritical(env, eltArray, elts, JNI_ABORT);
 
     if (xelts != &selts[0]) {
-      free(xelts);
+        free(xelts);
     }
 
     if (xids != &sids[0]) {
-      free(xids);
+        free(xids);
     }
 }
 
@@ -762,8 +801,12 @@
       }
     }
 
-    if ((rects = (jint *) (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
-      return;
+    if ((rects = (jint*)
+         (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
+        if (xRects != &sRects[0]) {
+            free(xRects);
+        }
+        return;
     }
 
     for (i=0; i < rectCnt; i++) {
--- a/jdk/src/solaris/native/sun/java2d/x11/XRSurfaceData.c	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/solaris/native/sun/java2d/x11/XRSurfaceData.c	Fri Mar 18 15:44:45 2011 -0700
@@ -114,3 +114,26 @@
     XShared_initSurface(env, xsdo, depth, width, height, drawable);
 #endif /* !HEADLESS */
 }
+
+
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture(JNIEnv *env, jobject xsd,
+                                                  jlong pXSData)
+{
+#ifndef HEADLESS
+    X11SDOps *xsdo;
+
+    J2dTraceLn(J2D_TRACE_INFO, "in XRSurfaceData_freeXSDOPicture");
+
+    xsdo = X11SurfaceData_GetOps(env, xsd);
+    if (xsdo == NULL) {
+        return;
+    }
+
+    if(xsdo->xrPic != None) {
+       XRenderFreePicture(awt_display, xsdo->xrPic);
+       xsdo->xrPic = None;
+    }
+#endif /* !HEADLESS */
+}
--- a/jdk/src/windows/classes/sun/nio/ch/PendingIoCache.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/windows/classes/sun/nio/ch/PendingIoCache.java	Fri Mar 18 15:44:45 2011 -0700
@@ -110,8 +110,7 @@
             if (closed)
                 return;
 
-            // handle the case that where there are I/O operations that have
-            // not completed.
+            // handle case where I/O operations that have not completed.
             if (!pendingIoMap.isEmpty())
                 clearPendingIoMap();
 
@@ -132,7 +131,9 @@
         closePending = true;
         try {
             this.wait(50);
-        } catch (InterruptedException x) { }
+        } catch (InterruptedException x) {
+            Thread.currentThread().interrupt();
+        }
         closePending = false;
         if (pendingIoMap.isEmpty())
             return;
--- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -439,6 +439,7 @@
                 address = ((DirectBuffer)buf).address();
             }
 
+            boolean pending = false;
             try {
                 begin();
 
@@ -449,6 +450,7 @@
                 n = readFile(handle, address, rem, position, overlapped);
                 if (n == IOStatus.UNAVAILABLE) {
                     // I/O is pending
+                    pending = true;
                     return;
                 } else if (n == IOStatus.EOF) {
                     result.setResult(n);
@@ -460,14 +462,15 @@
                 // failed to initiate read
                 result.setFailure(toIOException(x));
             } finally {
+                if (!pending) {
+                    // release resources
+                    if (overlapped != 0L)
+                        ioCache.remove(overlapped);
+                    releaseBufferIfSubstituted();
+                }
                 end();
             }
 
-            // release resources
-            if (overlapped != 0L)
-                ioCache.remove(overlapped);
-            releaseBufferIfSubstituted();
-
             // invoke completion handler
             Invoker.invoke(result);
         }
--- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -239,14 +239,14 @@
                     result.setResult(null);
                 }
             } catch (Throwable x) {
+                if (overlapped != 0L)
+                    ioCache.remove(overlapped);
                 exc = x;
             } finally {
                 end();
             }
 
             if (exc != null) {
-                if (overlapped != 0L)
-                    ioCache.remove(overlapped);
                 closeChannel();
                 result.setFailure(toIOException(exc));
             }
--- a/jdk/src/windows/classes/sun/nio/fs/WindowsFileStore.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/src/windows/classes/sun/nio/fs/WindowsFileStore.java	Fri Mar 18 15:44:45 2011 -0700
@@ -201,13 +201,12 @@
         if (!(ob instanceof WindowsFileStore))
             return false;
         WindowsFileStore other = (WindowsFileStore)ob;
-        return this.volInfo.volumeSerialNumber() == other.volInfo.volumeSerialNumber();
+        return root.equals(other.root);
     }
 
     @Override
     public int hashCode() {
-        // reveals VSN without permission check - okay?
-        return volInfo.volumeSerialNumber();
+        return root.hashCode();
     }
 
     @Override
--- a/jdk/test/ProblemList.txt	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/ProblemList.txt	Fri Mar 18 15:44:45 2011 -0700
@@ -380,30 +380,9 @@
 
 # jdk_nio
 
-# 6944810
-java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java       windows-all
-
 # 6963118
 java/nio/channels/Selector/Wakeup.java                          windows-all
 
-# The asynchronous I/O implementation on Windows requires Windows XP or newer.
-# We can remove the following once all Windows 2000 machines have been
-# decommissioned.
-java/nio/channels/AsynchronousChannelGroup/Basic.java           windows-5.0
-java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java      windows-5.0
-java/nio/channels/AsynchronousChannelGroup/Identity.java        windows-5.0
-java/nio/channels/AsynchronousChannelGroup/Restart.java         windows-5.0
-java/nio/channels/AsynchronousChannelGroup/Unbounded.java       windows-5.0
-java/nio/channels/AsynchronousDatagramChannel/Basic.java        windows-5.0
-java/nio/channels/AsynchronousFileChannel/Lock.java             windows-5.0
-java/nio/channels/AsynchronousServerSocketChannel/Basic.java    windows-5.0
-java/nio/channels/AsynchronousServerSocketChannel/WithSecurityManager.java windows-5.0
-java/nio/channels/AsynchronousSocketChannel/Basic.java          windows-5.0
-java/nio/channels/AsynchronousSocketChannel/DieBeforeComplete.java windows-5.0
-java/nio/channels/AsynchronousSocketChannel/Leaky.java          windows-5.0
-java/nio/channels/AsynchronousSocketChannel/StressLoopback.java windows-5.0
-java/nio/channels/Channels/Basic2.java                          windows-5.0
-
 # 6959891
 com/sun/nio/sctp/SctpChannel/SocketOptionTests.java
 
@@ -625,9 +604,6 @@
 # Timeout on solaris-sparcv9 or exception thrown
 com/sun/crypto/provider/Cipher/RSA/TestOAEP_KAT.java	 	solaris-all
 
-# File 6535697.test input stream left open? windows samevm
-java/security/cert/CertificateFactory/openssl/OpenSSLCert.java	generic-all
-
 # Leaving file open: SerialVersion.current, windows samevm
 java/security/BasicPermission/SerialVersion.java		generic-all
 
@@ -717,6 +693,7 @@
 # Filed 6933803
 java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java	generic-all
 
+# Filed 7022325
 # Fails with assertion error on windows
 #   11 separate stacktraces created... file reuse problem?
 java/util/zip/ZipFile/ReadLongZipFileName.java			generic-all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jndi/ldap/NoWaitForReplyTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6748156
+ * @summary add an new JNDI property to control the boolean flag WaitForReply
+ */
+
+import java.net.Socket;
+import java.net.ServerSocket;
+import java.io.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+import java.util.Hashtable;
+
+public class NoWaitForReplyTest {
+
+    public static void main(String[] args) throws Exception {
+
+        boolean passed = false;
+
+        // start the LDAP server
+        DummyServer ldapServer = new DummyServer();
+        ldapServer.start();
+
+        // Set up the environment for creating the initial context
+        Hashtable env = new Hashtable(11);
+        env.put(Context.PROVIDER_URL, "ldap://localhost:" +
+            ldapServer.getPortNumber());
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+            "com.sun.jndi.ldap.LdapCtxFactory");
+
+        // Wait up to 10 seconds for a response from the LDAP server
+        env.put("com.sun.jndi.ldap.read.timeout", "10000");
+
+        // Don't wait until the first search reply is received
+        env.put("com.sun.jndi.ldap.search.waitForReply", "false");
+
+        // Send the LDAP search request without first authenticating (no bind)
+        env.put("java.naming.ldap.version", "3");
+
+
+        try {
+
+            // Create initial context
+            System.out.println("Client: connecting to the server");
+            DirContext ctx = new InitialDirContext(env);
+
+            SearchControls scl = new SearchControls();
+            scl.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            System.out.println("Client: performing search");
+            NamingEnumeration answer =
+            ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl);
+
+            // Server will never reply: either we waited in the call above until
+            // the timeout (fail) or we did not wait and reached here (pass).
+            passed = true;
+            System.out.println("Client: did not wait until first reply");
+
+            // Close the context when we're done
+            ctx.close();
+
+        } catch (NamingException e) {
+            // timeout (ignore)
+        }
+        ldapServer.interrupt();
+
+        if (!passed) {
+            throw new Exception(
+                "Test FAILED: should not have waited until first search reply");
+        }
+        System.out.println("Test PASSED");
+    }
+
+    static class DummyServer extends Thread {
+
+        private final ServerSocket serverSocket;
+
+        DummyServer() throws IOException {
+            this.serverSocket = new ServerSocket(0);
+            System.out.println("Server: listening on port " + serverSocket.getLocalPort());
+        }
+
+        public int getPortNumber() {
+            return serverSocket.getLocalPort();
+        }
+
+        public void run() {
+            try (Socket socket = serverSocket.accept()) {
+                System.out.println("Server: accepted a connection");
+                InputStream in = socket.getInputStream();
+
+                while (!isInterrupted()) {
+                   in.skip(in.available());
+                }
+
+            } catch (Exception e) {
+                // ignore
+
+            } finally {
+                System.out.println("Server: shutting down");
+                try {
+                    serverSocket.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/SurrogateTest/SupplementaryCanDisplayUpToTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6623219
+ * @summary Test canDisplayUpTo with supplementary characters.
+ */
+
+import java.awt.*;
+import java.text.*;
+
+public class SupplementaryCanDisplayUpToTest {
+    // Lists consisting of a font name, test text, and its expected
+    // return value. Test text uses private area code point U+F0000
+    // (\udb80\udc00).
+    private static String[][] DATA = {
+        // Windows
+        { "Meiryo", "\ud87e\udd45\ud87e\udd47\udb80\udc00", "4" },
+        { "Meiryo", "\ud87e\udd45\ud87e\udd47\udb80Z", "4" },
+        { "Meiryo", "\ud87e\udd45\ud87e\udd47\udb80", "4" },
+        { "Meiryo", "\ud87e\udd45\ud87e\udd47\udc00", "4" },
+        { "Meiryo", "\ud87e\udd45\ud87e\udd47", "-1" },
+
+        // Linux
+        { "AR PL UMing TW", "\ud87e\udc25\ud87e\udc3b\udb80\udc00", "4" },
+        { "AR PL UMing TW", "\ud87e\udc25\ud87e\udc3b\udb80Z", "4" },
+        { "AR PL UMing TW", "\ud87e\udc25\ud87e\udc3b\udb80", "4" },
+        { "AR PL UMing TW", "\ud87e\udc25\ud87e\udc3b\udc00", "4" },
+        { "AR PL UMing TW", "\ud87e\udc25\ud87e\udc3b", "-1" },
+
+        // Solaris
+        { "FZMingTi", "\ud87e\udc25\ud87e\udc3b\udb80\udc00", "4" },
+        { "FZMingTi", "\ud87e\udc25\ud87e\udc3b\udb80Z", "4" },
+        { "FZMingTi", "\ud87e\udc25\ud87e\udc3b\udb80", "4" },
+        { "FZMingTi", "\ud87e\udc25\ud87e\udc3b\udc00", "4" },
+        { "FZMingTi", "\ud87e\udc25\ud87e\udc3b", "-1" },
+    };
+    private static int errorcount = 0;
+
+    public static void main(String[] args) {
+        for (String[] data : DATA) {
+            String fontname = data[0];
+            Font font = new Font(fontname, Font.PLAIN, 16);
+            if (font.getFamily().equals(Font.DIALOG)) {
+                // Skip any unavailable fonts.
+                continue;
+            }
+
+            System.out.printf("Testing with font '%s'... ", fontname);
+            int errors = 0;
+            String text = data[1];
+            int expected = Integer.parseInt(data[2]);
+
+            int result = font.canDisplayUpTo(text);
+            if (result != expected) {
+                System.err.println("canDisplayUpTo(String) returns " + result);
+                errors++;
+            }
+
+            result = font.canDisplayUpTo(text.toCharArray(), 0, text.length());
+            if (result != expected) {
+                System.err.println("canDisplayUpTo(char[], int, int) returns " + result);
+                errors++;
+            }
+
+            CharacterIterator iter = new StringCharacterIterator(text);
+            result = font.canDisplayUpTo(iter, iter.getBeginIndex(), iter.getEndIndex());
+            if (result != expected) {
+                System.err.println("canDisplayUpTo(CharacterIterator, int, int) returns " + result);
+                errors++;
+            }
+
+            if (errors == 0) {
+                System.out.println("passed");
+            } else {
+                System.out.println("failed");
+                errorcount += errors;
+            }
+        }
+        if (errorcount > 0) {
+            throw new RuntimeException("SupplementaryCanDisplayUpToTest: failed");
+        }
+    }
+}
--- a/jdk/test/java/io/File/SetLastModified.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/File/SetLastModified.java	Fri Mar 18 15:44:45 2011 -0700
@@ -105,9 +105,9 @@
             System.getProperty("os.name").startsWith("Windows") ? 0L : 3L*G;
         long pos = 0L;
         while (pos <= MAX_POSITION) {
-            FileChannel fc = new FileOutputStream(f).getChannel();
-            fc.position(pos).write(ByteBuffer.wrap("x".getBytes()));
-            fc.close();
+            try (FileChannel fc = new FileOutputStream(f).getChannel()) {
+                fc.position(pos).write(ByteBuffer.wrap("x".getBytes()));
+            }
             ot = f.lastModified();
             System.out.format("check with file size: %d\n", f.length());
             if (!f.setLastModified(nt))
--- a/jdk/test/java/io/FileOutputStream/AtomicAppend.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/FileOutputStream/AtomicAppend.java	Fri Mar 18 15:44:45 2011 -0700
@@ -47,12 +47,12 @@
             for (int i = 0; i < nThreads; i++)
                 es.execute(new Runnable() { public void run() {
                     try {
-                        FileOutputStream s = new FileOutputStream(file, true);
-                        for (int j = 0; j < 1000; j++) {
-                            s.write((int) 'x');
-                            s.flush();
+                        try (FileOutputStream s = new FileOutputStream(file, true)) {
+                            for (int j = 0; j < 1000; j++) {
+                                s.write((int) 'x');
+                                s.flush();
+                            }
                         }
-                        s.close();
                     } catch (Throwable t) { unexpected(t); }}});
             es.shutdown();
             es.awaitTermination(10L, TimeUnit.MINUTES);
--- a/jdk/test/java/io/OutputStreamWriter/Encode.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/OutputStreamWriter/Encode.java	Fri Mar 18 15:44:45 2011 -0700
@@ -35,8 +35,9 @@
         new Encode();
     }
 
+    final ServerSocket ss = new ServerSocket(0);
+
     Encode() throws Exception {
-        ss = new ServerSocket(0);
         (new Thread(this)).start();
         String toEncode = "\uD800\uDC00 \uD801\uDC01 ";
         String enc1 = URLEncoder.encode(toEncode, "UTF-8");
@@ -47,27 +48,31 @@
             "/missing.nothtml";
         HttpURLConnection uc =  (HttpURLConnection)new URL(url).openConnection();
         uc.connect();
-        String enc2 = URLEncoder.encode(toEncode, "UTF-8");
-        if (!enc1.equals(enc2))
-            throw new RuntimeException("test failed");
-        uc.disconnect();
+        try {
+            String enc2 = URLEncoder.encode(toEncode, "UTF-8");
+            if (!enc1.equals(enc2)) {
+                System.out.println("test failed");
+                throw new RuntimeException("test failed");
+            }
+        } finally {
+            uc.disconnect();
+        }
     }
 
-    ServerSocket ss;
-
     public void run() {
-        try {
-            Socket s = ss.accept();
-            BufferedReader in = new BufferedReader(
-                new InputStreamReader(s.getInputStream()));
+        try (ServerSocket serv = ss;
+             Socket s = serv.accept();
+             BufferedReader in =
+                 new BufferedReader(new InputStreamReader(s.getInputStream())))
+        {
             String req = in.readLine();
-            PrintStream out = new PrintStream(new BufferedOutputStream(
-                s.getOutputStream()));
-            out.print("HTTP/1.1 403 Forbidden\r\n");
-            out.print("\r\n");
-            out.flush();
-            s.close();
-            ss.close();
+            try (OutputStream os = s.getOutputStream();
+                 BufferedOutputStream bos = new BufferedOutputStream(os);
+                 PrintStream out = new PrintStream(bos))
+            {
+                out.print("HTTP/1.1 403 Forbidden\r\n");
+                out.print("\r\n");
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
--- a/jdk/test/java/io/PrintStream/EncodingConstructor.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/PrintStream/EncodingConstructor.java	Fri Mar 18 15:44:45 2011 -0700
@@ -34,11 +34,11 @@
 
     public static void main(String args[]) throws Exception {
         ByteArrayOutputStream bo = new ByteArrayOutputStream();
-        PrintStream ps = new PrintStream(bo, false, "UTF-8");
         String s = "xyzzy";
         int n = s.length();
-        ps.print(s);
-        ps.close();
+        try (PrintStream ps = new PrintStream(bo, false, "UTF-8")) {
+            ps.print(s);
+        }
         byte[] ba = bo.toByteArray();
         if (ba.length != n)
             throw new Exception("Length mismatch: " + n + " " + ba.length);
--- a/jdk/test/java/io/PrintStream/FailingConstructors.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/PrintStream/FailingConstructors.java	Fri Mar 18 15:44:45 2011 -0700
@@ -35,6 +35,8 @@
 import java.io.IOException;
 import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 
 public class FailingConstructors {
     static final String fileName = "FailingConstructorsTest";
@@ -45,14 +47,13 @@
         test(false, new File(fileName));
 
         /* create the file and write its contents */
-        File file = File.createTempFile(fileName, null);
-        file.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(file);
-        fos.write(FILE_CONTENTS.getBytes());
-        fos.close();
-
-        test(true, file);
-        file.delete();
+        Path path = Files.createTempFile(fileName, null);
+        try {
+            Files.write(path, FILE_CONTENTS.getBytes());
+            test(true, path.toFile());
+        } finally {
+            Files.delete(path);
+        }
     }
 
     private static void test(boolean exists, File file) throws Throwable {
--- a/jdk/test/java/io/Serializable/evolution/RenamePackage/install/SerialDriver.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/Serializable/evolution/RenamePackage/install/SerialDriver.java	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,7 @@
  * @build install/SerialDriver.java test/SerialDriver.java extension/ExtendedObjectInputStream.java
  * @summary Enable resolveClass() to accommodate package renaming.
  * This fix enables one to implement a resolveClass method that maps a
- * Serialiazable class within a serialization stream to the same class
+ * Serializable class within a serialization stream to the same class
  * in a different package within the JVM runtime. See run shell script
  * for instructions on how to run this test.
  */
@@ -86,16 +86,15 @@
         File f = new File("stream.ser");
         if (serialize) {
             // Serialize the subclass
-            try {
-                FileOutputStream fo = new FileOutputStream(f);
-                ObjectOutputStream so = new ObjectOutputStream(fo);
+            try (FileOutputStream fo = new FileOutputStream(f);
+                 ObjectOutputStream so = new ObjectOutputStream(fo))
+            {
                 so.writeObject(obj);
                 /* Skip arrays since they do not work with rename yet.
                    The serialVersionUID changes due to the name change
                    and there is no way to set the serialVersionUID for an
                    array. */
                 so.writeObject(array);
-                so.flush();
             } catch (Exception e) {
                 System.out.println(e);
                 throw e;
@@ -103,16 +102,14 @@
         }
         if (deserialize) {
             // Deserialize the subclass
-            try {
-                FileInputStream fi = new FileInputStream(f);
-                ExtendedObjectInputStream si =
-                    new ExtendedObjectInputStream(fi);
+            try (FileInputStream fi = new FileInputStream(f);
+                 ExtendedObjectInputStream si = new ExtendedObjectInputStream(fi))
+            {
                 si.addRenamedClassName("test.SerialDriver", "install.SerialDriver");
                 si.addRenamedClassName("[Ltest.SerialDriver;",
                                        "[Linstall.SerialDriver");
                 obj = (SerialDriver) si.readObject();
                 array = (SerialDriver[]) si.readObject();
-                si.close();
             } catch (Exception e) {
                 System.out.println(e);
                 throw e;
--- a/jdk/test/java/io/Serializable/evolution/RenamePackage/test/SerialDriver.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/io/Serializable/evolution/RenamePackage/test/SerialDriver.java	Fri Mar 18 15:44:45 2011 -0700
@@ -27,7 +27,7 @@
  * @build install/SerialDriver.java test/SerialDriver.java extension/ExtendedObjectInputStream.java
  * @summary Enable resolveClass() to accommodate package renaming.
  * This fix enables one to implement a resolveClass method that maps a
- * Serialiazable class within a serialization stream to the same class
+ * Serializable class within a serialization stream to the same class
  * in a different package within the JVM runtime. See run shell script
  * for instructions on how to run this test.
  */
@@ -83,14 +83,13 @@
         File f = new File("stream.ser");
         if (serialize) {
             // Serialize the subclass
-            try {
-                FileOutputStream fo = new FileOutputStream(f);
-                ObjectOutputStream so = new ObjectOutputStream(fo);
+            try (FileOutputStream fo = new FileOutputStream(f);
+                 ObjectOutputStream so = new ObjectOutputStream(fo))
+            {
                 so.writeObject(obj);
                 /* Comment out since renaming arrays does not work
                    since it changes the serialVersionUID. */
                 so.writeObject(array);
-                so.flush();
             } catch (Exception e) {
                 System.out.println(e);
                 throw e;
@@ -98,16 +97,15 @@
         }
         if (deserialize) {
             // Deserialize the subclass
-            try {
-                FileInputStream fi = new FileInputStream(f);
-                ExtendedObjectInputStream si = new ExtendedObjectInputStream(fi);
+            try (FileInputStream fi = new FileInputStream(f);
+                 ExtendedObjectInputStream si = new ExtendedObjectInputStream(fi))
+            {
                 si.addRenamedClassName("install.SerialDriver",
                                        "test.SerialDriver");
                 si.addRenamedClassName("[Linstall.SerialDriver;",
                                        "[Ltest.SerialDriver");
                 obj = (SerialDriver) si.readObject();
                 array = (SerialDriver[]) si.readObject();
-                si.close();
             } catch (Exception e) {
                 System.out.println(e);
                 throw e;
--- a/jdk/test/java/lang/Character/CheckScript.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/Character/CheckScript.java	Fri Mar 18 15:44:45 2011 -0700
@@ -12,40 +12,43 @@
 
 public class CheckScript {
 
-    public static void main(String[] args) throws Exception {
-
-        BufferedReader sbfr = null;
+    static BufferedReader open(String[] args) throws FileNotFoundException {
         if (args.length == 0) {
-            sbfr = new BufferedReader(new FileReader(new File(System.getProperty("test.src", "."), "Scripts.txt")));
+            return new BufferedReader(new FileReader(new File(System.getProperty("test.src", "."), "Scripts.txt")));
         } else if (args.length == 1) {
-            sbfr = new BufferedReader(new FileReader(args[0]));
+            return new BufferedReader(new FileReader(args[0]));
         } else {
             System.out.println("java CharacterScript Scripts.txt");
             throw new RuntimeException("Datafile name should be specified.");
         }
+    }
+
+    public static void main(String[] args) throws Exception {
+
         Matcher m = Pattern.compile("(\\p{XDigit}+)(?:\\.{2}(\\p{XDigit}+))?\\s+;\\s+(\\w+)\\s+#.*").matcher("");
         String line = null;
         HashMap<String,ArrayList<Integer>> scripts = new HashMap<>();
-        while ((line = sbfr.readLine()) != null) {
-            if (line.length() <= 1 || line.charAt(0) == '#') {
-                continue;
-            }
-            m.reset(line);
-            if (m.matches()) {
-                int start = Integer.parseInt(m.group(1), 16);
-                int end = (m.group(2)==null)?start
-                                            :Integer.parseInt(m.group(2), 16);
-                String name = m.group(3).toLowerCase(Locale.ENGLISH);
-                ArrayList<Integer> ranges = scripts.get(name);
-                if (ranges == null) {
-                    ranges = new ArrayList<Integer>();
-                    scripts.put(name, ranges);
+        try (BufferedReader sbfr = open(args)) {
+            while ((line = sbfr.readLine()) != null) {
+                if (line.length() <= 1 || line.charAt(0) == '#') {
+                    continue;
                 }
-                ranges.add(start);
-                ranges.add(end);
+                m.reset(line);
+                if (m.matches()) {
+                    int start = Integer.parseInt(m.group(1), 16);
+                    int end = (m.group(2)==null)?start
+                                                :Integer.parseInt(m.group(2), 16);
+                    String name = m.group(3).toLowerCase(Locale.ENGLISH);
+                    ArrayList<Integer> ranges = scripts.get(name);
+                    if (ranges == null) {
+                        ranges = new ArrayList<Integer>();
+                        scripts.put(name, ranges);
+                    }
+                    ranges.add(start);
+                    ranges.add(end);
+                }
             }
         }
-        sbfr.close();
         // check all defined ranges
         Integer[] ZEROSIZEARRAY = new Integer[0];
         for (String name : scripts.keySet()) {
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java	Fri Mar 18 15:44:45 2011 -0700
@@ -26,7 +26,7 @@
  * @bug 4199068 4738465 4937983 4930681 4926230 4931433 4932663 4986689
  *      5026830 5023243 5070673 4052517 4811767 6192449 6397034 6413313
  *      6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958
- *      4947220
+ *      4947220 7018606
  * @summary Basic tests for Process and Environment Variable code
  * @run main/othervm/timeout=300 Basic
  * @author Martin Buchholz
@@ -47,6 +47,9 @@
 
 public class Basic {
 
+    /* used for Windows only */
+    static final String systemRoot = System.getenv("SystemRoot");
+
     private static String commandOutput(Reader r) throws Throwable {
         StringBuilder sb = new StringBuilder();
         int c;
@@ -1073,7 +1076,11 @@
         try {
             ProcessBuilder pb = new ProcessBuilder();
             pb.environment().clear();
-            equal(getenvInChild(pb), "");
+            String expected = Windows.is() ? "SystemRoot="+systemRoot+",": "";
+            if (Windows.is()) {
+                pb.environment().put("SystemRoot", systemRoot);
+            }
+            equal(getenvInChild(pb), expected);
         } catch (Throwable t) { unexpected(t); }
 
         //----------------------------------------------------------------
@@ -1561,13 +1568,21 @@
             List<String> childArgs = new ArrayList<String>(javaChildArgs);
             childArgs.add("System.getenv()");
             String[] cmdp = childArgs.toArray(new String[childArgs.size()]);
-            String[] envp = {"=ExitValue=3", "=C:=\\"};
+            String[] envp;
+            String[] envpWin = {"=ExitValue=3", "=C:=\\", "SystemRoot="+systemRoot};
+            String[] envpOth = {"=ExitValue=3", "=C:=\\"};
+            if (Windows.is()) {
+                envp = envpWin;
+            } else {
+                envp = envpOth;
+            }
             Process p = Runtime.getRuntime().exec(cmdp, envp);
-            String expected = Windows.is() ? "=C:=\\,=ExitValue=3," : "=C:=\\,";
+            String expected = Windows.is() ? "=C:=\\,SystemRoot="+systemRoot+",=ExitValue=3," : "=C:=\\,";
             equal(commandOutput(p), expected);
             if (Windows.is()) {
                 ProcessBuilder pb = new ProcessBuilder(childArgs);
                 pb.environment().clear();
+                pb.environment().put("SystemRoot", systemRoot);
                 pb.environment().put("=ExitValue", "3");
                 pb.environment().put("=C:", "\\");
                 equal(commandOutput(pb), expected);
@@ -1591,10 +1606,18 @@
             List<String> childArgs = new ArrayList<String>(javaChildArgs);
             childArgs.add("System.getenv()");
             String[] cmdp = childArgs.toArray(new String[childArgs.size()]);
-            String[] envp = {"LC_ALL=C\u0000\u0000", // Yuck!
+            String[] envpWin = {"SystemRoot="+systemRoot, "LC_ALL=C\u0000\u0000", // Yuck!
+                             "FO\u0000=B\u0000R"};
+            String[] envpOth = {"LC_ALL=C\u0000\u0000", // Yuck!
                              "FO\u0000=B\u0000R"};
+            String[] envp;
+            if (Windows.is()) {
+                envp = envpWin;
+            } else {
+                envp = envpOth;
+            }
             Process p = Runtime.getRuntime().exec(cmdp, envp);
-            check(commandOutput(p).equals("LC_ALL=C,"),
+            check(commandOutput(p).equals(Windows.is() ? "SystemRoot="+systemRoot+",LC_ALL=C," : "LC_ALL=C,"),
                   "Incorrect handling of envstrings containing NULs");
         } catch (Throwable t) { unexpected(t); }
 
@@ -2144,6 +2167,7 @@
     static void equal(Object x, Object y) {
         if (x == null ? y == null : x.equals(y)) pass();
         else fail(x + " not equal to " + y);}
+
     public static void main(String[] args) throws Throwable {
         try {realMain(args);} catch (Throwable t) {unexpected(t);}
         System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
--- a/jdk/test/java/lang/Runtime/shutdown/ShutdownHooks.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/Runtime/shutdown/ShutdownHooks.java	Fri Mar 18 15:44:45 2011 -0700
@@ -43,9 +43,9 @@
         file = new File(dir, args[1]);
         // write to file
         System.out.println("writing to "+ file);
-        PrintWriter pw = new PrintWriter(file);
-        pw.println("Shutdown begins");
-        pw.close();
+        try (PrintWriter pw = new PrintWriter(file)) {
+            pw.println("Shutdown begins");
+        }
     }
 
     public static class Cleaner extends Thread {
@@ -56,10 +56,8 @@
             // register the DeleteOnExitHook while the application
             // shutdown hook is running
             file.deleteOnExit();
-            try {
-                PrintWriter pw = new PrintWriter(file);
+            try (PrintWriter pw = new PrintWriter(file)) {
                 pw.println("file is being deleted");
-                pw.close();
             } catch (FileNotFoundException e) {
                 throw new RuntimeException(e);
             }
--- a/jdk/test/java/lang/Thread/StartOOMTest.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/Thread/StartOOMTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -22,11 +22,14 @@
  */
 
 /*
- * @test
- * @bug 6379235
- * @ignore until 6721694 is fixed
- * @run main/othervm -server -Xmx32m -Xms32m -Xss256m StartOOMTest
- * @summary ThreadGroup accounting mistake possible with failure of Thread.start()
+ * This test is relatively useful for verifying 6379235, but
+ * is too resource intensive, especially on 64 bit systems,
+ * to be run automatically, see 6721694.
+ *
+ * When run it should be typically be run with the server vm
+ * and a relatively small java heap, and a large stack size
+ * ( to provoke the OOM quicker ).
+ *    java -server -Xmx32m -Xms32m -Xss256m StartOOMTest
  */
 
 import java.util.*;
--- a/jdk/test/java/lang/instrument/BootClassPath/Setup.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/instrument/BootClassPath/Setup.java	Fri Mar 18 15:44:45 2011 -0700
@@ -62,31 +62,33 @@
          * Create manifest file with Boot-Class-Path encoding the
          * sub-directory name.
          */
-        FileOutputStream out = new FileOutputStream(manifestFile);
-        out.write("Manifest-Version: 1.0\n".getBytes("UTF-8"));
+        try (FileOutputStream out = new FileOutputStream(manifestFile)) {
+            out.write("Manifest-Version: 1.0\n".getBytes("UTF-8"));
 
-        byte[] premainBytes = ("Premain-Class: " + premainClass + "\n").getBytes("UTF-8");
-        out.write(premainBytes);
+            byte[] premainBytes =
+                ("Premain-Class: " + premainClass + "\n").getBytes("UTF-8");
+            out.write(premainBytes);
 
-        out.write( "Boot-Class-Path: ".getBytes("UTF-8") );
+            out.write( "Boot-Class-Path: ".getBytes("UTF-8") );
 
-        byte[] value = bootClassPath.getBytes("UTF-8");
-        for (int i=0; i<value.length; i++) {
-            int v = (int)value[i];
-            if (v < 0) v += 256;
-            byte[] escaped =  ("%" + Integer.toHexString(v)).getBytes("UTF-8");
-            out.write(escaped);
+            byte[] value = bootClassPath.getBytes("UTF-8");
+            for (int i=0; i<value.length; i++) {
+                int v = (int)value[i];
+                if (v < 0) v += 256;
+                byte[] escaped =
+                    ("%" + Integer.toHexString(v)).getBytes("UTF-8");
+                out.write(escaped);
+            }
+            out.write( "\n\n".getBytes("UTF-8") );
         }
-        out.write( "\n\n".getBytes("UTF-8") );
-        out.close();
 
         /*
          * Write the name of the boot dir to "boot.dir"
          */
         f = new File(workDir + fileSeparator + "boot.dir");
-        out = new FileOutputStream(f);
-        out.write(bootDir.getBytes(defaultEncoding));
-        out.close();
+        try (FileOutputStream out = new FileOutputStream(f)) {
+            out.write(bootDir.getBytes(defaultEncoding));
+        }
     }
 
     /* ported from test/sun/tools/launcher/UnicodeTest.java */
--- a/jdk/test/java/lang/instrument/ilib/Inject.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/lang/instrument/ilib/Inject.java	Fri Mar 18 15:44:45 2011 -0700
@@ -118,23 +118,24 @@
         }
 
         void dump(File outDir, String filename) throws IOException {
-            FileOutputStream fileOut = new FileOutputStream(new File(outDir, filename));
-            DataOutputStream dataOut = new DataOutputStream(fileOut);
-
-            String currentClassName = null;
+            try (FileOutputStream fileOut =
+                     new FileOutputStream(new File(outDir, filename));
+                 DataOutputStream dataOut = new DataOutputStream(fileOut))
+            {
+                String currentClassName = null;
 
-            dataOut.writeInt(infoList.size());
-            for (Iterator<Info> it = infoList.iterator(); it.hasNext(); ) {
-                Info info = it.next();
-                if (!info.className.equals(currentClassName)) {
-                    dataOut.writeInt(123456); // class name marker
-                    currentClassName = info.className;
-                    dataOut.writeUTF(currentClassName);
+                dataOut.writeInt(infoList.size());
+                for (Iterator<Info> it = infoList.iterator(); it.hasNext(); ) {
+                    Info info = it.next();
+                    if (!info.className.equals(currentClassName)) {
+                        dataOut.writeInt(123456); // class name marker
+                        currentClassName = info.className;
+                        dataOut.writeUTF(currentClassName);
+                    }
+                    dataOut.writeInt(info.location);
+                    dataOut.writeUTF(info.methodName);
                 }
-                dataOut.writeInt(info.location);
-                dataOut.writeUTF(info.methodName);
             }
-            dataOut.close();
         }
 
         public byte[] bytecodes(String className, String methodName, int location) {
--- a/jdk/test/java/math/BigInteger/BigIntegerTest.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/math/BigInteger/BigIntegerTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -645,26 +645,17 @@
             BigInteger b2 = null;
 
             File f = new File("serialtest");
-            FileOutputStream fos = new FileOutputStream(f);
-            try {
-                ObjectOutputStream oos = new ObjectOutputStream(fos);
-                try {
+
+            try (FileOutputStream fos = new FileOutputStream(f)) {
+                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                     oos.writeObject(b1);
                     oos.flush();
-                } finally {
-                    oos.close();
                 }
 
-                FileInputStream fis = new FileInputStream(f);
-                try {
-                    ObjectInputStream ois = new ObjectInputStream(fis);
-                    try {
-                        b2 = (BigInteger)ois.readObject();
-                    } finally {
-                        ois.close();
-                    }
-                } finally {
-                    fis.close();
+                try (FileInputStream fis = new FileInputStream(f);
+                     ObjectInputStream ois = new ObjectInputStream(fis))
+                {
+                    b2 = (BigInteger)ois.readObject();
                 }
 
                 if (!b1.equals(b2) ||
@@ -673,8 +664,6 @@
                     System.err.println("Serialized failed for hex " +
                                        b1.toString(16));
                 }
-            } finally {
-                fos.close();
             }
             f.delete();
         }
@@ -683,29 +672,17 @@
             BigInteger b1 = fetchNumber(rnd.nextInt(100));
             BigInteger b2 = null;
             File f = new File("serialtest");
-            FileOutputStream fos = new FileOutputStream(f);
-            try {
-                ObjectOutputStream oos = new ObjectOutputStream(fos);
-                try {
+            try (FileOutputStream fos = new FileOutputStream(f)) {
+                try (ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                     oos.writeObject(b1);
                     oos.flush();
-                } finally {
-                    oos.close();
                 }
 
-                FileInputStream fis = new FileInputStream(f);
-                try {
-                    ObjectInputStream ois = new ObjectInputStream(fis);
-                    try {
-                        b2 = (BigInteger)ois.readObject();
-                    } finally {
-                        ois.close();
-                    }
-                } finally {
-                    fis.close();
+                try (FileInputStream fis = new FileInputStream(f);
+                     ObjectInputStream ois = new ObjectInputStream(fis))
+                {
+                    b2 = (BigInteger)ois.readObject();
                 }
-            } finally {
-                fos.close();
             }
 
             if (!b1.equals(b2) ||
--- a/jdk/test/java/net/URLConnection/RedirectLimit.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/net/URLConnection/RedirectLimit.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, 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
@@ -36,105 +36,81 @@
 import java.net.*;
 
 class RedirLimitServer extends Thread {
+    static final int TIMEOUT = 10 * 1000;
+    static final int NUM_REDIRECTS = 9;
 
-    ServerSocket s;
-    Socket   s1;
-    InputStream  is;
-    OutputStream os;
-    int port;
-    int nredirects = 9;
-
-    String reply1 = "HTTP/1.1 307 Temporary Redirect\r\n" +
+    static final String reply1 = "HTTP/1.1 307 Temporary Redirect\r\n" +
         "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" +
         "Server: Apache/1.3.14 (Unix)\r\n" +
         "Location: http://localhost:";
-    String reply2 = ".html\r\n" +
+    static final String reply2 = ".html\r\n" +
         "Connection: close\r\n" +
         "Content-Type: text/html; charset=iso-8859-1\r\n\r\n" +
         "<html>Hello</html>";
-
-    RedirLimitServer (ServerSocket y) {
-        s = y;
-        port = s.getLocalPort();
-    }
-
-    String reply3 = "HTTP/1.1 200 Ok\r\n" +
+    static final String reply3 = "HTTP/1.1 200 Ok\r\n" +
         "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" +
         "Server: Apache/1.3.14 (Unix)\r\n" +
         "Connection: close\r\n" +
         "Content-Type: text/html; charset=iso-8859-1\r\n\r\n" +
         "World";
 
-    public void run () {
+    final ServerSocket ss;
+    final int port;
+
+    RedirLimitServer(ServerSocket ss) {
+        this.ss = ss;
+        port = ss.getLocalPort();
+    }
+
+    public void run() {
         try {
-            s.setSoTimeout (2000);
-            for (int i=0; i<nredirects; i++) {
-                s1 = s.accept ();
-                s1.setSoTimeout (2000);
-                is = s1.getInputStream ();
-                os = s1.getOutputStream ();
-                is.read ();
-                String reply = reply1 + port + "/redirect" + i + reply2;
-                os.write (reply.getBytes());
-                os.close();
+            ss.setSoTimeout(TIMEOUT);
+            for (int i=0; i<NUM_REDIRECTS; i++) {
+                try (Socket s = ss.accept()) {
+                    s.setSoTimeout(TIMEOUT);
+                    InputStream is = s.getInputStream();
+                    OutputStream os = s.getOutputStream();
+                    is.read();
+                    String reply = reply1 + port + "/redirect" + i + reply2;
+                    os.write(reply.getBytes());
+                }
             }
-            s1 = s.accept ();
-            is = s1.getInputStream ();
-            os = s1.getOutputStream ();
-            is.read ();
-            os.write (reply3.getBytes());
-            os.close();
-        }
-        catch (Exception e) {
-            /* Just need thread to terminate */
+            try (Socket s = ss.accept()) {
+                InputStream is = s.getInputStream();
+                OutputStream os = s.getOutputStream();
+                is.read();
+                os.write(reply3.getBytes());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         } finally {
-            try { s.close(); } catch (IOException unused) {}
+            try { ss.close(); } catch (IOException unused) {}
         }
     }
 };
 
-
 public class RedirectLimit {
-
-    public static final int DELAY = 10;
-
     public static void main(String[] args) throws Exception {
-        int nLoops = 1;
-        int nSize = 10;
-        int port, n =0;
-        byte b[] = new byte[nSize];
-        RedirLimitServer server;
-        ServerSocket sock;
+        ServerSocket ss = new ServerSocket (0);
+        int port = ss.getLocalPort();
+        RedirLimitServer server = new RedirLimitServer(ss);
+        server.start();
 
+        InputStream in = null;
         try {
-            sock = new ServerSocket (0);
-            port = sock.getLocalPort ();
-        }
-        catch (Exception e) {
-            System.out.println ("Exception: " + e);
-            return;
-        }
-
-        server = new RedirLimitServer(sock);
-        server.start ();
-
-        try  {
-
-            String s = "http://localhost:" + port;
-            URL url = new URL(s);
+            URL url = new URL("http://localhost:" + port);
             URLConnection conURL =  url.openConnection();
 
             conURL.setDoInput(true);
             conURL.setAllowUserInteraction(false);
             conURL.setUseCaches(false);
 
-            InputStream in = conURL.getInputStream();
+            in = conURL.getInputStream();
             if ((in.read() != (int)'W') || (in.read()!=(int)'o')) {
-                throw new RuntimeException ("Unexpected string read");
+                throw new RuntimeException("Unexpected string read");
             }
-        }
-        catch(IOException e) {
-            throw new RuntimeException ("Exception caught " + e);
+        } finally {
+            if ( in != null ) { in.close(); }
         }
     }
 }
--- a/jdk/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Fri Mar 18 15:44:45 2011 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4607272 6842687 6878369
+ * @bug 4607272 6842687 6878369 6944810 7023403
  * @summary Unit test for AsynchronousSocketChannel
  * @run main/timeout=600 Basic
  */
--- a/jdk/test/java/nio/file/DirectoryStream/Basic.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/nio/file/DirectoryStream/Basic.java	Fri Mar 18 15:44:45 2011 -0700
@@ -69,7 +69,7 @@
             throw new RuntimeException("entry not found");
 
         // check filtering: f* should match foo
-        DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<>() {
+        DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
             private PathMatcher matcher =
                 dir.getFileSystem().getPathMatcher("glob:f*");
             public boolean accept(Path file) {
--- a/jdk/test/java/nio/file/FileStore/Basic.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/nio/file/FileStore/Basic.java	Fri Mar 18 15:44:45 2011 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 6873621 6979526 7006126
+ * @bug 4313887 6873621 6979526 7006126 7020517
  * @summary Unit test for java.nio.file.FileStore
  * @library ..
  */
--- a/jdk/test/java/nio/file/Files/TemporaryFiles.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/nio/file/Files/TemporaryFiles.java	Fri Mar 18 15:44:45 2011 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 6838333 7006126
+ * @bug 4313887 6838333 7006126 7023034
  * @summary Unit test for Files.createTempXXX
  * @library ..
  */
@@ -167,5 +167,31 @@
         testInvalidFileTemp("../blah", null);
         testInvalidFileTemp("dir/blah", null);
         testInvalidFileTemp("blah", ".dat/foo");
+
+        // nulls
+        try {
+            Files.createTempFile("blah", ".tmp", (FileAttribute<?>[])null);
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
+        try {
+            Files.createTempFile("blah", ".tmp", new FileAttribute<?>[] { null });
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
+        try {
+            Files.createTempDirectory("blah", (FileAttribute<?>[])null);
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
+        try {
+            Files.createTempDirectory("blah", new FileAttribute<?>[] { null });
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
+        try {
+            Files.createTempFile((Path)null, "blah", ".tmp");
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
+        try {
+            Files.createTempDirectory((Path)null, "blah");
+            throw new RuntimeException("NullPointerException expected");
+        } catch (NullPointerException ignore) { }
     }
 }
--- a/jdk/test/java/security/cert/CertificateFactory/openssl/OpenSSLCert.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/security/cert/CertificateFactory/openssl/OpenSSLCert.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,8 @@
  */
 
 import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.security.cert.CertificateFactory;
 
@@ -46,24 +48,20 @@
     }
 
     static void test(String... files) throws Exception {
-        FileOutputStream fout = new FileOutputStream(OUTFILE);
-        for (String file: files) {
-            FileInputStream fin = new FileInputStream(
-                new File(System.getProperty("test.src", "."), file));
-            byte[] buffer = new byte[4096];
-            while (true) {
-                int len = fin.read(buffer);
-                if (len < 0) break;
-                fout.write(buffer, 0, len);
+        try (FileOutputStream fout = new FileOutputStream(OUTFILE)) {
+            String here = System.getProperty("test.src", "");
+            for (String file: files) {
+                Files.copy(Paths.get(here, file), fout);
             }
-            fin.close();
         }
-        fout.close();
-        System.out.println("Testing " + Arrays.toString(files) + "...");
-        if (CertificateFactory.getInstance("X509")
-                .generateCertificates(new FileInputStream(OUTFILE))
-                .size() != files.length) {
-            throw new Exception("Not same number");
+        try (FileInputStream fin = new FileInputStream(OUTFILE)) {
+            System.out.println("Testing " + Arrays.toString(files) + "...");
+            if (CertificateFactory.getInstance("X509")
+                    .generateCertificates(fin)
+                    .size() != files.length) {
+                throw new Exception("Not same number");
+            }
         }
+        Files.delete(Paths.get(OUTFILE));
     }
 }
--- a/jdk/test/java/util/Collection/MOAT.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/Collection/MOAT.java	Fri Mar 18 15:44:45 2011 -0700
@@ -28,6 +28,8 @@
  *          6431845 4802633 6570566 6570575 6570631 6570924 6691185 6691215
  * @summary Run many tests on many Collection and Map implementations
  * @author  Martin Buchholz
+ * @run main MOAT
+ * @run main/othervm -XX:+AggressiveOpts MOAT
  */
 
 /* Mother Of All (Collection) Tests
--- a/jdk/test/java/util/Currency/ValidateISO4217.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/Currency/ValidateISO4217.java	Fri Mar 18 15:44:45 2011 -0700
@@ -111,57 +111,58 @@
 
     static void test1() throws Exception {
 
-        FileReader fr = new FileReader(new File(System.getProperty("test.src", "."), datafile));
-        BufferedReader in = new BufferedReader(fr);
-        String line;
-        SimpleDateFormat format = null;
+        try (FileReader fr = new FileReader(new File(System.getProperty("test.src", "."), datafile));
+             BufferedReader in = new BufferedReader(fr))
+        {
+            String line;
+            SimpleDateFormat format = null;
 
-        while ((line = in.readLine()) != null) {
-            if (line.length() == 0 || line.charAt(0) == '#') {
-                continue;
-            }
+            while ((line = in.readLine()) != null) {
+                if (line.length() == 0 || line.charAt(0) == '#') {
+                    continue;
+                }
 
-            StringTokenizer tokens = new StringTokenizer(line, "\t");
-            String country = tokens.nextToken();
-            if (country.length() != 2) {
-                continue;
-            }
+                StringTokenizer tokens = new StringTokenizer(line, "\t");
+                String country = tokens.nextToken();
+                if (country.length() != 2) {
+                    continue;
+                }
 
-            String currency;
-            String numeric;
-            String minorUnit;
-            int tokensCount = tokens.countTokens();
-            if (tokensCount < 3) {
-                currency = "";
-                numeric = "0";
-                minorUnit = "0";
-            } else {
-                currency = tokens.nextToken();
-                numeric = tokens.nextToken();
-                minorUnit = tokens.nextToken();
-                testCurrencies.add(Currency.getInstance(currency));
+                String currency;
+                String numeric;
+                String minorUnit;
+                int tokensCount = tokens.countTokens();
+                if (tokensCount < 3) {
+                    currency = "";
+                    numeric = "0";
+                    minorUnit = "0";
+                } else {
+                    currency = tokens.nextToken();
+                    numeric = tokens.nextToken();
+                    minorUnit = tokens.nextToken();
+                    testCurrencies.add(Currency.getInstance(currency));
 
-                // check for the cutover
-                if (tokensCount > 3) {
-                    if (format == null) {
-                        format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US);
-                        format.setTimeZone(TimeZone.getTimeZone("GMT"));
-                        format.setLenient(false);
-                    }
-                    if (format.parse(tokens.nextToken()).getTime() <
-                        System.currentTimeMillis()) {
-                        currency = tokens.nextToken();
-                        numeric = tokens.nextToken();
-                        minorUnit = tokens.nextToken();
-                        testCurrencies.add(Currency.getInstance(currency));
+                    // check for the cutover
+                    if (tokensCount > 3) {
+                        if (format == null) {
+                            format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US);
+                            format.setTimeZone(TimeZone.getTimeZone("GMT"));
+                            format.setLenient(false);
+                        }
+                        if (format.parse(tokens.nextToken()).getTime() <
+                            System.currentTimeMillis()) {
+                            currency = tokens.nextToken();
+                            numeric = tokens.nextToken();
+                            minorUnit = tokens.nextToken();
+                            testCurrencies.add(Currency.getInstance(currency));
+                        }
                     }
                 }
+                int index = toIndex(country);
+                testCountryCurrency(country, currency, Integer.parseInt(numeric),
+                    Integer.parseInt(minorUnit), index);
             }
-            int index = toIndex(country);
-            testCountryCurrency(country, currency, Integer.parseInt(numeric),
-                Integer.parseInt(minorUnit), index);
         }
-        in.close();
 
         for (int i = 0; i < additionalCodes.length; i++) {
             int index = toIndex(additionalCodes[i][0]);
--- a/jdk/test/java/util/Formatter/FailingConstructors.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/Formatter/FailingConstructors.java	Fri Mar 18 15:44:45 2011 -0700
@@ -34,6 +34,7 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
 import java.util.Formatter;
 
 public class FailingConstructors {
@@ -47,9 +48,7 @@
         /* create the file and write its contents */
         File file = File.createTempFile(fileName, null);
         file.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(file);
-        fos.write(FILE_CONTENTS.getBytes());
-        fos.close();
+        Files.write(file.toPath(), FILE_CONTENTS.getBytes());
 
         test(true, file);
         file.delete();
--- a/jdk/test/java/util/Locale/LocaleEnhanceTest.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/Locale/LocaleEnhanceTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1204,14 +1204,12 @@
                 locale = new Locale(lang, country, variant);
             }
 
-            // desrialize
-            try {
-                FileInputStream fis = new FileInputStream(testfile);
-                ObjectInputStream ois = new ObjectInputStream(fis);
-
+            // deserialize
+            try (FileInputStream fis = new FileInputStream(testfile);
+                 ObjectInputStream ois = new ObjectInputStream(fis))
+            {
                 Object o = ois.readObject();
                 assertEquals("Deserialize Java 6 Locale " + locale, o, locale);
-                ois.close();
             } catch (Exception e) {
                 errln("Exception while reading " + testfile.getAbsolutePath() + " - " + e.getMessage());
             }
--- a/jdk/test/java/util/PriorityQueue/NoNulls.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/PriorityQueue/NoNulls.java	Fri Mar 18 15:44:45 2011 -0700
@@ -53,7 +53,7 @@
 public class NoNulls {
     void test(String[] args) throws Throwable {
         final Comparator<String> nullTolerantComparator
-            = new Comparator<>() {
+            = new Comparator<String>() {
             public int compare(String x, String y) {
                 return (x == null ? -1 :
                         y == null ? 1 :
@@ -65,7 +65,7 @@
         nullSortedSet.add(null);
 
         final PriorityQueue<String> nullPriorityQueue
-            = new PriorityQueue<>() {
+            = new PriorityQueue<String>() {
             public Object[] toArray() { return new Object[] { null };}};
 
         final Collection<String> nullCollection = new ArrayList<>();
--- a/jdk/test/java/util/ResourceBundle/Bug6204853.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/ResourceBundle/Bug6204853.java	Fri Mar 18 15:44:45 2011 -0700
@@ -39,24 +39,19 @@
 public final class Bug6204853 {
 
     public Bug6204853() {
-        try {
-            String srcDir = System.getProperty("test.src", ".");
-            FileInputStream  fis8859_1 =
-                new FileInputStream(new File(srcDir, "Bug6204853.properties"));
-            FileInputStream fisUtf8 =
-                new FileInputStream(new File(srcDir, "Bug6204853_Utf8.properties"));
-            InputStreamReader isrUtf8 = new InputStreamReader(fisUtf8, "UTF-8");
-
+        String srcDir = System.getProperty("test.src", ".");
+        try (FileInputStream fis8859_1 =
+                 new FileInputStream(new File(srcDir, "Bug6204853.properties"));
+             FileInputStream fisUtf8 =
+                 new FileInputStream(new File(srcDir, "Bug6204853_Utf8.properties"));
+             InputStreamReader isrUtf8 = new InputStreamReader(fisUtf8, "UTF-8"))
+        {
             PropertyResourceBundle bundleUtf8 = new PropertyResourceBundle(isrUtf8);
             PropertyResourceBundle bundle = new PropertyResourceBundle(fis8859_1);
 
             String[] arrayUtf8 = createKeyValueArray(bundleUtf8);
             String[] array = createKeyValueArray(bundle);
 
-            isrUtf8.close();
-            fisUtf8.close();
-            fis8859_1.close();
-
             if (!Arrays.equals(arrayUtf8, array)) {
                 throw new RuntimeException("PropertyResourceBundle constructed from a UTF-8 encoded property file is not equal to the one constructed from ISO-8859-1 encoded property file.");
             }
--- a/jdk/test/java/util/Scanner/FailingConstructors.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/Scanner/FailingConstructors.java	Fri Mar 18 15:44:45 2011 -0700
@@ -33,6 +33,7 @@
 import java.io.FileOutputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.Scanner;
 
 public class FailingConstructors {
@@ -46,9 +47,7 @@
         /* create the file and write its contents */
         File file = File.createTempFile(fileName, null);
         file.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(file);
-        fos.write(FILE_CONTENTS.getBytes());
-        fos.close();
+        Files.write(file.toPath(), FILE_CONTENTS.getBytes());
 
         test(true, file);
         file.delete();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/TimeZone/Bug6772689.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6772689
+ * @summary Test for standard-to-daylight transitions at midnight:
+ * date stays on the given day.
+ */
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import static java.util.GregorianCalendar.*;
+
+public class Bug6772689 {
+    private static final int BEGIN_YEAR = 2035;
+    private static final int END_YEAR = BEGIN_YEAR + 28;
+
+    public static void main(String[] args) {
+        TimeZone defaultTimeZone = TimeZone.getDefault();
+        int errors = 0;
+
+        Calendar cal = new GregorianCalendar(BEGIN_YEAR, MARCH, 1);
+        String[] tzids = TimeZone.getAvailableIDs();
+        try {
+            for (String id : tzids) {
+                TimeZone tz = TimeZone.getTimeZone(id);
+                if (!tz.useDaylightTime()) {
+                    continue;
+                }
+                TimeZone.setDefault(tz);
+
+              dateloop:
+                // Use future dates because sun.util.calendar.ZoneInfo
+                // delegates offset transition calculations to a SimpleTimeZone
+                // (after 2038 as of JDK7).
+                for (int year = BEGIN_YEAR; year < END_YEAR; year++) {
+                    for (int month = MARCH; month <= NOVEMBER; month++) {
+                        cal.set(year, month, 1, 15, 0, 0);
+                        int maxDom = cal.getActualMaximum(DAY_OF_MONTH);
+                        for (int dom = 1; dom <= maxDom; dom++) {
+                            Date date = new Date(year - 1900, month, dom);
+                            if (date.getYear()+1900 != year
+                                || date.getMonth() != month
+                                || date.getDate() != dom) {
+                                System.err.printf("%s: got %04d-%02d-%02d, expected %04d-%02d-%02d%n",
+                                                  id,
+                                                  date.getYear() + 1900,
+                                                  date.getMonth() + 1,
+                                                  date.getDate(),
+                                                  year,
+                                                  month + 1,
+                                                  dom);
+                                errors++;
+                                break dateloop;
+                            }
+                        }
+                    }
+                }
+            }
+        } finally {
+            // Restore the default TimeZone.
+            TimeZone.setDefault(defaultTimeZone);
+        }
+        if (errors > 0) {
+            throw new RuntimeException("Transition test failed");
+        }
+    }
+}
--- a/jdk/test/java/util/jar/JarEntry/GetMethodsReturnClones.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/jar/JarEntry/GetMethodsReturnClones.java	Fri Mar 18 15:44:45 2011 -0700
@@ -40,22 +40,21 @@
         System.getProperty("file.separator");
 
     public static void main(String[] args) throws Exception {
-        JarFile jf = new JarFile(BASE + "test.jar", true);
-
-        byte[] buffer = new byte[8192];
-        Enumeration<JarEntry> e = jf.entries();
-        List<JarEntry> entries = new ArrayList<JarEntry>();
-        while (e.hasMoreElements()) {
-            JarEntry je = e.nextElement();
-            entries.add(je);
-            InputStream is = jf.getInputStream(je);
-            while (is.read(buffer, 0, buffer.length) != -1) {
-                // we just read. this will throw a SecurityException
-                // if  a signature/digest check fails.
+        List<JarEntry> entries = new ArrayList<>();
+        try (JarFile jf = new JarFile(BASE + "test.jar", true)) {
+            byte[] buffer = new byte[8192];
+            Enumeration<JarEntry> e = jf.entries();
+            while (e.hasMoreElements()) {
+                JarEntry je = e.nextElement();
+                entries.add(je);
+                try (InputStream is = jf.getInputStream(je)) {
+                    while (is.read(buffer, 0, buffer.length) != -1) {
+                        // we just read. this will throw a SecurityException
+                        // if  a signature/digest check fails.
+                    }
+                }
             }
-            is.close();
         }
-        jf.close();
 
         for (JarEntry je : entries) {
             Certificate[] certs = je.getCertificates();
--- a/jdk/test/java/util/jar/JarFile/ScanSignedJar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/jar/JarFile/ScanSignedJar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -37,25 +37,25 @@
 public class ScanSignedJar {
 
     public static void main(String[] args) throws Exception {
-        JarFile file = new JarFile(new File(System.getProperty("test.src","."),
-            "bogus-signerinfo-attr.jar"));
-        byte[] buffer = new byte[8192];
         boolean isSigned = false;
+        try (JarFile file = new JarFile(new File(System.getProperty("test.src","."),
+                 "bogus-signerinfo-attr.jar"))) {
+            byte[] buffer = new byte[8192];
 
-        for (Enumeration entries = file.entries(); entries.hasMoreElements();) {
-            JarEntry entry = (JarEntry) entries.nextElement();
-            InputStream jis = file.getInputStream(entry);
-            while (jis.read(buffer, 0, buffer.length) != -1) {
-                // read the jar entry
+            for (Enumeration entries = file.entries(); entries.hasMoreElements();) {
+                JarEntry entry = (JarEntry) entries.nextElement();
+                try (InputStream jis = file.getInputStream(entry)) {
+                    while (jis.read(buffer, 0, buffer.length) != -1) {
+                        // read the jar entry
+                    }
+                }
+                if (entry.getCertificates() != null) {
+                    isSigned = true;
+                }
+                System.out.println((isSigned ? "[signed] " : "\t ") +
+                    entry.getName());
             }
-            jis.close();
-            if (entry.getCertificates() != null) {
-                isSigned = true;
-            }
-            System.out.println((isSigned ? "[signed] " : "\t ") +
-                entry.getName());
         }
-        file.close();
 
         if (isSigned) {
             System.out.println("\nJAR file has signed entries");
--- a/jdk/test/java/util/zip/Available.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/Available.java	Fri Mar 18 15:44:45 2011 -0700
@@ -44,14 +44,17 @@
         File f = new File(System.getProperty("test.src", "."), "input.jar");
 
         // test ZipInputStream
-        ZipInputStream z = new ZipInputStream(new FileInputStream(f));
-        z.getNextEntry();
-        tryAvail(z);
+        try (FileInputStream fis = new FileInputStream(f);
+             ZipInputStream z = new ZipInputStream(fis))
+        {
+            z.getNextEntry();
+            tryAvail(z);
+        }
 
         // test InflaterInputStream
-        ZipFile zfile = new ZipFile(f);
-        tryAvail(zfile.getInputStream(zfile.getEntry("Available.java")));
-        z.close();
+        try (ZipFile zfile = new ZipFile(f)) {
+            tryAvail(zfile.getInputStream(zfile.getEntry("Available.java")));
+        }
     }
 
     static void tryAvail(InputStream in) throws Exception {
@@ -67,20 +70,21 @@
     // To reproduce 4401122
     private static void test2() throws Exception {
         File f = new File(System.getProperty("test.src", "."), "input.jar");
-        ZipFile zf = new ZipFile(f);
-        InputStream in = zf.getInputStream(zf.getEntry("Available.java"));
+        try (ZipFile zf = new ZipFile(f)) {
+            InputStream in = zf.getInputStream(zf.getEntry("Available.java"));
 
-        int initialAvailable = in.available();
-        in.read();
-        if (in.available() != initialAvailable - 1)
-            throw new RuntimeException("Available not decremented.");
-        for(int j=0; j<initialAvailable-1; j++)
+            int initialAvailable = in.available();
             in.read();
-        if (in.available() != 0)
-            throw new RuntimeException();
-        in.close();
-        if (in.available() != 0)
-            throw new RuntimeException();
+            if (in.available() != initialAvailable - 1)
+                throw new RuntimeException("Available not decremented.");
+            for(int j=0; j<initialAvailable-1; j++)
+                in.read();
+            if (in.available() != 0)
+                throw new RuntimeException();
+            in.close();
+            if (in.available() != 0)
+                throw new RuntimeException();
+        }
     }
 
 }
--- a/jdk/test/java/util/zip/FileBuilder.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/FileBuilder.java	Fri Mar 18 15:44:45 2011 -0700
@@ -53,25 +53,24 @@
                filetype.equals("SlightlyCompressible")))
             usageError();
 
-        RandomAccessFile raf = new RandomAccessFile(filename, "rw");
+        try (RandomAccessFile raf = new RandomAccessFile(filename, "rw")) {
+            if (filetype.equals("SlightlyCompressible")) {
+                byte[] randomBytes = new byte[16384];
+                byte[] nullBytes   = new byte[randomBytes.length/10];
+                Random rand = new Random();
+                for (int i = 0; raf.length() < filesize; ++i) {
+                    rand.nextBytes(randomBytes);
+                    raf.write(nullBytes);
+                    raf.write(randomBytes);
+                }
+            }
 
-        if (filetype.equals("SlightlyCompressible")) {
-            byte[] randomBytes = new byte[16384];
-            byte[] nullBytes   = new byte[randomBytes.length/10];
-            Random rand = new Random();
-            for (int i = 0; raf.length() < filesize; ++i) {
-                rand.nextBytes(randomBytes);
-                raf.write(nullBytes);
-                raf.write(randomBytes);
-            }
+            // Make sure file is exactly the requested size, and that
+            // a unique identifying trailer is written.
+            byte[] filenameBytes = filename.getBytes("UTF8");
+            raf.seek(filesize-filenameBytes.length);
+            raf.write(filenameBytes);
+            raf.setLength(filesize);
         }
-
-        // Make sure file is exactly the requested size, and that
-        // a unique identifying trailer is written.
-        byte[] filenameBytes = filename.getBytes("UTF8");
-        raf.seek(filesize-filenameBytes.length);
-        raf.write(filenameBytes);
-        raf.setLength(filesize);
-        raf.close();
     }
 }
--- a/jdk/test/java/util/zip/GZIP/Accordion.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/GZIP/Accordion.java	Fri Mar 18 15:44:45 2011 -0700
@@ -64,16 +64,13 @@
         System.out.println("count="+count);
 
         Thread compressor = new Thread() { public void run() {
-            try {
-                final GZIPOutputStream s = new GZIPOutputStream(out);
+            try (GZIPOutputStream s = new GZIPOutputStream(out)) {
                 for (long i = 0; i < count; i++)
                     s.write(data, 0, data.length);
-                s.close();
             } catch (Throwable t) { trouble = t; }}};
 
         Thread uncompressor = new Thread() { public void run() {
-            try {
-                final GZIPInputStream s = new GZIPInputStream(in);
+            try (GZIPInputStream s = new GZIPInputStream(in)) {
                 final byte[] maybeBytes = new byte[data.length];
                 for (long i = 0; i < count; i++) {
                     readFully(s, maybeBytes);
@@ -82,7 +79,6 @@
                 }
                 if (s.read(maybeBytes, 0, 1) > 0)
                     throw new Exception("Unexpected NON-EOF");
-                s.close();
             } catch (Throwable t) { trouble = t; }}};
 
         compressor.start(); uncompressor.start();
--- a/jdk/test/java/util/zip/GZIP/GZIPInputStreamRead.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/GZIP/GZIPInputStreamRead.java	Fri Mar 18 15:44:45 2011 -0700
@@ -44,9 +44,9 @@
                 rnd.nextBytes(src);
                 srcBAOS.write(src);
 
-                GZIPOutputStream gzos = new GZIPOutputStream(dstBAOS);
-                gzos.write(src);
-                gzos.close();
+                try (GZIPOutputStream gzos = new GZIPOutputStream(dstBAOS)) {
+                    gzos.write(src);
+                }
             }
             byte[] srcBytes = srcBAOS.toByteArray();
             byte[] dstBytes = dstBAOS.toByteArray();
@@ -75,26 +75,26 @@
                              int readBufSize, int gzisBufSize)
         throws Throwable
     {
-        GZIPInputStream gzis = new GZIPInputStream(
-                                   new ByteArrayInputStream(dst),
-                                   gzisBufSize);
-        byte[] result = new byte[src.length + 10];
-        byte[] buf = new byte[readBufSize];
-        int n = 0;
-        int off = 0;
+        try (ByteArrayInputStream bais = new ByteArrayInputStream(dst);
+             GZIPInputStream gzis = new GZIPInputStream(bais, gzisBufSize))
+        {
+            byte[] result = new byte[src.length + 10];
+            byte[] buf = new byte[readBufSize];
+            int n = 0;
+            int off = 0;
 
-        while ((n = gzis.read(buf, 0, buf.length)) != -1) {
-            System.arraycopy(buf, 0, result, off, n);
-            off += n;
-            // no range check, if overflow, let it fail
+            while ((n = gzis.read(buf, 0, buf.length)) != -1) {
+                System.arraycopy(buf, 0, result, off, n);
+                off += n;
+                // no range check, if overflow, let it fail
+            }
+            if (off != src.length || gzis.available() != 0 ||
+                !Arrays.equals(src, Arrays.copyOf(result, off))) {
+                throw new RuntimeException(
+                    "GZIPInputStream reading failed! " +
+                    ", src.len=" + src.length +
+                    ", read=" + off);
+            }
         }
-        if (off != src.length || gzis.available() != 0 ||
-            !Arrays.equals(src, Arrays.copyOf(result, off))) {
-            throw new RuntimeException(
-                "GZIPInputStream reading failed! " +
-                ", src.len=" + src.length +
-                ", read=" + off);
-        }
-        gzis.close();
     }
 }
--- a/jdk/test/java/util/zip/InflateIn_DeflateOut.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/InflateIn_DeflateOut.java	Fri Mar 18 15:44:45 2011 -0700
@@ -134,14 +134,14 @@
 
         PairedOutputStream pos = new PairedOutputStream(pis);
         pis.setPairedOutputStream(pos);
-        DeflaterOutputStream dos = new DeflaterOutputStream(pos, true);
 
         byte[] data = new byte[random.nextInt(1024 * 1024)];
         byte[] buf = new byte[data.length];
         random.nextBytes(data);
 
-        dos.write(data);
-        dos.close();
+        try (DeflaterOutputStream dos = new DeflaterOutputStream(pos, true)) {
+            dos.write(data);
+        }
         check(readFully(iis, buf, buf.length));
         check(Arrays.equals(data, buf));
     }
--- a/jdk/test/java/util/zip/InfoZip.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/InfoZip.java	Fri Mar 18 15:44:45 2011 -0700
@@ -85,41 +85,37 @@
         //----------------------------------------------------------------
         File f = new File("InfoZip.zip");
 
-        OutputStream os = new FileOutputStream(f);
-        os.write(new byte[]
-            {'P', 'K', 3, 4, 10, 0, 0, 0, 0, 0, -68, 8, 'k',
-             '2', 'V', -7, 'm', 9, 20, 0, 0, 0, 20, 0, 0, 0,
-             8, 0, 21, 0, 's', 'o', 'm', 'e', 'F', 'i', 'l', 'e', 'U',
-             'T', 9, 0, 3, 't', '_', '1', 'B', 't', '_', '1', 'B', 'U',
-             'x', 4, 0, -14, 'v', 26, 4, 'M', 'e', 's', 's', 'a', 'g',
-             'e', ' ', 'i', 'n', ' ', 'a', ' ', 'B', 'o', 't', 't', 'l', 'e',
-             10, 'P', 'K', 1, 2, 23, 3, 10, 0, 0, 0, 0, 0,
-             -68, 8, 'k', '2', 'V', -7, 'm', 9, 20, 0, 0, 0, 20,
-             0, 0, 0, 8, 0, 13, 0, 0, 0, 0, 0, 1, 0,
-             0, 0, -92, -127, 0, 0, 0, 0, 's', 'o', 'm', 'e', 'F',
-             'i', 'l', 'e', 'U', 'T', 5, 0, 3, 't', '_', '1', 'B', 'U',
-             'x', 0, 0, 'P', 'K', 5, 6, 0, 0, 0, 0, 1, 0,
-             1, 0, 'C', 0, 0, 0, 'O', 0, 0, 0, 0, 0, });
-        os.close();
+        try (OutputStream os = new FileOutputStream(f)) {
+            os.write(new byte[]
+                {'P', 'K', 3, 4, 10, 0, 0, 0, 0, 0, -68, 8, 'k',
+                 '2', 'V', -7, 'm', 9, 20, 0, 0, 0, 20, 0, 0, 0,
+                 8, 0, 21, 0, 's', 'o', 'm', 'e', 'F', 'i', 'l', 'e', 'U',
+                 'T', 9, 0, 3, 't', '_', '1', 'B', 't', '_', '1', 'B', 'U',
+                 'x', 4, 0, -14, 'v', 26, 4, 'M', 'e', 's', 's', 'a', 'g',
+                 'e', ' ', 'i', 'n', ' ', 'a', ' ', 'B', 'o', 't', 't', 'l', 'e',
+                 10, 'P', 'K', 1, 2, 23, 3, 10, 0, 0, 0, 0, 0,
+                 -68, 8, 'k', '2', 'V', -7, 'm', 9, 20, 0, 0, 0, 20,
+                 0, 0, 0, 8, 0, 13, 0, 0, 0, 0, 0, 1, 0,
+                 0, 0, -92, -127, 0, 0, 0, 0, 's', 'o', 'm', 'e', 'F',
+                 'i', 'l', 'e', 'U', 'T', 5, 0, 3, 't', '_', '1', 'B', 'U',
+                 'x', 0, 0, 'P', 'K', 5, 6, 0, 0, 0, 0, 1, 0,
+                 1, 0, 'C', 0, 0, 0, 'O', 0, 0, 0, 0, 0, });
+        }
 
-        ZipFile zf = new ZipFile(f);
         ZipEntry ze = null;
-        try {
+        try (ZipFile zf = new ZipFile(f)) {
             Enumeration<? extends ZipEntry> entries = zf.entries();
             ze = entries.nextElement();
             check(! entries.hasMoreElements());
             checkZipEntry(ze, contents(zf, ze));
-        } finally {
-            zf.close();
         }
 
-        ZipInputStream is = new ZipInputStream(new FileInputStream(f));
-        try {
+        try (FileInputStream fis = new FileInputStream(f);
+             ZipInputStream is = new ZipInputStream(fis))
+        {
             ze = is.getNextEntry();
             checkZipEntry(ze, contents(is));
             check(is.getNextEntry() == null);
-        } finally {
-            is.close();
         }
         f.delete();
         System.out.printf("passed = %d, failed = %d%n", passed, failed);
--- a/jdk/test/java/util/zip/LargeZip.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/LargeZip.java	Fri Mar 18 15:44:45 2011 -0700
@@ -98,19 +98,21 @@
         }
         data = baos.toByteArray();
 
-        ZipOutputStream zos = new ZipOutputStream(
-            new BufferedOutputStream(new FileOutputStream(largeFile)));
-        long length = 0;
-        while (length < fileSize) {
-            ZipEntry ze = new ZipEntry("entry-" + length);
-            lastEntryName = ze.getName();
-            zos.putNextEntry(ze);
-            zos.write(data, 0, data.length);
-            zos.closeEntry();
-            length = largeFile.length();
+        try (FileOutputStream fos = new FileOutputStream(largeFile);
+             BufferedOutputStream bos = new BufferedOutputStream(fos);
+             ZipOutputStream zos = new ZipOutputStream(bos))
+        {
+            long length = 0;
+            while (length < fileSize) {
+                ZipEntry ze = new ZipEntry("entry-" + length);
+                lastEntryName = ze.getName();
+                zos.putNextEntry(ze);
+                zos.write(data, 0, data.length);
+                zos.closeEntry();
+                length = largeFile.length();
+            }
+            System.out.println("Last entry written is " + lastEntryName);
         }
-        System.out.println("Last entry written is " + lastEntryName);
-        zos.close();
     }
 
     static void readLargeZip1() throws Throwable {
@@ -143,33 +145,35 @@
 
 
     static void readLargeZip2() throws Throwable {
-        ZipInputStream zis = new ZipInputStream(
-            new BufferedInputStream(new FileInputStream(largeFile)));
-        ZipEntry entry = null;
-        String entryName = null;
-        int count = 0;
-        while ((entry = zis.getNextEntry()) != null) {
-            entryName = entry.getName();
-            if (entryName.equals(lastEntryName)) {
-                break;
+        try (FileInputStream fis = new FileInputStream(largeFile);
+             BufferedInputStream bis = new BufferedInputStream(fis);
+             ZipInputStream zis = new ZipInputStream(bis))
+        {
+            ZipEntry entry = null;
+            String entryName = null;
+            int count = 0;
+            while ((entry = zis.getNextEntry()) != null) {
+                entryName = entry.getName();
+                if (entryName.equals(lastEntryName)) {
+                    break;
+                }
+                count++;
             }
-            count++;
+            System.out.println("Number of entries read: " + count);
+            System.out.println("Last entry read is " + entryName);
+            check(!entry.isDirectory());
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+            byte buf[] = new byte[4096];
+            int len;
+            while ((len = zis.read(buf)) >= 0) {
+                baos.write(buf, 0, len);
+            }
+            baos.close();
+            check(Arrays.equals(data, baos.toByteArray()));
+            check(zis.getNextEntry() == null);
         }
-        System.out.println("Number of entries read: " + count);
-        System.out.println("Last entry read is " + entryName);
-        check(!entry.isDirectory());
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        byte buf[] = new byte[4096];
-        int len;
-        while ((len = zis.read(buf)) >= 0) {
-            baos.write(buf, 0, len);
-        }
-        baos.close();
-        check(Arrays.equals(data, baos.toByteArray()));
-        check(zis.getNextEntry() == null);
-        zis.close();
     }
 
 
--- a/jdk/test/java/util/zip/TestEmptyZip.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/TestEmptyZip.java	Fri Mar 18 15:44:45 2011 -0700
@@ -78,67 +78,49 @@
                 pass();
             }
         }
-        ZipInputStream zis = null;
-        try {
-            zis = new ZipInputStream(new FileInputStream(f));
+        try (FileInputStream fis = new FileInputStream(f);
+             ZipInputStream zis = new ZipInputStream(fis))
+        {
             ZipEntry ze = zis.getNextEntry();
             check(ze == null);
         } catch (IOException ex) {
             unexpected(ex);
-        } finally {
-            if (zis != null) zis.close();
         }
     }
 
     static void write(File f) throws Exception {
-        ZipOutputStream zos = null;
-        try {
-            zos = new ZipOutputStream(new FileOutputStream(f));
+        try (FileOutputStream fis = new FileOutputStream(f);
+             ZipOutputStream zos = new ZipOutputStream(fis))
+        {
             zos.finish();
-            zos.close();
             pass();
         } catch (Exception ex) {
             unexpected(ex);
-        } finally {
-            if (zos != null) {
-                zos.close();
-            }
         }
     }
 
     static void readFile(File f) throws Exception {
-        ZipFile zf = null;
-        try {
-            zf = new ZipFile(f);
+        try (ZipFile zf = new ZipFile(f)) {
 
             Enumeration e = zf.entries();
             while (e.hasMoreElements()) {
                 ZipEntry entry = (ZipEntry) e.nextElement();
                 fail();
             }
-            zf.close();
             pass();
         } catch (Exception ex) {
             unexpected(ex);
-        } finally {
-            if (zf != null) {
-                zf.close();
-            }
         }
     }
 
     static void readStream(File f) throws Exception {
-        ZipInputStream zis = null;
-        try {
-            zis = new ZipInputStream(new FileInputStream(f));
+        try (FileInputStream fis = new FileInputStream(f);
+             ZipInputStream zis = new ZipInputStream(fis))
+        {
             ZipEntry ze = zis.getNextEntry();
             check(ze == null);
             byte[] buf = new byte[1024];
             check(zis.read(buf, 0, 1024) == -1);
-        } finally {
-            if (zis != null) {
-                zis.close();
-            }
         }
     }
 
--- a/jdk/test/java/util/zip/ZipCoding.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipCoding.java	Fri Mar 18 15:44:45 2011 -0700
@@ -57,59 +57,58 @@
                                    String name, String comment, byte[] bb)
         throws Exception
     {
-        ZipInputStream zis = new ZipInputStream(is, cs);
-        ZipEntry e = zis.getNextEntry();
-        if (e == null || ! name.equals(e.getName()))
-            throw new RuntimeException("ZipIS name doesn't match!");
-        byte[] bBuf = new byte[bb.length << 1];
-        int n = zis.read(bBuf, 0, bBuf.length);
-        if (n != bb.length ||
-            !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
-            throw new RuntimeException("ZipIS content doesn't match!");
+        try (ZipInputStream zis = new ZipInputStream(is, cs)) {
+            ZipEntry e = zis.getNextEntry();
+            if (e == null || ! name.equals(e.getName()))
+                throw new RuntimeException("ZipIS name doesn't match!");
+            byte[] bBuf = new byte[bb.length << 1];
+            int n = zis.read(bBuf, 0, bBuf.length);
+            if (n != bb.length ||
+                !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
+                throw new RuntimeException("ZipIS content doesn't match!");
+            }
         }
-        zis.close();
     }
 
     static void testZipFile(File f, Charset cs,
                             String name, String comment, byte[] bb)
         throws Exception
     {
-        ZipFile zf = new ZipFile(f, cs);
-        Enumeration<? extends ZipEntry> zes = zf.entries();
-        ZipEntry e = (ZipEntry)zes.nextElement();
-        if (! name.equals(e.getName()) ||
-            ! comment.equals(e.getComment()))
-            throw new RuntimeException("ZipFile: name/comment doesn't match!");
-        InputStream is = zf.getInputStream(e);
-        if (is == null)
-            throw new RuntimeException("ZipFile: getIS failed!");
-        byte[] bBuf = new byte[bb.length << 1];
-        int n = 0;
-        int nn =0;
-        while ((nn = is.read(bBuf, n, bBuf.length-n)) != -1) {
-            n += nn;
+        try (ZipFile zf = new ZipFile(f, cs)) {
+            Enumeration<? extends ZipEntry> zes = zf.entries();
+            ZipEntry e = (ZipEntry)zes.nextElement();
+            if (! name.equals(e.getName()) ||
+                ! comment.equals(e.getComment()))
+                throw new RuntimeException("ZipFile: name/comment doesn't match!");
+            InputStream is = zf.getInputStream(e);
+            if (is == null)
+                throw new RuntimeException("ZipFile: getIS failed!");
+            byte[] bBuf = new byte[bb.length << 1];
+            int n = 0;
+            int nn =0;
+            while ((nn = is.read(bBuf, n, bBuf.length-n)) != -1) {
+                n += nn;
+            }
+            if (n != bb.length ||
+                !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
+                throw new RuntimeException("ZipFile content doesn't match!");
+            }
         }
-        if (n != bb.length ||
-            !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
-            throw new RuntimeException("ZipFile content doesn't match!");
-        }
-        zf.close();
     }
 
     static void test(String csn, String name, String comment)
         throws Exception
     {
-        byte[] bb = "This is the conent of the zipfile".getBytes("ISO-8859-1");
+        byte[] bb = "This is the content of the zipfile".getBytes("ISO-8859-1");
         Charset cs = Charset.forName(csn);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ZipOutputStream zos = new ZipOutputStream(baos, cs);
-
-        ZipEntry e = new ZipEntry(name);
-        e.setComment(comment);
-        zos.putNextEntry(e);
-        zos.write(bb, 0, bb.length);
-        zos.closeEntry();
-        zos.close();
+        try (ZipOutputStream zos = new ZipOutputStream(baos, cs)) {
+            ZipEntry e = new ZipEntry(name);
+            e.setComment(comment);
+            zos.putNextEntry(e);
+            zos.write(bb, 0, bb.length);
+            zos.closeEntry();
+        }
         ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
         testZipInputStream(bis, cs, name, comment, bb);
 
@@ -121,9 +120,9 @@
 
         File f = new File(new File(System.getProperty("test.dir", ".")),
                           "zfcoding.zip");
-        FileOutputStream fos = new FileOutputStream(f);
-        baos.writeTo(fos);
-        fos.close();
+        try (FileOutputStream fos = new FileOutputStream(f)) {
+            baos.writeTo(fos);
+        }
         testZipFile(f, cs, name, comment, bb);
         if ("utf-8".equals(csn)) {
             testZipFile(f, Charset.forName("MS932"), name, comment, bb);
--- a/jdk/test/java/util/zip/ZipFile/Assortment.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/Assortment.java	Fri Mar 18 15:44:45 2011 -0700
@@ -201,13 +201,12 @@
         //----------------------------------------------------------------
         // Write zip file using ZipOutputStream
         //----------------------------------------------------------------
-        ZipOutputStream zos = new ZipOutputStream(
-            new FileOutputStream(zipName));
-
-        for (Entry e : entries)
-            e.write(zos);
-
-        zos.close();
+        try (FileOutputStream fos = new FileOutputStream(zipName);
+             ZipOutputStream zos = new ZipOutputStream(fos))
+        {
+            for (Entry e : entries)
+                e.write(zos);
+        }
 
         //----------------------------------------------------------------
         // Verify zip file contents using JarFile class
--- a/jdk/test/java/util/zip/ZipFile/Comment.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/Comment.java	Fri Mar 18 15:44:45 2011 -0700
@@ -57,16 +57,15 @@
     private static void writeZipFile(String name, String comment)
         throws IOException
     {
-        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(name));
-        try {
+        try (FileOutputStream fos = new FileOutputStream(name);
+             ZipOutputStream zos = new ZipOutputStream(fos))
+        {
             zos.setComment(comment);
             ZipEntry ze = new ZipEntry(entryName);
             ze.setMethod(ZipEntry.DEFLATED);
             zos.putNextEntry(ze);
             new DataOutputStream(zos).writeUTF(entryContents);
             zos.closeEntry();
-        } finally {
-            zos.close();
         }
     }
 
@@ -74,30 +73,30 @@
         throws Exception
     {
         // Check that Zip entry was correctly written.
-        ZipFile zipFile = new ZipFile(name);
-        ZipEntry zipEntry = zipFile.getEntry(entryName);
-        InputStream is = zipFile.getInputStream(zipEntry);
-        String result = new DataInputStream(is).readUTF();
-        if (!result.equals(entryContents))
-            throw new Exception("Entry contents corrupted");
+        try (ZipFile zipFile = new ZipFile(name)) {
+            ZipEntry zipEntry = zipFile.getEntry(entryName);
+            InputStream is = zipFile.getInputStream(zipEntry);
+            String result = new DataInputStream(is).readUTF();
+            if (!result.equals(entryContents))
+                throw new Exception("Entry contents corrupted");
+        }
 
-        // Check that comment length was correctly written.
-        RandomAccessFile file = new RandomAccessFile(name, "r");
-        file.seek(file.length() - comment.length()
-                  - ZipFile.ENDHDR + ZipFile.ENDCOM);
-        int b1 = file.readUnsignedByte();
-        int b2 = file.readUnsignedByte();
-        if (b1 + (b2 << 8) != comment.length())
-            throw new Exception("Zip file comment length corrupted");
+        try (RandomAccessFile file = new RandomAccessFile(name, "r")) {
+            // Check that comment length was correctly written.
+            file.seek(file.length() - comment.length()
+                      - ZipFile.ENDHDR + ZipFile.ENDCOM);
+            int b1 = file.readUnsignedByte();
+            int b2 = file.readUnsignedByte();
+            if (b1 + (b2 << 8) != comment.length())
+                throw new Exception("Zip file comment length corrupted");
 
-        // Check that comment was correctly written.
-        file.seek(file.length() - comment.length());
-        byte [] bytes = new byte [comment.length()];
-        file.readFully(bytes);
-        zipFile.close();
-        file.close();
-        if (! comment.equals(new String(bytes, "UTF8")))
-            throw new Exception("Zip file comment corrupted");
+            // Check that comment was correctly written.
+            file.seek(file.length() - comment.length());
+            byte [] bytes = new byte [comment.length()];
+            file.readFully(bytes);
+            if (! comment.equals(new String(bytes, "UTF8")))
+                throw new Exception("Zip file comment corrupted");
+        }
     }
 
     private static String buildComment(int length) {
--- a/jdk/test/java/util/zip/ZipFile/CopyJar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/CopyJar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -31,18 +31,18 @@
 
 public class CopyJar {
     public static void main(String args[]) throws Exception {
-        ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
-                                          "input.jar"));
-        ZipEntry ze = zf.getEntry("ReleaseInflater.java");
-        ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());
-        InputStream in = zf.getInputStream(ze);
-        byte[] b = new byte[128];
-        int n;
-        zos.putNextEntry(ze);
-        while((n = in.read(b)) != -1) {
-            zos.write(b, 0, n);
+        try (ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
+                                               "input.jar"))) {
+            ZipEntry ze = zf.getEntry("ReleaseInflater.java");
+            ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());
+            InputStream in = zf.getInputStream(ze);
+            byte[] b = new byte[128];
+            int n;
+            zos.putNextEntry(ze);
+            while((n = in.read(b)) != -1) {
+                zos.write(b, 0, n);
+            }
+            zos.close();
         }
-        zos.close();
-        zf.close();
     }
 }
--- a/jdk/test/java/util/zip/ZipFile/CorruptedZipFiles.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/CorruptedZipFiles.java	Fri Mar 18 15:44:45 2011 -0700
@@ -47,21 +47,19 @@
     }
 
     public static void main(String[] args) throws Exception {
-        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("x.zip"));
-        try {
+        try (FileOutputStream fos = new FileOutputStream("x.zip");
+             ZipOutputStream zos = new ZipOutputStream(fos))
+        {
             ZipEntry e = new ZipEntry("x");
             zos.putNextEntry(e);
             zos.write((int)'x');
-        } finally {
-            zos.close();
         }
 
         int len = (int)(new File("x.zip").length());
         byte[] good = new byte[len];
-        FileInputStream fis = new FileInputStream("x.zip");
-        fis.read(good);
-        fis.close();
-        fis = null;
+        try (FileInputStream fis = new FileInputStream("x.zip")) {
+            fis.read(good);
+        }
         new File("x.zip").delete();
 
         int endpos = len - ENDHDR;
@@ -150,17 +148,14 @@
                                       boolean getInputStream) {
         String zipName = "bad" + (uniquifier++) + ".zip";
         try {
-            FileOutputStream fos = new FileOutputStream(zipName);
-            fos.write(data);
-            fos.close();
-            ZipFile zf = new ZipFile(zipName);
-            try {
+            try (FileOutputStream fos = new FileOutputStream(zipName)) {
+                fos.write(data);
+            }
+            try (ZipFile zf = new ZipFile(zipName)) {
                 if (getInputStream) {
                     InputStream is = zf.getInputStream(new ZipEntry("x"));
                     is.read();
                 }
-            } finally {
-                zf.close();
             }
             fail("Failed to throw expected ZipException");
         } catch (ZipException e) {
@@ -170,8 +165,7 @@
                 unexpected(e);
         } catch (Throwable t) {
             unexpected(t);
-        }
-        finally {
+        } finally {
             new File(zipName).delete();
         }
     }
--- a/jdk/test/java/util/zip/ZipFile/DeleteTempJar.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/DeleteTempJar.java	Fri Mar 18 15:44:45 2011 -0700
@@ -53,34 +53,34 @@
     {
         final File zf = File.createTempFile("deletetemp", ".jar");
         zf.deleteOnExit();
-        JarOutputStream jos = new JarOutputStream(
-                new FileOutputStream(zf));
-        JarEntry je = new JarEntry("entry");
-        jos.putNextEntry(je);
-        jos.write("hello, world".getBytes("ASCII"));
-        jos.close();
+        try (FileOutputStream fos = new FileOutputStream(zf);
+             JarOutputStream jos = new JarOutputStream(fos))
+        {
+            JarEntry je = new JarEntry("entry");
+            jos.putNextEntry(je);
+            jos.write("hello, world".getBytes("ASCII"));
+        }
 
         HttpServer server = HttpServer.create(
                 new InetSocketAddress((InetAddress) null, 0), 0);
         HttpContext context = server.createContext("/",
             new HttpHandler() {
                 public void handle(HttpExchange e) {
-                try {
-                    FileInputStream fis = new FileInputStream(zf);
-                    e.sendResponseHeaders(200, zf.length());
-                    OutputStream os = e.getResponseBody();
-                    byte[] buf = new byte[1024];
-                    int count = 0;
-                    while ((count = fis.read(buf)) != -1) {
-                        os.write(buf, 0, count);
+                    try (FileInputStream fis = new FileInputStream(zf)) {
+                        e.sendResponseHeaders(200, zf.length());
+                        OutputStream os = e.getResponseBody();
+                        byte[] buf = new byte[1024];
+                        int count = 0;
+                        while ((count = fis.read(buf)) != -1) {
+                            os.write(buf, 0, count);
+                        }
+                    } catch (Exception ex) {
+                        unexpected(ex);
+                    } finally {
+                        e.close();
                     }
-                    fis.close();
-                    e.close();
-                } catch (Exception ex) {
-                    unexpected(ex);
                 }
-            }
-        });
+            });
         server.start();
 
         URL url = new URL("jar:http://localhost:"
--- a/jdk/test/java/util/zip/ZipFile/EnumAfterClose.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/EnumAfterClose.java	Fri Mar 18 15:44:45 2011 -0700
@@ -33,10 +33,12 @@
 
 public class EnumAfterClose {
     public static void main(String args[]) throws Exception {
-        ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
-                                          "input.zip"));
-        Enumeration e = zf.entries();
-        zf.close();
+        Enumeration e;
+        try (ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
+                                               "input.zip"))) {
+            e = zf.entries();
+        }
+        // ensure that the ZipFile is closed before checking the Enumeration
         try {
             if (e.hasMoreElements()) {
                 ZipEntry ze = (ZipEntry)e.nextElement();
--- a/jdk/test/java/util/zip/ZipFile/GetDirEntry.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/GetDirEntry.java	Fri Mar 18 15:44:45 2011 -0700
@@ -32,12 +32,12 @@
 
 public class GetDirEntry {
     public static void main(String args[]) throws Exception {
-        ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
-                                          "input.jar"));
-        ZipEntry ze = zf.getEntry("META-INF");
-        if (ze == null) {
-            throw new Exception("failed to find a directory entry");
+        try (ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
+                                               "input.jar"))) {
+            ZipEntry ze = zf.getEntry("META-INF");
+            if (ze == null) {
+                throw new Exception("failed to find a directory entry");
+            }
         }
-        zf.close();
     }
 }
--- a/jdk/test/java/util/zip/ZipFile/LargeZipFile.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/LargeZipFile.java	Fri Mar 18 15:44:45 2011 -0700
@@ -93,51 +93,50 @@
             baos.write(bb.array(), 0, DATA_SIZE);
         }
         data = baos.toByteArray();
-
-        ZipOutputStream zos = new ZipOutputStream(
-            new BufferedOutputStream(new FileOutputStream(largeFile)));
-        long length = 0;
-        while (length < fileSize) {
-            ZipEntry ze = new ZipEntry("entry-" + length);
-            lastEntryName = ze.getName();
-            zos.putNextEntry(ze);
-            zos.write(data, 0, data.length);
-            zos.closeEntry();
-            length = largeFile.length();
+        try (FileOutputStream fos = new FileOutputStream(largeFile);
+             BufferedOutputStream bos = new BufferedOutputStream(fos);
+             ZipOutputStream zos = new ZipOutputStream(bos))
+        {
+            long length = 0;
+            while (length < fileSize) {
+                ZipEntry ze = new ZipEntry("entry-" + length);
+                lastEntryName = ze.getName();
+                zos.putNextEntry(ze);
+                zos.write(data, 0, data.length);
+                zos.closeEntry();
+                length = largeFile.length();
+            }
+            System.out.println("Last entry written is " + lastEntryName);
         }
-        System.out.println("Last entry written is " + lastEntryName);
-        zos.close();
     }
 
     static void readLargeZip() throws Throwable {
-        ZipFile zipFile = new ZipFile(largeFile);
-        ZipEntry entry = null;
-        String entryName = null;
-        int count = 0;
-        Enumeration<? extends ZipEntry> entries = zipFile.entries();
-        while (entries.hasMoreElements()) {
-            entry = entries.nextElement();
-            entryName = entry.getName();
-            count++;
+        try (ZipFile zipFile = new ZipFile(largeFile)) {
+            ZipEntry entry = null;
+            String entryName = null;
+            int count = 0;
+            Enumeration<? extends ZipEntry> entries = zipFile.entries();
+            while (entries.hasMoreElements()) {
+                entry = entries.nextElement();
+                entryName = entry.getName();
+                count++;
+            }
+            System.out.println("Number of entries read: " + count);
+            System.out.println("Last entry read is " + entryName);
+            check(!entry.isDirectory());
+            if (check(entryName.equals(lastEntryName))) {
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                InputStream is = zipFile.getInputStream(entry);
+                byte buf[] = new byte[4096];
+                int len;
+                while ((len = is.read(buf)) >= 0) {
+                    baos.write(buf, 0, len);
+                }
+                baos.close();
+                is.close();
+                check(Arrays.equals(data, baos.toByteArray()));
+            }
         }
-        System.out.println("Number of entries read: " + count);
-        System.out.println("Last entry read is " + entryName);
-        check(!entry.isDirectory());
-        if (check(entryName.equals(lastEntryName))) {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            InputStream is = zipFile.getInputStream(entry);
-            byte buf[] = new byte[4096];
-            int len;
-            while ((len = is.read(buf)) >= 0) {
-                baos.write(buf, 0, len);
-            }
-            baos.close();
-            is.close();
-            check(Arrays.equals(data, baos.toByteArray()));
-        }
-        try {
-          zipFile.close();
-        } catch (IOException ioe) {/* what can you do */ }
     }
 
     //--------------------- Infrastructure ---------------------------
--- a/jdk/test/java/util/zip/ZipFile/ManyEntries.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/ManyEntries.java	Fri Mar 18 15:44:45 2011 -0700
@@ -55,10 +55,10 @@
         File zipFile = new File(++uniquifier + ".zip");
         try {
             zipFile.delete();
-            ZipOutputStream zos = new ZipOutputStream(
-                new BufferedOutputStream(
-                    new FileOutputStream(zipFile)));
-            try {
+            try (FileOutputStream fos = new FileOutputStream(zipFile);
+                 BufferedOutputStream bos = new BufferedOutputStream(fos);
+                 ZipOutputStream zos = new ZipOutputStream(bos))
+            {
                 for (int i = 0; i < N; i++) {
                     ZipEntry e = new ZipEntry("DIR/"+i);
                     e.setMethod(method);
@@ -75,13 +75,9 @@
                     zos.putNextEntry(e);
                     zos.write(i);
                 }
-            } finally {
-                zos.close();
-                zos = null;
             }
 
-            ZipFile zip = zip = new ZipFile(zipFile);
-            try {
+            try (ZipFile zip = new ZipFile(zipFile)) {
                 if (! (zip.size() == N))
                     throw new Exception("Bad ZipFile size: " + zip.size());
                 Enumeration entries = zip.entries();
@@ -104,11 +100,8 @@
                 }
                 if (entries.hasMoreElements())
                     throw new Exception("too many elements");
-            } finally {
-                zip.close();
             }
-        }
-        finally {
+        } finally {
             zipFile.delete();
         }
     }
--- a/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java	Fri Mar 18 15:44:45 2011 -0700
@@ -51,14 +51,14 @@
 
         // Create some zip data
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ZipOutputStream zos = new ZipOutputStream(baos);
-        ZipEntry ze = new ZipEntry("test");
-        zos.putNextEntry(ze);
-        byte[] hello = "hello, world".getBytes("ASCII");
-        zos.write(hello, 0, hello.length);
-        zos.closeEntry();
-        zos.finish();
-        zos.close();
+        try (ZipOutputStream zos = new ZipOutputStream(baos)) {
+            ZipEntry ze = new ZipEntry("test");
+            zos.putNextEntry(ze);
+            byte[] hello = "hello, world".getBytes("ASCII");
+            zos.write(hello, 0, hello.length);
+            zos.closeEntry();
+            zos.finish();
+        }
         byte[] data = baos.toByteArray();
 
         ZipFile zips[] = new ZipFile[numFiles];
@@ -90,9 +90,9 @@
             for (int i = 0; i < numFiles; i++) {
                 File f = File.createTempFile("test", ".zip", tmpdir);
                 f.deleteOnExit();
-                FileOutputStream fos = new FileOutputStream(f);
-                fos.write(data, 0, data.length);
-                fos.close();
+                try (FileOutputStream fos = new FileOutputStream(f)) {
+                    fos.write(data, 0, data.length);
+                }
                 try {
                     zips[i] = new ZipFile(f);
                 } catch (Throwable t) {
@@ -102,11 +102,12 @@
                 }
             }
         } finally {
-            // This finally block is due to bug 4171239.  On windows, if the
+            // This finally block is due to bug 4171239.  On Windows, if the
             // file is still open at the end of the VM, deleteOnExit won't
             // take place.  "new ZipFile(...)" opens the zip file, so we have
-            // to explicity close those opened above.  This finally block can
-            // be removed when 4171239 is fixed.
+            // to explicitly close those opened above.  This finally block can
+            // be removed when 4171239 is fixed. See also 6357433, against which
+            // 4171239 was closed as a duplicate.
             for (int i = 0; i < numFiles; i++) {
                 if (zips[i] != null) {
                     try {
--- a/jdk/test/java/util/zip/ZipFile/ReadAfterClose.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/ReadAfterClose.java	Fri Mar 18 15:44:45 2011 -0700
@@ -34,10 +34,13 @@
 
 public class ReadAfterClose {
     public static void main(String[] argv) throws Exception {
-        ZipFile zf = new ZipFile(new File(System.getProperty("test.src","."),"crash.jar"));
-        ZipEntry zent = zf.getEntry("Test.java");
-        InputStream in = zf.getInputStream(zent);
-        zf.close();
+        InputStream in;
+        try (ZipFile zf = new ZipFile(
+                 new File(System.getProperty("test.src","."),"crash.jar"))) {
+            ZipEntry zent = zf.getEntry("Test.java");
+            in = zf.getInputStream(zent);
+        }
+        // ensure zf is closed at this point
         try {
             in.read();
         } catch (IOException e) {
--- a/jdk/test/java/util/zip/ZipFile/ReadZip.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/ReadZip.java	Fri Mar 18 15:44:45 2011 -0700
@@ -27,6 +27,10 @@
  */
 
 import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
 import java.util.zip.*;
 
 public class ReadZip {
@@ -38,71 +42,62 @@
     }
 
     public static void main(String args[]) throws Exception {
-        ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
-                                          "input.zip"));
-
-        // Make sure we throw NPE on null objects
-        try { unreached (zf.getEntry(null)); }
-        catch (NullPointerException e) {}
+        try (ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."),
+                                               "input.zip"))) {
+            // Make sure we throw NPE on null objects
+            try { unreached (zf.getEntry(null)); }
+            catch (NullPointerException e) {}
 
-        try { unreached (zf.getInputStream(null)); }
-        catch (NullPointerException e) {}
+            try { unreached (zf.getInputStream(null)); }
+            catch (NullPointerException e) {}
 
-        ZipEntry ze = zf.getEntry("ReadZip.java");
-        if (ze == null) {
-            throw new Exception("cannot read from zip file");
+            ZipEntry ze = zf.getEntry("ReadZip.java");
+            if (ze == null) {
+                throw new Exception("cannot read from zip file");
+            }
         }
-        zf.close();
 
         // Make sure we can read the zip file that has some garbage
         // bytes padded at the end.
-        FileInputStream fis = new FileInputStream(
-                                   new File(System.getProperty("test.src", "."),
-                                            "input.zip"));
-        File newZip = new File(System.getProperty("test.dir", "."),
-                               "input2.zip");
-        FileOutputStream fos = new FileOutputStream(newZip);
+        File newZip = new File(System.getProperty("test.dir", "."), "input2.zip");
+        Files.copy(Paths.get(System.getProperty("test.src", ""), "input.zip"),
+                   newZip.toPath(), StandardCopyOption.REPLACE_EXISTING);
 
-        byte[] buf = new byte[1024];
-        int n = 0;
-        while ((n = fis.read(buf)) != -1) {
-            fos.write(buf, 0, n);
+        // pad some bytes
+        try (OutputStream os = Files.newOutputStream(newZip.toPath(),
+                                                     StandardOpenOption.APPEND)) {
+            os.write(1); os.write(3); os.write(5); os.write(7);
         }
-        fis.close();
-        // pad some bytes
-        fos.write(1); fos.write(3); fos.write(5); fos.write(7);
-        fos.close();
-        try {
-            zf = new ZipFile(newZip);
-            ze = zf.getEntry("ReadZip.java");
+
+        try (ZipFile zf = new ZipFile(newZip)) {
+            ZipEntry ze = zf.getEntry("ReadZip.java");
             if (ze == null) {
                 throw new Exception("cannot read from zip file");
             }
         } finally {
-            zf.close();
             newZip.delete();
         }
 
         // Read zip file comment
         try {
+            try (FileOutputStream fos = new FileOutputStream(newZip);
+                 ZipOutputStream zos = new ZipOutputStream(fos))
+            {
+                ZipEntry ze = new ZipEntry("ZipEntry");
+                zos.putNextEntry(ze);
+                zos.write(1); zos.write(2); zos.write(3); zos.write(4);
+                zos.closeEntry();
+                zos.setComment("This is the comment for testing");
+            }
 
-            ZipOutputStream zos = new ZipOutputStream(
-                                      new FileOutputStream(newZip));
-            ze = new ZipEntry("ZipEntry");
-            zos.putNextEntry(ze);
-            zos.write(1); zos.write(2); zos.write(3); zos.write(4);
-            zos.closeEntry();
-            zos.setComment("This is the comment for testing");
-            zos.close();
-
-            zf = new ZipFile(newZip);
-            ze = zf.getEntry("ZipEntry");
-            if (ze == null)
-                throw new Exception("cannot read entry from zip file");
-            if (!"This is the comment for testing".equals(zf.getComment()))
-                throw new Exception("cannot read comment from zip file");
+            try (ZipFile zf = new ZipFile(newZip)) {
+                ZipEntry ze = zf.getEntry("ZipEntry");
+                if (ze == null)
+                    throw new Exception("cannot read entry from zip file");
+                if (!"This is the comment for testing".equals(zf.getComment()))
+                    throw new Exception("cannot read comment from zip file");
+            }
         } finally {
-            zf.close();
             newZip.delete();
         }
 
--- a/jdk/test/java/util/zip/ZipFile/ShortRead.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/ZipFile/ShortRead.java	Fri Mar 18 15:44:45 2011 -0700
@@ -38,27 +38,29 @@
         try {
             final String entryName = "abc";
             final String data = "Data disponible";
-            final ZipOutputStream zos =
-                new ZipOutputStream(new FileOutputStream(zFile));
-            zos.putNextEntry(new ZipEntry(entryName));
-            zos.write(data.getBytes("ASCII"));
-            zos.closeEntry();
-            zos.close();
+            try (FileOutputStream fos = new FileOutputStream(zFile);
+                 ZipOutputStream zos = new ZipOutputStream(fos))
+            {
+                zos.putNextEntry(new ZipEntry(entryName));
+                zos.write(data.getBytes("ASCII"));
+                zos.closeEntry();
+            }
 
-            final ZipFile zipFile = new ZipFile(zFile);
-            final ZipEntry zentry = zipFile.getEntry(entryName);
-            final InputStream inputStream = zipFile.getInputStream(zentry);
-            System.out.printf("size=%d csize=%d available=%d%n",
-                              zentry.getSize(),
-                              zentry.getCompressedSize(),
-                              inputStream.available());
-            byte[] buf = new byte[data.length()];
-            final int count = inputStream.read(buf);
-            if (! new String(buf, "ASCII").equals(data) ||
-                count != data.length())
-                throw new Exception("short read?");
-            zipFile.close();
+            try (ZipFile zipFile = new ZipFile(zFile)) {
+                final ZipEntry zentry = zipFile.getEntry(entryName);
+                final InputStream inputStream = zipFile.getInputStream(zentry);
+                System.out.printf("size=%d csize=%d available=%d%n",
+                                  zentry.getSize(),
+                                  zentry.getCompressedSize(),
+                                  inputStream.available());
+                byte[] buf = new byte[data.length()];
+                final int count = inputStream.read(buf);
+                if (! new String(buf, "ASCII").equals(data) ||
+                    count != data.length())
+                    throw new Exception("short read?");
+            }
+        } finally {
+            zFile.delete();
         }
-        finally { zFile.delete(); }
     }
 }
--- a/jdk/test/java/util/zip/zip.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/java/util/zip/zip.java	Fri Mar 18 15:44:45 2011 -0700
@@ -322,57 +322,57 @@
 
     void create(OutputStream out) throws IOException
     {
-        ZipOutputStream zos = new ZipOutputStream(out, cs);
-        if (flag0) {
-            zos.setMethod(ZipOutputStream.STORED);
+        try (ZipOutputStream zos = new ZipOutputStream(out, cs)) {
+            if (flag0) {
+                zos.setMethod(ZipOutputStream.STORED);
+            }
+            for (File file: entries) {
+                addFile(zos, file);
+            }
         }
-        for (File file: entries) {
-            addFile(zos, file);
-        }
-        zos.close();
     }
 
     boolean update(InputStream in, OutputStream out) throws IOException
     {
-        ZipInputStream zis = new ZipInputStream(in, cs);
-        ZipOutputStream zos = new ZipOutputStream(out, cs);
-        ZipEntry e = null;
-        byte[] buf = new byte[1024];
-        int n = 0;
-        boolean updateOk = true;
+        try (ZipInputStream zis = new ZipInputStream(in, cs);
+             ZipOutputStream zos = new ZipOutputStream(out, cs))
+        {
+            ZipEntry e = null;
+            byte[] buf = new byte[1024];
+            int n = 0;
+            boolean updateOk = true;
 
-        // put the old entries first, replace if necessary
-        while ((e = zis.getNextEntry()) != null) {
-            String name = e.getName();
-            if (!entryMap.containsKey(name)) { // copy the old stuff
-                // do our own compression
-                ZipEntry e2 = new ZipEntry(name);
-                e2.setMethod(e.getMethod());
-                e2.setTime(e.getTime());
-                e2.setComment(e.getComment());
-                e2.setExtra(e.getExtra());
-                if (e.getMethod() == ZipEntry.STORED) {
-                    e2.setSize(e.getSize());
-                    e2.setCrc(e.getCrc());
+            // put the old entries first, replace if necessary
+            while ((e = zis.getNextEntry()) != null) {
+                String name = e.getName();
+                if (!entryMap.containsKey(name)) { // copy the old stuff
+                    // do our own compression
+                    ZipEntry e2 = new ZipEntry(name);
+                    e2.setMethod(e.getMethod());
+                    e2.setTime(e.getTime());
+                    e2.setComment(e.getComment());
+                    e2.setExtra(e.getExtra());
+                    if (e.getMethod() == ZipEntry.STORED) {
+                        e2.setSize(e.getSize());
+                        e2.setCrc(e.getCrc());
+                    }
+                    zos.putNextEntry(e2);
+                    while ((n = zis.read(buf, 0, buf.length)) != -1) {
+                        zos.write(buf, 0, n);
+                    }
+                } else { // replace with the new files
+                    File f = entryMap.get(name);
+                    addFile(zos, f);
+                    entryMap.remove(name);
+                    entries.remove(f);
                 }
-                zos.putNextEntry(e2);
-                while ((n = zis.read(buf, 0, buf.length)) != -1) {
-                    zos.write(buf, 0, n);
-                }
-            } else { // replace with the new files
-                File f = entryMap.get(name);
+            }
+
+            // add the remaining new files
+            for (File f: entries) {
                 addFile(zos, f);
-                entryMap.remove(name);
-                entries.remove(f);
             }
         }
-
-        // add the remaining new files
-        for (File f: entries) {
-            addFile(zos, f);
-        }
-        zis.close();
-        zos.close();
         return updateOk;
     }
 
@@ -517,25 +517,25 @@
     }
 
     void extract(String fname, String files[]) throws IOException {
-        ZipFile zf = new ZipFile(fname, cs);
-        Set<ZipEntry> dirs = newDirSet();
-        Enumeration<? extends ZipEntry> zes = zf.entries();
-        while (zes.hasMoreElements()) {
-            ZipEntry e = zes.nextElement();
-            InputStream is;
-            if (files == null) {
-                dirs.add(extractFile(zf.getInputStream(e), e));
-            } else {
-                String name = e.getName();
-                for (String file : files) {
-                    if (name.startsWith(file)) {
-                        dirs.add(extractFile(zf.getInputStream(e), e));
-                        break;
+        try (ZipFile zf = new ZipFile(fname, cs)) {
+            Set<ZipEntry> dirs = newDirSet();
+            Enumeration<? extends ZipEntry> zes = zf.entries();
+            while (zes.hasMoreElements()) {
+                ZipEntry e = zes.nextElement();
+                InputStream is;
+                if (files == null) {
+                    dirs.add(extractFile(zf.getInputStream(e), e));
+                } else {
+                    String name = e.getName();
+                    for (String file : files) {
+                        if (name.startsWith(file)) {
+                            dirs.add(extractFile(zf.getInputStream(e), e));
+                            break;
+                        }
                     }
                 }
             }
         }
-        zf.close();
         updateLastModifiedTime(dirs);
     }
 
@@ -607,12 +607,12 @@
     }
 
     void list(String fname, String files[]) throws IOException {
-        ZipFile zf = new ZipFile(fname, cs);
-        Enumeration<? extends ZipEntry> zes = zf.entries();
-        while (zes.hasMoreElements()) {
-            printEntry(zes.nextElement(), files);
+        try (ZipFile zf = new ZipFile(fname, cs)) {
+            Enumeration<? extends ZipEntry> zes = zf.entries();
+            while (zes.hasMoreElements()) {
+                printEntry(zes.nextElement(), files);
+            }
         }
-        zf.close();
     }
 
     void printEntry(ZipEntry e, String[] files) throws IOException {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/File/SMPTESequence.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,75 @@
+/**
+ * @test
+ * @bug 6835393
+ * @summary Tests that MidiFileReader correctly reads sequences with different division types
+ * @author Alex Menkov
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.Sequence;
+
+public class SMPTESequence {
+
+    static int failed = 0;
+
+    public static void main(String[] args) {
+        test(Sequence.PPQ);
+        test(Sequence.SMPTE_24);
+        test(Sequence.SMPTE_25);
+        test(Sequence.SMPTE_30);
+        test(Sequence.SMPTE_30DROP);
+
+        if (failed > 0) {
+            throw new RuntimeException("" + failed + " tests failed");
+        }
+    }
+
+    static boolean test(float divisionType) {
+        boolean result = false;
+        try {
+            log("Testing divisionType == " + divisionType);
+            Sequence sequence = new Sequence(divisionType, 16, 1);
+            float div1 = sequence.getDivisionType();
+
+            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+            MidiSystem.write(sequence, 1, outStream);
+
+            InputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
+
+            sequence = MidiSystem.getSequence(inStream);
+            float div2 = sequence.getDivisionType();
+
+            log("After write/read got divisionType == " + div2);
+            if (Math.abs(div2 - div1) < 0.001f) {
+                result = true;
+            }
+        } catch (InvalidMidiDataException ex) {
+            log(ex);
+        } catch (IOException ex) {
+            log(ex);
+        } catch (IllegalArgumentException ex) {
+            log(ex);
+        }
+        if (result) {
+            log("OK");
+        } else {
+            log("FAIL");
+            failed++;
+        }
+        return result;
+    }
+
+    static void log(String s) {
+        System.out.println(s);
+    }
+
+    static void log(Exception ex) {
+        log("got exception (" + ex.getClass().getSimpleName() + "): " + ex.getMessage());
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/Sequencer/SequencerImplicitSynthOpen.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,110 @@
+/**
+ * @test
+ * @bug 6660470
+ * @summary Tests that sequencer correctly opens/closes (implicitly) devices
+ * @author Alex Menkov
+ */
+
+import java.util.List;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Sequencer;
+import javax.sound.midi.Transmitter;
+
+public class SequencerImplicitSynthOpen {
+
+    static int TEST_COUNT   = 5;
+
+    public static void main(String[] args) {
+        try {
+            log("getting sequencer...");
+            Sequencer sequencer = MidiSystem.getSequencer();
+            log("  - got " + getDeviceStr(sequencer));
+
+            // obtain connected device (usually synthesizer)
+            MidiDevice synth = getConnectedDevice(sequencer);
+            if (synth == null) {
+                log("could not get connected device, returning");
+                return;
+            }
+
+            log("connected device: " + getDeviceStr(synth));
+
+            int success = 0;
+            for (int i=0; i<TEST_COUNT; i++) {
+                if (test(sequencer)) {
+                    success++;
+                }
+            }
+
+            if (success != TEST_COUNT) {
+                throw new RuntimeException("test FAILS");
+            }
+        } catch (MidiUnavailableException ex) {
+            // this is not a failure
+            log("Could not get Sequencer");
+        }
+        log("test PASSED.");
+    }
+
+    static boolean test(Sequencer sequencer) throws MidiUnavailableException {
+        log("");
+        log("opening sequencer...");
+        sequencer.open();   // opens connected synthesizer implicitly
+        MidiDevice synth = getConnectedDevice(sequencer);
+        log("  connected device: " + getDeviceStr(synth));
+
+        log("closing sequencer...");
+        sequencer.close();  // closes the synth implicitly
+        log("  synth is " + getDeviceStr(synth));
+        MidiDevice synth2 = getConnectedDevice(sequencer);
+        log("  currently connected device: " + getDeviceStr(synth2));
+
+        if (synth != null && synth.isOpen()) {
+            log("FAIL.");
+            return false;
+        }
+        log("OK.");
+        return true;
+    }
+
+    static MidiDevice getConnectedDevice(Sequencer sequencer) {
+        List<Transmitter> trans = sequencer.getTransmitters();
+        log("  sequencer has " + trans.size() + " opened transmitters:");
+        for (Transmitter tr: trans) {
+            Receiver r = tr.getReceiver();
+            log("    " + getClassStr(tr) + " connected to " + getClassStr(r));
+            if (r instanceof MidiDeviceReceiver) {
+                MidiDeviceReceiver recv = (MidiDeviceReceiver)r;
+                MidiDevice dev = recv.getMidiDevice();
+                log("      - receiver of " + getClassStr(dev));
+                return dev;
+            } else {
+                log("      - does NOT implement MidiDeviceReceiver");
+            }
+        }
+        return null;
+    }
+
+    static String getClassStr(Object o) {
+        if (o == null) {
+            return "<null>";
+        }
+        return o.getClass().getName();
+    }
+
+    static String getDeviceStr(MidiDevice dev) {
+        if (dev == null) {
+            return "NULL";
+        }
+        return getClassStr(dev) + ", " + (dev.isOpen() ? "OPENED" : "CLOSED");
+    }
+
+    static void log(String s) {
+        System.out.println(s);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/sampled/Clip/ClipSetPos.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6801206
+ * @summary Tests that Clip sets frame position
+ * @author Alex Menkov
+ */
+
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.LineUnavailableException;
+
+public class ClipSetPos {
+
+    final static AudioFormat audioFormat = new AudioFormat(44100f, 16, 2, true, true);
+    final static int frameLength = 44100 * 2; // 2 seconds
+    final static byte[] dataBuffer
+            = new byte[frameLength * (audioFormat.getSampleSizeInBits()/8)
+                       * audioFormat.getChannels()];
+    final static int MAX_FRAME_DELTA = 20;
+
+    public static void main(String[] args) {
+        boolean testPassed = true;
+        Clip clip = null;
+        try {
+            clip = AudioSystem.getClip();
+            clip.open(audioFormat, dataBuffer, 0, dataBuffer.length);
+        } catch (LineUnavailableException ex) {
+            log(ex);
+            log("Cannot test (this is not failure)");
+            return;
+        }
+
+        log("clip: " + clip.getClass().getName());
+
+        int len = clip.getFrameLength();
+        for (int pos=0; pos < len; pos += (len /100)) {
+            clip.setFramePosition(pos);
+            int curPos = clip.getFramePosition();
+            if (Math.abs(pos - curPos) > MAX_FRAME_DELTA) {
+                log("Tried to set pos to " + pos + ", but got back " + curPos);
+                testPassed = false;
+            } else {
+                log("Sucessfully set pos to " + pos);
+            }
+        }
+        clip.close();
+
+        if (testPassed) {
+            log("Test PASSED.");
+        } else {
+            log("Test FAILED.");
+            throw new RuntimeException("Test FAILED (see log)");
+        }
+    }
+
+    static void log(String s) {
+        System.out.println(s);
+    }
+
+    static void log(Exception ex) {
+        ex.printStackTrace(System.out);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/sampled/FileWriter/AlawEncoderSync.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,113 @@
+/**
+ * @test
+ * @bug 6938426
+ * @summary Tests that Alaw encoder works properly in multithreaded environment
+ * @author Alex Menkov
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+
+public class AlawEncoderSync {
+
+    static final int THREAD_COUNT   = 20;
+
+    static final AudioFormat pcmFormat = new AudioFormat(8000f, 16, 2, true, false);
+    static final int STREAM_LENGTH = 10;    // in seconds
+    static byte[] pcmBuffer;
+    static final AudioFormat alawFormat
+            = new AudioFormat(AudioFormat.Encoding.ALAW, 8000f, 8, 2, 2, 8000f, false);
+
+    static final ConversionThread[] threads = new ConversionThread[THREAD_COUNT];
+
+    public static void main(String[] args) {
+        preparePCMBuffer();
+        log("pcmStream size: " + pcmBuffer.length);
+
+        for (int i=0; i<THREAD_COUNT; i++) {
+            threads[i] = new ConversionThread(i);
+            threads[i].start();
+        }
+
+        for (int i=1; i<THREAD_COUNT; i++) {
+            try {
+                threads[i].join();
+            } catch (InterruptedException ex) {
+                log("Main thread was interrupted, exiting.");
+                return;
+            }
+        }
+
+        int failed = 0;
+        log("comparing result arrays...");
+        for (int i=1; i<THREAD_COUNT; i++) {
+            if (!Arrays.equals(threads[0].resultArray, threads[i].resultArray)) {
+                failed++;
+                log("NOT equals: 0 and " + i);
+            }
+        }
+        if (failed > 0) {
+            throw new RuntimeException("test FAILED");
+        }
+        log("test PASSED.");
+    }
+
+
+    static void preparePCMBuffer() {
+        pcmBuffer = new byte[STREAM_LENGTH * (int)pcmFormat.getSampleRate()
+                * (pcmFormat.getSampleSizeInBits() / 8) * pcmFormat.getChannels()];
+        for (int i=0; i<pcmBuffer.length; i++) {
+            pcmBuffer[i] = (byte)(Math.random() * 256.0 - 128.0);
+        }
+    }
+
+    static AudioInputStream createPCMStream() {
+        InputStream byteStream = new ByteArrayInputStream(pcmBuffer);
+        return new AudioInputStream(byteStream, pcmFormat, AudioSystem.NOT_SPECIFIED);
+    }
+
+    static class ConversionThread extends Thread {
+        public final int num;
+        public byte[] resultArray = null;
+        public ConversionThread(int num) {
+            this.num = num;
+        }
+        @Override
+        public void run() {
+            log("ConversionThread[" + num + "] started.");
+            try {
+                InputStream inStream = new ByteArrayInputStream(pcmBuffer);
+
+                AudioInputStream pcmStream = new AudioInputStream(
+                        inStream, pcmFormat, AudioSystem.NOT_SPECIFIED);
+                AudioInputStream alawStream = AudioSystem.getAudioInputStream(alawFormat, pcmStream);
+
+                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+                int read = 0;
+                byte[] data = new byte[4096];
+                while((read = alawStream.read(data)) != -1) {
+                    outStream.write(data, 0, read);
+               }
+               alawStream.close();
+               resultArray = outStream.toByteArray();
+            } catch (Exception ex) {
+                log("ConversionThread[" + num + "] exception:");
+                log(ex);
+            }
+            log("ConversionThread[" + num + "] completed.");
+        }
+    }
+
+    static void log(String s) {
+        System.out.println(s);
+    }
+
+    static void log(Exception ex) {
+        ex.printStackTrace(System.out);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/sampled/FileWriter/WriterCloseInput.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,127 @@
+/**
+ * @test
+ * @bug 7013521
+ * @summary AIFF/AU/WAVE writers close input audio stream
+ * @author Alex Menkov
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+
+
+public class WriterCloseInput {
+
+    final static AudioFormat audioFormat = new AudioFormat(44100f, 16, 2, true, true);
+    //final static AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.ULAW, 44100f, 8, 2, 2, 44100f, true);
+    final static int frameLength = 44100 * 2; // 2 seconds
+    final static byte[] dataBuffer
+            = new byte[frameLength * (audioFormat.getSampleSizeInBits()/8)
+                       * audioFormat.getChannels()];
+
+    static int testTotal = 0;
+    static int testFailed = 0;
+
+    public static void main(String[] args) throws Exception {
+        test(AudioFileFormat.Type.AIFF);
+        test(AudioFileFormat.Type.AU);
+        test(AudioFileFormat.Type.WAVE);
+
+        if (testFailed == 0) {
+            out("All tests passed.");
+        } else {
+            out("" + testFailed + " of " + testTotal + " tests FAILED.");
+            System.out.flush();
+            throw new RuntimeException("Test FAILED.");
+        }
+    }
+
+    static void test(AudioFileFormat.Type fileType) {
+        test(fileType, frameLength);
+        test(fileType, AudioSystem.NOT_SPECIFIED);
+    }
+
+    static void test(AudioFileFormat.Type fileType, int length) {
+        test(fileType, length, false);
+        test(fileType, length, true);
+    }
+
+    static void test(AudioFileFormat.Type fileType, int length, boolean isFile) {
+        testTotal++;
+        out("Testing fileType: " + fileType
+                + ", frameLength: " + (length >= 0 ? length : "unspecified")
+                + ", output: " + (isFile ? "File" : "OutputStream"));
+        AudioInputStream inStream = new ThrowAfterCloseStream(
+                new ByteArrayInputStream(dataBuffer), audioFormat, length);
+
+        AudioSystem.isFileTypeSupported(fileType, inStream);
+
+        try {
+            if (isFile) {
+                File f = File.createTempFile("WriterCloseInput" + testTotal, "tmp");
+                AudioSystem.write(inStream, fileType, f);
+                f.delete();
+            } else {
+                OutputStream outStream = new NullOutputStream();
+                AudioSystem.write(inStream, fileType, outStream);
+            }
+        } catch (Exception ex) {
+            // this is not failure
+            out("SKIPPED (AudioSystem.write exception): " + ex.getMessage());
+            //out(ex);
+            inStream = null;
+        }
+
+        if (inStream != null) {
+            try {
+                // test if the stream is closed
+                inStream.available();
+                out("PASSED");
+            } catch (IOException ex) {
+                testFailed++;
+                out("FAILED: " + ex.getMessage());
+                //out(ex);
+            }
+        }
+        out("");
+    }
+
+    static class ThrowAfterCloseStream extends AudioInputStream {
+        private boolean closed = false;
+        public ThrowAfterCloseStream(InputStream in, AudioFormat format, long length) {
+            super(in, format, length);
+        }
+        @Override
+        public void close() {
+            closed = true;
+        }
+        @Override
+        public int available() throws IOException {
+            if (closed) {
+                throw new IOException("The stream has been closed");
+            }
+            return 1;
+        }
+    }
+
+    static class NullOutputStream extends OutputStream {
+        @Override
+        public void write(int b) throws IOException {
+            // nop
+        }
+    }
+
+    static void out(String s) {
+        System.out.println(s);
+    }
+
+    static void out(Exception ex) {
+        ex.printStackTrace(System.out);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/regtesthelpers/Util.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+/**
+ * <p>This class contains utilities useful for regression testing.
+ * <p>When using jtreg you would include this class via something like:
+ * <pre>
+ *
+ * @library ../../regtesthelpers
+ * @build Util
+ * </pre>
+ */
+
+public class Util {
+    /**
+     * Convert a rectangle from coordinate system of Component c to
+     * screen coordinate system.
+     *
+     * @param r a non-null Rectangle
+     * @param c a Component whose coordinate system is used for conversion
+     */
+    public static void convertRectToScreen(Rectangle r, Component c) {
+        Point p = new Point(r.x, r.y);
+        SwingUtilities.convertPointToScreen(p, c);
+        r.x = p.x;
+        r.y = p.y;
+    }
+
+    /**
+     * Compares two bufferedImages pixel-by-pixel.
+     * return true if all pixels in the two areas are identical
+     */
+    public static boolean compareBufferedImages(BufferedImage bufferedImage0, BufferedImage bufferedImage1) {
+        int width = bufferedImage0.getWidth();
+        int height = bufferedImage0.getHeight();
+
+        if (width != bufferedImage1.getWidth() || height != bufferedImage1.getHeight()) {
+            return false;
+        }
+
+        for (int y = 0; y < height; y++) {
+            for (int x = 0; x < width; x++) {
+                if (bufferedImage0.getRGB(x, y) != bufferedImage1.getRGB(x, y)) {
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/CSSBorder/6796710/bug6796710.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6796710
+ * @summary Html content in JEditorPane is overlapping on swing components while resizing the application.
+ * @library ../../../regtesthelpers
+ * @build Util
+ * @author Pavel Porvatov
+   @run main bug6796710
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class bug6796710 {
+    // The page is inlined because we want to be sure that the JEditorPane filled synchronously
+    public static final String TEXT = "<html>" +
+            "<body>" +
+            "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">" +
+            "    <tbody>" +
+            "        <tr>" +
+            "            <td>Col1</td>" +
+            "            <td>Col2</td>" +
+            "            <td>Col3</td>" +
+            "        </tr>" +
+            "        <tr>" +
+            "            <td>1. It's a regression from CR 4419748. The problem is in the CSSBorder#paintBorder, which ignores clip area while painting.</td>" +
+            "            <td>2. It's a regression from CR 4419748. The problem is in the CSSBorder#paintBorder, which ignores clip area while painting.</td>" +
+            "            <td>3. It's a regression from CR 4419748. The problem is in the CSSBorder#paintBorder, which ignores clip area while painting.</td>" +
+            "        </tr>" +
+            "    </tbody>" +
+            "</table>" +
+            "</body>" +
+            "</html>";
+
+    private static Robot robot;
+
+    private static JFrame frame;
+
+    private static JPanel pnBottom;
+
+    public static void main(String[] args) throws Exception {
+        robot = new Robot();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                frame = new JFrame();
+
+                pnBottom = new JPanel();
+                pnBottom.add(new JLabel("Some label"));
+                pnBottom.add(new JButton("A button"));
+
+                JEditorPane editorPane = new JEditorPane();
+
+                editorPane.setContentType("text/html");
+                editorPane.setText(TEXT);
+                editorPane.setEditable(false);
+
+                JPanel pnContent = new JPanel(new BorderLayout());
+
+                pnContent.add(new JScrollPane(editorPane), BorderLayout.CENTER);
+                pnContent.add(pnBottom, BorderLayout.SOUTH);
+
+                frame.setContentPane(pnContent);
+                frame.setSize(400, 600);
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.setVisible(true);
+            }
+        });
+
+        robot.waitForIdle();
+
+        BufferedImage bufferedImage = getPnBottomImage();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                frame.setSize(400, 150);
+            }
+        });
+
+        robot.waitForIdle();
+
+        if (!Util.compareBufferedImages(bufferedImage, getPnBottomImage())) {
+            throw new RuntimeException("The test failed");
+        }
+
+        System.out.println("The test bug6796710 passed.");
+    }
+
+    private static BufferedImage getPnBottomImage() {
+        Rectangle rect = pnBottom.getBounds();
+
+        Util.convertRectToScreen(rect, pnBottom.getParent());
+
+        return robot.createScreenCapture(rect);
+    }
+}
--- a/jdk/test/sun/misc/BootClassLoaderHook/TestHook.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.io.File;
-import java.util.TreeSet;
-import java.util.Set;
-import java.net.URLStreamHandlerFactory;
-import sun.misc.BootClassLoaderHook;
-import sun.misc.URLClassPath;
-
-
-/* @test
- * @bug     6888802
- * @summary Sanity test of BootClassLoaderHook interface
- *
- * @build TestHook
- * @run main TestHook
- */
-
-public class TestHook extends BootClassLoaderHook {
-
-    private static final TestHook hook = new TestHook();
-    private static Set<String> names = new TreeSet<String>();
-    private static final String LOGRECORD_CLASS =
-        "java.util.logging.LogRecord";
-    private static final String NONEXIST_RESOURCE =
-        "non.exist.resource";
-    private static final String LIBHELLO = "hello";
-
-    public static void main(String[] args) throws Exception {
-        BootClassLoaderHook.setHook(hook);
-        if (BootClassLoaderHook.getHook() == null) {
-           throw new RuntimeException("Null boot classloader hook ");
-        }
-
-        testHook();
-
-        if (!names.contains(LOGRECORD_CLASS)) {
-           throw new RuntimeException("loadBootstrapClass for " + LOGRECORD_CLASS + " not called");
-        }
-
-        if (!names.contains(NONEXIST_RESOURCE)) {
-           throw new RuntimeException("getBootstrapResource for " + NONEXIST_RESOURCE + " not called");
-        }
-        if (!names.contains(LIBHELLO)) {
-           throw new RuntimeException("loadLibrary for " + LIBHELLO + " not called");
-        }
-
-        Set<String> copy = new TreeSet<String>();
-        copy.addAll(names);
-        for (String s : copy) {
-            System.out.println("  Loaded " + s);
-        }
-    }
-
-    private static void testHook() throws Exception {
-        Class.forName(LOGRECORD_CLASS);
-        ClassLoader.getSystemResource(NONEXIST_RESOURCE);
-        try {
-          System.loadLibrary(LIBHELLO);
-        } catch (UnsatisfiedLinkError e) {
-        }
-    }
-
-    public String loadBootstrapClass(String className) {
-        names.add(className);
-        return null;
-    }
-
-    public String getBootstrapResource(String resourceName) {
-        names.add(resourceName);
-        return null;
-    }
-
-    public boolean loadLibrary(String libname) {
-        names.add(libname);
-        return false;
-    }
-
-    public URLClassPath getBootstrapClassPath(URLClassPath bcp,
-            URLStreamHandlerFactory factory) {
-        return bcp;
-    }
-
-    public boolean isCurrentThreadPrefetching() {
-        return false;
-    }
-
-    public boolean prefetchFile(String name) {
-        return false;
-    }
-}
--- a/jdk/test/sun/security/pkcs11/Cipher/TestRSACipher.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRSACipher.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 4898468
+ * @bug 4898468 6994008
  * @summary basic test for RSA cipher
  * @author Andreas Sterbenz
  * @library ..
@@ -38,9 +38,12 @@
 
 public class TestRSACipher extends PKCS11Test {
 
+    private static final String[] RSA_ALGOS =
+        { "RSA/ECB/PKCS1Padding", "RSA" };
+
     public void main(Provider p) throws Exception {
         try {
-            Cipher.getInstance("RSA/ECB/PKCS1Padding", p);
+            Cipher.getInstance(RSA_ALGOS[0], p);
         } catch (GeneralSecurityException e) {
             System.out.println("Not supported by provider, skipping");
             return;
@@ -55,57 +58,58 @@
         b = new byte[16];
         random.nextBytes(b);
 
-        Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding", p);
-        Cipher c2 = Cipher.getInstance("RSA/ECB/PKCS1Padding", "SunJCE");
+        for (String rsaAlgo: RSA_ALGOS) {
+            Cipher c1 = Cipher.getInstance(rsaAlgo, p);
+            Cipher c2 = Cipher.getInstance(rsaAlgo, "SunJCE");
 
-        c1.init(Cipher.ENCRYPT_MODE, publicKey);
-        e = c1.doFinal(b);
-        c1.init(Cipher.DECRYPT_MODE, privateKey);
-        d = c1.doFinal(e);
-        match(b, d);
-        c2.init(Cipher.DECRYPT_MODE, privateKey);
-        d = c2.doFinal(e);
-        match(b, d);
+            c1.init(Cipher.ENCRYPT_MODE, publicKey);
+            e = c1.doFinal(b);
+            c1.init(Cipher.DECRYPT_MODE, privateKey);
+            d = c1.doFinal(e);
+            match(b, d);
+            c2.init(Cipher.DECRYPT_MODE, privateKey);
+            d = c2.doFinal(e);
+            match(b, d);
 
-        // invalid data
-        c1.init(Cipher.DECRYPT_MODE, publicKey);
-        try {
-            d = c1.doFinal(e);
-            throw new Exception("completed call");
-        } catch (BadPaddingException ee) {
-            ee.printStackTrace();
-        }
+            // invalid data
+            c1.init(Cipher.DECRYPT_MODE, publicKey);
+            try {
+                d = c1.doFinal(e);
+                throw new Exception("completed call");
+            } catch (BadPaddingException ee) {
+                ee.printStackTrace();
+            }
 
-        c1.init(Cipher.ENCRYPT_MODE, privateKey);
-        e = c1.doFinal(b);
-        c1.init(Cipher.DECRYPT_MODE, publicKey);
-        d = c1.doFinal(e);
-        match(b, d);
-        c2.init(Cipher.DECRYPT_MODE, publicKey);
-        d = c2.doFinal(e);
-        match(b, d);
+            c1.init(Cipher.ENCRYPT_MODE, privateKey);
+            e = c1.doFinal(b);
+            c1.init(Cipher.DECRYPT_MODE, publicKey);
+            d = c1.doFinal(e);
+            match(b, d);
+            c2.init(Cipher.DECRYPT_MODE, publicKey);
+            d = c2.doFinal(e);
+            match(b, d);
 
-        // reinit tests
-        c1.init(Cipher.ENCRYPT_MODE, privateKey);
-        c1.init(Cipher.ENCRYPT_MODE, privateKey);
-        e = c1.doFinal(b);
-        e = c1.doFinal(b);
-        c1.update(b);
-        c1.update(b);
-        c1.init(Cipher.ENCRYPT_MODE, privateKey);
-        e = c1.doFinal();
-        e = c1.doFinal();
-        c1.update(b);
-        e = c1.doFinal();
+            // reinit tests
+            c1.init(Cipher.ENCRYPT_MODE, privateKey);
+            c1.init(Cipher.ENCRYPT_MODE, privateKey);
+            e = c1.doFinal(b);
+            e = c1.doFinal(b);
+            c1.update(b);
+            c1.update(b);
+            c1.init(Cipher.ENCRYPT_MODE, privateKey);
+            e = c1.doFinal();
+            e = c1.doFinal();
+            c1.update(b);
+            e = c1.doFinal();
 
-        c1.update(new byte[256]);
-        try {
-            e = c1.doFinal();
-            throw new Exception("completed call");
-        } catch (IllegalBlockSizeException ee) {
-            System.out.println(ee);
+            c1.update(new byte[256]);
+            try {
+                e = c1.doFinal();
+                throw new Exception("completed call");
+            } catch (IllegalBlockSizeException ee) {
+                System.out.println(ee);
+            }
         }
-
     }
 
     private static void match(byte[] b1, byte[] b2) throws Exception {
--- a/jdk/test/sun/security/pkcs11/Cipher/TestRSACipherWrap.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRSACipherWrap.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 6572331
+ * @bug 6572331 6994008
  * @summary basic test for RSA cipher key wrapping functionality
  * @author Valerie Peng
  * @library ..
@@ -38,47 +38,48 @@
 
 public class TestRSACipherWrap extends PKCS11Test {
 
-    private static final String RSA_ALGO = "RSA/ECB/PKCS1Padding";
+    private static final String[] RSA_ALGOS =
+        { "RSA/ECB/PKCS1Padding", "RSA" };
 
     public void main(Provider p) throws Exception {
         try {
-            Cipher.getInstance(RSA_ALGO, p);
+            Cipher.getInstance(RSA_ALGOS[0], p);
         } catch (GeneralSecurityException e) {
-            System.out.println("Not supported by provider, skipping");
+            System.out.println(RSA_ALGOS[0] + " unsupported, skipping");
             return;
         }
         KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", p);
         kpg.initialize(1024);
         KeyPair kp = kpg.generateKeyPair();
-        PublicKey publicKey = kp.getPublic();
-        PrivateKey privateKey = kp.getPrivate();
 
-        Cipher cipherPKCS11 = Cipher.getInstance(RSA_ALGO, p);
-        Cipher cipherJce = Cipher.getInstance(RSA_ALGO, "SunJCE");
+        for (String rsaAlgo: RSA_ALGOS) {
+            Cipher cipherPKCS11 = Cipher.getInstance(rsaAlgo, p);
+            Cipher cipherJce = Cipher.getInstance(rsaAlgo, "SunJCE");
 
-        String algos[] = {"AES", "RC2", "Blowfish"};
-        int keySizes[] = {128, 256};
+            String algos[] = {"AES", "RC2", "Blowfish"};
+            int keySizes[] = {128, 256};
 
-        for (int j = 0; j < algos.length; j++) {
-            String algorithm = algos[j];
-            KeyGenerator keygen =
+            for (int j = 0; j < algos.length; j++) {
+                String algorithm = algos[j];
+                KeyGenerator keygen =
                     KeyGenerator.getInstance(algorithm);
 
-            for (int i = 0; i < keySizes.length; i++) {
-                SecretKey secretKey = null;
-                System.out.print("Generate " + keySizes[i] + "-bit " +
+                for (int i = 0; i < keySizes.length; i++) {
+                    SecretKey secretKey = null;
+                    System.out.print("Generate " + keySizes[i] + "-bit " +
                         algorithm + " key using ");
-                try {
-                    keygen.init(keySizes[i]);
-                    secretKey = keygen.generateKey();
-                    System.out.println(keygen.getProvider().getName());
-                } catch (InvalidParameterException ipe) {
-                    secretKey = new SecretKeySpec(new byte[32], algorithm);
-                    System.out.println("SecretKeySpec class");
+                    try {
+                        keygen.init(keySizes[i]);
+                        secretKey = keygen.generateKey();
+                        System.out.println(keygen.getProvider().getName());
+                    } catch (InvalidParameterException ipe) {
+                        secretKey = new SecretKeySpec(new byte[32], algorithm);
+                        System.out.println("SecretKeySpec class");
+                    }
+                    test(kp, secretKey, cipherPKCS11, cipherJce);
+                    test(kp, secretKey, cipherPKCS11, cipherPKCS11);
+                    test(kp, secretKey, cipherJce, cipherPKCS11);
                 }
-                test(kp, secretKey, cipherPKCS11, cipherJce);
-                test(kp, secretKey, cipherPKCS11, cipherPKCS11);
-                test(kp, secretKey, cipherJce, cipherPKCS11);
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRawRSACipher.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6994008
+ * @summary basic test for RSA/ECB/NoPadding cipher
+ * @author Valerie Peng
+ * @library ..
+ */
+
+import javax.crypto.*;
+import java.io.*;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.*;
+import java.util.*;
+
+public class TestRawRSACipher extends PKCS11Test {
+
+    public void main(Provider p) throws Exception {
+        try {
+            Cipher.getInstance("RSA/ECB/NoPadding", p);
+        } catch (GeneralSecurityException e) {
+            System.out.println("Not supported by provider, skipping");
+            return;
+        }
+
+        final int KEY_LEN = 1024;
+        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", p);
+        kpGen.initialize(KEY_LEN);
+        KeyPair kp = kpGen.generateKeyPair();
+        Random random = new Random();
+        byte[] plainText, cipherText, recoveredText;
+        plainText = new byte[KEY_LEN/8];
+        random.nextBytes(plainText);
+        plainText[0] = 0; // to ensure that it's less than modulus
+
+        Cipher c1 = Cipher.getInstance("RSA/ECB/NoPadding", p);
+        Cipher c2 = Cipher.getInstance("RSA/ECB/NoPadding", "SunJCE");
+
+        c1.init(Cipher.ENCRYPT_MODE, kp.getPublic());
+        c2.init(Cipher.DECRYPT_MODE, kp.getPrivate());
+
+        cipherText = c1.doFinal(plainText);
+        recoveredText = c2.doFinal(cipherText);
+        if (!Arrays.equals(plainText, recoveredText)) {
+            throw new RuntimeException("E/D Test against SunJCE Failed!");
+        }
+
+        c2.init(Cipher.ENCRYPT_MODE, kp.getPublic());
+        c1.init(Cipher.DECRYPT_MODE, kp.getPrivate());
+        cipherText = c2.doFinal(plainText);
+        recoveredText = c1.doFinal(cipherText);
+        if (!Arrays.equals(plainText, recoveredText)) {
+            throw new RuntimeException("D/E Test against SunJCE Failed!");
+        }
+
+        System.out.println("Test Passed");
+    }
+
+    public static void main(String[] args) throws Exception {
+        main(new TestRawRSACipher());
+    }
+}
--- a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /**
  * @test %I% %E%
- * @bug 4898461
+ * @bug 4898461 6604496
  * @summary basic test for symmetric ciphers with padding
  * @author Valerie Peng
  * @library ..
@@ -70,9 +70,13 @@
         new CI("DES/ECB/PKCS5Padding", "DES", 6400),
         new CI("DESede/ECB/PKCS5Padding", "DESede", 400),
         new CI("AES/ECB/PKCS5Padding", "AES", 64),
+
         new CI("DES", "DES", 6400),
         new CI("DESede", "DESede", 408),
-        new CI("AES", "AES", 128)
+        new CI("AES", "AES", 128),
+
+        new CI("AES/CTR/NoPadding", "AES", 3200)
+
     };
     private static StringBuffer debugBuf = new StringBuffer();
 
--- a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 4898484
+ * @bug 4898484 6604496
  * @summary basic test for symmetric ciphers with no padding
  * @author Valerie Peng
  * @library ..
@@ -59,7 +59,8 @@
         new CI("DES/CBC/NoPadding", "DES", 400),
         new CI("DESede/CBC/NoPadding", "DESede", 160),
         new CI("AES/CBC/NoPadding", "AES", 4800),
-        new CI("Blowfish/CBC/NoPadding", "Blowfish", 24)
+        new CI("Blowfish/CBC/NoPadding", "Blowfish", 24),
+        new CI("AES/CTR/NoPadding", "AES", 1600)
     };
 
     private static StringBuffer debugBuf;
--- a/jdk/test/sun/security/tools/jarsigner/crl.sh	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/tools/jarsigner/crl.sh	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -32,9 +32,6 @@
 fi
 
 # set platform-dependent variables
-# PF: platform name, say, solaris-sparc
-
-PF=""
 
 OS=`uname -s`
 case "$OS" in
@@ -47,54 +44,28 @@
 esac
 
 KS=crl.jks
-JFILE=crl.jar
 
 KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS"
-JAR=$TESTJAVA${FS}bin${FS}jar
-JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner
 
-rm $KS $JFILE 2> /dev/null
+rm $KS 2> /dev/null
 
-# Generates some crl files, each containing two entries
+# Test keytool -gencrl
 
 $KT -alias a -dname CN=a -keyalg rsa -genkey -validity 300
-$KT -alias a -gencrl -id 1:1 -id 2:2 -file crl1
-$KT -alias a -gencrl -id 3:3 -id 4:4 -file crl2
-$KT -alias b -dname CN=b -keyalg rsa -genkey -validity 300
-$KT -alias b -gencrl -id 5:1 -id 6:2 -file crl3
+$KT -alias a -gencrl -id 1:1 -id 2:2 -file crl1 || exit 1
+$KT -alias a -gencrl -id 3:3 -id 4:4 -file crl2 || exit 2
+$KT -alias a -gencrl -id 5:1 -id 6:2 -file crl3 || exit 4
 
-cat > ToURI.java <<EOF
-class ToURI {
-    public static void main(String[] args) throws Exception {
-        System.out.println(new java.io.File("crl1").toURI());
-    }
-}
-EOF
-$TESTJAVA${FS}bin${FS}javac ToURI.java
-$TESTJAVA${FS}bin${FS}java ToURI > uri
-$KT -alias c -dname CN=c -keyalg rsa -genkey -validity 300 \
-    -ext crl=uri:`cat uri`
-
-echo A > A
+# Test keytool -printcrl
 
-# Test -crl:auto, cRLDistributionPoints is a local file
+$KT -printcrl -file crl1 || exit 5
+$KT -printcrl -file crl2 || exit 6
+$KT -printcrl -file crl3 || exit 7
 
-$JAR cvf $JFILE A
-$JARSIGNER -keystore $KS -storepass changeit $JFILE c \
-        -crl:auto || exit 1
-$JARSIGNER -keystore $KS -verify -debug -strict $JFILE || exit 6
-$KT -printcert -jarfile $JFILE | grep CRLs || exit 7
-
-# Test -crl <file>
 
-$JAR cvf $JFILE A
-$JARSIGNER -keystore $KS -storepass changeit $JFILE a \
-        -crl crl1 -crl crl2 || exit 2
-$JARSIGNER -keystore $KS -storepass changeit $JFILE b \
-        -crl crl3 -crl crl2 || exit 3
-$JARSIGNER -keystore $KS -verify -debug -strict $JFILE || exit 3
-$KT -printcert -jarfile $JFILE | grep CRLs || exit 4
-CRLCOUNT=`$KT -printcert -jarfile $JFILE | grep SerialNumber | wc -l`
-if [ $CRLCOUNT != 8 ]; then exit 5; fi
+# Test keytool -ext crl
+
+$KT -alias b -dname CN=c -keyalg rsa -genkey -validity 300 \
+    -ext crl=uri:http://www.example.com/crl || exit 10
 
 exit 0
--- a/jdk/test/sun/security/tools/keytool/NewSize7.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/security/tools/keytool/NewSize7.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,8 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
 import java.security.interfaces.RSAPublicKey;
@@ -42,8 +44,10 @@
                 " -alias a -dname cn=c -storepass changeit" +
                 " -keypass changeit -keyalg rsa").split(" "));
         KeyStore ks = KeyStore.getInstance("JKS");
-        ks.load(new FileInputStream(FILE), null);
-        new File(FILE).delete();
+        try (FileInputStream fin = new FileInputStream(FILE)) {
+            ks.load(fin, null);
+        }
+        Files.delete(Paths.get(FILE));
         RSAPublicKey r = (RSAPublicKey)ks.getCertificate("a").getPublicKey();
         if (r.getModulus().bitLength() != 2048) {
             throw new Exception("Bad keysize");
--- a/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh	Fri Mar 18 17:56:47 2011 +0300
+++ b/jdk/test/sun/tools/native2ascii/Native2AsciiTests.sh	Fri Mar 18 15:44:45 2011 -0700
@@ -24,7 +24,7 @@
 #
 
 # @test
-# @bug 4630463 4630971 4636448 4701617 4721296 4710890 6247817
+# @bug 4630463 4630971 4636448 4701617 4721296 4710890 6247817 7021987
 # @summary Tests miscellaneous native2ascii bugfixes and regressions
 
 
@@ -100,6 +100,15 @@
 $N2A -reverse -encoding MS932 $TESTSRC/A2N_4701617 x.out
 check 4701617 $TESTSRC/A2N_4701617.expected x.out
 
+# Check that the inputfile appears in the error message when not found
+
+badin="DoesNotExist"
+$N2A $badin x.out | grep "$badin" > /dev/null
+if [ $? != 0 ]; then
+    echo "\"$badin\" expected to appear in error message"
+    exit 1
+fi
+
 # for win32 only ensure when output file pre-exists that
 # native2ascii tool will simply overwrite with the expected
 # output file (fixed bugID 4710890)
--- a/langtools/.hgtags	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/.hgtags	Fri Mar 18 15:44:45 2011 -0700
@@ -106,3 +106,5 @@
 1383d1ee8b5db13d5df9523d1760df17b9d228d4 jdk7-b129
 7a98db8cbfce77a619057aa4fdde69d2a06d4101 jdk7-b130
 67221b8643b478c4fceacc89240db876455aae76 jdk7-b131
+e3d011d59a33acef79eff7523bef069557e91002 jdk7-b132
+e77e98f936e83d94c9b56cc7af218dc822a06122 jdk7-b133
--- a/langtools/src/share/classes/com/sun/tools/apt/main/AptJavaCompiler.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/apt/main/AptJavaCompiler.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2011, 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
@@ -280,7 +280,7 @@
         }
 
         if (verbose)
-            printVerbose("total", Long.toString(System.currentTimeMillis() - msec));
+            log.printVerbose("total", Long.toString(System.currentTimeMillis() - msec));
 
         chk.reportDeferredDiagnostics();
 
--- a/langtools/src/share/classes/com/sun/tools/apt/util/Bark.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/apt/util/Bark.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,15 +48,15 @@
      * Preregisters factories to create and use a Bark object for use as
      * both a Log and a Bark.
      */
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(barkKey, new Context.Factory<Bark>() {
-            public Bark make() {
-                return new Bark(context);
+            public Bark make(Context c) {
+                return new Bark(c);
             }
         });
         context.put(Log.logKey, new Context.Factory<Log>() {
-            public Log make() {
-                return Bark.instance(context);
+            public Log make(Context c) {
+                return Bark.instance(c);
             }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2011, 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
@@ -156,7 +156,7 @@
         if (index < 0) {
             return htmlstr;
         }
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         int previndex = 0;
         while (true) {
             // Search for lowercase version of {@docRoot}
@@ -2279,7 +2279,7 @@
      */
     public String commentTagsToString(Tag holderTag, Doc doc, Tag[] tags,
             boolean isFirstSentence) {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         // Array of all possible inline tags for this javadoc run
         configuration.tagletManager.checkTags(doc, tags, true);
         for (int i = 0; i < tags.length; i++) {
@@ -2315,7 +2315,7 @@
                 StringTokenizer lines = new StringTokenizer(text, "\r\n", true);
                 StringBuffer textBuff = new StringBuffer();
                 while (lines.hasMoreTokens()) {
-                    StringBuffer line = new StringBuffer(lines.nextToken());
+                    StringBuilder line = new StringBuilder(lines.nextToken());
                     Util.replaceTabs(configuration.sourcetab, line);
                     textBuff.append(line.toString());
                 }
@@ -2473,7 +2473,7 @@
                 return text;
             }
             int endindex = startindex + tobe.length();
-            StringBuffer replaced = new StringBuffer();
+            StringBuilder replaced = new StringBuilder();
             if (startindex > 0) {
                 replaced.append(text.substring(0, startindex));
             }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,7 +30,6 @@
 import com.sun.javadoc.*;
 import com.sun.tools.doclets.internal.toolkit.*;
 import com.sun.tools.doclets.internal.toolkit.taglets.*;
-import com.sun.tools.doclets.internal.toolkit.util.*;
 import com.sun.tools.doclets.formats.html.markup.*;
 
 /**
@@ -53,7 +52,7 @@
     }
 
     public List<FieldDoc> members(ClassDoc cd) {
-        return Util.asList(cd.serializableFields());
+        return Arrays.asList(cd.serializableFields());
     }
 
     protected void printTypeLinkNoDimension(Type type) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, 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
@@ -266,7 +266,7 @@
     private static void addLine(Content pre, String line, int tabLength,
             int currentLineNo) {
         if (line != null) {
-            StringBuffer lineBuffer = new StringBuffer(Util.escapeHtmlChars(line));
+            StringBuilder lineBuffer = new StringBuilder(Util.escapeHtmlChars(line));
             Util.replaceTabs(tabLength, lineBuffer);
             pre.addContent(new RawHtml(lineBuffer.toString()));
             Content anchor = HtmlTree.A_NAME("line." + Integer.toString(currentLineNo));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties	Fri Mar 18 15:44:45 2011 -0700
@@ -11,15 +11,25 @@
 doclet.Interface_Hierarchy=Interface Hierarchy
 doclet.Enum_Hierarchy=Enum Hierarchy
 doclet.Annotation_Type_Hierarchy=Annotation Type Hierarchy
+# The following ALL CAPS words should be translated. It is used as "Previous" link on javadoc.
 doclet.Prev=PREV
+# The following ALL CAPS words should be translated. It is used as "Next" link on javadoc.
 doclet.Next=NEXT
+# The following ALL CAPS words should be translated. It is used as "Previous Class" link on javadoc.
 doclet.Prev_Class=PREV CLASS
+# The following ALL CAPS words should be translated. It is used as "Next Class" link on javadoc.
 doclet.Next_Class=NEXT CLASS
+# The following ALL CAPS words should be translated. It is used as "Previous Package" link on javadoc.
 doclet.Prev_Package=PREV PACKAGE
+# The following ALL CAPS words should be translated. It is used as "Next Package" link on javadoc.
 doclet.Next_Package=NEXT PACKAGE
+# The following ALL CAPS words should be translated. It is used as "Previous Letter" link on javadoc alphabetical index.
 doclet.Prev_Letter=PREV LETTER
+# The following ALL CAPS words should be translated. It is used as "Next Letter" link on javadoc alphabetical index.
 doclet.Next_Letter=NEXT LETTER
+# The following ALL CAPS words should be translated. It is used as "Show List" link on javadoc.
 doclet.Show_Lists=SHOW LISTS
+# The following ALL CAPS words should be translated. It is used as "Hide List" link on javadoc.
 doclet.Hide_Lists=HIDE LISTS
 doclet.Href_Class_Title=class in {0}
 doclet.Href_Interface_Title=interface in {0}
@@ -27,16 +37,27 @@
 doclet.Href_Enum_Title=enum in {0}
 doclet.Href_Type_Param_Title=type parameter in {0}
 doclet.Href_Class_Or_Interface_Title=class or interface in {0}
+# The following ALL CAPS words should be translated. It's used as SUMMARY: NESTED | FIELD | CONSTR | METHOD, meaning Nested Class Summary, Field Summary, Constructor Summary, or Method Summary.
 doclet.Summary=SUMMARY:
+# The following ALL CAPS words should be translated. It is used as DETAIL: FIELD | CONSTR | METHOD, meaning Field Detail, Constructor Detail, or Method Detail.
 doclet.Detail=DETAIL:
+# The following ALL CAPS words should be translated. It is used as "Nested" (Nested Class Summary) link on javadoc.
 doclet.navNested=NESTED
+# The following ALL CAPS words should be translated. It is used as "Optional" (Optional Element Summary) link on javadoc.
 doclet.navAnnotationTypeOptionalMember=OPTIONAL
+# The following ALL CAPS words should be translated. It is used as "Required" (Required Element Summary) link on javadoc.
 doclet.navAnnotationTypeRequiredMember=REQUIRED
+# The following ALL CAPS words should be translated. It is used as "Element" (Required Element Summary) link on javadoc.
 doclet.navAnnotationTypeMember=ELEMENT
+# The following ALL CAPS words should be translated. It is used as "Field" (Field Detail) link on javadoc.
 doclet.navField=FIELD
+# The following ALL CAPS words should be translated. It is used as "Enum Constants" link on javadoc.
 doclet.navEnum=ENUM CONSTANTS
+# The following ALL CAPS words should be translated. It is used as "Constructor" (Constructor Detail) link on javadoc.
 doclet.navConstructor=CONSTR
+# The following ALL CAPS words should be translated. It is used as "Method" (Method Detail) link on javadoc.
 doclet.navMethod=METHOD
+# The following resource does not seem to be used anymore.
 doclet.navFactoryMethod=FACTORY
 doclet.Index=Index
 doclet.Window_Single_Index=Index
@@ -45,8 +66,11 @@
 doclet.Skip_navigation_links=Skip navigation links
 doclet.New_Page=NewPage
 doclet.None=None
+# The following resource does not seem to be used anymore
 doclet.CLASSES=CLASSES
+# The following resource does not seem to be used anymore
 doclet.MEMBERS=MEMBERS
+# The following resource does not seem to be used anymore
 doclet.NONE=NONE
 doclet.Factory_Method_Detail=Static Factory Method Detail
 doclet.navDeprecated=Deprecated
@@ -112,7 +136,9 @@
 doclet.Option=Option
 doclet.Or=Or
 doclet.Frames=Frames
+# The following ALL CAPS words should be translated. It is used as "FRAMES" javadoc navigation link to indicate displaying the page with HTML frames.
 doclet.FRAMES=FRAMES
+# The following ALL CAPS words should be translated. It is used as "NO FRAMES" javadoc navigation link to indicate displaying the page without HTML frames.
 doclet.NO_FRAMES=NO FRAMES
 doclet.Package_Hierarchies=Package Hierarchies:
 doclet.Hierarchy_For_Package=Hierarchy For Package {0}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -375,8 +375,7 @@
      */
     public void buildFieldSerializationOverview(ClassDoc classDoc, Content classContentTree) {
         if (classDoc.definesSerializableFields()) {
-            FieldDoc serialPersistentField =
-                Util.asList(classDoc.serializableFields()).get(0);
+            FieldDoc serialPersistentField = classDoc.serializableFields()[0];
             // Check to see if there are inline comments, tags or deprecation
             // information to be printed.
             if (fieldWriter.shouldPrintOverview(serialPersistentField)) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -382,7 +382,7 @@
                 out.close();
             }
         } catch (IOException ie) {
-            ie.printStackTrace();
+            ie.printStackTrace(System.err);
             throw new DocletAbortException();
         }
     }
@@ -399,12 +399,12 @@
             String pkgPath = DirectoryManager.getDirectoryPath(pkgDoc);
             String completePath = new SourcePath(configuration.sourcepath).
                 getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPARATOR;
-            //Make sure that both paths are using the same seperators.
+            //Make sure that both paths are using the same separators.
             completePath = Util.replaceText(completePath, File.separator,
                     DirectoryManager.URL_FILE_SEPARATOR);
             pkgPath = Util.replaceText(pkgPath, File.separator,
                     DirectoryManager.URL_FILE_SEPARATOR);
-            return completePath.substring(0, completePath.indexOf(pkgPath));
+            return completePath.substring(0, completePath.lastIndexOf(pkgPath));
         } catch (Exception e){
             return "";
         }
@@ -536,15 +536,6 @@
             findAllInterfaceTypes(results, (ClassDoc) type, true, configuration);
     }
 
-
-    public static <T extends ProgramElementDoc> List<T> asList(T[] members) {
-        List<T> list = new ArrayList<T>();
-        for (int i = 0; i < members.length; i++) {
-            list.add(members[i]);
-        }
-        return list;
-    }
-
     /**
      * Enclose in quotes, used for paths and filenames that contains spaces
      */
@@ -583,14 +574,7 @@
         if (oldStr == null || newStr == null || oldStr.equals(newStr)) {
             return originalStr;
         }
-        StringBuffer result = new StringBuffer(originalStr);
-        int startIndex = 0;
-        while ((startIndex = result.indexOf(oldStr, startIndex)) != -1) {
-            result = result.replace(startIndex, startIndex + oldStr.length(),
-                    newStr);
-            startIndex += newStr.length();
-        }
-        return result.toString();
+        return originalStr.replace(oldStr, newStr);
     }
 
     /**
@@ -833,19 +817,17 @@
      * @param tabLength the length of each tab.
      * @param s the String to scan.
      */
-    public static void replaceTabs(int tabLength, StringBuffer s) {
-        int index, col;
-        StringBuffer whitespace;
-        while ((index = s.indexOf("\t")) != -1) {
-            whitespace = new StringBuffer();
-            col = index;
-            do {
-                whitespace.append(" ");
-                col++;
-            } while ((col%tabLength) != 0);
-            s.replace(index, index+1, whitespace.toString());
+    public static void replaceTabs(int tabLength, StringBuilder s) {
+        if (whitespace == null || whitespace.length() < tabLength)
+            whitespace = String.format("%" + tabLength + "s", " ");
+        int index = 0;
+        while ((index = s.indexOf("\t", index)) != -1) {
+            int spaceCount = tabLength - index % tabLength;
+            s.replace(index, index+1, whitespace.substring(0, spaceCount));
+            index += spaceCount;
         }
     }
+    private static String whitespace;
 
     /**
      * The documentation for values() and valueOf() in Enums are set by the
--- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2011, 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
@@ -157,19 +157,19 @@
     /**
      * Register that a compilation is about to start.
      */
-    void beginContext(final Context context) {
+    void beginContext(Context context) {
         if (compilationInProgress)
             throw new IllegalStateException("Compilation in progress");
         compilationInProgress = true;
         final JavaFileManager givenFileManager = context.get(JavaFileManager.class);
         context.put(JavaFileManager.class, (JavaFileManager)null);
         context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() {
-            public JavaFileManager make() {
+            public JavaFileManager make(Context c) {
                 if (givenFileManager != null) {
-                    context.put(JavaFileManager.class, givenFileManager);
+                    c.put(JavaFileManager.class, givenFileManager);
                     return givenFileManager;
                 } else {
-                    return new JavacFileManager(context, true, null);
+                    return new JavacFileManager(c, true, null);
                 }
             }
         });
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java	Fri Mar 18 15:44:45 2011 -0700
@@ -43,7 +43,7 @@
     private Flags() {} // uninstantiable
 
     public static String toString(long flags) {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         String sep = "";
         for (Flag s : asFlagSet(flags)) {
             buf.append(sep);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -163,6 +163,7 @@
         case PARAMETER:
         case LOCAL_VARIABLE:
         case EXCEPTION_PARAMETER:
+        case RESOURCE_VARIABLE:
             return KindName.VAR;
 
         case CONSTRUCTOR:
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java	Fri Mar 18 15:44:45 2011 -0700
@@ -831,6 +831,8 @@
                 ClassType t = (ClassType)type;
                 if (t.interfaces_field == null) // FIXME: shouldn't be null
                     t.interfaces_field = List.nil();
+                if (t.all_interfaces_field != null)
+                    return Type.getModelTypes(t.all_interfaces_field);
                 return t.interfaces_field;
             } else {
                 return List.nil();
@@ -846,7 +848,7 @@
                 // An interface has no superclass; its supertype is Object.
                 return t.isInterface()
                     ? Type.noType
-                    : t.supertype_field;
+                    : t.supertype_field.getModelType();
             } else {
                 return Type.noType;
             }
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -26,6 +26,8 @@
 package com.sun.tools.javac.code;
 
 import java.util.*;
+import javax.lang.model.type.TypeVisitor;
+import javax.lang.model.element.ElementVisitor;
 
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.List;
@@ -345,7 +347,12 @@
         target = Target.instance(context);
 
         // Create the unknown type
-        unknownType = new Type(TypeTags.UNKNOWN, null);
+        unknownType = new Type(TypeTags.UNKNOWN, null) {
+            @Override
+            public <R, P> R accept(TypeVisitor<R, P> v, P p) {
+                return v.visitUnknown(this, p);
+            }
+        };
 
         // create the basic builtin symbols
         rootPackage = new PackageSymbol(names.empty, null);
@@ -355,13 +362,20 @@
                     return messages.getLocalizedString("compiler.misc.unnamed.package");
                 }
             };
-        noSymbol = new TypeSymbol(0, names.empty, Type.noType, rootPackage);
+        noSymbol = new TypeSymbol(0, names.empty, Type.noType, rootPackage) {
+            public <R, P> R accept(ElementVisitor<R, P> v, P p) {
+                return v.visitUnknown(this, p);
+            }
+        };
         noSymbol.kind = Kinds.NIL;
 
         // create the error symbols
         errSymbol = new ClassSymbol(PUBLIC|STATIC|ACYCLIC, names.any, null, rootPackage);
+        errType = new ErrorType(errSymbol, Type.noType);
+
         unknownSymbol = new ClassSymbol(PUBLIC|STATIC|ACYCLIC, names.fromString("<any?>"), null, rootPackage);
-        errType = new ErrorType(errSymbol, Type.noType);
+        unknownSymbol.members_field = new Scope.ErrorScope(unknownSymbol);
+        unknownSymbol.type = unknownType;
 
         // initialize builtin types
         initType(byteType, "byte", "Byte");
@@ -382,9 +396,11 @@
 
         // VGJ
         boundClass = new ClassSymbol(PUBLIC|ACYCLIC, names.Bound, noSymbol);
+        boundClass.members_field = new Scope.ErrorScope(boundClass);
 
         // the builtin class of all methods
         methodClass = new ClassSymbol(PUBLIC|ACYCLIC, names.Method, noSymbol);
+        methodClass.members_field = new Scope.ErrorScope(boundClass);
 
         // Create class to hold all predefined constants and operations.
         predefClass = new ClassSymbol(PUBLIC|ACYCLIC, names.empty, rootPackage);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java	Fri Mar 18 15:44:45 2011 -0700
@@ -93,6 +93,22 @@
         return null;
     }
 
+    /**
+     * Get the representation of this type used for modelling purposes.
+     * By default, this is itself. For ErrorType, a different value
+     * may be provided,
+     */
+    public Type getModelType() {
+        return this;
+    }
+
+    public static List<Type> getModelTypes(List<Type> ts) {
+        ListBuffer<Type> lb = new ListBuffer<Type>();
+        for (Type t: ts)
+            lb.append(t.getModelType());
+        return lb.toList();
+    }
+
     public <R,S> R accept(Type.Visitor<R,S> v, S s) { return v.visitType(this, s); }
 
     /** Define a type given its tag and type symbol
@@ -190,7 +206,7 @@
         if (ts.isEmpty()) {
             return "";
         } else {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             buf.append(ts.head.toString());
             for (List<Type> l = ts.tail; l.nonEmpty(); l = l.tail)
                 buf.append(",").append(l.head.toString());
@@ -464,7 +480,7 @@
 
         boolean isPrintingBound = false;
         public String toString() {
-            StringBuffer s = new StringBuffer();
+            StringBuilder s = new StringBuilder();
             s.append(kind.toString());
             if (kind != UNBOUND)
                 s.append(type);
@@ -538,6 +554,10 @@
          */
         public List<Type> interfaces_field;
 
+        /** All the interfaces of this class, including missing ones.
+         */
+        public List<Type> all_interfaces_field;
+
         public ClassType(Type outer, List<Type> typarams, TypeSymbol tsym) {
             super(CLASS, tsym);
             this.outer_field = outer;
@@ -578,7 +598,7 @@
         /** The Java source which this type represents.
          */
         public String toString() {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             if (getEnclosingType().tag == CLASS && tsym.owner.kind == TYP) {
                 buf.append(getEnclosingType().toString());
                 buf.append(".");
@@ -596,7 +616,7 @@
 //where
             private String className(Symbol sym, boolean longform) {
                 if (sym.name.isEmpty() && (sym.flags() & COMPOUND) != 0) {
-                    StringBuffer s = new StringBuffer(supertype_field.toString());
+                    StringBuilder s = new StringBuilder(supertype_field.toString());
                     for (List<Type> is=interfaces_field; is.nonEmpty(); is = is.tail) {
                         s.append("&");
                         s.append(is.head.toString());
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1992,7 +1992,11 @@
      * @return true if t is a sub signature of s.
      */
     public boolean isSubSignature(Type t, Type s) {
-        return hasSameArgs(t, s) || hasSameArgs(t, erasure(s));
+        return isSubSignature(t, s, true);
+    }
+
+    public boolean isSubSignature(Type t, Type s, boolean strict) {
+        return hasSameArgs(t, s, strict) || hasSameArgs(t, erasure(s), strict);
     }
 
     /**
@@ -2129,10 +2133,24 @@
      * where correspondence is by position in the type parameter list.
      */
     public boolean hasSameArgs(Type t, Type s) {
+        return hasSameArgs(t, s, true);
+    }
+
+    public boolean hasSameArgs(Type t, Type s, boolean strict) {
+        return hasSameArgs(t, s, strict ? hasSameArgs_strict : hasSameArgs_nonstrict);
+    }
+
+    private boolean hasSameArgs(Type t, Type s, TypeRelation hasSameArgs) {
         return hasSameArgs.visit(t, s);
     }
     // where
-        private TypeRelation hasSameArgs = new TypeRelation() {
+        private class HasSameArgs extends TypeRelation {
+
+            boolean strict;
+
+            public HasSameArgs(boolean strict) {
+                this.strict = strict;
+            }
 
             public Boolean visitType(Type t, Type s) {
                 throw new AssertionError();
@@ -2147,7 +2165,7 @@
             @Override
             public Boolean visitForAll(ForAll t, Type s) {
                 if (s.tag != FORALL)
-                    return false;
+                    return strict ? false : visitMethodType(t.asMethodType(), s);
 
                 ForAll forAll = (ForAll)s;
                 return hasSameBounds(t, forAll)
@@ -2159,6 +2177,10 @@
                 return false;
             }
         };
+
+        TypeRelation hasSameArgs_strict = new HasSameArgs(true);
+        TypeRelation hasSameArgs_nonstrict = new HasSameArgs(false);
+
     // </editor-fold>
 
     // <editor-fold defaultstate="collapsed" desc="subst">
@@ -2534,7 +2556,7 @@
     }
     // where
         private String typaramsString(List<Type> tvars) {
-            StringBuffer s = new StringBuffer();
+            StringBuilder s = new StringBuilder();
             s.append('<');
             boolean first = true;
             for (Type t : tvars) {
@@ -2545,7 +2567,7 @@
             s.append('>');
             return s.toString();
         }
-        private void appendTyparamString(TypeVar t, StringBuffer buf) {
+        private void appendTyparamString(TypeVar t, StringBuilder buf) {
             buf.append(t);
             if (t.bound == null ||
                 t.bound.tsym.getQualifiedName() == names.java_lang_Object)
@@ -2832,12 +2854,26 @@
             while (ts.head.tag != CLASS && ts.head.tag != TYPEVAR)
                 ts = ts.tail;
             Assert.check(!ts.isEmpty());
-            List<Type> cl = closure(ts.head);
+            //step 1 - compute erased candidate set (EC)
+            List<Type> cl = erasedSupertypes(ts.head);
             for (Type t : ts.tail) {
                 if (t.tag == CLASS || t.tag == TYPEVAR)
-                    cl = intersect(cl, closure(t));
+                    cl = intersect(cl, erasedSupertypes(t));
             }
-            return compoundMin(cl);
+            //step 2 - compute minimal erased candidate set (MEC)
+            List<Type> mec = closureMin(cl);
+            //step 3 - for each element G in MEC, compute lci(Inv(G))
+            List<Type> candidates = List.nil();
+            for (Type erasedSupertype : mec) {
+                List<Type> lci = List.of(asSuper(ts.head, erasedSupertype.tsym));
+                for (Type t : ts) {
+                    lci = intersect(lci, List.of(asSuper(t, erasedSupertype.tsym)));
+                }
+                candidates = candidates.appendList(lci);
+            }
+            //step 4 - let MEC be { G1, G2 ... Gn }, then we have that
+            //lub = lci(Inv(G1)) & lci(Inv(G2)) & ... & lci(Inv(Gn))
+            return compoundMin(candidates);
 
         default:
             // calculate lub(A, B[])
@@ -2851,6 +2887,18 @@
         }
     }
     // where
+        List<Type> erasedSupertypes(Type t) {
+            ListBuffer<Type> buf = lb();
+            for (Type sup : closure(t)) {
+                if (sup.tag == TYPEVAR) {
+                    buf.append(sup);
+                } else {
+                    buf.append(erasure(sup));
+                }
+            }
+            return buf.toList();
+        }
+
         private Type arraySuperType = null;
         private Type arraySuperType() {
             // initialized lazily to avoid problems during compiler startup
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1425,7 +1425,7 @@
                             // qualifier omitted; check for existence
                             // of an appropriate implicit qualifier.
                             rs.resolveImplicitThis(tree.meth.pos(),
-                                                   localEnv, site);
+                                                   localEnv, site, true);
                         }
                     } else if (tree.meth.getTag() == JCTree.SELECT) {
                         log.error(tree.meth.pos(), "illegal.qual.not.icls",
@@ -1581,15 +1581,7 @@
         // symbol + type back into the attributed tree.
         Type clazztype = attribType(clazz, env);
         Pair<Scope,Scope> mapping = getSyntheticScopeMapping(clazztype, cdef != null);
-        if (!TreeInfo.isDiamond(tree)) {
-            clazztype = chk.checkClassType(
-                tree.clazz.pos(), clazztype, true);
-        } else if (!clazztype.isErroneous() &&
-                !clazztype.tsym.type.isParameterized()) {
-            log.error(tree.clazz.pos(),
-                    "cant.apply.diamond.1",
-                    clazztype, diags.fragment("diamond.non.generic", clazztype));
-        }
+        clazztype = chk.checkDiamond(tree, clazztype);
         chk.validate(clazz, localEnv);
         if (tree.encl != null) {
             // We have to work in this case to store
@@ -1614,10 +1606,12 @@
         List<Type> argtypes = attribArgs(tree.args, localEnv);
         List<Type> typeargtypes = attribTypes(tree.typeargs, localEnv);
 
-        if (TreeInfo.isDiamond(tree) && clazztype.tsym.type.isParameterized()) {
+        if (TreeInfo.isDiamond(tree) && !clazztype.isErroneous()) {
             clazztype = attribDiamond(localEnv, tree, clazztype, mapping, argtypes, typeargtypes);
             clazz.type = clazztype;
         } else if (allowDiamondFinder &&
+                tree.def == null &&
+                !clazztype.isErroneous() &&
                 clazztype.getTypeArguments().nonEmpty() &&
                 findDiamonds) {
             boolean prevDeferDiags = log.deferDiagnostics;
@@ -1641,8 +1635,7 @@
             if (inferred != null &&
                     !inferred.isErroneous() &&
                     inferred.tag == CLASS &&
-                    types.isAssignable(inferred, pt.tag == NONE ? clazztype : pt, Warner.noWarnings) &&
-                    chk.checkDiamond((ClassType)inferred).isEmpty()) {
+                    types.isAssignable(inferred, pt.tag == NONE ? clazztype : pt, Warner.noWarnings)) {
                 String key = types.isSameType(clazztype, inferred) ?
                     "diamond.redundant.args" :
                     "diamond.redundant.args.1";
@@ -1857,34 +1850,9 @@
                         ex.diagnostic);
             }
         }
-        clazztype = chk.checkClassType(tree.clazz.pos(),
+        return chk.checkClassType(tree.clazz.pos(),
                 clazztype,
                 true);
-        if (clazztype.tag == CLASS) {
-            List<Type> invalidDiamondArgs = chk.checkDiamond((ClassType)clazztype);
-            if (!clazztype.isErroneous() && invalidDiamondArgs.nonEmpty()) {
-                //one or more types inferred in the previous steps is either a
-                //captured type or an intersection type --- we need to report an error.
-                String subkey = invalidDiamondArgs.size() > 1 ?
-                    "diamond.invalid.args" :
-                    "diamond.invalid.arg";
-                //The error message is of the kind:
-                //
-                //cannot infer type arguments for {clazztype}<>;
-                //reason: {subkey}
-                //
-                //where subkey is a fragment of the kind:
-                //
-                //type argument(s) {invalidDiamondArgs} inferred for {clazztype}<> is not allowed in this context
-                log.error(tree.clazz.pos(),
-                            "cant.apply.diamond.1",
-                            diags.fragment("diamond", clazztype.tsym),
-                            diags.fragment(subkey,
-                                           invalidDiamondArgs,
-                                           diags.fragment("diamond", clazztype.tsym)));
-            }
-        }
-        return clazztype;
     }
 
     /** Creates a synthetic scope containing fake generic constructors.
@@ -2806,7 +2774,7 @@
                                   sym.location());
                 owntype = new MethodType(owntype.getParameterTypes(),
                                          types.erasure(owntype.getReturnType()),
-                                         owntype.getThrownTypes(),
+                                         types.erasure(owntype.getThrownTypes()),
                                          syms.methodClass);
             }
             if (useVarargs) {
@@ -2980,7 +2948,7 @@
             // (see comment for TypeVar.bound).
             // In this case, generate a class tree that represents the
             // bound class, ...
-            JCTree extending;
+            JCExpression extending;
             List<JCExpression> implementing;
             if ((bs.head.tsym.flags() & INTERFACE) == 0) {
                 extending = tree.bounds.head;
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Fri Mar 18 15:44:45 2011 -0700
@@ -664,40 +664,25 @@
             return true;
     }
 
-    /** Check that the type inferred using the diamond operator does not contain
-     *  non-denotable types such as captured types or intersection types.
-     *  @param t the type inferred using the diamond operator
+    /** Check that usage of diamond operator is correct (i.e. diamond should not
+     * be used with non-generic classes or in anonymous class creation expressions)
      */
-    List<Type> checkDiamond(ClassType t) {
-        DiamondTypeChecker dtc = new DiamondTypeChecker();
-        ListBuffer<Type> buf = ListBuffer.lb();
-        for (Type arg : t.getTypeArguments()) {
-            if (!dtc.visit(arg, null)) {
-                buf.append(arg);
-            }
-        }
-        return buf.toList();
-    }
-
-    static class DiamondTypeChecker extends Types.SimpleVisitor<Boolean, Void> {
-        public Boolean visitType(Type t, Void s) {
-            return true;
-        }
-        @Override
-        public Boolean visitClassType(ClassType t, Void s) {
-            if (t.isCompound()) {
-                return false;
-            }
-            for (Type targ : t.getTypeArguments()) {
-                if (!visit(targ, s)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-        @Override
-        public Boolean visitCapturedType(CapturedType t, Void s) {
-            return false;
+    Type checkDiamond(JCNewClass tree, Type t) {
+        if (!TreeInfo.isDiamond(tree) ||
+                t.isErroneous()) {
+            return checkClassType(tree.clazz.pos(), t, true);
+        } else if (tree.def != null) {
+            log.error(tree.clazz.pos(),
+                    "cant.apply.diamond.1",
+                    t, diags.fragment("diamond.and.anon.class", t));
+            return types.createErrorType(t);
+        } else if (!t.tsym.type.isParameterized()) {
+            log.error(tree.clazz.pos(),
+                "cant.apply.diamond.1",
+                t, diags.fragment("diamond.non.generic", t));
+            return types.createErrorType(t);
+        } else {
+            return t;
         }
     }
 
@@ -1679,7 +1664,8 @@
                             "(" + types.memberType(t2, s2).getParameterTypes() + ")");
                         return s2;
                     }
-                } else if (checkNameClash((ClassSymbol)site.tsym, s1, s2)) {
+                } else if (checkNameClash((ClassSymbol)site.tsym, s1, s2) &&
+                        !checkCommonOverriderIn(s1, s2, site)) {
                     log.error(pos,
                             "name.clash.same.erasure.no.override",
                             s1, s1.location(),
@@ -2113,7 +2099,7 @@
                 if (s1 == s2 || !sym.overrides(s2, site.tsym, types, false)) continue;
                 //if (i) the signature of 'sym' is not a subsignature of m1 (seen as
                 //a member of 'site') and (ii) m1 has the same erasure as m2, issue an error
-                if (!types.isSubSignature(sym.type, types.memberType(site, s1)) &&
+                if (!types.isSubSignature(sym.type, types.memberType(site, s1), false) &&
                         types.hasSameArgs(s1.erasure(types), s2.erasure(types))) {
                     sym.flags_field |= CLASH;
                     String key = s2 == sym ?
@@ -2145,7 +2131,7 @@
         for (Symbol s : types.membersClosure(site).getElementsByName(sym.name, cf)) {
             //if (i) the signature of 'sym' is not a subsignature of m1 (seen as
             //a member of 'site') and (ii) 'sym' has the same erasure as m1, issue an error
-            if (!types.isSubSignature(sym.type, types.memberType(site, s)) &&
+            if (!types.isSubSignature(sym.type, types.memberType(site, s), false) &&
                     types.hasSameArgs(s.erasure(types), sym.erasure(types))) {
                 log.error(pos,
                         "name.clash.same.erasure.no.hide",
@@ -2666,7 +2652,7 @@
                 if ((sym.flags() & VARARGS) != (e.sym.flags() & VARARGS)) {
                     varargsDuplicateError(pos, sym, e.sym);
                     return true;
-                } else if (sym.kind == MTH && !hasSameSignature(sym.type, e.sym.type)) {
+                } else if (sym.kind == MTH && !types.hasSameArgs(sym.type, e.sym.type, false)) {
                     duplicateErasureError(pos, sym, e.sym);
                     sym.flags_field |= CLASH;
                     return true;
@@ -2678,15 +2664,6 @@
         }
         return true;
     }
-    //where
-        boolean hasSameSignature(Type mt1, Type mt2) {
-            if (mt1.tag == FORALL && mt2.tag == FORALL) {
-                ForAll fa1 = (ForAll)mt1;
-                ForAll fa2 = (ForAll)mt2;
-                mt2 = types.subst(fa2, fa2.tvars, fa1.tvars);
-            }
-            return types.hasSameArgs(mt1.asMethodType(), mt2.asMethodType());
-        }
 
     /** Report duplicate declaration error.
      */
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java	Fri Mar 18 15:44:45 2011 -0700
@@ -272,7 +272,7 @@
 
     /** The list of unreferenced automatic resources.
      */
-    Map<VarSymbol, JCVariableDecl> unrefdResources;
+    Scope unrefdResources;
 
     /** Set when processing a loop body the second time for DU analysis. */
     boolean loopPassTwo = false;
@@ -804,14 +804,16 @@
         ListBuffer<PendingExit> prevPendingExits = pendingExits;
         boolean prevLoopPassTwo = loopPassTwo;
         pendingExits = new ListBuffer<PendingExit>();
+        int prevErrors = log.nerrors;
         do {
             Bits uninitsEntry = uninits.dup();
+            uninitsEntry.excludeFrom(nextadr);
             scanStat(tree.body);
             alive |= resolveContinues(tree);
             scanCond(tree.cond);
-            if (log.nerrors != 0 ||
+            if (log.nerrors !=  prevErrors ||
                 loopPassTwo ||
-                uninitsEntry.diffSet(uninitsWhenTrue).nextBit(firstadr)==-1)
+                uninitsEntry.dup().diffSet(uninitsWhenTrue).nextBit(firstadr)==-1)
                 break;
             inits = initsWhenTrue;
             uninits = uninitsEntry.andSet(uninitsWhenTrue);
@@ -831,8 +833,10 @@
         Bits initsCond;
         Bits uninitsCond;
         pendingExits = new ListBuffer<PendingExit>();
+        int prevErrors = log.nerrors;
         do {
             Bits uninitsEntry = uninits.dup();
+            uninitsEntry.excludeFrom(nextadr);
             scanCond(tree.cond);
             initsCond = initsWhenFalse;
             uninitsCond = uninitsWhenFalse;
@@ -841,9 +845,9 @@
             alive = !tree.cond.type.isFalse();
             scanStat(tree.body);
             alive |= resolveContinues(tree);
-            if (log.nerrors != 0 ||
+            if (log.nerrors != prevErrors ||
                 loopPassTwo ||
-                uninitsEntry.diffSet(uninits).nextBit(firstadr) == -1)
+                uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1)
                 break;
             uninits = uninitsEntry.andSet(uninits);
             loopPassTwo = true;
@@ -864,8 +868,10 @@
         Bits initsCond;
         Bits uninitsCond;
         pendingExits = new ListBuffer<PendingExit>();
+        int prevErrors = log.nerrors;
         do {
             Bits uninitsEntry = uninits.dup();
+            uninitsEntry.excludeFrom(nextadr);
             if (tree.cond != null) {
                 scanCond(tree.cond);
                 initsCond = initsWhenFalse;
@@ -883,7 +889,7 @@
             scanStat(tree.body);
             alive |= resolveContinues(tree);
             scan(tree.step);
-            if (log.nerrors != 0 ||
+            if (log.nerrors != prevErrors ||
                 loopPassTwo ||
                 uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1)
                 break;
@@ -897,8 +903,6 @@
         alive = resolveBreaks(tree, prevPendingExits) ||
             tree.cond != null && !tree.cond.type.isTrue();
         nextadr = nextadrPrev;
-        inits.excludeFrom(nextadr);
-        uninits.excludeFrom(nextadr);
     }
 
     public void visitForeachLoop(JCEnhancedForLoop tree) {
@@ -913,13 +917,15 @@
 
         letInit(tree.pos(), tree.var.sym);
         pendingExits = new ListBuffer<PendingExit>();
+        int prevErrors = log.nerrors;
         do {
             Bits uninitsEntry = uninits.dup();
+            uninitsEntry.excludeFrom(nextadr);
             scanStat(tree.body);
             alive |= resolveContinues(tree);
-            if (log.nerrors != 0 ||
+            if (log.nerrors != prevErrors ||
                 loopPassTwo ||
-                uninitsEntry.diffSet(uninits).nextBit(firstadr) == -1)
+                uninitsEntry.dup().diffSet(uninits).nextBit(firstadr) == -1)
                 break;
             uninits = uninitsEntry.andSet(uninits);
             loopPassTwo = true;
@@ -992,7 +998,6 @@
     public void visitTry(JCTry tree) {
         List<Type> caughtPrev = caught;
         List<Type> thrownPrev = thrown;
-        Map<VarSymbol, JCVariableDecl> unrefdResourcesPrev = unrefdResources;
         thrown = List.nil();
         for (List<JCCatch> l = tree.catchers; l.nonEmpty(); l = l.tail) {
             List<JCExpression> subClauses = TreeInfo.isMultiCatch(l.head) ?
@@ -1002,17 +1007,18 @@
                 caught = chk.incl(ct.type, caught);
             }
         }
+        ListBuffer<JCVariableDecl> resourceVarDecls = ListBuffer.lb();
         Bits uninitsTryPrev = uninitsTry;
         ListBuffer<PendingExit> prevPendingExits = pendingExits;
         pendingExits = new ListBuffer<PendingExit>();
         Bits initsTry = inits.dup();
         uninitsTry = uninits.dup();
-        unrefdResources = new LinkedHashMap<VarSymbol, JCVariableDecl>();
         for (JCTree resource : tree.resources) {
             if (resource instanceof JCVariableDecl) {
                 JCVariableDecl vdecl = (JCVariableDecl) resource;
                 visitVarDef(vdecl);
-                unrefdResources.put(vdecl.sym, vdecl);
+                unrefdResources.enter(vdecl.sym);
+                resourceVarDecls.append(vdecl);
             } else if (resource instanceof JCExpression) {
                 scanExpr((JCExpression) resource);
             } else {
@@ -1049,11 +1055,14 @@
         Bits uninitsEnd = uninits;
         int nextadrCatch = nextadr;
 
-        if (!unrefdResources.isEmpty() &&
+        if (!resourceVarDecls.isEmpty() &&
                 lint.isEnabled(Lint.LintCategory.TRY)) {
-            for (Map.Entry<VarSymbol, JCVariableDecl> e : unrefdResources.entrySet()) {
-                log.warning(Lint.LintCategory.TRY, e.getValue().pos(),
-                            "try.resource.not.referenced", e.getKey());
+            for (JCVariableDecl resVar : resourceVarDecls) {
+                if (unrefdResources.includes(resVar.sym)) {
+                    log.warning(Lint.LintCategory.TRY, resVar.pos(),
+                                "try.resource.not.referenced", resVar.sym);
+                    unrefdResources.remove(resVar.sym);
+                }
             }
         }
 
@@ -1143,7 +1152,6 @@
             while (exits.nonEmpty()) pendingExits.append(exits.next());
         }
         uninitsTry.andSet(uninitsTryPrev).andSet(uninits);
-        unrefdResources = unrefdResourcesPrev;
     }
 
     public void visitConditional(JCConditional tree) {
@@ -1369,9 +1377,7 @@
     }
 
     void referenced(Symbol sym) {
-        if (unrefdResources != null && unrefdResources.containsKey(sym)) {
-            unrefdResources.remove(sym);
-        }
+        unrefdResources.remove(sym);
     }
 
     public void visitTypeCast(JCTypeCast tree) {
@@ -1430,6 +1436,7 @@
             alive = true;
             this.thrown = this.caught = null;
             this.classDef = null;
+            unrefdResources = new Scope(env.enclClass.sym);
             scan(tree);
         } finally {
             // note that recursive invocations of this method fail hard
@@ -1444,6 +1451,7 @@
             this.make = null;
             this.thrown = this.caught = null;
             this.classDef = null;
+            unrefdResources = null;
         }
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java	Fri Mar 18 15:44:45 2011 -0700
@@ -465,10 +465,9 @@
             // quantify result type with them
             final List<Type> inferredTypes = insttypes.toList();
             final List<Type> all_tvars = tvars; //this is the wrong tvars
-            final MethodType mt2 = new MethodType(mt.argtypes, null, mt.thrown, syms.methodClass);
-            mt2.restype = new ForAll(restvars.toList(), mt.restype) {
+            return new UninferredMethodType(mt, restvars.toList()) {
                 @Override
-                public List<Type> getConstraints(TypeVar tv, ConstraintKind ck) {
+                List<Type> getConstraints(TypeVar tv, ConstraintKind ck) {
                     for (Type t : restundet.toList()) {
                         UndetVar uv = (UndetVar)t;
                         if (uv.qtype == tv) {
@@ -481,21 +480,17 @@
                     }
                     return List.nil();
                 }
-
                 @Override
-                public Type inst(List<Type> inferred, Types types) throws NoInstanceException {
-                    List<Type> formals = types.subst(mt2.argtypes, tvars, inferred);
+                void check(List<Type> inferred, Types types) throws NoInstanceException {
                     // check that actuals conform to inferred formals
-                    checkArgumentsAcceptable(env, capturedArgs, formals, allowBoxing, useVarargs, warn);
+                    checkArgumentsAcceptable(env, capturedArgs, getParameterTypes(), allowBoxing, useVarargs, warn);
                     // check that inferred bounds conform to their bounds
                     checkWithinBounds(all_tvars,
                            types.subst(inferredTypes, tvars, inferred), warn);
                     if (useVarargs) {
-                        chk.checkVararg(env.tree.pos(), formals, msym);
+                        chk.checkVararg(env.tree.pos(), getParameterTypes(), msym);
                     }
-                    return super.inst(inferred, types);
             }};
-            return mt2;
         }
         else {
             // check that actuals conform to inferred formals
@@ -506,6 +501,62 @@
     }
     //where
 
+        /**
+         * A delegated type representing a partially uninferred method type.
+         * The return type of a partially uninferred method type is a ForAll
+         * type - when the return type is instantiated (see Infer.instantiateExpr)
+         * the underlying method type is also updated.
+         */
+        static abstract class UninferredMethodType extends DelegatedType {
+
+            final List<Type> tvars;
+
+            public UninferredMethodType(MethodType mtype, List<Type> tvars) {
+                super(METHOD, new MethodType(mtype.argtypes, null, mtype.thrown, mtype.tsym));
+                this.tvars = tvars;
+                asMethodType().restype = new UninferredReturnType(tvars, mtype.restype);
+            }
+
+            @Override
+            public MethodType asMethodType() {
+                return qtype.asMethodType();
+            }
+
+            @Override
+            public Type map(Mapping f) {
+                return qtype.map(f);
+            }
+
+            void instantiateReturnType(Type restype, List<Type> inferred, Types types) throws NoInstanceException {
+                //update method type with newly inferred type-arguments
+                qtype = new MethodType(types.subst(getParameterTypes(), tvars, inferred),
+                                       restype,
+                                       types.subst(UninferredMethodType.this.getThrownTypes(), tvars, inferred),
+                                       UninferredMethodType.this.qtype.tsym);
+                check(inferred, types);
+            }
+
+            abstract void check(List<Type> inferred, Types types) throws NoInstanceException;
+
+            abstract List<Type> getConstraints(TypeVar tv, ConstraintKind ck);
+
+            class UninferredReturnType extends ForAll {
+                public UninferredReturnType(List<Type> tvars, Type restype) {
+                    super(tvars, restype);
+                }
+                @Override
+                public Type inst(List<Type> actuals, Types types) {
+                    Type newRestype = super.inst(actuals, types);
+                    instantiateReturnType(newRestype, actuals, types);
+                    return newRestype;
+                }
+                @Override
+                public List<Type> getConstraints(TypeVar tv, ConstraintKind ck) {
+                    return UninferredMethodType.this.getConstraints(tv, ck);
+                }
+            }
+        }
+
         private void checkArgumentsAcceptable(Env<AttrContext> env, List<Type> actuals, List<Type> formals,
                 boolean allowBoxing, boolean useVarargs, Warner warn) {
             try {
@@ -518,25 +569,25 @@
             }
         }
 
-        /** Try to instantiate argument type `that' to given type `to'.
-         *  If this fails, try to insantiate `that' to `to' where
-         *  every occurrence of a type variable in `tvars' is replaced
-         *  by an unknown type.
-         */
-        private Type instantiateArg(ForAll that,
-                                    Type to,
-                                    List<Type> tvars,
-                                    Warner warn) throws InferenceException {
-            List<Type> targs;
-            try {
-                return instantiateExpr(that, to, warn);
-            } catch (NoInstanceException ex) {
-                Type to1 = to;
-                for (List<Type> l = tvars; l.nonEmpty(); l = l.tail)
-                    to1 = types.subst(to1, List.of(l.head), List.of(syms.unknownType));
-                return instantiateExpr(that, to1, warn);
-            }
+    /** Try to instantiate argument type `that' to given type `to'.
+     *  If this fails, try to insantiate `that' to `to' where
+     *  every occurrence of a type variable in `tvars' is replaced
+     *  by an unknown type.
+     */
+    private Type instantiateArg(ForAll that,
+                                Type to,
+                                List<Type> tvars,
+                                Warner warn) throws InferenceException {
+        List<Type> targs;
+        try {
+            return instantiateExpr(that, to, warn);
+        } catch (NoInstanceException ex) {
+            Type to1 = to;
+            for (List<Type> l = tvars; l.nonEmpty(); l = l.tail)
+                to1 = types.subst(to1, List.of(l.head), List.of(syms.unknownType));
+            return instantiateExpr(that, to1, warn);
         }
+    }
 
     /** check that type parameters are within their bounds.
      */
@@ -616,4 +667,4 @@
                     return t;
                 }
         };
-}
+    }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java	Fri Mar 18 15:44:45 2011 -0700
@@ -2817,8 +2817,8 @@
                     // local class or this() call
                     thisArg = makeThis(tree.meth.pos(), c.type.getEnclosingType().tsym);
                 } else {
-                    // super() call of nested class
-                    thisArg = makeOwnerThis(tree.meth.pos(), c, false);
+                    // super() call of nested class - never pick 'this'
+                    thisArg = makeOwnerThisN(tree.meth.pos(), c, false);
                 }
                 tree.args = tree.args.prepend(thisArg);
             }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -889,10 +889,11 @@
                 : (c.fullname == names.java_lang_Object)
                 ? Type.noType
                 : syms.objectType;
-            ct.supertype_field = supertype;
+            ct.supertype_field = modelMissingTypes(supertype, tree.extending, false);
 
             // Determine interfaces.
             ListBuffer<Type> interfaces = new ListBuffer<Type>();
+            ListBuffer<Type> all_interfaces = null; // lazy init
             Set<Type> interfaceSet = new HashSet<Type>();
             List<JCExpression> interfaceTrees = tree.implementing;
             if ((tree.mods.flags & Flags.ENUM) != 0 && target.compilerBootstrap(c)) {
@@ -909,13 +910,22 @@
                 Type i = attr.attribBase(iface, baseEnv, false, true, true);
                 if (i.tag == CLASS) {
                     interfaces.append(i);
+                    if (all_interfaces != null) all_interfaces.append(i);
                     chk.checkNotRepeated(iface.pos(), types.erasure(i), interfaceSet);
+                } else {
+                    if (all_interfaces == null)
+                        all_interfaces = new ListBuffer<Type>().appendList(interfaces);
+                    all_interfaces.append(modelMissingTypes(i, iface, true));
                 }
             }
-            if ((c.flags_field & ANNOTATION) != 0)
+            if ((c.flags_field & ANNOTATION) != 0) {
                 ct.interfaces_field = List.of(syms.annotationType);
-            else
+                ct.all_interfaces_field = ct.interfaces_field;
+            }  else {
                 ct.interfaces_field = interfaces.toList();
+                ct.all_interfaces_field = (all_interfaces == null)
+                        ? ct.interfaces_field : all_interfaces.toList();
+            }
 
             if (c.fullname == names.java_lang_Object) {
                 if (tree.extending != null) {
@@ -1066,6 +1076,125 @@
         return result;
     }
 
+    Type modelMissingTypes(Type t, final JCExpression tree, final boolean interfaceExpected) {
+        if (t.tag != ERROR)
+            return t;
+
+        return new ErrorType(((ErrorType) t).getOriginalType(), t.tsym) {
+            private Type modelType;
+
+            @Override
+            public Type getModelType() {
+                if (modelType == null)
+                    modelType = new Synthesizer(getOriginalType(), interfaceExpected).visit(tree);
+                return modelType;
+            }
+        };
+    }
+    // where
+    private class Synthesizer extends JCTree.Visitor {
+        Type originalType;
+        boolean interfaceExpected;
+        List<ClassSymbol> synthesizedSymbols = List.nil();
+        Type result;
+
+        Synthesizer(Type originalType, boolean interfaceExpected) {
+            this.originalType = originalType;
+            this.interfaceExpected = interfaceExpected;
+        }
+
+        Type visit(JCTree tree) {
+            tree.accept(this);
+            return result;
+        }
+
+        List<Type> visit(List<? extends JCTree> trees) {
+            ListBuffer<Type> lb = new ListBuffer<Type>();
+            for (JCTree t: trees)
+                lb.append(visit(t));
+            return lb.toList();
+        }
+
+        @Override
+        public void visitTree(JCTree tree) {
+            result = syms.errType;
+        }
+
+        @Override
+        public void visitIdent(JCIdent tree) {
+            if (tree.type.tag != ERROR) {
+                result = tree.type;
+            } else {
+                result = synthesizeClass(tree.name, syms.unnamedPackage).type;
+            }
+        }
+
+        @Override
+        public void visitSelect(JCFieldAccess tree) {
+            if (tree.type.tag != ERROR) {
+                result = tree.type;
+            } else {
+                Type selectedType;
+                boolean prev = interfaceExpected;
+                try {
+                    interfaceExpected = false;
+                    selectedType = visit(tree.selected);
+                } finally {
+                    interfaceExpected = prev;
+                }
+                ClassSymbol c = synthesizeClass(tree.name, selectedType.tsym);
+                result = c.type;
+            }
+        }
+
+        @Override
+        public void visitTypeApply(JCTypeApply tree) {
+            if (tree.type.tag != ERROR) {
+                result = tree.type;
+            } else {
+                ClassType clazzType = (ClassType) visit(tree.clazz);
+                if (synthesizedSymbols.contains(clazzType.tsym))
+                    synthesizeTyparams((ClassSymbol) clazzType.tsym, tree.arguments.size());
+                final List<Type> actuals = visit(tree.arguments);
+                result = new ErrorType(tree.type, clazzType.tsym) {
+                    @Override
+                    public List<Type> getTypeArguments() {
+                        return actuals;
+                    }
+                };
+            }
+        }
+
+        ClassSymbol synthesizeClass(Name name, Symbol owner) {
+            int flags = interfaceExpected ? INTERFACE : 0;
+            ClassSymbol c = new ClassSymbol(flags, name, owner);
+            c.members_field = new Scope.ErrorScope(c);
+            c.type = new ErrorType(originalType, c) {
+                @Override
+                public List<Type> getTypeArguments() {
+                    return typarams_field;
+                }
+            };
+            synthesizedSymbols = synthesizedSymbols.prepend(c);
+            return c;
+        }
+
+        void synthesizeTyparams(ClassSymbol sym, int n) {
+            ClassType ct = (ClassType) sym.type;
+            Assert.check(ct.typarams_field.isEmpty());
+            if (n == 1) {
+                TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType);
+                ct.typarams_field = ct.typarams_field.prepend(v);
+            } else {
+                for (int i = n; i > 0; i--) {
+                    TypeVar v = new TypeVar(names.fromString("T" + i), sym, syms.botType);
+                    ct.typarams_field = ct.typarams_field.prepend(v);
+                }
+            }
+        }
+    }
+
+
 /* ***************************************************************************
  * tree building
  ****************************************************************************/
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Fri Mar 18 15:44:45 2011 -0700
@@ -45,7 +45,9 @@
 import javax.lang.model.element.ElementVisitor;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.HashMap;
+import java.util.HashSet;
 
 /** Helper class for name resolution, used mostly by the attribution phase.
  *
@@ -896,7 +898,8 @@
                           bestSoFar,
                           allowBoxing,
                           useVarargs,
-                          operator);
+                          operator,
+                          new HashSet<TypeSymbol>());
     }
     // where
     private Symbol findMethod(Env<AttrContext> env,
@@ -909,11 +912,13 @@
                               Symbol bestSoFar,
                               boolean allowBoxing,
                               boolean useVarargs,
-                              boolean operator) {
+                              boolean operator,
+                              Set<TypeSymbol> seen) {
         for (Type ct = intype; ct.tag == CLASS || ct.tag == TYPEVAR; ct = types.supertype(ct)) {
             while (ct.tag == TYPEVAR)
                 ct = ct.getUpperBound();
             ClassSymbol c = (ClassSymbol)ct.tsym;
+            if (!seen.add(c)) return bestSoFar;
             if ((c.flags() & (ABSTRACT | INTERFACE | ENUM)) == 0)
                 abstractok = false;
             for (Scope.Entry e = c.members().lookup(name);
@@ -942,7 +947,7 @@
                     bestSoFar = findMethod(env, site, name, argtypes,
                                            typeargtypes,
                                            l.head, abstractok, bestSoFar,
-                                           allowBoxing, useVarargs, operator);
+                                           allowBoxing, useVarargs, operator, seen);
                 }
                 if (concrete != bestSoFar &&
                     concrete.kind < ERR  && bestSoFar.kind < ERR &&
@@ -1736,24 +1741,26 @@
      */
     Symbol resolveSelfContaining(DiagnosticPosition pos,
                                  Env<AttrContext> env,
-                                 Symbol member) {
+                                 Symbol member,
+                                 boolean isSuperCall) {
         Name name = names._this;
-        Env<AttrContext> env1 = env;
+        Env<AttrContext> env1 = isSuperCall ? env.outer : env;
         boolean staticOnly = false;
-        while (env1.outer != null) {
-            if (isStatic(env1)) staticOnly = true;
-            if (env1.enclClass.sym.isSubClass(member.owner, types) &&
-                isAccessible(env, env1.enclClass.sym.type, member)) {
-                Symbol sym = env1.info.scope.lookup(name).sym;
-                if (sym != null) {
-                    if (staticOnly) sym = new StaticError(sym);
-                    return access(sym, pos, env.enclClass.sym.type,
-                                  name, true);
+        if (env1 != null) {
+            while (env1 != null && env1.outer != null) {
+                if (isStatic(env1)) staticOnly = true;
+                if (env1.enclClass.sym.isSubClass(member.owner, types)) {
+                    Symbol sym = env1.info.scope.lookup(name).sym;
+                    if (sym != null) {
+                        if (staticOnly) sym = new StaticError(sym);
+                        return access(sym, pos, env.enclClass.sym.type,
+                                      name, true);
+                    }
                 }
+                if ((env1.enclClass.sym.flags() & STATIC) != 0)
+                    staticOnly = true;
+                env1 = env1.outer;
             }
-            if ((env1.enclClass.sym.flags() & STATIC) != 0)
-                staticOnly = true;
-            env1 = env1.outer;
         }
         log.error(pos, "encl.class.required", member);
         return syms.errSymbol;
@@ -1764,9 +1771,13 @@
      * JLS2 8.8.5.1 and 15.9.2
      */
     Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t) {
+        return resolveImplicitThis(pos, env, t, false);
+    }
+
+    Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t, boolean isSuperCall) {
         Type thisType = (((t.tsym.owner.kind & (MTH|VAR)) != 0)
                          ? resolveSelf(pos, env, t.getEnclosingType().tsym, names._this)
-                         : resolveSelfContaining(pos, env, t.tsym)).type;
+                         : resolveSelfContaining(pos, env, t.tsym, isSuperCall)).type;
         if (env.info.isSelfCall && thisType.tsym == env.enclClass.sym)
             log.error(pos, "cant.ref.before.ctor.called", "this");
         return thisType;
--- a/langtools/src/share/classes/com/sun/tools/javac/file/CacheFSInfo.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/CacheFSInfo.java	Fri Mar 18 15:44:45 2011 -0700
@@ -44,13 +44,13 @@
 public class CacheFSInfo extends FSInfo {
 
     /**
-     * Register a Context.Factory to create a singleton CacheFSInfo.
+     * Register a Context.Factory to create a CacheFSInfo.
      */
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(FSInfo.class, new Context.Factory<FSInfo>() {
-            public FSInfo make() {
+            public FSInfo make(Context c) {
                 FSInfo instance = new CacheFSInfo();
-                context.put(FSInfo.class, instance);
+                c.put(FSInfo.class, instance);
                 return instance;
             }
         });
--- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Fri Mar 18 15:44:45 2011 -0700
@@ -129,10 +129,10 @@
     /**
      * Register a Context.Factory to create a JavacFileManager.
      */
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() {
-            public JavaFileManager make() {
-                return new JavacFileManager(context, true, null);
+            public JavaFileManager make(Context c) {
+                return new JavacFileManager(c, true, null);
             }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Fri Mar 18 15:44:45 2011 -0700
@@ -2183,7 +2183,7 @@
                 }
                 currentClassFile = classfile;
                 if (verbose) {
-                    printVerbose("loading", currentClassFile.toString());
+                    log.printVerbose("loading", currentClassFile.toString());
                 }
                 if (classfile.getKind() == JavaFileObject.Kind.CLASS) {
                     filling = true;
@@ -2452,13 +2452,13 @@
                     for (File file : fm.getLocation(SOURCE_PATH)) {
                         path = path.prepend(file);
                     }
-                    printVerbose("sourcepath", path.reverse().toString());
+                    log.printVerbose("sourcepath", path.reverse().toString());
                 } else if (wantSourceFiles) {
                     List<File> path = List.nil();
                     for (File file : fm.getLocation(CLASS_PATH)) {
                         path = path.prepend(file);
                     }
-                    printVerbose("sourcepath", path.reverse().toString());
+                    log.printVerbose("sourcepath", path.reverse().toString());
                 }
                 if (wantClassFiles) {
                     List<File> path = List.nil();
@@ -2468,7 +2468,7 @@
                     for (File file : fm.getLocation(CLASS_PATH)) {
                         path = path.prepend(file);
                     }
-                    printVerbose("classpath",  path.reverse().toString());
+                    log.printVerbose("classpath",  path.reverse().toString());
                 }
             }
         }
@@ -2519,14 +2519,6 @@
             }
         }
 
-    /** Output for "-verbose" option.
-     *  @param key The key to look up the correct internationalized string.
-     *  @param arg An argument for substitution into the output string.
-     */
-    private void printVerbose(String key, CharSequence arg) {
-        log.printNoteLines("verbose." + key, arg);
-    }
-
     /** Output for "-checkclassfile" option.
      *  @param key The key to look up the correct internationalized string.
      *  @param arg An argument for substitution into the output string.
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1447,7 +1447,7 @@
         try {
             writeClassFile(out, c);
             if (verbose)
-                log.printErrLines("verbose.wrote.file", outFile);
+                log.printVerbose("wrote.file", outFile);
             out.close();
             out = null;
         } finally {
--- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Fri Mar 18 15:44:45 2011 -0700
@@ -299,6 +299,13 @@
     protected JavaCompiler delegateCompiler;
 
     /**
+     * Command line options.
+     */
+    protected Options options;
+
+    protected Context context;
+
+    /**
      * Flag set if any annotation processing occurred.
      **/
     protected boolean annotationProcessingOccurred;
@@ -308,11 +315,9 @@
      **/
     protected boolean implicitSourceFilesRead;
 
-    protected Context context;
-
     /** Construct a new compiler using a shared context.
      */
-    public JavaCompiler(final Context context) {
+    public JavaCompiler(Context context) {
         this.context = context;
         context.put(compilerKey, this);
 
@@ -354,7 +359,7 @@
 
         reader.sourceCompleter = this;
 
-        Options options = Options.instance(context);
+        options = Options.instance(context);
 
         verbose       = options.isSet(VERBOSE);
         sourceOutput  = options.isSet(PRINTSOURCE); // used to be -s
@@ -580,7 +585,7 @@
                                       null, List.<JCTree>nil());
         if (content != null) {
             if (verbose) {
-                printVerbose("parsing.started", filename);
+                log.printVerbose("parsing.started", filename);
             }
             if (taskListener != null) {
                 TaskEvent e = new TaskEvent(TaskEvent.Kind.PARSE, filename);
@@ -589,7 +594,7 @@
             Parser parser = parserFactory.newParser(content, keepComments(), genEndPos, lineDebugInfo);
             tree = parser.parseCompilationUnit();
             if (verbose) {
-                printVerbose("parsing.done", Long.toString(elapsed(msec)));
+                log.printVerbose("parsing.done", Long.toString(elapsed(msec)));
             }
         }
 
@@ -676,7 +681,7 @@
             try {
                 new Pretty(out, true).printUnit(env.toplevel, cdef);
                 if (verbose)
-                    printVerbose("wrote.file", outFile);
+                    log.printVerbose("wrote.file", outFile);
             } finally {
                 out.close();
             }
@@ -792,6 +797,11 @@
             throw new AssertionError("attempt to reuse JavaCompiler");
         hasBeenUsed = true;
 
+        // forcibly set the equivalent of -Xlint:-options, so that no further
+        // warnings about command line options are generated from this point on
+        options.put(XLINT_CUSTOM + "-" + LintCategory.OPTIONS.option, "true");
+        options.remove(XLINT_CUSTOM + LintCategory.OPTIONS.option);
+
         start_msec = now();
 
         try {
@@ -857,7 +867,7 @@
 
         if (verbose) {
             elapsed_msec = elapsed(start_msec);
-            printVerbose("total", Long.toString(elapsed_msec));
+            log.printVerbose("total", Long.toString(elapsed_msec));
         }
 
         reportDeferredDiagnostics();
@@ -963,7 +973,6 @@
     public void initProcessAnnotations(Iterable<? extends Processor> processors) {
         // Process annotations if processing is not disabled and there
         // is at least one Processor available.
-        Options options = Options.instance(context);
         if (options.isSet(PROC, "none")) {
             processAnnotations = false;
         } else if (procEnvImpl == null) {
@@ -1022,7 +1031,6 @@
             // If there are no annotation processors present, and
             // annotation processing is to occur with compilation,
             // emit a warning.
-            Options options = Options.instance(context);
             if (options.isSet(PROC, "only")) {
                 log.warning("proc.proc-only.requested.no.procs");
                 todo.clear();
@@ -1108,9 +1116,13 @@
     }
 
     boolean explicitAnnotationProcessingRequested() {
-        Options options = Options.instance(context);
         return
             explicitAnnotationProcessingRequested ||
+            explicitAnnotationProcessingRequested(options);
+    }
+
+    static boolean explicitAnnotationProcessingRequested(Options options) {
+        return
             options.isSet(PROCESSOR) ||
             options.isSet(PROCESSORPATH) ||
             options.isSet(PROC, "only") ||
@@ -1142,7 +1154,7 @@
         if (verboseCompilePolicy)
             printNote("[attribute " + env.enclClass.sym + "]");
         if (verbose)
-            printVerbose("checking.attribution", env.enclClass.sym);
+            log.printVerbose("checking.attribution", env.enclClass.sym);
 
         if (taskListener != null) {
             TaskEvent e = new TaskEvent(TaskEvent.Kind.ANALYZE, env.toplevel, env.enclClass.sym);
@@ -1508,7 +1520,8 @@
         }
 
     public void reportDeferredDiagnostics() {
-        if (annotationProcessingOccurred
+        if (errorCount() == 0
+                && annotationProcessingOccurred
                 && implicitSourceFilesRead
                 && implicitSourcePolicy == ImplicitSourcePolicy.UNSET) {
             if (explicitAnnotationProcessingRequested())
@@ -1562,14 +1575,6 @@
         Log.printLines(log.noticeWriter, lines);
     }
 
-    /** Output for "-verbose" option.
-     *  @param key The key to look up the correct internationalized string.
-     *  @param arg An argument for substitution into the output string.
-     */
-    protected void printVerbose(String key, Object arg) {
-        log.printNoteLines("verbose." + key, arg);
-    }
-
     /** Print numbers of errors and warnings.
      */
     protected void printCount(String kind, int count) {
--- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -367,7 +367,11 @@
                         || options.isSet(VERSION)
                         || options.isSet(FULLVERSION))
                         return EXIT_OK;
-                    error("err.no.source.files");
+                    if (JavaCompiler.explicitAnnotationProcessingRequested(options)) {
+                        error("err.no.source.files.classes");
+                    } else {
+                        error("err.no.source.files");
+                    }
                     return EXIT_CMDERR;
                 }
             } catch (java.io.FileNotFoundException e) {
--- a/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java	Fri Mar 18 15:44:45 2011 -0700
@@ -88,6 +88,7 @@
     O("-O"),
     XJCOV("-Xjcov"),
     XD("-XD"),
+    AT("@"),
     SOURCEFILE("sourcefile");
 
     public final String optionName;
--- a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java	Fri Mar 18 15:44:45 2011 -0700
@@ -168,6 +168,7 @@
         O,
         XJCOV,
         XD,
+        AT,
         SOURCEFILE);
 
     static Set<OptionName> javacFileManagerOptions = EnumSet.of(
@@ -565,12 +566,27 @@
             }
         },
 
+        // This option exists only for the purpose of documenting itself.
+        // It's actually implemented by the CommandLine class.
+        new Option(AT,                   "opt.arg.file",         "opt.AT") {
+            @Override
+            String helpSynopsis() {
+                hasSuffix = true;
+                return super.helpSynopsis();
+            }
+            @Override
+            public boolean process(Options options, String option) {
+                throw new AssertionError
+                    ("the @ flag should be caught by CommandLine.");
+            }
+        },
+
         /*
          * TODO: With apt, the matches method accepts anything if
          * -XclassAsDecls is used; code elsewhere does the lookup to
          * see if the class name is both legal and found.
          *
-         * In apt, the process method adds the candiate class file
+         * In apt, the process method adds the candidate class file
          * name to a separate list.
          */
         new HiddenOption(SOURCEFILE) {
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Fri Mar 18 15:44:45 2011 -0700
@@ -2357,7 +2357,7 @@
 
         List<JCTypeParameter> typarams = typeParametersOpt();
 
-        JCTree extending = null;
+        JCExpression extending = null;
         if (S.token() == EXTENDS) {
             S.nextToken();
             extending = parseType();
--- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java	Fri Mar 18 15:44:45 2011 -0700
@@ -807,8 +807,6 @@
         final JavaCompiler compiler;
         /** The log for the round. */
         final Log log;
-        /** The number of warnings in the previous round. */
-        final int priorWarnings;
 
         /** The ASTs to be compiled. */
         List<JCCompilationUnit> roots;
@@ -826,10 +824,10 @@
         private Round(Context context, int number, int priorWarnings) {
             this.context = context;
             this.number = number;
-            this.priorWarnings = priorWarnings;
 
             compiler = JavaCompiler.instance(context);
             log = Log.instance(context);
+            log.nwarnings += priorWarnings;
             log.deferDiagnostics = true;
 
             // the following is for the benefit of JavacProcessingEnvironment.getContext()
@@ -904,8 +902,8 @@
         JavaCompiler finalCompiler(boolean errorStatus) {
             try {
                 JavaCompiler c = JavaCompiler.instance(nextContext());
+                c.log.nwarnings += compiler.log.nwarnings;
                 if (errorStatus) {
-                    c.log.nwarnings += priorWarnings + compiler.log.nwarnings;
                     c.log.nerrors += compiler.log.nerrors;
                 }
                 return c;
@@ -1045,7 +1043,7 @@
          * other values are implicitly reset.
          */
         private Context nextContext() {
-            Context next = new Context();
+            Context next = new Context(context);
 
             Options options = Options.instance(context);
             Assert.checkNonNull(options);
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Fri Mar 18 15:44:45 2011 -0700
@@ -1588,14 +1588,6 @@
 compiler.misc.diamond.non.generic=\
     cannot use ''<>'' with non-generic class {0}
 
-# 0: list of type, 1: message segment
-compiler.misc.diamond.invalid.arg=\
-    type argument {0} inferred for {1} is not allowed in this context
-
-# 0: list of type, 1: message segment
-compiler.misc.diamond.invalid.args=\
-    type arguments {0} inferred for {1} are not allowed in this context
-
 # 0: type, 1: list of type
 compiler.misc.explicit.param.do.not.conform.to.bounds=\
     explicit type argument {0} does not conform to declared bound(s) {1}
@@ -1803,8 +1795,8 @@
 compiler.misc.varargs.clash.with=\
     {0} in {1} overrides {2} in {3}
 
-compiler.misc.non.denotable.type=\
-    Non-denotable type {0} not allowed here
+compiler.misc.diamond.and.anon.class=\
+    cannot use ''<>'' with anonymous inner classes
 
 # 0: symbol kind, 1: symbol, 2: symbol, 3: message segment
 compiler.misc.inapplicable.method=\
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2011, 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
@@ -146,6 +146,8 @@
     Print information about which annotations a processor is asked to process
 javac.opt.prefer=\
     Specify which file to read when both a source file and class file are found for an implicitly compiled class
+javac.opt.AT=\
+    Read options and filenames from file
 
 ## errors
 
@@ -161,6 +163,8 @@
     invalid target release: {0}
 javac.err.no.source.files=\
     no source files
+javac.err.no.source.files.classes=\
+    no source files or class names
 javac.err.req.arg=\
     {0} requires an argument
 javac.err.invalid.source=\
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Fri Mar 18 15:44:45 2011 -0700
@@ -567,14 +567,14 @@
         public JCModifiers mods;
         public Name name;
         public List<JCTypeParameter> typarams;
-        public JCTree extending;
+        public JCExpression extending;
         public List<JCExpression> implementing;
         public List<JCTree> defs;
         public ClassSymbol sym;
         protected JCClassDecl(JCModifiers mods,
                            Name name,
                            List<JCTypeParameter> typarams,
-                           JCTree extending,
+                           JCExpression extending,
                            List<JCExpression> implementing,
                            List<JCTree> defs,
                            ClassSymbol sym)
@@ -2104,7 +2104,7 @@
         JCClassDecl ClassDef(JCModifiers mods,
                           Name name,
                           List<JCTypeParameter> typarams,
-                          JCTree extending,
+                          JCExpression extending,
                           List<JCExpression> implementing,
                           List<JCTree> defs);
         JCMethodDecl MethodDef(JCModifiers mods,
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Fri Mar 18 15:44:45 2011 -0700
@@ -135,7 +135,7 @@
         JCClassDecl t = (JCClassDecl) node;
         JCModifiers mods = copy(t.mods, p);
         List<JCTypeParameter> typarams = copy(t.typarams, p);
-        JCTree extending = copy(t.extending, p);
+        JCExpression extending = copy(t.extending, p);
         List<JCExpression> implementing = copy(t.implementing, p);
         List<JCTree> defs = copy(t.defs, p);
         return M.at(t.pos).ClassDef(mods, t.name, typarams, extending, implementing, defs);
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java	Fri Mar 18 15:44:45 2011 -0700
@@ -146,7 +146,7 @@
     public JCClassDecl ClassDef(JCModifiers mods,
                                 Name name,
                                 List<JCTypeParameter> typarams,
-                                JCTree extending,
+                                JCExpression extending,
                                 List<JCExpression> implementing,
                                 List<JCTree> defs)
     {
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Context.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Context.java	Fri Mar 18 15:44:45 2011 -0700
@@ -108,7 +108,7 @@
      * instance.
      */
     public static interface Factory<T> {
-        T make();
+        T make(Context c);
     };
 
     /**
@@ -124,6 +124,8 @@
         Object old = ht.put(key, fac);
         if (old != null)
             throw new AssertionError("duplicate context value");
+        checkState(ft);
+        ft.put(key, fac); // cannot be duplicate if unique in ht
     }
 
     /** Set the value for the key in this context. */
@@ -142,7 +144,7 @@
         Object o = ht.get(key);
         if (o instanceof Factory<?>) {
             Factory<?> fac = (Factory<?>)o;
-            o = fac.make();
+            o = fac.make(this);
             if (o instanceof Factory<?>)
                 throw new AssertionError("T extends Context.Factory");
             Assert.check(ht.get(key) == o);
@@ -158,6 +160,20 @@
 
     public Context() {}
 
+    /**
+     * The table of preregistered factories.
+     */
+    private Map<Key<?>,Factory<?>> ft = new HashMap<Key<?>,Factory<?>>();
+
+    public Context(Context prev) {
+        kt.putAll(prev.kt);     // retain all implicit keys
+        ft.putAll(prev.ft);     // retain all factory objects
+        ht.putAll(prev.ft);     // init main table with factories
+    }
+
+    /*
+     * The key table, providing a unique Key<T> for each Class<T>.
+     */
     private Map<Class<?>, Key<?>> kt = new HashMap<Class<?>, Key<?>>();
 
     private <T> Key<T> key(Class<T> clss) {
@@ -198,6 +214,7 @@
     public void clear() {
         ht = null;
         kt = null;
+        ft = null;
     }
 
     private static void checkState(Map<?,?> t) {
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2011, 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
@@ -329,7 +329,6 @@
         printLines(errWriter, localize(key, args));
     }
 
-
     /** Print the text of a message to the noticeWriter stream,
      *  translating newlines appropriately for the platform.
      */
@@ -337,6 +336,14 @@
         printLines(noticeWriter, localize(key, args));
     }
 
+    /**
+     * Print the localized text of a "verbose" message to the
+     * noticeWriter stream.
+     */
+    public void printVerbose(String key, Object... args) {
+        printLines(noticeWriter, localize("verbose." + key, args));
+    }
+
     protected void directError(String key, Object... args) {
         printErrLines(key, args);
         errWriter.flush();
--- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -92,8 +92,9 @@
      *     @com.example.foo
      * Omit parens for marker annotations, and omit "value=" when allowed.
      */
+    @Override
     public String toString() {
-        StringBuffer sb = new StringBuffer("@");
+        StringBuilder sb = new StringBuilder("@");
         sb.append(annotation.type.tsym);
 
         ElementValuePair vals[] = elementValues();
@@ -153,6 +154,7 @@
          * Returns a string representation of this pair
          * of the form "name=value".
          */
+        @Override
         public String toString() {
             return meth.name + "=" + value();
         }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,7 +30,6 @@
 
 import com.sun.tools.javac.code.Attribute;
 import com.sun.tools.javac.code.Symbol.*;
-import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.TypeTags;
 
 
@@ -114,6 +113,7 @@
      * @return the text of a Java language annotation value expression
      *          whose value is the value of this annotation type element.
      */
+    @Override
     public String toString() {
         ToStringVisitor tv = new ToStringVisitor();
         attr.accept(tv);
@@ -121,8 +121,9 @@
     }
 
     private class ToStringVisitor implements Attribute.Visitor {
-        private final StringBuffer sb = new StringBuffer();
+        private final StringBuilder sb = new StringBuilder();
 
+        @Override
         public String toString() {
             return sb.toString();
         }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -64,7 +64,6 @@
 import com.sun.tools.javac.util.Names;
 import com.sun.tools.javac.util.Position;
 
-import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Kinds.*;
 
 /**
@@ -147,6 +146,7 @@
     /**
      * Return true if this is a class, not an interface.
      */
+    @Override
     public boolean isClass() {
         return !Modifier.isInterface(getModifiers());
     }
@@ -155,6 +155,7 @@
      * Return true if this is a ordinary class,
      * not an enumeration, exception, an error, or an interface.
      */
+    @Override
     public boolean isOrdinaryClass() {
         if (isEnum() || isInterface() || isAnnotationType()) {
             return false;
@@ -172,6 +173,7 @@
      * Return true if this is an enumeration.
      * (For legacy doclets, return false.)
      */
+    @Override
     public boolean isEnum() {
         return (getFlags() & Flags.ENUM) != 0
                &&
@@ -182,6 +184,7 @@
      * Return true if this is an interface, but not an annotation type.
      * Overridden by AnnotationTypeDocImpl.
      */
+    @Override
     public boolean isInterface() {
         return Modifier.isInterface(getModifiers());
     }
@@ -189,6 +192,7 @@
     /**
      * Return true if this is an exception class
      */
+    @Override
     public boolean isException() {
         if (isEnum() || isInterface() || isAnnotationType()) {
             return false;
@@ -204,6 +208,7 @@
     /**
      * Return true if this is an error class
      */
+    @Override
     public boolean isError() {
         if (isEnum() || isInterface() || isAnnotationType()) {
             return false;
@@ -275,6 +280,7 @@
     /**
      * Return the package that this class is contained in.
      */
+    @Override
     public PackageDoc containingPackage() {
         PackageDocImpl p = env.getPackageDoc(tsym.packge());
         if (p.setDocPath == false) {
@@ -374,6 +380,7 @@
      * Return the qualified name and any type parameters.
      * Each parameter is a type variable with optional bounds.
      */
+    @Override
     public String toString() {
         return classToString(env, tsym, true);
     }
@@ -401,7 +408,7 @@
      * qualified by their enclosing class(es) only.
      */
     static String classToString(DocEnv env, ClassSymbol c, boolean full) {
-        StringBuffer s = new StringBuffer();
+        StringBuilder s = new StringBuilder();
         if (!c.isInner()) {             // if c is not an inner class
             s.append(getClassName(c, full));
         } else {
@@ -449,10 +456,12 @@
      * Return the modifier string for this class. If it's an interface
      * exclude 'abstract' keyword from the modifier string
      */
+    @Override
     public String modifiers() {
         return Modifier.toString(modifierSpecifier());
     }
 
+    @Override
     public int modifierSpecifier() {
         int modifiers = getModifiers();
         return (isInterface() || isAnnotationType())
@@ -1285,6 +1294,7 @@
      * Return the source position of the entity, or null if
      * no position is available.
      */
+    @Override
     public SourcePosition position() {
         if (tsym.sourcefile == null) return null;
         return SourcePositionImpl.make(tsym.sourcefile,
--- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
 
 package com.sun.tools.javadoc;
 
+import java.io.DataInputStream;
 import java.io.InputStream;
 import java.io.IOException;
 import java.text.CollationKey;
@@ -33,6 +34,8 @@
 import com.sun.javadoc.*;
 
 import com.sun.tools.javac.util.Position;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * abstract base class of all Doc classes.  Doc item's are representations
@@ -166,51 +169,28 @@
      * Utility for subclasses which read HTML documentation files.
      */
     String readHTMLDocumentation(InputStream input, FileObject filename) throws IOException {
-        int filesize = input.available();
-        byte[] filecontents = new byte[filesize];
-        input.read(filecontents, 0, filesize);
-        input.close();
+        byte[] filecontents = new byte[input.available()];
+        try {
+            DataInputStream dataIn = new DataInputStream(input);
+            dataIn.readFully(filecontents);
+        } finally {
+            input.close();
+        }
         String encoding = env.getEncoding();
         String rawDoc = (encoding!=null)
             ? new String(filecontents, encoding)
             : new String(filecontents);
-        String upper = null;
-        int bodyIdx = rawDoc.indexOf("<body");
-        if (bodyIdx == -1) {
-            bodyIdx = rawDoc.indexOf("<BODY");
-            if (bodyIdx == -1) {
-                upper = rawDoc.toUpperCase();
-                bodyIdx = upper.indexOf("<BODY");
-                if (bodyIdx == -1) {
-                    env.error(SourcePositionImpl.make(filename, Position.NOPOS, null),
-                                       "javadoc.Body_missing_from_html_file");
-                    return "";
-                }
-            }
-        }
-        bodyIdx = rawDoc.indexOf('>', bodyIdx);
-        if (bodyIdx == -1) {
-            env.error(SourcePositionImpl.make(filename, Position.NOPOS, null),
-                               "javadoc.Body_missing_from_html_file");
+        Pattern bodyPat = Pattern.compile("(?is).*<body\\b[^>]*>(.*)</body\\b.*");
+        Matcher m = bodyPat.matcher(rawDoc);
+        if (m.matches()) {
+            return m.group(1);
+        } else {
+            String key = rawDoc.matches("(?is).*<body\\b.*")
+                    ? "javadoc.End_body_missing_from_html_file"
+                    : "javadoc.Body_missing_from_html_file";
+            env.error(SourcePositionImpl.make(filename, Position.NOPOS, null), key);
             return "";
         }
-        ++bodyIdx;
-        int endIdx = rawDoc.indexOf("</body", bodyIdx);
-        if (endIdx == -1) {
-            endIdx = rawDoc.indexOf("</BODY", bodyIdx);
-            if (endIdx == -1) {
-                if (upper == null) {
-                    upper = rawDoc.toUpperCase();
-                }
-                endIdx = upper.indexOf("</BODY", bodyIdx);
-                if (endIdx == -1) {
-                    env.error(SourcePositionImpl.make(filename, Position.NOPOS, null),
-                                       "javadoc.End_body_missing_from_html_file");
-                    return "";
-                }
-            }
-        }
-        return rawDoc.substring(bodyIdx, endIdx);
     }
 
     /**
@@ -256,6 +236,7 @@
     /**
      * Returns a string representation of this Doc item.
      */
+    @Override
     public String toString() {
         return qualifiedName();
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,14 +31,13 @@
 
 import com.sun.tools.javac.util.List;
 
-import java.net.*;
+import java.io.File;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.net.URLClassLoader;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.StringTokenizer;
 
 /**
  * Class creates, controls and invokes doclets.
--- a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -226,7 +226,7 @@
     }
 
     private String makeSignature(boolean full) {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         result.append("(");
         for (List<Type> types = sym.type.getParameterTypes(); types.nonEmpty(); ) {
             Type t = types.head;
@@ -251,6 +251,7 @@
     /**
      * Generate a key for sorting.
      */
+    @Override
     CollationKey generateKey() {
         String k = name() + flatSignature() + typeParametersString();
         // ',' and '&' are between '$' and 'a':  normalize to spaces.
@@ -263,6 +264,7 @@
      * Return the source position of the entity, or null if
      * no position is available.
      */
+    @Override
     public SourcePosition position() {
         if (sym.enclClass().sourcefile == null) return null;
         return SourcePositionImpl.make(sym.enclClass().sourcefile,
--- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -142,7 +142,7 @@
             return v + (suffix == 'f' || suffix == 'F' ? "" + suffix : "");
         }
         private static String sourceForm(char c) {
-            StringBuffer buf = new StringBuffer(8);
+            StringBuilder buf = new StringBuilder(8);
             buf.append('\'');
             sourceChar(c, buf);
             buf.append('\'');
@@ -152,7 +152,7 @@
             return "0x" + Integer.toString(c & 0xff, 16);
         }
         private static String sourceForm(String s) {
-            StringBuffer buf = new StringBuffer(s.length() + 5);
+            StringBuilder buf = new StringBuilder(s.length() + 5);
             buf.append('\"');
             for (int i=0; i<s.length(); i++) {
                 char c = s.charAt(i);
@@ -161,7 +161,7 @@
             buf.append('\"');
             return buf.toString();
         }
-        private static void sourceChar(char c, StringBuffer buf) {
+        private static void sourceChar(char c, StringBuilder buf) {
             switch (c) {
             case '\b': buf.append("\\b"); return;
             case '\t': buf.append("\\t"); return;
@@ -179,7 +179,7 @@
                 return;
             }
         }
-        private static void unicodeEscape(char c, StringBuffer buf) {
+        private static void unicodeEscape(char c, StringBuilder buf) {
             final String chars = "0123456789abcdef";
             buf.append("\\u");
             buf.append(chars.charAt(15 & (c>>12)));
@@ -201,6 +201,7 @@
     /**
      * Is this Doc item a field (but not an enum constant?
      */
+    @Override
     public boolean isField() {
         return !isEnumConstant();
     }
@@ -209,6 +210,7 @@
      * Is this Doc item an enum constant?
      * (For legacy doclets, return false.)
      */
+    @Override
     public boolean isEnumConstant() {
         return (getFlags() & Flags.ENUM) != 0 &&
                !env.legacyDoclet;
@@ -257,6 +259,7 @@
      * Return the source position of the entity, or null if
      * no position is available.
      */
+    @Override
     public SourcePosition position() {
         if (sym.enclClass().sourcefile == null) return null;
         return SourcePositionImpl.make(sym.enclClass().sourcefile,
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,10 +44,10 @@
         return (JavadocClassReader)instance;
     }
 
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(classReaderKey, new Context.Factory<ClassReader>() {
-            public ClassReader make() {
-                return new JavadocClassReader(context);
+            public ClassReader make(Context c) {
+                return new JavadocClassReader(c);
             }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,10 +48,10 @@
         return (JavadocEnter)instance;
     }
 
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(enterKey, new Context.Factory<Enter>() {
-               public Enter make() {
-                   return new JavadocEnter(context);
+               public Enter make(Context c) {
+                   return new JavadocEnter(c);
                }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -46,10 +46,10 @@
         return (JavadocMemberEnter)instance;
     }
 
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(memberEnterKey, new Context.Factory<MemberEnter>() {
-               public MemberEnter make() {
-                   return new JavadocMemberEnter(context);
+               public MemberEnter make(Context c) {
+                   return new JavadocMemberEnter(c);
                }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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,10 +34,10 @@
  *  @author Neal Gafter
  */
 public class JavadocTodo extends Todo {
-    public static void preRegister(final Context context) {
+    public static void preRegister(Context context) {
         context.put(todoKey, new Context.Factory<Todo>() {
-               public Todo make() {
-                   return new JavadocTodo(context);
+               public Todo make(Context c) {
+                   return new JavadocTodo(c);
                }
         });
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -57,23 +57,23 @@
         return (Messager)instance;
     }
 
-    public static void preRegister(final Context context,
+    public static void preRegister(Context context,
                                    final String programName) {
         context.put(logKey, new Context.Factory<Log>() {
-            public Log make() {
-                return new Messager(context,
+            public Log make(Context c) {
+                return new Messager(c,
                                     programName);
             }
         });
     }
-    public static void preRegister(final Context context,
+    public static void preRegister(Context context,
                                    final String programName,
                                    final PrintWriter errWriter,
                                    final PrintWriter warnWriter,
                                    final PrintWriter noticeWriter) {
         context.put(logKey, new Context.Factory<Log>() {
-            public Log make() {
-                return new Messager(context,
+            public Log make(Context c) {
+                return new Messager(c,
                                     programName,
                                     errWriter,
                                     warnWriter,
@@ -143,11 +143,9 @@
      * if needed.
      */
     private String getString(String key) {
-        ResourceBundle messageRB = this.messageRB;
         if (messageRB == null) {
             try {
-                this.messageRB = messageRB =
-                    ResourceBundle.getBundle(
+                messageRB = ResourceBundle.getBundle(
                           "com.sun.tools.javadoc.resources.javadoc");
             } catch (MissingResourceException e) {
                 throw new Error("Fatal: Resource for javadoc is missing");
@@ -456,8 +454,6 @@
      * Print exit message.
      */
     public void exitNotice() {
-        int nerrors = nerrors();
-        int nwarnings = nwarnings();
         if (nerrors > 0) {
             notice((nerrors > 1) ? "main.errors" : "main.error",
                    "" + nerrors);
--- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,15 +25,11 @@
 
 package com.sun.tools.javadoc;
 
-
 import com.sun.javadoc.*;
 
-import static com.sun.javadoc.LanguageVersion.*;
-
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.Type.ClassType;
-import com.sun.tools.javac.util.List;
 
 import static com.sun.tools.javac.code.TypeTags.*;
 
@@ -55,6 +51,7 @@
     /**
      * Return the generic class or interface that declared this type.
      */
+    @Override
     public ClassDoc asClassDoc() {
         return env.getClassDoc((ClassSymbol)type.tsym);
     }
@@ -111,14 +108,17 @@
     // Asking for the "name" of a parameterized type doesn't exactly make
     // sense.  It's a type expression.  Return the name of its generic
     // type.
+    @Override
     public String typeName() {
         return TypeMaker.getTypeName(type, false);
     }
 
+    @Override
     public ParameterizedType asParameterizedType() {
         return this;
     }
 
+    @Override
     public String toString() {
         return parameterizedTypeToString(env, (ClassType)type, true);
     }
@@ -128,7 +128,7 @@
         if (env.legacyDoclet) {
             return TypeMaker.getTypeName(cl, full);
         }
-        StringBuffer s = new StringBuffer();
+        StringBuilder s = new StringBuilder();
         if (cl.getEnclosingType().tag != CLASS) {               // if not an inner class...
             s.append(TypeMaker.getTypeName(cl, full));
         } else {
--- a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -322,6 +322,7 @@
     /**
      * Do lazy initialization of "documentation" string.
      */
+    @Override
     protected String documentation() {
         if (documentation == null) {
             int cnt = options.length();
@@ -348,6 +349,7 @@
      * Return the source position of the entity, or null if
      * no position is available.
      */
+    @Override
     public SourcePosition position() {
         JavaFileObject path;
         return ((path = getOverviewPath()) == null) ?
--- a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -358,14 +358,14 @@
 
         String parameters;
 
-        StringBuffer typeId;
+        StringBuilder typeId;
 
         ListBuffer<String> paramList;
 
         ParameterParseMachine(String parameters) {
             this.parameters = parameters;
             this.paramList = new ListBuffer<String>();
-            typeId = new StringBuffer();
+            typeId = new StringBuilder();
         }
 
         public String[] parseParameters() {
@@ -464,6 +464,7 @@
     /**
      * Return the kind of this tag.
      */
+    @Override
     public String kind() {
         return "@see";
     }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -396,6 +396,10 @@
         boolean ok = root != null;
         if (ok) ok = docletInvoker.start(root);
 
+        Messager docletMessager = Messager.instance0(context);
+        messager.nwarnings += docletMessager.nwarnings;
+        messager.nerrors += docletMessager.nerrors;
+
         // We're done.
         if (compOpts.get("-verbose") != null) {
             tm = System.currentTimeMillis() - tm;
--- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -27,15 +27,12 @@
 
 import com.sun.javadoc.*;
 
-import static com.sun.javadoc.LanguageVersion.*;
-
 import com.sun.tools.javac.code.Symbol;
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.Type.ClassType;
 import com.sun.tools.javac.code.Type.TypeVar;
 import com.sun.tools.javac.code.Type.ArrayType;
-import com.sun.tools.javac.code.Types;
 import com.sun.tools.javac.util.List;
 
 import static com.sun.tools.javac.code.TypeTags.*;
@@ -109,12 +106,13 @@
     public static String getTypeName(Type t, boolean full) {
         switch (t.tag) {
         case ARRAY:
-            StringBuffer dimension = new StringBuffer();
+            StringBuilder s = new StringBuilder();
             while (t.tag == ARRAY) {
-                dimension = dimension.append("[]");
+                s.append("[]");
                 t = ((ArrayType)t).elemtype;
             }
-            return getTypeName(t, full) + dimension;
+            s.insert(0, getTypeName(t, full));
+            return s.toString();
         case CLASS:
             return ClassDocImpl.getClassName((ClassSymbol)t.tsym, full);
         default:
@@ -130,12 +128,13 @@
     static String getTypeString(DocEnv env, Type t, boolean full) {
         switch (t.tag) {
         case ARRAY:
-            StringBuffer dimension = new StringBuffer();
+            StringBuilder s = new StringBuilder();
             while (t.tag == ARRAY) {
-                dimension = dimension.append("[]");
+                s.append("[]");
                 t = env.types.elemtype(t);
             }
-            return getTypeString(env, t, full) + dimension;
+            s.insert(0, getTypeString(env, t, full));
+            return s.toString();
         case CLASS:
             return ParameterizedTypeImpl.
                         parameterizedTypeToString(env, (ClassType)t, full);
@@ -157,7 +156,7 @@
         if (env.legacyDoclet || sym.type.getTypeArguments().isEmpty()) {
             return "";
         }
-        StringBuffer s = new StringBuffer();
+        StringBuilder s = new StringBuilder();
         for (Type t : sym.type.getTypeArguments()) {
             s.append(s.length() == 0 ? "<" : ", ");
             s.append(TypeVariableImpl.typeVarToString(env, (TypeVar)t, full));
@@ -175,7 +174,7 @@
         if (env.legacyDoclet || cl.getTypeArguments().isEmpty()) {
             return "";
         }
-        StringBuffer s = new StringBuffer();
+        StringBuilder s = new StringBuilder();
         for (Type t : cl.getTypeArguments()) {
             s.append(s.length() == 0 ? "<" : ", ");
             s.append(getTypeString(env, t, full));
@@ -213,9 +212,9 @@
          * For example, a two dimensional array of String returns '[][]'.
          */
         public String dimension() {
-            StringBuffer dimension = new StringBuffer();
+            StringBuilder dimension = new StringBuilder();
             for (Type t = arrayType; t.tag == ARRAY; t = env.types.elemtype(t)) {
-                dimension = dimension.append("[]");
+                dimension.append("[]");
             }
             return dimension.toString();
         }
@@ -304,6 +303,7 @@
          *
          * @return name of type including any dimension information.
          */
+        @Override
         public String toString() {
             return qualifiedTypeName() + dimension();
         }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, 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
@@ -78,14 +78,17 @@
     /**
      * Return the ClassDoc of the erasure of this type variable.
      */
+    @Override
     public ClassDoc asClassDoc() {
         return env.getClassDoc((ClassSymbol)env.types.erasure(type).tsym);
     }
 
+    @Override
     public TypeVariable asTypeVariable() {
         return this;
     }
 
+    @Override
     public String toString() {
         return typeVarToString(env, (TypeVar)type, true);
     }
@@ -96,7 +99,7 @@
      * "extends" clause.  Class names are qualified if "full" is true.
      */
     static String typeVarToString(DocEnv env, TypeVar v, boolean full) {
-        StringBuffer s = new StringBuffer(v.toString());
+        StringBuilder s = new StringBuilder(v.toString());
         List<Type> bounds = getBounds(v, env);
         if (bounds.nonEmpty()) {
             boolean first = true;
--- a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,8 +28,6 @@
 
 import com.sun.javadoc.*;
 
-import static com.sun.javadoc.LanguageVersion.*;
-
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.util.List;
@@ -69,18 +67,24 @@
     /**
      * Return the ClassDoc of the erasure of this wildcard type.
      */
+    @Override
     public ClassDoc asClassDoc() {
         return env.getClassDoc((ClassSymbol)env.types.erasure(type).tsym);
     }
 
+    @Override
     public WildcardType asWildcardType() {
         return this;
     }
 
+    @Override
     public String typeName()            { return "?"; }
+    @Override
     public String qualifiedTypeName()   { return "?"; }
+    @Override
     public String simpleTypeName()      { return "?"; }
 
+    @Override
     public String toString() {
         return wildcardTypeToString(env, (Type.WildcardType)type, true);
     }
@@ -96,7 +100,7 @@
         if (env.legacyDoclet) {
             return TypeMaker.getTypeName(env.types.erasure(wildThing), full);
         }
-        StringBuffer s = new StringBuffer("?");
+        StringBuilder s = new StringBuilder("?");
         List<Type> bounds = getExtendsBounds(wildThing);
         if (bounds.nonEmpty()) {
             s.append(" extends ");
--- a/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc.properties	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc.properties	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2011, 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
@@ -104,7 +104,7 @@
 tag.End_delimiter_missing_for_possible_SeeTag=End Delimiter } missing for possible See Tag in comment string: "{0}"
 tag.Improper_Use_Of_Link_Tag=Missing closing ''}'' character for inline tag: "{0}"
 javadoc.File_Read_Error=Error while reading file {0}
-javadoc.Body_missing_from_html_file=Body tag missing from HTML
+javadoc.Body_missing_from_html_file=Body tag missing from HTML file
 javadoc.End_body_missing_from_html_file=Close body tag missing from HTML file
 javadoc.Multiple_package_comments=Multiple sources of package comments found for package "{0}"
 javadoc.class_not_found=Class {0} not found.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/7023703/T7023703neg.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 7023703
+ * @summary Valid code doesn't compile
+ * @compile/fail/ref=T7023703neg.out -XDrawDiagnostics T7023703neg.java
+ */
+
+class T7023703neg {
+
+    void testForLoop(boolean cond) {
+        final int bug;
+        final int bug2;
+        for (;cond;) {
+            final int item = 0;
+            bug2 = 1; //error
+        }
+        bug = 0; //ok
+    }
+
+    void testForEachLoop(java.util.Collection<Integer> c) {
+        final int bug;
+        final int bug2;
+        for (Integer i : c) {
+            final int item = 0;
+            bug2 = 1; //error
+        }
+        bug = 0; //ok
+    }
+
+    void testWhileLoop(boolean cond) {
+        final int bug;
+        final int bug2;
+        while (cond) {
+            final int item = 0;
+            bug2 = 1; //error
+        }
+        bug = 0; //ok
+    }
+
+    void testDoWhileLoop(boolean cond) {
+        final int bug;
+        final int bug2;
+        do {
+            final int item = 0;
+            bug2 = 1; //error
+        } while (cond);
+        bug = 0; //ok
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/7023703/T7023703neg.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,5 @@
+T7023703neg.java:37:13: compiler.err.var.might.be.assigned.in.loop: bug2
+T7023703neg.java:47:13: compiler.err.var.might.be.assigned.in.loop: bug2
+T7023703neg.java:57:13: compiler.err.var.might.be.assigned.in.loop: bug2
+T7023703neg.java:67:13: compiler.err.var.might.be.assigned.in.loop: bug2
+4 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/7023703/T7023703pos.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 7023703
+ * @summary Valid code doesn't compile
+ * @compile T7023703pos.java
+ */
+
+class T7023703pos {
+
+    void testForLoop() {
+        final int bug;
+        for (;"a".equals("b");) {
+            final int item = 0;
+        }
+        bug = 0; //ok
+    }
+
+    void testForEachLoop(boolean cond, java.util.Collection<Integer> c) {
+        final int bug;
+        for (Integer i : c) {
+            if (cond) {
+                final int item = 0;
+            }
+        }
+        bug = 0; //ok
+    }
+
+    void testWhileLoop() {
+        final int bug;
+        while ("a".equals("b")) {
+            final int item = 0;
+        }
+        bug = 0; //ok
+    }
+
+    void testDoWhileLoop() {
+        final int bug;
+        do {
+            final int item = 0;
+        } while ("a".equals("b"));
+        bug = 0; //ok
+    }
+
+    private static class Inner {
+        private final int a, b, c, d, e;
+
+        public Inner() {
+            a = b = c = d = e = 0;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/7024568/T7024568.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 7024568
+ * @summary Very long method resolution causing OOM error
+ * @compile/fail/ref=T7024568.out -XDrawDiagnostics T7024568.java
+ */
+
+class Main {
+    void test(Obj o) {
+        o.test(0, 0, 0, 0, 0, 0, 0, 0, undefined);
+    }
+}
+
+interface Test {
+    public void test(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, String str);
+    public void test(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, long l);
+}
+
+interface Obj extends Test, A, B, C, D, E {}
+interface A extends Test {}
+interface B extends A, Test {}
+interface C extends A, B, Test {}
+interface D extends A, B, C, Test {}
+interface E extends A, B, C, D, Test {}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/7024568/T7024568.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+T7024568.java:32:40: compiler.err.cant.resolve.location: kindname.variable, undefined, , , (compiler.misc.location: kindname.class, Main, null)
+1 error
--- a/langtools/test/tools/javac/AnonStaticMember_2.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/AnonStaticMember_2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 /*
  * @test  /nodynamiccopyright/
- * @bug 4279339
+ * @bug 4279339 6969184
  * @summary Verify that an anonymous class cannot contain a static method.
  * @author maddox
  *
--- a/langtools/test/tools/javac/InterfaceInInner.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/InterfaceInInner.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 /*
  * @test  /nodynamiccopyright/
- * @bug 4063740
+ * @bug 4063740 6969184
  * @summary Interfaces may only be declared in top level classes.
  * @author turnidge
  *
--- a/langtools/test/tools/javac/QualifiedNew.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/QualifiedNew.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 /*
  * @test  /nodynamiccopyright/
- * @bug 4406966
+ * @bug 4406966 6969184
  * @summary null qualifying inner instance creation should be error.
  * @author gafter
  *
--- a/langtools/test/tools/javac/T6900037.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 6900037
- * @summary javac should warn if earlier -source is used and bootclasspath not set
- * @compile T6900037.java
- * @compile -source 1.6 T6900037.java
- * @compile/fail/ref=T6900037.out -XDrawDiagnostics -Werror -source 1.6 T6900037.java
- * @compile -Werror -source 1.6 -Xlint:-options T6900037.java
- */
-
-class T6900037 { }
--- a/langtools/test/tools/javac/T6900037.out	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-- compiler.warn.source.no.bootclasspath: 1.6
-- compiler.err.warnings.and.werror
-1 error
-1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/T7022711.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,20 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7022711
+ * @summary compiler crash in try-with-resources
+ * @compile/fail/ref=T7022711.out -XDrawDiagnostics T7022711.java
+ */
+
+import java.io.*;
+
+class T7022711 {
+    public static void main (String args[]) throws Exception {
+        try (DataInputStream is = new DataInputStream(new FileInputStream("x"))) {
+            while (true) {
+                is.getChar();  // method not found
+            }
+        } catch (EOFException e) {
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/T7022711.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+T7022711.java:14:19: compiler.err.cant.resolve.location.args: kindname.method, getChar, , , (compiler.misc.location.1: kindname.variable, is, java.io.DataInputStream)
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/UnusedResourcesTest.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7023233
+ * @summary False positive for -Xlint:try with nested try with resources blocks
+ */
+
+import com.sun.source.util.JavacTask;
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.util.JCDiagnostic;
+import java.net.URI;
+import java.util.Arrays;
+import javax.tools.Diagnostic;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+
+public class UnusedResourcesTest {
+
+    enum XlintOption {
+        NONE("none"),
+        TRY("try");
+
+        String opt;
+
+        XlintOption(String opt) {
+            this.opt = opt;
+        }
+
+        String getXlintOption() {
+            return "-Xlint:" + opt;
+        }
+    }
+
+    enum TwrStmt {
+        TWR1("res1"),
+        TWR2("res2"),
+        TWR3("res3");
+
+        final String resourceName;
+
+        private TwrStmt(String resourceName) {
+            this.resourceName = resourceName;
+        }
+    }
+
+    enum SuppressLevel {
+        NONE,
+        SUPPRESS;
+
+        String getSuppressAnno() {
+            return this == SUPPRESS ?
+                "@SuppressWarnings(\"try\")" :
+                "";
+        }
+    }
+
+    enum ResourceUsage {
+        NONE(null),
+        USE_R1(TwrStmt.TWR1),
+        USE_R2(TwrStmt.TWR2),
+        USE_R3(TwrStmt.TWR3);
+
+        TwrStmt stmt;
+
+        private ResourceUsage(TwrStmt stmt) {
+            this.stmt = stmt;
+        }
+
+        String usedResourceName() {
+            return stmt != null ? stmt.resourceName : null;
+        }
+
+        boolean isUsedIn(TwrStmt res, TwrStmt stmt) {
+            return this.stmt == res &&
+                    stmt.ordinal() >= this.stmt.ordinal();
+        }
+
+        String getUsage(TwrStmt stmt) {
+            return this != NONE && stmt.ordinal() >= this.stmt.ordinal() ?
+                "use(" + usedResourceName() + ");" :
+                "";
+        }
+    }
+
+    static class JavaSource extends SimpleJavaFileObject {
+
+        String template = "class Resource implements AutoCloseable {\n" +
+                              "public void close() {}\n" +
+                          "}\n" +
+                          "class Test {\n" +
+                              "void use(Resource r) {}\n" +
+                              "#S void test() {\n" +
+                                 "try (Resource #R1 = new Resource()) {\n" +
+                                    "#U1_R1\n" +
+                                    "#U1_R2\n" +
+                                    "#U1_R3\n" +
+                                    "try (Resource #R2 = new Resource()) {\n" +
+                                       "#U2_R1\n" +
+                                       "#U2_R2\n" +
+                                       "#U2_R3\n" +
+                                       "try (Resource #R3 = new Resource()) {\n" +
+                                           "#U3_R1\n" +
+                                           "#U3_R2\n" +
+                                           "#U3_R3\n" +
+                                       "}\n" +
+                                    "}\n" +
+                                 "}\n" +
+                              "}\n" +
+                          "}\n";
+
+        String source;
+
+        public JavaSource(SuppressLevel suppressLevel, ResourceUsage usage1,
+                ResourceUsage usage2, ResourceUsage usage3) {
+            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+            source = template.replace("#S", suppressLevel.getSuppressAnno()).
+                    replace("#R1", TwrStmt.TWR1.resourceName).
+                    replace("#R2", TwrStmt.TWR2.resourceName).
+                    replace("#R3", TwrStmt.TWR3.resourceName).
+                    replace("#U1_R1", usage1.getUsage(TwrStmt.TWR1)).
+                    replace("#U1_R2", usage2.getUsage(TwrStmt.TWR1)).
+                    replace("#U1_R3", usage3.getUsage(TwrStmt.TWR1)).
+                    replace("#U2_R1", usage1.getUsage(TwrStmt.TWR2)).
+                    replace("#U2_R2", usage2.getUsage(TwrStmt.TWR2)).
+                    replace("#U2_R3", usage3.getUsage(TwrStmt.TWR2)).
+                    replace("#U3_R1", usage1.getUsage(TwrStmt.TWR3)).
+                    replace("#U3_R2", usage2.getUsage(TwrStmt.TWR3)).
+                    replace("#U3_R3", usage3.getUsage(TwrStmt.TWR3));
+        }
+
+        @Override
+        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+            return source;
+        }
+    }
+
+    public static void main(String... args) throws Exception {
+        for (XlintOption xlint : XlintOption.values()) {
+            for (SuppressLevel suppressLevel : SuppressLevel.values()) {
+                for (ResourceUsage usage1 : ResourceUsage.values()) {
+                    for (ResourceUsage usage2 : ResourceUsage.values()) {
+                        for (ResourceUsage usage3 : ResourceUsage.values()) {
+                                test(xlint,
+                                        suppressLevel,
+                                        usage1,
+                                        usage2,
+                                        usage3);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // Create a single file manager and reuse it for each compile to save time.
+    static StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+
+    static void test(XlintOption xlint, SuppressLevel suppressLevel, ResourceUsage usage1,
+                ResourceUsage usage2, ResourceUsage usage3) throws Exception {
+        final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
+        JavaSource source = new JavaSource(suppressLevel, usage1, usage2, usage3);
+        DiagnosticChecker dc = new DiagnosticChecker();
+        JavacTask ct = (JavacTask)tool.getTask(null, fm, dc,
+                Arrays.asList(xlint.getXlintOption()), null, Arrays.asList(source));
+        ct.analyze();
+        check(source, xlint, suppressLevel, usage1, usage2, usage3, dc);
+    }
+
+    static void check(JavaSource source, XlintOption xlint, SuppressLevel suppressLevel,
+                ResourceUsage usage1, ResourceUsage usage2, ResourceUsage usage3, DiagnosticChecker dc) {
+
+        ResourceUsage[] usages = { usage1, usage2, usage3 };
+        boolean[] unusedFound = { dc.unused_r1, dc.unused_r2, dc.unused_r3 };
+        boolean[] usedResources = { false, false, false };
+
+        for (TwrStmt res : TwrStmt.values()) {
+            outer: for (TwrStmt stmt : TwrStmt.values()) {
+                for (ResourceUsage usage : usages) {
+                    if (usage.isUsedIn(res, stmt)) {
+                        usedResources[res.ordinal()] = true;
+                        break outer;
+                    }
+                }
+            }
+        }
+
+        for (TwrStmt stmt : TwrStmt.values()) {
+            boolean unused = !usedResources[stmt.ordinal()] &&
+                    xlint == XlintOption.TRY &&
+                    suppressLevel != SuppressLevel.SUPPRESS;
+            if (unused != unusedFound[stmt.ordinal()]) {
+                throw new Error("invalid diagnostics for source:\n" +
+                    source.getCharContent(true) +
+                    "\nOptions: " + xlint.getXlintOption() +
+                    "\nFound unused res1: " + unusedFound[0] +
+                    "\nFound unused res2: " + unusedFound[1] +
+                    "\nFound unused res3: " + unusedFound[2] +
+                    "\nExpected unused res1: " + !usedResources[0] +
+                    "\nExpected unused res2: " + !usedResources[1] +
+                    "\nExpected unused res3: " + !usedResources[2]);
+            }
+        }
+    }
+
+    static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
+
+        boolean unused_r1 = false;
+        boolean unused_r2 = false;
+        boolean unused_r3 = false;
+
+        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
+            if (diagnostic.getKind() == Diagnostic.Kind.WARNING &&
+                    diagnostic.getCode().contains("try.resource.not.referenced")) {
+                String varName = ((JCDiagnostic)diagnostic).getArgs()[0].toString();
+                if (varName.equals(TwrStmt.TWR1.resourceName)) {
+                    unused_r1 = true;
+                } else if (varName.equals(TwrStmt.TWR2.resourceName)) {
+                    unused_r2 = true;
+                } else if (varName.equals(TwrStmt.TWR3.resourceName)) {
+                    unused_r3 = true;
+                }
+            }
+        }
+    }
+}
--- a/langtools/test/tools/javac/api/6557752/T6557752.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/api/6557752/T6557752.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2011, 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
@@ -119,7 +119,7 @@
                 Types types = task.getTypes();
 
                 if (types.asElement(trees.getOriginalType((ErrorType)typeMirror)) != null) {
-                    throw new AssertionError("Ttypes.asElement() error!");
+                    throw new AssertionError("Types.asElement() error!");
                 }
                 foundError = true;
               }
--- a/langtools/test/tools/javac/diags/ArgTypeCompilerFactory.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/diags/ArgTypeCompilerFactory.java	Fri Mar 18 15:44:45 2011 -0700
@@ -34,6 +34,7 @@
 import com.sun.tools.javac.code.*;
 import com.sun.tools.javac.file.*;
 import com.sun.tools.javac.main.Main;
+import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.parser.Token;
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.AbstractDiagnosticFormatter.SimpleConfiguration;
@@ -107,8 +108,7 @@
             JavacTaskImpl t = (JavacTaskImpl) tool.getTask(out, fm, null, opts, null, fos);
             Context c = t.getContext();
             ArgTypeMessages.preRegister(c);
-            Options options = Options.instance(c);
-            Log.instance(c).setDiagnosticFormatter(new ArgTypeDiagnosticFormatter(options));
+            ArgTypeJavaCompiler.preRegister(c);
             Boolean ok = t.call();
 
             return ok;
@@ -144,7 +144,7 @@
                 }
             };
             JavacFileManager.preRegister(c); // can't create it until Log has been set up
-            ArgTypeDiagnosticFormatter.preRegister(c);
+            ArgTypeJavaCompiler.preRegister(c);
             ArgTypeMessages.preRegister(c);
             int result = main.compile(args.toArray(new String[args.size()]), c);
 
@@ -170,7 +170,7 @@
 
             Context c = new Context();
             JavacFileManager.preRegister(c); // can't create it until Log has been set up
-            ArgTypeDiagnosticFormatter.preRegister(c);
+            ArgTypeJavaCompiler.preRegister(c);
             ArgTypeMessages.preRegister(c);
             com.sun.tools.javac.main.Main m = new com.sun.tools.javac.main.Main("javac", out);
             int rc = m.compile(args.toArray(new String[args.size()]), c);
@@ -189,17 +189,6 @@
      * arg types.
      */
     static class ArgTypeDiagnosticFormatter extends AbstractDiagnosticFormatter {
-        static void preRegister(final Context context) {
-            context.put(Log.logKey, new Context.Factory<Log>() {
-                public Log make() {
-                    Log log = new Log(context) { };
-                    Options options = Options.instance(context);
-                    log.setDiagnosticFormatter(new ArgTypeDiagnosticFormatter(options));
-                    return log;
-                }
-            });
-
-        }
 
         ArgTypeDiagnosticFormatter(Options options) {
             super(null, new SimpleConfiguration(options,
@@ -246,14 +235,37 @@
     }
 
     /**
+     * Trivial subtype of JavaCompiler to get access to the protected compilerKey field.
+     * The factory is used to ensure that the log is initialized with an instance of
+     * ArgTypeDiagnosticFormatter before we create the required JavaCompiler.
+     */
+    static class ArgTypeJavaCompiler extends JavaCompiler {
+        static void preRegister(Context context) {
+            context.put(compilerKey, new Context.Factory<JavaCompiler>() {
+                public JavaCompiler make(Context c) {
+                    Log log = Log.instance(c);
+                    Options options = Options.instance(c);
+                    log.setDiagnosticFormatter(new ArgTypeDiagnosticFormatter(options));
+                    return new JavaCompiler(c);
+                }
+            });
+        }
+
+        // not used
+        private ArgTypeJavaCompiler() {
+            super(null);
+        }
+    }
+
+    /**
      * Diagnostic formatter which "localizes" a message as a line
      * containing a key, and a possibly empty set of descriptive strings for the
      * arg types.
      */
     static class ArgTypeMessages extends JavacMessages {
-        static void preRegister(final Context c) {
-            c.put(JavacMessages.messagesKey, new Context.Factory<JavacMessages>() {
-                public JavacMessages make() {
+        static void preRegister(Context context) {
+            context.put(JavacMessages.messagesKey, new Context.Factory<JavacMessages>() {
+                public JavacMessages make(Context c) {
                     return new ArgTypeMessages(c) {
                         @Override
                         public String getLocalizedString(Locale l, String key, Object... args) {
--- a/langtools/test/tools/javac/diags/CheckResourceKeys.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java	Fri Mar 18 15:44:45 2011 -0700
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 6964768 6964461 6964469 6964487 6964460 6964481
+ * @bug 6964768 6964461 6964469 6964487 6964460 6964481 6980021
  * @summary need test program to validate javac resource bundles
  */
 
--- a/langtools/test/tools/javac/diags/Example.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/diags/Example.java	Fri Mar 18 15:44:45 2011 -0700
@@ -486,7 +486,7 @@
             if (verbose)
                 System.err.println("run_simple: " + opts + " " + files);
 
-            List<String> args = new ArrayList<String>(opts);
+            List<String> args = new ArrayList<String>();
 
             if (out != null && raw)
                 args.add("-XDrawDiagnostics");
@@ -522,10 +522,10 @@
                 super(context);
             }
 
-            static void preRegister(final Context c, final Set<String> keys) {
+            static void preRegister(Context c, final Set<String> keys) {
                 if (keys != null) {
                     c.put(JavacMessages.messagesKey, new Context.Factory<JavacMessages>() {
-                        public JavacMessages make() {
+                        public JavacMessages make(Context c) {
                             return new MessageTracker(c) {
                                 @Override
                                 public String getLocalizedString(Locale l, String key, Object... args) {
--- a/langtools/test/tools/javac/diags/examples.not-yet.txt	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/diags/examples.not-yet.txt	Fri Mar 18 15:44:45 2011 -0700
@@ -70,7 +70,6 @@
 compiler.misc.kindname.type.variable
 compiler.misc.kindname.type.variable.bound
 compiler.misc.kindname.value
-compiler.misc.non.denotable.type
 compiler.misc.no.unique.minimal.instance.exists
 compiler.misc.resume.abort                              # prompt for a response
 compiler.misc.source.unavailable                        # DiagnosticSource
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/DiamondAndAnonClass.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// key: compiler.misc.diamond.and.anon.class
+// key: compiler.err.cant.apply.diamond.1
+
+import java.util.*;
+
+class DiamondAndAnonClass {
+    void m() {
+        List<String> list = new ArrayList<>() {};
+    }
+}
--- a/langtools/test/tools/javac/diags/examples/DiamondInvalidArg.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * 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.
- *
- * 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.
- */
-
-// key: compiler.misc.diamond.invalid.arg
-// key: compiler.misc.diamond
-// key: compiler.err.cant.apply.diamond.1
-
-class DiamondInvalidArg {
-    static class Foo<X extends Number & Comparable<Number>> { }
-    Foo<?> foo = new Foo<>();
-}
--- a/langtools/test/tools/javac/diags/examples/DiamondInvalidArgs.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.
- *
- * 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.
- */
-
-// key: compiler.misc.diamond.invalid.args
-// key: compiler.misc.diamond
-// key: compiler.err.cant.apply.diamond.1
-
-class DiamondInvalidArgs {
-    static class Foo<X extends Number & Comparable<Number>,
-                           Y extends Number & Comparable<Number>> { }
-    Foo<?,?> foo = new Foo<>();
-}
--- a/langtools/test/tools/javac/generics/6969184/T6969184.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/6969184/T6969184.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6956758
+ * @bug 6969184
  *
  * @summary  poor error recovery after symbol not found
  * @author Maurizio Cimadamore
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7015430/T7015430.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,131 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7015430
+ *
+ * @summary  Incorrect thrown type determined for unchecked invocations
+ * @author Daniel Smith
+ * @compile/fail/ref=T7015430.out -Xlint:unchecked -XDrawDiagnostics T7015430.java
+ *
+ */
+
+class T7015430 {
+    static <E extends Exception> Iterable<E> empty(Iterable<E> arg) throws E {
+        return null;
+    }
+
+    <E extends Exception> T7015430(Iterable<E> arg) throws E { }
+
+    static <E extends Exception> Iterable<E> empty2(Iterable x) throws E {
+        return null;
+    }
+
+    static class Foo<X extends Exception> {
+        Foo() throws X {}
+    }
+
+    /**
+    * Method invocation, no unchecked
+    * inferred: RuntimeException - should pass
+    */
+    void m1() {
+        Iterable<RuntimeException> i = java.util.Collections.emptyList();
+        empty(i);
+    }
+
+    /**
+    * Method invocation, unchecked, inferred arguments
+    * inferred: Exception - should fail
+    */
+    void m2() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        empty(i);
+    }
+
+    /**
+    * Method invocation, unchecked, explicit arguments
+    * inferred: RuntimeException - should pass
+    */
+    void m3() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        T7015430.<RuntimeException>empty(i);
+    }
+
+    /**
+    * Constructor invocation, no unchecked
+    * inferred: RuntimeException - should pass
+    */
+    void m4() {
+        Iterable<RuntimeException> i = java.util.Collections.emptyList();
+        new T7015430(i);
+    }
+
+    /**
+    * Constructor invocation, unchecked, inferred arguments
+    * inferred: Exception - should fail
+    */
+    void m5() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        new T7015430(i);
+    }
+
+    /**
+    * Constructor invocation, unchecked, explicit arguments
+    * inferred: RuntimeException - should pass
+    */
+    void m6() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        new <RuntimeException>T7015430(i);
+    }
+
+    /**
+    * Method invocation, no unchecked, inferred arguments
+    * inferred: RuntimeException - should pass
+    */
+    void m7() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        Iterable<RuntimeException> e = empty2(i);
+    }
+
+    /**
+    * Method invocation, no unchecked, inferred arguments
+    * inferred: Exception - should fail
+    */
+    void m8() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        empty2(i);
+    }
+
+    /**
+    * Constructor invocation, unchecked, explicit arguments
+    * inferred: RuntimeException - should pass
+    */
+    void m9() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        new <RuntimeException> T7015430(i);
+    }
+
+    /**
+    * Constructor invocation, unchecked, inferred arguments
+    * inferred: Exception - should fail
+    */
+    void m10() {
+        Iterable i = java.util.Collections.EMPTY_LIST;
+        new T7015430(i);
+    }
+
+    /**
+    * Constructor invocation, no unchecked, inferred arguments (diamond)
+    * inferred: RuntimeException - should pass
+    */
+    void m11() {
+        Foo<RuntimeException>  o = new Foo<>();
+    }
+
+    /**
+    * Constructor invocation, no unchecked, inferred arguments (diamond)
+    * inferred: Exception - should fail
+    */
+    void m12() {
+        new Foo<>();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7015430/T7015430.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,19 @@
+T7015430.java:41:15: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
+T7015430.java:41:14: compiler.warn.unchecked.meth.invocation.applied: kindname.method, empty, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:50:42: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
+T7015430.java:50:41: compiler.warn.unchecked.meth.invocation.applied: kindname.method, empty, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:68:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
+T7015430.java:68:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:77:40: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
+T7015430.java:77:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:104:41: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
+T7015430.java:104:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:113:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
+T7015430.java:113:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
+T7015430.java:41:14: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+T7015430.java:68:9: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+T7015430.java:95:15: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+T7015430.java:113:9: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+T7015430.java:129:9: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
+5 errors
+12 warnings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7020657/T7020657neg.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,23 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7020657 6985719
+ *
+ * @summary  Javac rejects a fairly common idiom with raw override and interfaces
+ * @author Maurizio Cimadamore
+ * @compile/fail/ref=T7020657neg.out -XDrawDiagnostics T7020657neg.java
+ *
+ */
+
+import java.util.*;
+
+class T7020657neg {
+    interface A {
+        int get(List<String> l);
+    }
+
+    interface B  {
+        int get(List<Integer> l);
+    }
+
+    interface C extends A, B { }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7020657/T7020657neg.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+T7020657neg.java:22:5: compiler.err.name.clash.same.erasure.no.override: get(java.util.List<java.lang.Integer>), T7020657neg.B, get(java.util.List<java.lang.String>), T7020657neg.A
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7020657/T7020657pos.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7020657 6985719
+ *
+ * @summary  Javac rejects a fairly common idiom with raw override and interfaces
+ * @author Robert Field
+ * @compile T7020657pos.java
+ *
+ */
+
+import java.util.*;
+
+class T7020657pos {
+    interface A {
+        int get(List<String> l);
+    }
+
+    interface B  {
+        int get(List<Integer> l);
+    }
+
+    interface C extends A, B {
+        int get(List l);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054neg1.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,17 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7022054
+ *
+ * @summary  Invalid compiler error on covariant overriding methods with the same erasure
+ * @compile/fail/ref=T7022054neg1.out -XDrawDiagnostics T7022054neg1.java
+ *
+ */
+
+class T7022054neg1 {
+    static class A {
+        A m(String s) { return null; }
+    }
+    static class B extends A {
+        <X extends String> A m(X s) { return null; }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054neg1.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+T7022054neg1.java:15:30: compiler.err.name.clash.same.erasure.no.override: <X>m(X), T7022054neg1.B, m(java.lang.String), T7022054neg1.A, <X>m(X), T7022054neg1.B
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054neg2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,17 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7022054
+ *
+ * @summary  Invalid compiler error on covariant overriding methods with the same erasure
+ * @compile/fail/ref=T7022054neg2.out -XDrawDiagnostics T7022054neg2.java
+ *
+ */
+
+class T7022054neg2 {
+    static class A {
+        static A m(String s) { return null; }
+    }
+    static class B extends A {
+        static <X extends String> A m(X s) { return null; }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054neg2.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+T7022054neg2.java:15:37: compiler.err.name.clash.same.erasure.no.hide: <X>m(X), T7022054neg2.B, m(java.lang.String), T7022054neg2.A
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054pos1.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7022054
+ *
+ * @summary  Invalid compiler error on covariant overriding methods with the same erasure
+ * @compile T7022054pos1.java
+ *
+ */
+
+class T7022054pos1 {
+    static class A {
+        A m(String s) { return null; }
+    }
+    static class B extends A {
+        <X extends B> X m(String s) { return null; }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/7022054/T7022054pos2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7022054
+ *
+ * @summary  Invalid compiler error on covariant overriding methods with the same erasure
+ * @compile T7022054pos2.java
+ *
+ */
+
+class T7022054pos2 {
+    static class A {
+        static A m(String s) { return null; }
+    }
+    static class B extends A {
+        static <X extends B> X m(String s) { return null; }
+    }
+}
--- a/langtools/test/tools/javac/generics/diamond/6996914/T6996914a.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914a.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 6996914
+ * @bug 6996914 7020044
  * @summary  Diamond inference: problem when accessing protected constructor
  * @run main T6996914a
  */
@@ -53,17 +53,6 @@
         }
     }
 
-    enum DiamondKind {
-        STANDARD("new Foo<>();"),
-        ANON("new Foo<>() {};");
-
-        String expr;
-
-        DiamondKind(String expr) {
-            this.expr = expr;
-        }
-    }
-
     enum ConstructorKind {
         PACKAGE(""),
         PROTECTED("protected"),
@@ -104,14 +93,14 @@
         final static String sourceStub =
                         "#I\n" +
                         "class Test {\n" +
-                        "  Foo<String> fs = #D\n" +
+                        "  Foo<String> fs = new Foo<>();\n" +
                         "}\n";
 
         String source;
 
-        public ClientClass(PackageKind pk, DiamondKind dk) {
+        public ClientClass(PackageKind pk) {
             super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
-            source = sourceStub.replace("#I", pk.importDecl).replace("#D", dk.expr);
+            source = sourceStub.replace("#I", pk.importDecl);
         }
 
         @Override
@@ -123,22 +112,20 @@
     public static void main(String... args) throws Exception {
         for (PackageKind pk : PackageKind.values()) {
             for (ConstructorKind ck : ConstructorKind.values()) {
-                for (DiamondKind dk : DiamondKind.values()) {
-                    compileAndCheck(pk, ck, dk);
-                }
+                    compileAndCheck(pk, ck);
             }
         }
     }
 
-    static void compileAndCheck(PackageKind pk, ConstructorKind ck, DiamondKind dk) throws Exception {
+    static void compileAndCheck(PackageKind pk, ConstructorKind ck) throws Exception {
         FooClass foo = new FooClass(pk, ck);
-        ClientClass client = new ClientClass(pk, dk);
+        ClientClass client = new ClientClass(pk);
         final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         ErrorListener el = new ErrorListener();
         JavacTask ct = (JavacTask)tool.getTask(null, null, el,
                 null, null, Arrays.asList(foo, client));
         ct.analyze();
-        if (el.errors > 0 == check(pk, ck, dk)) {
+        if (el.errors > 0 == check(pk, ck)) {
             String msg = el.errors > 0 ?
                 "Error compiling files" :
                 "No error when compiling files";
@@ -146,10 +133,9 @@
         }
     }
 
-    static boolean check(PackageKind pk, ConstructorKind ck, DiamondKind dk) {
+    static boolean check(PackageKind pk, ConstructorKind ck) {
         switch (pk) {
-            case A: return ck == ConstructorKind.PUBLIC ||
-                    (ck  == ConstructorKind.PROTECTED && dk == DiamondKind.ANON);
+            case A: return ck == ConstructorKind.PUBLIC;
             case DEFAULT: return ck != ConstructorKind.PRIVATE;
             default: throw new AssertionError("Unknown package kind");
         }
--- a/langtools/test/tools/javac/generics/diamond/6996914/T6996914b.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/6996914/T6996914b.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 6996914
+ * @bug 6996914 7020044
  * @summary  Diamond inference: problem when accessing protected constructor
  * @compile T6996914b.java
  */
@@ -35,5 +35,4 @@
 
 class Test {
     Super<String,Integer> ssi1 = new Super<>(1, "", 2);
-    Super<String,Integer> ssi2 = new Super<>(1, "", 2) {};
 }
--- a/langtools/test/tools/javac/generics/diamond/T6939780.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/T6939780.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,6 +1,6 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939780
+ * @bug 6939780 7020044
  *
  * @summary  add a warning to detect diamond sites
  * @author mcimadamore
--- a/langtools/test/tools/javac/generics/diamond/T6939780.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/T6939780.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,3 @@
 T6939780.java:19:28: compiler.warn.diamond.redundant.args: Foo<java.lang.Number>, Foo<java.lang.Number>
 T6939780.java:20:28: compiler.warn.diamond.redundant.args.1: Foo<java.lang.Integer>, Foo<java.lang.Number>
-T6939780.java:22:28: compiler.warn.diamond.redundant.args: Foo<java.lang.Number>, Foo<java.lang.Number>
-T6939780.java:23:28: compiler.warn.diamond.redundant.args.1: Foo<java.lang.Integer>, Foo<java.lang.Number>
-4 warnings
+2 warnings
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg01.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg01.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,9 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond fails when inference violates declared bounds
+ *           (basic test with nested class, generic/non-generic constructors)
  * @author mcimadamore
  * @compile/fail/ref=Neg01.out Neg01.java -XDrawDiagnostics
  *
@@ -20,19 +21,9 @@
         Neg01<?> n3 = new Neg01<>("");
         Neg01<? super String> n4 = new Neg01<>("");
 
-        Neg01<String> n5 = new Neg01<>(""){};
-        Neg01<? extends String> n6 = new Neg01<>(""){};
-        Neg01<?> n7 = new Neg01<>(""){};
-        Neg01<? super String> n8 = new Neg01<>(""){};
-
-        Neg01<String> n9 = new Neg01<>("", "");
-        Neg01<? extends String> n10 = new Neg01<>("", "");
-        Neg01<?> n11 = new Neg01<>("", "");
-        Foo<? super String> n12 = new Neg01<>("", "");
-
-        Neg01<String> n13 = new Neg01<>("", ""){};
-        Neg01<? extends String> n14 = new Neg01<>("", ""){};
-        Neg01<?> n15 = new Neg01<>("", ""){};
-        Neg01<? super String> n16 = new Neg01<>("", ""){};
+        Neg01<String> n5 = new Neg01<>("", "");
+        Neg01<? extends String> n6 = new Neg01<>("", "");
+        Neg01<?> n7 = new Neg01<>("", "");
+        Foo<? super String> n8 = new Neg01<>("", "");
     }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg01.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg01.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,29 +1,15 @@
-Neg01.java:18:15: compiler.err.not.within.bounds: java.lang.String, X
-Neg01.java:18:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:19:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg01.java:19:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:20:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:21:15: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg01.java:21:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:23:15: compiler.err.not.within.bounds: java.lang.String, X
-Neg01.java:23:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:24:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg01.java:24:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:25:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:26:15: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg01.java:26:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:28:15: compiler.err.not.within.bounds: java.lang.String, X
-Neg01.java:28:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:29:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg01.java:29:39: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:30:24: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:31:9: compiler.err.cant.resolve.location: kindname.class, Foo, , , (compiler.misc.location: kindname.class, Neg01<X>, null)
-Neg01.java:31:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:33:15: compiler.err.not.within.bounds: java.lang.String, X
-Neg01.java:33:29: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:34:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg01.java:34:39: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:35:24: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-Neg01.java:36:15: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg01.java:36:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
-28 errors
+Neg01.java:19:15: compiler.err.not.within.bounds: java.lang.String, X
+Neg01.java:19:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:20:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg01.java:20:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:21:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:22:15: compiler.err.not.within.bounds: ? super java.lang.String, X
+Neg01.java:22:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:24:15: compiler.err.not.within.bounds: java.lang.String, X
+Neg01.java:24:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:25:15: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg01.java:25:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:26:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+Neg01.java:27:9: compiler.err.cant.resolve.location: kindname.class, Foo, , , (compiler.misc.location: kindname.class, Neg01<X>, null)
+Neg01.java:27:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg01), null
+14 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg02.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg02.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,9 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond fails when inference violates declared bounds
+ *           (test with nested class, qualified/simple type expressions)
  * @author mcimadamore
  * @compile/fail/ref=Neg02.out Neg02.java -XDrawDiagnostics
  *
@@ -21,20 +22,10 @@
         Foo<?> f3 = new Foo<>("");
         Foo<? super String> f4 = new Foo<>("");
 
-        Foo<String> f5 = new Foo<>(""){};
-        Foo<? extends String> f6 = new Foo<>(""){};
-        Foo<?> f7 = new Foo<>(""){};
-        Foo<? super String> f8 = new Foo<>(""){};
-
-        Foo<String> f9 = new Foo<>("", "");
-        Foo<? extends String> f10 = new Foo<>("", "");
-        Foo<?> f11 = new Foo<>("", "");
-        Foo<? super String> f12 = new Foo<>("", "");
-
-        Foo<String> f13 = new Foo<>("", ""){};
-        Foo<? extends String> f14 = new Foo<>("", ""){};
-        Foo<?> f15 = new Foo<>("", ""){};
-        Foo<? super String> f16 = new Foo<>("", ""){};
+        Foo<String> f5 = new Foo<>("", "");
+        Foo<? extends String> f6 = new Foo<>("", "");
+        Foo<?> f7 = new Foo<>("", "");
+        Foo<? super String> f8 = new Foo<>("", "");
     }
 
     void testQualified() {
@@ -43,19 +34,9 @@
         Foo<?> f3 = new Neg02.Foo<>("");
         Foo<? super String> f4 = new Neg02.Foo<>("");
 
-        Foo<String> f5 = new Neg02.Foo<>(""){};
-        Foo<? extends String> f6 = new Neg02.Foo<>(""){};
-        Foo<?> f7 = new Neg02.Foo<>(""){};
-        Foo<? super String> f8 = new Neg02.Foo<>(""){};
-
-        Foo<String> f9 = new Neg02.Foo<>("", "");
-        Foo<? extends String> f10 = new Neg02.Foo<>("", "");
-        Foo<?> f11 = new Neg02.Foo<>("", "");
-        Foo<? super String> f12 = new Neg02.Foo<>("", "");
-
-        Foo<String> f13 = new Neg02.Foo<>("", ""){};
-        Foo<? extends String> f14 = new Neg02.Foo<>("", ""){};
-        Foo<?> f15 = new Neg02.Foo<>("", ""){};
-        Foo<? super String> f16 = new Neg02.Foo<>("", ""){};
+        Foo<String> f5 = new Neg02.Foo<>("", "");
+        Foo<? extends String> f6 = new Neg02.Foo<>("", "");
+        Foo<?> f7 = new Neg02.Foo<>("", "");
+        Foo<? super String> f8 = new Neg02.Foo<>("", "");
     }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg02.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg02.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,57 +1,29 @@
-Neg02.java:19:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:19:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:20:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:20:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:21:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:22:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:22:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:24:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:24:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:25:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:25:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:26:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:27:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:27:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:29:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:29:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:30:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:30:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:31:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:32:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:32:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:34:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:34:27: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:35:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:35:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:36:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:37:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:37:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:41:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:41:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:42:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:42:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:43:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:44:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:44:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:46:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:46:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:47:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:47:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:48:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:49:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:49:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:51:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:51:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:52:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:52:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:53:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:54:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:54:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:56:13: compiler.err.not.within.bounds: java.lang.String, X
-Neg02.java:56:27: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:57:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
-Neg02.java:57:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:58:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-Neg02.java:59:13: compiler.err.not.within.bounds: ? super java.lang.String, X
-Neg02.java:59:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
-56 errors
+Neg02.java:20:13: compiler.err.not.within.bounds: java.lang.String, X
+Neg02.java:20:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:21:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg02.java:21:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:22:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:23:13: compiler.err.not.within.bounds: ? super java.lang.String, X
+Neg02.java:23:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:25:13: compiler.err.not.within.bounds: java.lang.String, X
+Neg02.java:25:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:26:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg02.java:26:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:27:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:28:13: compiler.err.not.within.bounds: ? super java.lang.String, X
+Neg02.java:28:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:32:13: compiler.err.not.within.bounds: java.lang.String, X
+Neg02.java:32:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:33:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg02.java:33:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:34:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:35:13: compiler.err.not.within.bounds: ? super java.lang.String, X
+Neg02.java:35:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:37:13: compiler.err.not.within.bounds: java.lang.String, X
+Neg02.java:37:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:38:13: compiler.err.not.within.bounds: ? extends java.lang.String, X
+Neg02.java:38:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:39:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+Neg02.java:40:13: compiler.err.not.within.bounds: ? super java.lang.String, X
+Neg02.java:40:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg02.Foo), null
+28 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg03.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg03.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,9 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond fails when inference violates declared bounds
+ *           (test with inner class, qualified/simple type expressions)
  * @author mcimadamore
  * @compile/fail/ref=Neg03.out Neg03.java -XDrawDiagnostics
  *
@@ -21,20 +22,10 @@
         Foo<?> f3 = new Foo<>("");
         Foo<? super String> f4 = new Foo<>("");
 
-        Foo<String> f5 = new Foo<>(""){};
-        Foo<? extends String> f6 = new Foo<>(""){};
-        Foo<?> f7 = new Foo<>(""){};
-        Foo<? super String> f8 = new Foo<>(""){};
-
-        Foo<String> f9 = new Foo<>("", "");
-        Foo<? extends String> f10 = new Foo<>("", "");
-        Foo<?> f11 = new Foo<>("", "");
-        Foo<? super String> f12 = new Foo<>("", "");
-
-        Foo<String> f13 = new Foo<>("", ""){};
-        Foo<? extends String> f14 = new Foo<>("", ""){};
-        Foo<?> f15 = new Foo<>("", ""){};
-        Foo<? super String> f16 = new Foo<>("", ""){};
+        Foo<String> f5 = new Foo<>("", "");
+        Foo<? extends String> f6 = new Foo<>("", "");
+        Foo<?> f7 = new Foo<>("", "");
+        Foo<? super String> f8 = new Foo<>("", "");
     }
 
     void testQualified_1() {
@@ -43,20 +34,10 @@
         Foo<?> f3 = new Neg03<U>.Foo<>("");
         Foo<? super String> f4 = new Neg03<U>.Foo<>("");
 
-        Foo<String> f5 = new Neg03<U>.Foo<>(""){};
-        Foo<? extends String> f6 = new Neg03<U>.Foo<>(""){};
-        Foo<?> f7 = new Neg03<U>.Foo<>(""){};
-        Foo<? super String> f8 = new Neg03<U>.Foo<>(""){};
-
-        Foo<String> f9 = new Neg03<U>.Foo<>("", "");
-        Foo<? extends String> f10 = new Neg03<U>.Foo<>("", "");
-        Foo<?> f11 = new Neg03<U>.Foo<>("", "");
-        Foo<? super String> f12 = new Neg03<U>.Foo<>("", "");
-
-        Foo<String> f13 = new Neg03<U>.Foo<>("", ""){};
-        Foo<? extends String> f14 = new Neg03<U>.Foo<>("", ""){};
-        Foo<?> f15 = new Neg03<U>.Foo<>("", ""){};
-        Foo<? super String> f16 = new Neg03<U>.Foo<>("", ""){};
+        Foo<String> f5 = new Neg03<U>.Foo<>("", "");
+        Foo<? extends String> f6 = new Neg03<U>.Foo<>("", "");
+        Foo<?> f7 = new Neg03<U>.Foo<>("", "");
+        Foo<? super String> f8 = new Neg03<U>.Foo<>("", "");
     }
 
     void testQualified_2(Neg03<U> n) {
@@ -65,19 +46,9 @@
         Foo<?> f3 = n.new Foo<>("");
         Foo<? super String> f4 = n.new Foo<>("");
 
-        Foo<String> f5 = n.new Foo<>(""){};
-        Foo<? extends String> f6 = n.new Foo<>(""){};
-        Foo<?> f7 = n.new Foo<>(""){};
-        Foo<? super String> f8 = n.new Foo<>(""){};
-
-        Foo<String> f9 = n.new Foo<>("", "");
-        Foo<? extends String> f10 = n.new Foo<>("", "");
-        Foo<?> f11 = n.new Foo<>("", "");
-        Foo<? super String> f12 = n.new Foo<>("", "");
-
-        Foo<String> f13 = n.new Foo<>("", ""){};
-        Foo<? extends String> f14 = n.new Foo<>("", ""){};
-        Foo<?> f15 = n.new Foo<>("", ""){};
-        Foo<? super String> f16 = n.new Foo<>("", ""){};
+        Foo<String> f5 = n.new Foo<>("", "");
+        Foo<? extends String> f6 = n.new Foo<>("", "");
+        Foo<?> f7 = n.new Foo<>("", "");
+        Foo<? super String> f8 = n.new Foo<>("", "");
     }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg03.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg03.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,85 +1,43 @@
-Neg03.java:19:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:19:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:20:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:20:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:21:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:22:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:22:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:24:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:24:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:25:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:25:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:26:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:27:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:27:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:29:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:29:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:30:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:30:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:31:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:32:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:32:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:34:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:34:27: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:35:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:35:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:36:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:37:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:37:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:41:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:41:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:42:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:42:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:43:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:44:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:44:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:46:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:46:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:47:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:20:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:20:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:21:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:21:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:22:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:23:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg03.java:23:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:25:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:25:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:26:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:26:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:27:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:28:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg03.java:28:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:32:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:32:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:33:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:33:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:34:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:35:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg03.java:35:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:37:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:37:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:38:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:38:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:39:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:40:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg03.java:40:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:44:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:44:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:45:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:45:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:46:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:47:13: compiler.err.not.within.bounds: ? super java.lang.String, V
 Neg03.java:47:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:48:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:49:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:49:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:51:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:51:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:52:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:52:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:53:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:54:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:54:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:56:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:56:27: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:57:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:57:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:58:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:59:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:59:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:63:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:63:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:64:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:64:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:65:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:66:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:66:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:68:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:68:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:69:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:69:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:70:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:71:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:71:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:73:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:73:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:74:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:74:39: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:75:24: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:76:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:76:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:78:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg03.java:78:29: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:79:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg03.java:79:39: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:80:24: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-Neg03.java:81:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg03.java:81:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
-84 errors
+Neg03.java:49:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg03.java:49:28: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:50:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg03.java:50:38: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:51:23: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+Neg03.java:52:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg03.java:52:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Neg03.Foo), null
+42 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg04.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg04.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,9 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond fails when inference violates declared bounds
+ *           (test with local class, qualified/simple type expressions)
  * @author mcimadamore
  * @compile/fail/ref=Neg04.out Neg04.java -XDrawDiagnostics
  *
@@ -20,19 +21,9 @@
         Foo<?> n3 = new Foo<>("");
         Foo<? super String> n4 = new Foo<>("");
 
-        Foo<String> n5 = new Foo<>(""){};
-        Foo<? extends String> n6 = new Foo<>(""){};
-        Foo<?> n7 = new Foo<>(""){};
-        Foo<? super String> n8 = new Foo<>(""){};
-
-        Foo<String> n9 = new Foo<>("", "");
-        Foo<? extends String> n10 = new Foo<>("", "");
-        Foo<?> n11 = new Foo<>("", "");
-        Foo<? super String> n12 = new Foo<>("", "");
-
-        Foo<String> n13 = new Foo<>("", ""){};
-        Foo<? extends String> n14 = new Foo<>("", ""){};
-        Foo<?> n15 = new Foo<>("", ""){};
-        Foo<? super String> n16 = new Foo<>("", ""){};
+        Foo<String> n5 = new Foo<>("", "");
+        Foo<? extends String> n6 = new Foo<>("", "");
+        Foo<?> n7 = new Foo<>("", "");
+        Foo<? super String> n8 = new Foo<>("", "");
     }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg04.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg04.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,29 +1,15 @@
-Neg04.java:18:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg04.java:18:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:19:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg04.java:19:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:20:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:21:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg04.java:21:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:23:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg04.java:23:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:24:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg04.java:24:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:25:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:26:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg04.java:26:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:28:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg04.java:28:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:29:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg04.java:29:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:30:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:31:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg04.java:31:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:33:13: compiler.err.not.within.bounds: java.lang.String, V
-Neg04.java:33:27: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:34:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
-Neg04.java:34:37: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:35:22: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-Neg04.java:36:13: compiler.err.not.within.bounds: ? super java.lang.String, V
-Neg04.java:36:35: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
-28 errors
+Neg04.java:19:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg04.java:19:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:20:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg04.java:20:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:21:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:22:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg04.java:22:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:24:13: compiler.err.not.within.bounds: java.lang.String, V
+Neg04.java:24:26: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:25:13: compiler.err.not.within.bounds: ? extends java.lang.String, V
+Neg04.java:25:36: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:26:21: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+Neg04.java:27:13: compiler.err.not.within.bounds: ? super java.lang.String, V
+Neg04.java:27:34: compiler.err.cant.apply.diamond: (compiler.misc.diamond: Foo), null
+14 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg05.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg05.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,8 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that usage of rare types doesn't cause spurious diamond diagnostics
  * @author mcimadamore
  * @compile/fail/ref=Neg05.out Neg05.java -XDrawDiagnostics
  *
@@ -21,20 +21,10 @@
         Neg05<?>.Foo<?> f3 = new Neg05.Foo<>("");
         Neg05<?>.Foo<? super String> f4 = new Neg05.Foo<>("");
 
-        Neg05<?>.Foo<String> f5 = new Neg05.Foo<>(""){};
-        Neg05<?>.Foo<? extends String> f6 = new Neg05.Foo<>(""){};
-        Neg05<?>.Foo<?> f7 = new Neg05.Foo<>(""){};
-        Neg05<?>.Foo<? super String> f8 = new Neg05.Foo<>(""){};
-
-        Neg05<?>.Foo<String> f9 = new Neg05.Foo<>("", "");
-        Neg05<?>.Foo<? extends String> f10 = new Neg05.Foo<>("", "");
-        Neg05<?>.Foo<?> f11 = new Neg05.Foo<>("", "");
-        Neg05<?>.Foo<? super String> f12 = new Neg05.Foo<>("", "");
-
-        Neg05<?>.Foo<String> f13 = new Neg05.Foo<>("", ""){};
-        Neg05<?>.Foo<? extends String> f14 = new Neg05.Foo<>("", ""){};
-        Neg05<?>.Foo<?> f15 = new Neg05.Foo<>("", ""){};
-        Neg05<?>.Foo<? super String> f16 = new Neg05.Foo<>("", ""){};
+        Neg05<?>.Foo<String> f5 = new Neg05.Foo<>("", "");
+        Neg05<?>.Foo<? extends String> f6 = new Neg05.Foo<>("", "");
+        Neg05<?>.Foo<?> f7 = new Neg05.Foo<>("", "");
+        Neg05<?>.Foo<? super String> f8 = new Neg05.Foo<>("", "");
     }
 
     void testRare_2(Neg05 n) {
@@ -43,19 +33,9 @@
         Neg05<?>.Foo<?> f3 = n.new Foo<>("");
         Neg05<?>.Foo<? super String> f4 = n.new Foo<>("");
 
-        Neg05<?>.Foo<String> f5 = n.new Foo<>(""){};
-        Neg05<?>.Foo<? extends String> f6 = n.new Foo<>(""){};
-        Neg05<?>.Foo<?> f7 = n.new Foo<>(""){};
-        Neg05<?>.Foo<? super String> f8 = n.new Foo<>(""){};
-
-        Neg05<?>.Foo<String> f9 = n.new Foo<>("", "");
-        Neg05<?>.Foo<? extends String> f10 = n.new Foo<>("", "");
-        Neg05<?>.Foo<?> f11 = n.new Foo<>("", "");
-        Neg05<?>.Foo<? super String> f12 = n.new Foo<>("", "");
-
-        Neg05<?>.Foo<String> f13 = n.new Foo<>("", ""){};
-        Neg05<?>.Foo<? extends String> f14 = n.new Foo<>("", ""){};
-        Neg05<?>.Foo<?> f15 = n.new Foo<>("", ""){};
-        Neg05<?>.Foo<? super String> f16 = n.new Foo<>("", ""){};
+        Neg05<?>.Foo<String> f5 = n.new Foo<>("", "");
+        Neg05<?>.Foo<? extends String> f6 = n.new Foo<>("", "");
+        Neg05<?>.Foo<?> f7 = n.new Foo<>("", "");
+        Neg05<?>.Foo<? super String> f8 = n.new Foo<>("", "");
     }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg05.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg05.out	Fri Mar 18 15:44:45 2011 -0700
@@ -7,43 +7,19 @@
 Neg05.java:22:56: compiler.err.improperly.formed.type.inner.raw.param
 Neg05.java:22:43: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? super java.lang.String>
 Neg05.java:24:48: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:24:35: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<java.lang.String>
+Neg05.java:24:35: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<java.lang.String>
 Neg05.java:25:58: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:25:45: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? extends java.lang.String>
+Neg05.java:25:45: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? extends java.lang.String>
 Neg05.java:26:43: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:26:30: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<?>
+Neg05.java:26:30: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<?>
 Neg05.java:27:56: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:27:43: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? super java.lang.String>
-Neg05.java:29:48: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:29:35: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<java.lang.String>
-Neg05.java:30:59: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:30:46: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? extends java.lang.String>
-Neg05.java:31:44: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:31:31: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<?>
-Neg05.java:32:57: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:32:44: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? super java.lang.String>
-Neg05.java:34:49: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:34:36: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<java.lang.String>
-Neg05.java:35:59: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:35:46: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? extends java.lang.String>
-Neg05.java:36:44: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:36:31: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<?>
-Neg05.java:37:57: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:37:44: compiler.err.prob.found.req: (compiler.misc.incompatible.types), compiler.misc.anonymous.class: Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? super java.lang.String>
-Neg05.java:41:37: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:42:47: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:43:32: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:44:45: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:46:37: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:47:47: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:48:32: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:49:45: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:51:37: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:52:48: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:53:33: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:54:46: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:56:38: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:57:48: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:58:33: compiler.err.improperly.formed.type.inner.raw.param
-Neg05.java:59:46: compiler.err.improperly.formed.type.inner.raw.param
-48 errors
+Neg05.java:27:43: compiler.err.prob.found.req: (compiler.misc.incompatible.types), Neg05.Foo<java.lang.String>, Neg05<?>.Foo<? super java.lang.String>
+Neg05.java:31:37: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:32:47: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:33:32: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:34:45: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:36:37: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:37:47: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:38:32: compiler.err.improperly.formed.type.inner.raw.param
+Neg05.java:39:45: compiler.err.improperly.formed.type.inner.raw.param
+24 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg06.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg06.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,21 +1,17 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond works where LHS is supertype of RHS (nilary constructor)
  * @author mcimadamore
  * @compile/fail/ref=Neg06.out Neg06.java -XDrawDiagnostics
  *
  */
 
 class Neg06 {
-   interface ISuperFoo<X> {}
-   interface IFoo<X extends Number> extends ISuperFoo<X> {}
 
    static class CSuperFoo<X> {}
    static class CFoo<X extends Number> extends CSuperFoo<X> {}
 
-   ISuperFoo<String> isf = new IFoo<>() {};
    CSuperFoo<String> csf1 = new CFoo<>();
-   CSuperFoo<String> csf2 = new CFoo<>() {};
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg06.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg06.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,4 +1,2 @@
-Neg06.java:18:36: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg06.IFoo), (compiler.misc.infer.no.conforming.instance.exists: X, Neg06.IFoo<X>, Neg06.ISuperFoo<java.lang.String>)
-Neg06.java:19:37: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg06.CFoo), (compiler.misc.infer.no.conforming.instance.exists: X, Neg06.CFoo<X>, Neg06.CSuperFoo<java.lang.String>)
-Neg06.java:20:37: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg06.CFoo), (compiler.misc.infer.no.conforming.instance.exists: X, Neg06.CFoo<X>, Neg06.CSuperFoo<java.lang.String>)
-3 errors
+Neg06.java:16:37: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg06.CFoo), (compiler.misc.infer.no.conforming.instance.exists: X, Neg06.CFoo<X>, Neg06.CSuperFoo<java.lang.String>)
+1 error
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg07.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg07.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,8 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that diamond works where LHS is supertype of RHS (1-ary constructor)
  * @author mcimadamore
  * @compile/fail/ref=Neg07.out Neg07.java -XDrawDiagnostics
  *
@@ -15,5 +15,4 @@
    }
 
    SuperFoo<String> sf1 = new Foo<>("");
-   SuperFoo<String> sf2 = new Foo<>("") {};
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg07.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg07.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,3 +1,2 @@
 Neg07.java:17:27: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg07.Foo), (compiler.misc.inferred.do.not.conform.to.bounds: java.lang.String, java.lang.Number)
-Neg07.java:18:27: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg07.Foo), (compiler.misc.inferred.do.not.conform.to.bounds: java.lang.String, java.lang.Number)
-2 errors
+1 error
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg08.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg08.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,30 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620 6894753
+ * @bug 7020043 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
- * @author mcimadamore
+ * @summary  Check that diamond is not allowed with non-generic class types
+ * @author R&eacute;mi Forax
  * @compile/fail/ref=Neg08.out Neg08.java -XDrawDiagnostics
  *
  */
 
 class Neg08 {
-    static class Foo<X> {
-        Foo(X x) {  }
-    }
-
-    static class DoubleFoo<X,Y> {
-        DoubleFoo(X x,Y y) {  }
-    }
-
-    static class TripleFoo<X,Y,Z> {
-        TripleFoo(X x,Y y,Z z) {  }
-    }
-
-    Foo<? extends Integer> fi = new Foo<>(1);
-    Foo<?> fw = new Foo<>(fi);
-    Foo<? extends Double> fd = new Foo<>(3.0);
-    DoubleFoo<?,?> dw = new DoubleFoo<>(fi,fd);
-    Foo<String> fs = new Foo<>("one");
-    TripleFoo<?,?,?> tw = new TripleFoo<>(fi,fd,fs);
+   public static void main(String[] args) {
+     String s = new String<>("foo");
+   }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg08.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg08.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,4 +1,2 @@
-Neg08.java:25:24: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg08.Foo), (compiler.misc.diamond.invalid.arg: Neg08.Foo<compiler.misc.type.captureof: 1, ? extends java.lang.Integer>, (compiler.misc.diamond: Neg08.Foo))
-Neg08.java:27:38: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg08.DoubleFoo), (compiler.misc.diamond.invalid.args: Neg08.Foo<compiler.misc.type.captureof: 1, ? extends java.lang.Integer>,Neg08.Foo<compiler.misc.type.captureof: 2, ? extends java.lang.Double>, (compiler.misc.diamond: Neg08.DoubleFoo))
-Neg08.java:29:40: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg08.TripleFoo), (compiler.misc.diamond.invalid.args: Neg08.Foo<compiler.misc.type.captureof: 1, ? extends java.lang.Integer>,Neg08.Foo<compiler.misc.type.captureof: 2, ? extends java.lang.Double>, (compiler.misc.diamond: Neg08.TripleFoo))
-3 errors
+Neg08.java:13:27: compiler.err.cant.apply.diamond.1: java.lang.String, (compiler.misc.diamond.non.generic: java.lang.String)
+1 error
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg09.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,22 +1,25 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620 6894753
+ * @bug 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
- * @author mcimadamore
+ * @summary  Check that diamond is not allowed with anonymous inner class expressions
+ * @author Maurizio Cimadamore
  * @compile/fail/ref=Neg09.out Neg09.java -XDrawDiagnostics
  *
  */
 
 class Neg09 {
-    static class Foo<X extends Number & Comparable<Number>> {}
-    static class DoubleFoo<X extends Number & Comparable<Number>,
-                           Y extends Number & Comparable<Number>> {}
-    static class TripleFoo<X extends Number & Comparable<Number>,
-                           Y extends Number & Comparable<Number>,
-                           Z> {}
+    class Member<X> {}
+
+    static class Nested<X> {}
 
-    Foo<?> fw = new Foo<>();
-    DoubleFoo<?,?> dw = new DoubleFoo<>();
-    TripleFoo<?,?,?> tw = new TripleFoo<>();
+    void testSimple() {
+        Member<?> m1 = new Member<>() {};
+        Nested<?> m2 = new Nested<>() {};
+    }
+
+    void testQualified() {
+        Member<?> m1 = this.new Member<>() {};
+        Nested<?> m2 = new Neg09.Nested<>() {};
+    }
 }
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg09.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg09.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,4 +1,5 @@
-Neg09.java:19:24: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg09.Foo), (compiler.misc.diamond.invalid.arg: java.lang.Number&java.lang.Comparable<java.lang.Number>, (compiler.misc.diamond: Neg09.Foo))
-Neg09.java:20:38: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg09.DoubleFoo), (compiler.misc.diamond.invalid.args: java.lang.Number&java.lang.Comparable<java.lang.Number>,java.lang.Number&java.lang.Comparable<java.lang.Number>, (compiler.misc.diamond: Neg09.DoubleFoo))
-Neg09.java:21:40: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg09.TripleFoo), (compiler.misc.diamond.invalid.args: java.lang.Number&java.lang.Comparable<java.lang.Number>,java.lang.Number&java.lang.Comparable<java.lang.Number>, (compiler.misc.diamond: Neg09.TripleFoo))
-3 errors
+Neg09.java:17:34: compiler.err.cant.apply.diamond.1: Neg09.Member, (compiler.misc.diamond.and.anon.class: Neg09.Member)
+Neg09.java:18:34: compiler.err.cant.apply.diamond.1: Neg09.Nested, (compiler.misc.diamond.and.anon.class: Neg09.Nested)
+Neg09.java:22:39: compiler.err.cant.apply.diamond.1: Neg09.Member, (compiler.misc.diamond.and.anon.class: Neg09.Member)
+Neg09.java:23:40: compiler.err.cant.apply.diamond.1: Neg09.Nested, (compiler.misc.diamond.and.anon.class: Neg09.Nested)
+4 errors
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg10.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg10.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,8 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that 'complex' diamond can infer type that is too specific
  * @author mcimadamore
  * @compile/fail/ref=Neg10.out Neg10.java -XDrawDiagnostics
  *
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg11.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/neg/Neg11.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,8 +1,8 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that unresolved symbols doesn't cause spurious diamond diagnostics
  * @author mcimadamore
  * @compile/fail/ref=Neg11.out Neg11.java -XDrawDiagnostics
  *
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg12.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*
- * @test /nodynamiccopyright/
- * @bug 7020043
- *
- * @summary  Project Coin: diamond allowed on non-generic type
- * @author R&eacute;mi Forax
- * @compile/fail/ref=Neg12.out Neg12.java -XDrawDiagnostics
- *
- */
-
-class DiamondRaw {
-   public static void main(String[] args) {
-     String s = new String<>("foo");
-   }
-}
--- a/langtools/test/tools/javac/generics/diamond/neg/Neg12.out	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Neg12.java:13:27: compiler.err.cant.apply.diamond.1: java.lang.String, (compiler.misc.diamond.non.generic: java.lang.String)
-1 error
--- a/langtools/test/tools/javac/generics/diamond/pos/Pos01.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos01.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  basic test for diamond (generic/non-generic constructors)
  * @author mcimadamore
  * @compile Pos01.java
  * @run main Pos01
@@ -44,20 +44,10 @@
         Pos01<?> p3 = new Pos01<>(1);
         Pos01<? super Integer> p4 = new Pos01<>(1);
 
-        Pos01<Integer> p5 = new Pos01<>(1){};
-        Pos01<? extends Integer> p6 = new Pos01<>(1){};
-        Pos01<?> p7 = new Pos01<>(1){};
-        Pos01<? super Integer> p8 = new Pos01<>(1){};
-
-        Pos01<Integer> p9 = new Pos01<>(1, "");
-        Pos01<? extends Integer> p10 = new Pos01<>(1, "");
-        Pos01<?> p11 = new Pos01<>(1, "");
-        Pos01<? super Integer> p12 = new Pos01<>(1, "");
-
-        Pos01<Integer> p13 = new Pos01<>(1, ""){};
-        Pos01<? extends Integer> p14= new Pos01<>(1, ""){};
-        Pos01<?> p15 = new Pos01<>(1, ""){};
-        Pos01<? super Integer> p16 = new Pos01<>(1, ""){};
+        Pos01<Integer> p5 = new Pos01<>(1, "");
+        Pos01<? extends Integer> p6 = new Pos01<>(1, "");
+        Pos01<?> p7 = new Pos01<>(1, "");
+        Pos01<? super Integer> p8 = new Pos01<>(1, "");
     }
 
     public static void main(String[] args) {
--- a/langtools/test/tools/javac/generics/diamond/pos/Pos02.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos02.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  basic test for diamond (simple/qualified type-expressions)
  * @author mcimadamore
  * @compile Pos02.java
  * @run main Pos02
@@ -44,20 +44,10 @@
         Foo<?> f3 = new Foo<>(1);
         Foo<? super Integer> f4 = new Foo<>(1);
 
-        Foo<Integer> f5 = new Foo<>(1){};
-        Foo<? extends Integer> f6 = new Foo<>(1){};
-        Foo<?> f7 = new Foo<>(1){};
-        Foo<? super Integer> f8 = new Foo<>(1){};
-
-        Foo<Integer> f9 = new Foo<>(1, "");
-        Foo<? extends Integer> f10 = new Foo<>(1, "");
-        Foo<?> f11 = new Foo<>(1, "");
-        Foo<? super Integer> f12 = new Foo<>(1, "");
-
-        Foo<Integer> f13 = new Foo<>(1, ""){};
-        Foo<? extends Integer> f14 = new Foo<>(1, ""){};
-        Foo<?> f15 = new Foo<>(1, ""){};
-        Foo<? super Integer> f16 = new Foo<>(1, ""){};
+        Foo<Integer> f5 = new Foo<>(1, "");
+        Foo<? extends Integer> f6 = new Foo<>(1, "");
+        Foo<?> f7 = new Foo<>(1, "");
+        Foo<? super Integer> f8 = new Foo<>(1, "");
     }
 
     void testQualified() {
@@ -66,20 +56,10 @@
         Foo<?> f3 = new Pos02.Foo<>(1);
         Foo<? super Integer> f4 = new Pos02.Foo<>(1);
 
-        Foo<Integer> f5 = new Pos02.Foo<>(1){};
-        Foo<? extends Integer> f6 = new Pos02.Foo<>(1){};
-        Foo<?> f7 = new Pos02.Foo<>(1){};
-        Foo<? super Integer> f8 = new Pos02.Foo<>(1){};
-
-        Foo<Integer> f9 = new Pos02.Foo<>(1, "");
-        Foo<? extends Integer> f10 = new Pos02.Foo<>(1, "");
-        Foo<?> f11 = new Pos02.Foo<>(1, "");
-        Foo<? super Integer> f12 = new Pos02.Foo<>(1, "");
-
-        Foo<Integer> f13 = new Pos02.Foo<>(1, ""){};
-        Foo<? extends Integer> f14 = new Pos02.Foo<>(1, ""){};
-        Foo<?> f15 = new Pos02.Foo<>(1, ""){};
-        Foo<? super Integer> f16 = new Pos02.Foo<>(1, ""){};
+        Foo<Integer> f5 = new Pos02.Foo<>(1, "");
+        Foo<? extends Integer> f6 = new Pos02.Foo<>(1, "");
+        Foo<?> f7 = new Pos02.Foo<>(1, "");
+        Foo<? super Integer> f8 = new Pos02.Foo<>(1, "");
     }
 
     public static void main(String[] args) {
--- a/langtools/test/tools/javac/generics/diamond/pos/Pos03.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos03.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  basic test for diamond (simple/qualified type-expressions, member inner)
  * @author mcimadamore
  * @compile Pos03.java
  * @run main Pos03
@@ -45,20 +45,10 @@
         Foo<?> f3 = new Foo<>(1);
         Foo<? super Integer> f4 = new Foo<>(1);
 
-        Foo<Integer> f5 = new Foo<>(1){};
-        Foo<? extends Integer> f6 = new Foo<>(1){};
-        Foo<?> f7 = new Foo<>(1){};
-        Foo<? super Integer> f8 = new Foo<>(1){};
-
-        Foo<Integer> f9 = new Foo<>(1, "");
-        Foo<? extends Integer> f10 = new Foo<>(1, "");
-        Foo<?> f11 = new Foo<>(1, "");
-        Foo<? super Integer> f12 = new Foo<>(1, "");
-
-        Foo<Integer> f13 = new Foo<>(1, ""){};
-        Foo<? extends Integer> f14 = new Foo<>(1, ""){};
-        Foo<?> f15 = new Foo<>(1, ""){};
-        Foo<? super Integer> f16 = new Foo<>(1, ""){};
+        Foo<Integer> f5 = new Foo<>(1, "");
+        Foo<? extends Integer> f6 = new Foo<>(1, "");
+        Foo<?> f7 = new Foo<>(1, "");
+        Foo<? super Integer> f8 = new Foo<>(1, "");
     }
 
     void testQualified_1() {
@@ -67,20 +57,10 @@
         Foo<?> f3 = new Pos03<U>.Foo<>(1);
         Foo<? super Integer> f4 = new Pos03<U>.Foo<>(1);
 
-        Foo<Integer> f5 = new Pos03<U>.Foo<>(1){};
-        Foo<? extends Integer> f6 = new Pos03<U>.Foo<>(1){};
-        Foo<?> f7 = new Pos03<U>.Foo<>(1){};
-        Foo<? super Integer> f8 = new Pos03<U>.Foo<>(1){};
-
-        Foo<Integer> f9 = new Pos03<U>.Foo<>(1, "");
-        Foo<? extends Integer> f10 = new Pos03<U>.Foo<>(1, "");
-        Foo<?> f11 = new Pos03<U>.Foo<>(1, "");
-        Foo<? super Integer> f12 = new Pos03<U>.Foo<>(1, "");
-
-        Foo<Integer> f13 = new Pos03<U>.Foo<>(1, ""){};
-        Foo<? extends Integer> f14 = new Pos03<U>.Foo<>(1, ""){};
-        Foo<?> f15 = new Pos03<U>.Foo<>(1, ""){};
-        Foo<? super Integer> f16 = new Pos03<U>.Foo<>(1, ""){};
+        Foo<Integer> f5 = new Pos03<U>.Foo<>(1, "");
+        Foo<? extends Integer> f6 = new Pos03<U>.Foo<>(1, "");
+        Foo<?> f7 = new Pos03<U>.Foo<>(1, "");
+        Foo<? super Integer> f8 = new Pos03<U>.Foo<>(1, "");
     }
 
     void testQualified_2(Pos03<U> p) {
@@ -89,20 +69,10 @@
         Foo<?> f3 = p.new Foo<>(1);
         Foo<? super Integer> f4 = p.new Foo<>(1);
 
-        Foo<Integer> f5 = p.new Foo<>(1){};
-        Foo<? extends Integer> f6 = p.new Foo<>(1){};
-        Foo<?> f7 = p.new Foo<>(1){};
-        Foo<? super Integer> f8 = p.new Foo<>(1){};
-
-        Foo<Integer> f9 = p.new Foo<>(1, "");
-        Foo<? extends Integer> f10 = p.new Foo<>(1, "");
-        Foo<?> f11 = p.new Foo<>(1, "");
-        Foo<? super Integer> f12 = p.new Foo<>(1, "");
-
-        Foo<Integer> f13 = p.new Foo<>(1, ""){};
-        Foo<? extends Integer> f14 = p.new Foo<>(1, ""){};
-        Foo<?> f15 = p.new Foo<>(1, ""){};
-        Foo<? super Integer> f16 = p.new Foo<>(1, ""){};
+        Foo<Integer> f5 = p.new Foo<>(1, "");
+        Foo<? extends Integer> f6 = p.new Foo<>(1, "");
+        Foo<?> f7 = p.new Foo<>(1, "");
+        Foo<? super Integer> f8 = p.new Foo<>(1, "");
     }
 
     public static void main(String[] args) {
--- a/langtools/test/tools/javac/generics/diamond/pos/Pos04.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos04.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  basic test for diamond (simple/qualified type-expressions, local class)
  * @author mcimadamore
  * @compile Pos04.java
  * @run main Pos04
@@ -44,20 +44,10 @@
         Foo<?> p3 = new Foo<>(1);
         Foo<? super Integer> p4 = new Foo<>(1);
 
-        Foo<Integer> p5 = new Foo<>(1){};
-        Foo<? extends Integer> p6 = new Foo<>(1){};
-        Foo<?> p7 = new Foo<>(1){};
-        Foo<? super Integer> p8 = new Foo<>(1){};
-
-        Foo<Integer> p9 = new Foo<>(1, "");
-        Foo<? extends Integer> p10 = new Foo<>(1, "");
-        Foo<?> p11 = new Foo<>(1, "");
-        Foo<? super Integer> p12 = new Foo<>(1, "");
-
-        Foo<Integer> p13 = new Foo<>(1, ""){};
-        Foo<? extends Integer> p14 = new Foo<>(1, ""){};
-        Foo<?> p15 = new Foo<>(1, ""){};
-        Foo<? super Integer> p16 = new Foo<>(1, ""){};
+        Foo<Integer> p5 = new Foo<>(1, "");
+        Foo<? extends Integer> p6 = new Foo<>(1, "");
+        Foo<?> p7 = new Foo<>(1, "");
+        Foo<? super Integer> p8 = new Foo<>(1, "");
     }
 
     public static void main(String[] args) {
--- a/langtools/test/tools/javac/generics/diamond/pos/Pos05.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos05.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 6939620
+ * @bug 6939620 7020044
  *
- * @summary  Switch to 'complex' diamond inference scheme
+ * @summary  Check that 'complex' inference sometimes works in method context
  * @author mcimadamore
  * @compile Pos05.java
  *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos06.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6939620 6894753 7020044
+ *
+ * @summary  Diamond and subtyping
+ * @author mcimadamore
+ * @compile Pos06.java
+ *
+ */
+
+class Pos06 {
+    static class Foo<X> {
+        Foo(X x) {  }
+    }
+
+    static class DoubleFoo<X,Y> {
+        DoubleFoo(X x,Y y) {  }
+    }
+
+    static class TripleFoo<X,Y,Z> {
+        TripleFoo(X x,Y y,Z z) {  }
+    }
+
+    Foo<? extends Integer> fi = new Foo<>(1);
+    Foo<?> fw = new Foo<>(fi);
+    Foo<? extends Double> fd = new Foo<>(3.0);
+    DoubleFoo<?,?> dw = new DoubleFoo<>(fi,fd);
+    Foo<String> fs = new Foo<>("one");
+    TripleFoo<?,?,?> tw = new TripleFoo<>(fi,fd,fs);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/pos/Pos07.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6939620 6894753 7020044
+ *
+ * @summary  Diamond and intersection types
+ * @author mcimadamore
+ * @compile Pos07.java
+ *
+ */
+
+class Pos07 {
+    static class Foo<X extends Number & Comparable<Number>> {}
+    static class DoubleFoo<X extends Number & Comparable<Number>,
+                           Y extends Number & Comparable<Number>> {}
+    static class TripleFoo<X extends Number & Comparable<Number>,
+                           Y extends Number & Comparable<Number>,
+                           Z> {}
+
+    Foo<?> fw = new Foo<>();
+    DoubleFoo<?,?> dw = new DoubleFoo<>();
+    TripleFoo<?,?,?> tw = new TripleFoo<>();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/T7015715.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7015715
+ *
+ * @summary lub gets stuck on type with complex supertype
+ * @author Neal Gafter
+ * @compile T7015715.java
+ *
+ */
+
+class T7015715 {
+
+    interface I<T> {}
+
+    interface A<T> extends I<A<A<T>>>{}
+
+    static abstract class X {
+       abstract <T> T foo(T x, T y);
+       void bar(A<Integer> x, A<String> y){
+           foo(x, y);
+       }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/implicitThis/6541876/T6541876a.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6541876
+ * @summary  "Enclosing Instance" error new in 1.6
+ *
+ */
+
+public class T6541876a {
+    class X {
+        class Y {}
+    }
+
+    class A extends X {
+        class B extends X.Y {}
+    }
+
+    public static void main(String[] args) {
+        new T6541876a().new A().new B();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/implicitThis/6541876/T6541876b.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6541876 6569091
+ * @summary  "Enclosing Instance" error new in 1.6
+ *
+ */
+
+public class T6541876b {
+
+    enum ENUM {
+        ENUM_CONST {
+            public AbstractClass method() {
+                return new AbstractClass() {
+                    public boolean method() {
+                        return true;
+                    }
+                };
+            }
+        };
+
+        public abstract AbstractClass method();
+
+        private abstract class AbstractClass {
+            public abstract boolean method();
+        }
+    }
+
+    public static void main(String[] args) {
+        ENUM.ENUM_CONST.method();
+    }
+}
--- a/langtools/test/tools/javac/implicitThis/NewBeforeOuterConstructed3.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/implicitThis/NewBeforeOuterConstructed3.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4704371 6313120
  * @summary compiler generates unverifiable code for implicit reference to uninit'd this
- * @compile/fail NewBeforeOuterConstructed3.java
  */
 
 public class NewBeforeOuterConstructed3 {
--- a/langtools/test/tools/javac/multicatch/Neg05.java	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * @test /nodynamiccopyright/
- * @bug 6943289
- *
- * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
- * @author mcimadamore
- * @compile/fail/ref=Neg05.out -XDrawDiagnostics Neg05.java
- *
- */
-
-class Neg02 {
-
-    static class Foo<X> {
-       Foo(X x) {}
-    }
-
-    static interface Base<X> {}
-    static class A extends Exception implements Base<String> {}
-    static class B extends Exception implements Base<Integer> {}
-
-    void m() {
-        try {
-            if (true) {
-                throw new A();
-            }
-            else {
-                throw new B();
-            }
-        } catch (A | B ex) {
-            Foo<?> f = new Foo<>(ex);
-        }
-    }
-}
--- a/langtools/test/tools/javac/multicatch/Neg05.out	Fri Mar 18 17:56:47 2011 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Neg05.java:30:31: compiler.err.cant.apply.diamond.1: (compiler.misc.diamond: Neg02.Foo), (compiler.misc.diamond.invalid.arg: java.lang.Exception&Neg02.Base<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, (compiler.misc.diamond: Neg02.Foo))
-1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/multicatch/Pos09.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6943289 7020044
+ *
+ * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch')
+ * @author mcimadamore
+ * @compile Pos09.java
+ *
+ */
+
+class Pos09 {
+
+    static class Foo<X> {
+       Foo(X x) {}
+    }
+
+    static interface Base<X> {}
+    static class A extends Exception implements Base<String> {}
+    static class B extends Exception implements Base<Integer> {}
+
+    void m() {
+        try {
+            if (true) {
+                throw new A();
+            }
+            else {
+                throw new B();
+            }
+        } catch (A | B ex) {
+            Foo<?> f = new Foo<>(ex);
+        }
+    }
+}
--- a/langtools/test/tools/javac/nested/4903103/T4903103.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/nested/4903103/T4903103.java	Fri Mar 18 15:44:45 2011 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,11 +25,14 @@
  * @test
  * @bug     4903103
  * @summary Can't compile subclasses of inner classes
- * @compile T4903103.java
  */
 
 public class T4903103 {
     private class InnerSuperclass extends T4903103 {}
 
     private class InnerSubclass extends InnerSuperclass {}
+
+    public static void main(String[] args) {
+        new T4903103().new InnerSubclass();
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/T6900037.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6900037
+ * @summary javac should warn if earlier -source is used and bootclasspath not set
+ * @compile T6900037.java
+ * @compile -source 1.6 T6900037.java
+ * @compile/fail/ref=T6900037.out -XDrawDiagnostics -Werror -source 1.6 T6900037.java
+ * @compile -Werror -source 1.6 -Xlint:-options T6900037.java
+ */
+
+class T6900037 { }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/T6900037.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,4 @@
+- compiler.warn.source.no.bootclasspath: 1.6
+- compiler.err.warnings.and.werror
+1 error
+1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/T6986895.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6986895
+ * @summary compiler gives misleading message for no input files
+ */
+
+import java.io.*;
+import java.util.*;
+
+public class T6986895 {
+    public static void main(String... args) throws Exception {
+        new T6986895().run();
+    }
+
+    String noSourceFiles = "no source files";
+    String noSourceFilesOrClasses = "no source files or class names";
+
+    void run() throws Exception {
+        Locale prev = Locale.getDefault();
+        try {
+            Locale.setDefault(Locale.ENGLISH);
+            test(noSourceFiles,           "-Werror");
+            test(noSourceFilesOrClasses,  "-Werror", "-Xprint");
+        } finally {
+            Locale.setDefault(prev);
+        }
+    }
+
+    void test(String expect, String... args) throws Exception {
+        System.err.println("Test " + expect + ": " + Arrays.asList(args));
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        int rc = com.sun.tools.javac.Main.compile(args, pw);
+        pw.close();
+        System.err.println("compilation failed; rc=" + rc);
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        if (!out.contains(expect))
+            throw new Exception("expected text not found: " + expect);
+        System.err.println();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/T7022337.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+ * @test
+ * @bug 7022337
+ * @summary repeated warnings about bootclasspath not set
+ * @library ../lib
+ * @build JavacTestingAbstractProcessor T7022337
+ * @run main T7022337
+ */
+
+import java.io.*;
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.tools.*;
+
+public class T7022337 extends JavacTestingAbstractProcessor {
+    public static void main(String... args) throws Exception {
+        new T7022337().run();
+    }
+
+    void run() throws Exception {
+        String myName = T7022337.class.getSimpleName();
+        File testSrc = new File(System.getProperty("test.src"));
+        File file = new File(testSrc, myName + ".java");
+
+        String out = compile(
+            "-XDrawDiagnostics",
+            "-d", ".",
+            "-processor", myName,
+            "-source", "6", // explicit use of older source value without bootclasspath
+            file.getPath());
+
+        int count = 0;
+        for (String line: out.split("[\r\n]+")) {
+            if (line.contains("compiler.warn.source.no.bootclasspath"))
+                count++;
+        }
+        if (count != 1)
+            throw new Exception("unexpected number of warnings found: " + count + ", expected: 1");
+    }
+
+    String compile(String... args) throws Exception {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        int rc = com.sun.tools.javac.Main.compile(args, pw);
+        pw.close();
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        if (rc != 0)
+            throw new Exception("compilation failed unexpectedly: rc=" + rc);
+        return out;
+    }
+
+    // ----------
+
+    int round = 0;
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        round++;
+
+        final int MAXROUNDS = 3;
+        if (round < MAXROUNDS)
+            generate("Gen" + round);
+
+        return true;
+    }
+
+    void generate(String name) {
+        try {
+            JavaFileObject fo = filer.createSourceFile(name);
+            Writer out = fo.openWriter();
+            try {
+                out.write("class " + name + " { }");
+            } finally {
+                out.close();
+            }
+        } catch (IOException e) {
+            throw new Error(e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/TestWarnErrorCount.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,340 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+ * @test
+ * @bug 7022337
+ * @summary repeated warnings about bootclasspath not set
+ * @library ../lib
+ * @build JavacTestingAbstractProcessor TestWarnErrorCount
+ * @run main TestWarnErrorCount
+ */
+
+import java.io.*;
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.tools.*;
+
+@SupportedOptions({"errKind", "msgrWarnKind", "javaWarnKind"})
+public class TestWarnErrorCount extends JavacTestingAbstractProcessor {
+    public static void main(String... args) throws Exception {
+        new TestWarnErrorCount().run(args);
+    }
+
+    final int MAX_GEN = 10;
+    final int ERROR_ROUND = MAX_GEN / 2; // when to generate error
+
+    /**
+     * Type of errors to generate in test case.
+     */
+    enum ErrorKind {
+        /** No errors. */
+        NONE,
+        /** Source code errors. */
+        JAVA,
+        /** Errors reported to Messager. */
+        MESSAGER,
+        /** Error as a result of using -Werror. */
+        WERROR,
+    }
+
+    /**
+     * Frequency of warnings in test case.
+     */
+    enum WarnKind {
+        /** No warnings. */
+        NONE {
+            boolean warn(int round) { return false; }
+            int count(int start, int end) { return 0; }
+        },
+        /** Generate a warning if round count is a multiple of 2. */
+        EVERY_TWO {
+            boolean warn(int round) { return (round % 2) == 0; }
+            int count(int start, int end) { return (end / 2) - ((start - 1)/ 2); }
+        },
+        /** Generate a warning if round count is a multiple of 3. */
+        EVERY_THREE {
+            boolean warn(int round) { return (round % 3) == 0; }
+            int count(int start, int end) { return (end / 3) - ((start - 1)/ 3); }
+        },
+        /** Generate a warning every round. */
+        ALL {
+            boolean warn(int round) { return true; }
+            int count(int start, int end) { return (end - start + 1); }
+        };
+
+        /** whether to generate a warning in round 'round'. */
+        abstract boolean warn(int round);
+
+        /** number of warnings generated in a range of rounds, inclusive. */
+        abstract int count(int start, int end);
+    }
+
+
+    /**
+     * Run test.
+     * @param args provide ability to specify particular test cases for debugging.
+     */
+    void run(String... args) throws Exception {
+        for (String arg: args) {
+            if (arg.matches("[0-9]+")) {
+                if (testCases == null)
+                    testCases = new HashSet<Integer>();
+                testCases.add(Integer.valueOf(arg));
+            } else if (arg.equals("-stopOnError")) {
+                stopOnError = true;
+            } else
+                throw new IllegalArgumentException(arg);
+        }
+
+        run ();
+
+        if (errors > 0)
+            throw new Exception(errors + " errors found");
+    }
+
+    /**
+     * Run test.
+     */
+    void run() throws Exception {
+        for (ErrorKind ek: ErrorKind.values()) {
+            for (WarnKind mwk: WarnKind.values()) {
+                for (WarnKind jwk: WarnKind.values()) {
+                    test(ek, mwk, jwk);
+                    if (stopOnError && errors > 0)
+                        throw new Exception(errors + " errors found");
+                }
+            }
+        }
+    }
+
+    boolean stopOnError;
+    Set<Integer> testCases;
+    int testNum = 0;
+
+    /**
+     * Run a test case.
+     * @param ek    The type of errors to generate
+     * @param mwk   The frequency of Messager warnings to generate
+     * @param jwk   The frequency of Java warnings to generate
+     */
+    void test(ErrorKind ek, WarnKind mwk, WarnKind jwk) {
+        testNum++;
+
+        if (testCases != null && !testCases.contains(testNum))
+            return;
+
+        System.err.println("Test " + testNum + ": ek:" + ek + " mwk:" + mwk + " jwk:" + jwk);
+
+        File testDir = new File("test" + testNum);
+        testDir.mkdirs();
+
+        String myName = TestWarnErrorCount.class.getSimpleName();
+        File testSrc = new File(System.getProperty("test.src"));
+        File file = new File(testSrc, myName + ".java");
+
+        List<String> args = new ArrayList<String>();
+        args.addAll(Arrays.asList(
+            "-XDrawDiagnostics",
+            "-d", testDir.getPath(),
+            "-processor", myName,
+//            "-XprintRounds",
+            "-Xlint:all,-path",
+            "-AerrKind=" + ek,
+            "-AmsgrWarnKind=" + mwk,
+            "-AjavaWarnKind=" + jwk));
+        if (ek == ErrorKind.WERROR)
+            args.add("-Werror");
+        args.add(file.getPath());
+
+        String out = compile(args.toArray(new String[args.size()]));
+
+        int errsFound = 0;
+        int errsReported = 0;
+        int warnsFound = 0;
+        int warnsReported = 0;
+
+        // Scan the output looking for messages of interest.
+
+        for (String line: out.split("[\r\n]+")) {
+            if (line.contains("compiler.err.")) {
+                errsFound++;
+            } else if (line.contains("compiler.warn.")) {
+                warnsFound++;
+            } else if (line.matches("[0-9]+ error(?:s?)")) {
+                errsReported = Integer.valueOf(line.substring(0, line.indexOf("error")).trim());
+            } else if (line.matches("[0-9]+ warning(?:s?)")) {
+                warnsReported = Integer.valueOf(line.substring(0, line.indexOf("warning")).trim());
+            }
+        }
+
+        // Compute the expected number of errors and warnings, based on
+        // the test case parameters.
+        // This is highly specific to the annotation processor below, and to
+        // the files it generates.
+        // Generally, the rules are:
+        // -- errors stop annotation processing, allowing for one extra "last round"
+        // -- messager warnings are immediate
+        // -- javac warnings are not shown before the final compilation
+        //      (FIXME?  -Werror does not stop processing for java warnings)
+        int errsExpected;
+        int msgrWarnsExpected;
+        int javaWarnsExpected;
+        switch (ek) {
+            case NONE:
+                errsExpected = 0;
+                msgrWarnsExpected = mwk.count(1, 1 + MAX_GEN + 1);
+                javaWarnsExpected = jwk.count(2, 1 + MAX_GEN);
+                break;
+            case MESSAGER:
+                errsExpected = 1;
+                msgrWarnsExpected = mwk.count(1, ERROR_ROUND + 1);
+                javaWarnsExpected = 0;
+                break;
+            case JAVA:
+                errsExpected = 2;
+                msgrWarnsExpected = mwk.count(1, ERROR_ROUND + 1);
+                javaWarnsExpected = 0;
+                break;
+            case WERROR:
+                errsExpected = (mwk != WarnKind.NONE || jwk != WarnKind.NONE) ? 1 : 0;
+                switch (mwk) {
+                    case NONE:
+                        msgrWarnsExpected = 0;
+                        javaWarnsExpected = (jwk == WarnKind.NONE)
+                                ? 0
+                                : 1;  // this is surprising: javac only reports warning in first file
+                        break;
+                    case EVERY_TWO:
+                        msgrWarnsExpected = mwk.count(1, 2 + 1);
+                        javaWarnsExpected = 0;
+                        break;
+                    case EVERY_THREE:
+                        msgrWarnsExpected = mwk.count(1, 3 + 1);
+                        javaWarnsExpected = 0;
+                        break;
+                    case ALL:
+                        msgrWarnsExpected = mwk.count(1, 1 + 1);
+                        javaWarnsExpected = 0;
+                        break;
+                    default:
+                        throw new IllegalStateException();
+                }
+                break;
+            default:
+                throw new IllegalStateException();
+        }
+
+        int warnsExpected = msgrWarnsExpected + javaWarnsExpected;
+        System.err.println("mwk: " + msgrWarnsExpected
+                + ", jwk: " + javaWarnsExpected
+                + ", total: " + warnsExpected);
+
+        boolean ok;
+        ok  = checkEqual("errors", "reported", errsFound, errsReported);
+        ok &= checkEqual("errors", "expected", errsFound, errsExpected);
+        ok &= checkEqual("warnings", "reported", warnsFound, warnsReported);
+        ok &= checkEqual("warnings", "expected", warnsFound, warnsExpected);
+        if (ok)
+            System.err.println("OK");
+
+        System.err.println();
+    }
+
+    String compile(String... args) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        int rc = com.sun.tools.javac.Main.compile(args, pw);
+        pw.close();
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        if (rc != 0)
+            System.err.println("compilation failed: rc=" + rc);
+        return out;
+    }
+
+    boolean checkEqual(String l1, String l2, int i1, int i2) {
+        if (i1 != i2)
+            error("number of " + l1 + " found, " + i1 + ", does not match number " + l2 + ", " + i2);
+        return (i1 == i2);
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int errors = 0;
+
+    // ----- Annotation processor -----
+
+    int round = 0;
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        round++;
+
+        ErrorKind ek = ErrorKind.valueOf(options.get("errKind"));
+        WarnKind mwk = WarnKind.valueOf(options.get("msgrWarnKind"));
+        WarnKind jwk = WarnKind.valueOf(options.get("javaWarnKind"));
+        messager.printMessage(Diagnostic.Kind.NOTE,
+                "Round " + round
+                + " " + roundEnv.getRootElements()
+                + ", last round: " + roundEnv.processingOver());
+        messager.printMessage(Diagnostic.Kind.NOTE,
+                "ek: " + ek + ", mwk: " + mwk + ", jwk: " + jwk);
+
+        if (round <= MAX_GEN && !roundEnv.processingOver())
+            generate("Gen" + round,
+                    (ek == ErrorKind.JAVA) && (round == ERROR_ROUND),
+                    jwk.warn(round));
+
+        if (mwk.warn(round))
+            messager.printMessage(Diagnostic.Kind.WARNING, "round " + round);
+
+        if ((ek == ErrorKind.MESSAGER) && (round == ERROR_ROUND))
+            messager.printMessage(Diagnostic.Kind.ERROR, "round " + round);
+
+        return true;
+    }
+
+    void generate(String name, boolean error, boolean warn) {
+        try {
+            JavaFileObject fo = filer.createSourceFile(name);
+            Writer out = fo.openWriter();
+            try {
+                out.write("class " + name + " {\n"
+                        + (warn ? "    int i = (int) 0;\n" : "")
+                        + (error ? "   ERROR\n" : "")
+                        + "}\n");
+            } finally {
+                out.close();
+            }
+        } catch (IOException e) {
+            throw new Error(e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/TestSymtabItems.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7021183
+ * @summary 269: assertion failure getting enclosing element of an undefined name
+ */
+
+import java.lang.reflect.Field;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.TypeParameterElement;
+import javax.lang.model.element.UnknownElementException;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.type.UnknownTypeException;
+import javax.lang.model.util.ElementScanner7;
+import javax.lang.model.util.SimpleTypeVisitor7;
+import javax.lang.model.util.Types;
+
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.model.JavacTypes;
+import com.sun.tools.javac.util.Context;
+
+/**
+ * Scan javac Symtab looking for TypeMirrors and Elements, and ensure that
+ * no exceptions are thrown when used with javax.lang.model visitors.
+ *
+ */
+public class TestSymtabItems {
+    public static void main(String... args) throws Exception {
+        new TestSymtabItems().run();
+    }
+
+    void run() throws Exception {
+        Context c = new Context();
+        JavacFileManager.preRegister(c);
+        Symtab syms = Symtab.instance(c);
+        JavacTypes types = JavacTypes.instance(c);
+
+//        print("noSymbol", syms.noSymbol);
+//        print("errSymbol", syms.errSymbol);
+//        print("unknownSymbol", syms.unknownSymbol);
+//        print("botType", syms.botType);
+//        print("errType", syms.errType);
+//        print("unknownType", syms.unknownType);
+
+        for (Field f: Symtab.class.getDeclaredFields()) {
+//            System.err.println(f.getType() + " " + f.getName());
+
+            // Temporarily ignore methodHandle and transientMethodHandle
+            // during API evolution
+            if (f.getName().toLowerCase().contains("methodhandle"))
+                continue;
+
+            Class<?> ft = f.getType();
+            if (TypeMirror.class.isAssignableFrom(ft))
+                print(f.getName(), (TypeMirror) f.get(syms), types);
+            else if(Element.class.isAssignableFrom(ft))
+                print(f.getName(), (Element) f.get(syms));
+        }
+
+        if (errors > 0)
+            throw new Exception(errors + " errors occurred");
+    }
+
+    void print(String label, Element e) {
+        ElemPrinter ep = new ElemPrinter();
+        System.err.println("Test " + label);
+        ep.visit(e);
+        System.err.println();
+    }
+
+    void print(String label, TypeMirror t, Types types) {
+        TypePrinter tp = new TypePrinter();
+        System.err.println("Test " + label);
+        tp.visit(t, types);
+        System.err.println();
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int errors;
+
+    class ElemPrinter extends ElementScanner7<Void, Void> {
+        @Override
+        public Void visitPackage(PackageElement e, Void p) {
+            show("package", e);
+            indent(+1);
+            super.visitPackage(e, p);
+            indent(-1);
+            return null;
+        }
+
+        @Override
+        public Void visitType(TypeElement e, Void p) {
+            show("type", e);
+            indent(+1);
+            super.visitType(e, p);
+            indent(-1);
+            return null;
+        }
+
+        @Override
+        public Void visitVariable(VariableElement e, Void p) {
+            show("variable", e);
+            indent(+1);
+            super.visitVariable(e, p);
+            indent(-1);
+            return null;
+        }
+
+        @Override
+        public Void visitExecutable(ExecutableElement e, Void p) {
+            show("executable", e);
+            indent(+1);
+            super.visitExecutable(e, p);
+            indent(-1);
+            return null;
+        }
+
+        @Override
+        public Void visitTypeParameter(TypeParameterElement e, Void p) {
+            show("type parameter", e);
+            indent(+1);
+            super.visitTypeParameter(e, p);
+            indent(-1);
+            return null;
+        }
+
+        @Override
+        public Void visitUnknown(Element e, Void p) {
+            show("unknown", e);
+            indent(+1);
+            try {
+                super.visitUnknown(e, p);
+            } catch (UnknownElementException ex) {
+                System.err.println("caught " + ex);
+            }
+            indent(-1);
+            return null;
+        }
+
+        void indent(int i) {
+            indent += i;
+        }
+
+        String sp(int w) {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < w; i++)
+                sb.append("    ");
+            return sb.toString();
+        }
+
+        void show(String label, Element e) {
+            System.err.println(sp(indent) + label
+                    + ": mods:" + e.getModifiers()
+                    + " " + e.getSimpleName()
+                    + ", kind: " + e.getKind()
+                    + ", type: " + e.asType()
+                    + ", encl: " + e.getEnclosingElement());
+
+            // The following checks help establish why NPE might occur when trying to scan children
+            if (e instanceof ClassSymbol) {
+                ClassSymbol csym = (ClassSymbol) e;
+                if (csym.members_field == null)
+                    error("members_field is null");
+                if (csym.type == null)
+                    System.err.println("type is null");
+            }
+        }
+
+        int indent;
+    };
+
+    class TypePrinter extends SimpleTypeVisitor7<Void, Types> {
+        @Override
+        public Void defaultAction(TypeMirror m, Types types) {
+            System.err.println(m.getKind() + " " + m + " " + types.asElement(m));
+            return null;
+        }
+
+        @Override
+        public Void visitUnknown(TypeMirror t, Types types) {
+            try {
+                return super.visitUnknown(t, types);
+            } catch (UnknownTypeException ex) {
+                System.err.println("caught " + ex);
+                return null;
+            }
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement/InvalidSource.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.*;
+
+@interface ExpectInterfaces {
+    String value();
+}
+
+@interface ExpectSupertype {
+    String value();
+}
+
+interface OK {
+    void m();
+}
+
+class InvalidSource {
+    /*
+     * The following annotations contain a simple description of the expected
+     * representation of the superclass and superinterfaces of the corresponding
+     * elements.
+     * The strings contain a comma-separated list of descriptions.
+     * Descriptions are composed as follows:
+     * A leading "!:" indicates the type mirror has kind ERROR.
+     * "empty" means that the corresponding element has no enclosed elements.
+     * "clss", "intf" and "tvar" indicate the name refers to a class, interface
+     * or type variable. Each is followed by the declared name of the element.
+     * "pkg" indicates the name of a package element.
+     * An enclosing element is shown in parentheses.
+     * A trailing "!" indicates that the element's type has kind ERROR.
+     */
+
+    @ExpectSupertype("!:empty clss A!")
+    class TestClassMissingClassA extends A { }
+
+    @ExpectSupertype("!:empty clss (pkg A).B!")
+    class TestClassMissingClassAB extends A.B { }
+
+    @ExpectSupertype("!:empty clss (pkg java.util).A!")
+    class TestClassMissingClass_juA extends java.util.A { }
+
+    @ExpectSupertype("!:empty clss A!<tvar T>")
+    class TestClassTMissingClassAT<T> extends A<T> { }
+
+    @ExpectInterfaces("!:empty intf A!")
+    class TestClassMissingIntfA implements A { }
+
+    @ExpectInterfaces("!:empty intf (pkg A).B!")
+    class TestClassMissingIntfAB implements A.B { }
+
+    @ExpectInterfaces("!:empty intf A!, intf OK")
+    abstract class TestClassMissingIntfAOK implements A, OK { }
+
+    @ExpectInterfaces("intf OK, !:empty intf A!")
+    abstract class TestClassOKMissingIntfA implements OK, A { }
+
+    @ExpectInterfaces("!:empty intf A!, !:empty intf B!")
+    class TestClassMissingIntfA_B implements A, B { }
+
+    @ExpectInterfaces("!:empty intf A!")
+    interface TestIntfMissingIntfA extends A { }
+
+    @ExpectInterfaces("!:empty intf A!, intf OK")
+    interface TestIntfMissingIntfAOK extends A, OK { }
+
+    @ExpectInterfaces("intf OK, !:empty intf A!")
+    interface TestIntfOKMissingIntfA extends OK, A { }
+
+    @ExpectInterfaces("!:empty intf A!, !:empty intf B!")
+    interface TestIntfMissingIntfAB extends A, B { }
+
+    @ExpectInterfaces("!:empty intf A!<tvar T>")
+    class TestClassTMissingIntfAT<T> implements A<T> { }
+
+    @ExpectInterfaces("!:empty intf A!<tvar T>, !:empty intf B!")
+    class TestClassTMissingIntfAT_B<T> implements A<T>, B { }
+
+    @ExpectInterfaces("!:empty intf A!<tvar T>")
+    interface TestIntfTMissingIntfAT<T> extends A<T> { }
+
+    @ExpectInterfaces("!:empty intf A!<tvar T>, !:empty intf B!")
+    interface TestIntfTMissingIntfAT_B<T> extends A<T>, B { }
+
+    @ExpectInterfaces("intf (pkg java.util).List<!:empty clss X!>")
+    abstract class TestClassListMissingX implements List<X> { }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement/TestMissingElement.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @build JavacTestingAbstractProcessor TestMissingElement
+ * @compile -proc:only -XprintRounds -processor TestMissingElement InvalidSource.java
+ */
+
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.lang.model.type.*;
+import javax.lang.model.util.*;
+import static javax.tools.Diagnostic.Kind.*;
+
+public class TestMissingElement extends JavacTestingAbstractProcessor {
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        for (TypeElement te: ElementFilter.typesIn(roundEnv.getRootElements())) {
+            if (isSimpleName(te, "InvalidSource")) {
+                for (Element c: te.getEnclosedElements()) {
+                    for (AnnotationMirror am: c.getAnnotationMirrors()) {
+                        Element ate = am.getAnnotationType().asElement();
+                        if (isSimpleName(ate, "ExpectInterfaces")) {
+                            checkInterfaces((TypeElement) c, getValue(am));
+                        } else if (isSimpleName(ate, "ExpectSupertype")) {
+                            checkSupertype((TypeElement) c, getValue(am));
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    private boolean isSimpleName(Element e, String name) {
+        return e.getSimpleName().contentEquals(name);
+    }
+
+    private String getValue(AnnotationMirror am) {
+        Map<? extends ExecutableElement, ? extends AnnotationValue> map = am.getElementValues();
+        if (map.size() != 1) throw new IllegalArgumentException();
+        AnnotationValue v = map.values().iterator().next();
+        return (String) v.getValue();
+    }
+
+    private void checkInterfaces(TypeElement te, String expect) {
+        System.err.println("check interfaces: " + te + " -- " + expect);
+        String found = asString(te.getInterfaces(), ", ");
+        checkEqual("interfaces", te, found, expect);
+    }
+
+    private void checkSupertype(TypeElement te, String expect) {
+        System.err.println("check supertype: " + te + " -- " + expect);
+        String found = asString(te.getSuperclass());
+        checkEqual("supertype", te, found, expect);
+    }
+
+    private void checkEqual(String label, TypeElement te, String found, String expect) {
+        if (found.equals(expect)) {
+//            messager.printMessage(NOTE, "expected " + label + " found: " + expect, te);
+        } else {
+            System.err.println("unexpected " + label + ": " + te + "\n"
+                    + " found: " + found + "\n"
+                    + "expect: " + expect);
+            messager.printMessage(ERROR, "unexpected " + label + " found: " + found + "; expected: " + expect, te);
+        }
+    }
+
+    private String asString(List<? extends TypeMirror> ts, String sep) {
+        StringBuilder sb = new StringBuilder();
+        for (TypeMirror t: ts) {
+            if (sb.length() != 0) sb.append(sep);
+            sb.append(asString(t));
+        }
+        return sb.toString();
+    }
+
+    private String asString(TypeMirror t) {
+        if (t == null)
+            return "[typ:null]";
+        return t.accept(new SimpleTypeVisitor7<String, Void>() {
+            @Override
+            public String defaultAction(TypeMirror t, Void ignore) {
+                return "[typ:" + t.toString() + "]";
+            }
+
+            @Override
+            public String visitDeclared(DeclaredType t, Void ignore) {
+                String s = asString(t.asElement());
+                List<? extends TypeMirror> args = t.getTypeArguments();
+                if (!args.isEmpty())
+                    s += "<" + asString(args, ",") + ">";
+                return s;
+            }
+
+            @Override
+            public String visitTypeVariable(TypeVariable t, Void ignore) {
+                return "tvar " + t;
+            }
+
+            @Override
+            public String visitError(ErrorType t, Void ignore) {
+                return "!:" + visitDeclared(t, ignore);
+            }
+        }, null);
+    }
+
+    private String asString(Element e) {
+        if (e == null)
+            return "[elt:null]";
+        return e.accept(new SimpleElementVisitor7<String, Void>() {
+            @Override
+            public String defaultAction(Element e, Void ignore) {
+                return "[elt:" + e.getKind() + " " + e.toString() + "]";
+            }
+            @Override
+            public String visitPackage(PackageElement e, Void ignore) {
+                return "pkg " + e.getQualifiedName();
+            }
+            @Override
+            public String visitType(TypeElement e, Void ignore) {
+                StringBuilder sb = new StringBuilder();
+                if (e.getEnclosedElements().isEmpty())
+                    sb.append("empty ");
+                ElementKind ek = e.getKind();
+                switch (ek) {
+                    case CLASS:
+                        sb.append("clss");
+                        break;
+                    case INTERFACE:
+                        sb.append("intf");
+                        break;
+                    default:
+                        sb.append(ek);
+                        break;
+                }
+                sb.append(" ");
+                Element encl = e.getEnclosingElement();
+                if (!isUnnamedPackage(encl) && encl.asType().getKind() != TypeKind.NONE) {
+                    sb.append("(");
+                    sb.append(asString(encl));
+                    sb.append(")");
+                    sb.append(".");
+                }
+                sb.append(e.getSimpleName());
+                if (e.asType().getKind() == TypeKind.ERROR) sb.append("!");
+                return sb.toString();
+            }
+        }, null);
+    }
+
+    boolean isUnnamedPackage(Element e) {
+        return (e != null && e.getKind() == ElementKind.PACKAGE
+                && ((PackageElement) e).isUnnamed());
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/Generator.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.*;
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.lang.model.type.*;
+import javax.lang.model.util.*;
+import javax.tools.*;
+
+public class Generator extends JavacTestingAbstractProcessor {
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        for (TypeElement te: ElementFilter.typesIn(roundEnv.getRootElements())) {
+            System.err.println(te);
+            generateIfMissing(te.getSuperclass());
+            generateIfMissing(te.getInterfaces());
+        }
+        return true;
+    }
+
+    void generateIfMissing(List<? extends TypeMirror> ts) {
+        for (TypeMirror t: ts)
+            generateIfMissing(t);
+    }
+
+    void generateIfMissing(TypeMirror t) {
+        if (t == null)
+            return;
+        if (t.getKind() == TypeKind.ERROR) {
+            Element e = ((ErrorType) t).asElement();
+            if (e == null)
+                return;
+            if (e.asType().getKind() == TypeKind.ERROR)
+                createFile((TypeElement) e);
+        }
+    }
+
+    void createFile(TypeElement e) {
+        try {
+            JavaFileObject fo = filer.createSourceFile(e.getSimpleName());
+            Writer out = fo.openWriter();
+            try {
+                switch (e.getKind()) {
+                    case CLASS:
+                        out.write("import java.util.*;\n");
+                        out.write("class " + signature(e) + " {\n");
+                        out.write("    public void run() {\n");
+                        out.write("        Class<?> c = getClass();\n");
+                        out.write("        System.out.println(\"class: \" + c);\n");
+                        out.write("        System.out.println(\"superclass: \" + c.getSuperclass());\n");
+                        out.write("        System.out.println(\"generic superclass: \" +c.getGenericSuperclass());\n");
+                        out.write("        System.out.println(\"interfaces: \" + Arrays.asList(c.getInterfaces()));\n");
+                        out.write("        System.out.println(\"generic interfaces: \" + Arrays.asList(c.getGenericInterfaces()));\n");
+                        out.write("    }\n");
+                        out.write("}\n");
+                        break;
+                    case INTERFACE:
+                        out.write("interface " + signature(e) + " {\n");
+                        out.write("    void run();\n");
+                        out.write("}\n");
+                        break;
+                }
+            } finally {
+                out.close();
+            }
+        } catch (IOException ex) {
+            messager.printMessage(Diagnostic.Kind.ERROR, "problem writing file: " + ex);
+        }
+    }
+
+    String signature(TypeElement e) {
+        System.err.println("signature: " + e + " " + e.getTypeParameters());
+        StringBuilder sb = new StringBuilder();
+        sb.append(e.getSimpleName());
+        if (!e.getTypeParameters().isEmpty()) {
+            sb.append("<");
+            String sep = "";
+            for (TypeParameterElement t : e.getTypeParameters()) {
+                sb.append(sep);
+                sb.append(t);
+                sep = ",";
+            }
+            sb.append(">");
+        }
+        return sb.toString();
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingClass.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingClass.java
+ * @run main TestMissingClass
+ */
+
+public class TestMissingClass extends MissingClass {
+    public static void main(String... args) {
+        new TestMissingClass().run();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingGenericClass1.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @clean MissingGenericClass1
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingGenericClass1.java
+ * @run main TestMissingGenericClass1
+ */
+
+public class TestMissingGenericClass1 extends MissingGenericClass1<String> {
+    public static void main(String... args) {
+        new TestMissingGenericClass1().run();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingGenericClass2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @clean MissingGenericClass2
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingGenericClass2.java
+ * @run main TestMissingGenericClass2
+ */
+
+public class TestMissingGenericClass2 extends MissingGenericClass2<String,Integer> {
+    public static void main(String... args) {
+        new TestMissingGenericClass2().run();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingGenericInterface1.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2011, 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, asrm
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @clean MissingGenericInterface1
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingGenericInterface1.java
+ * @run main TestMissingGenericInterface1
+ */
+
+import java.util.*;
+
+public class TestMissingGenericInterface1 implements MissingGenericInterface1<String> {
+    public static void main(String... args) {
+        new TestMissingGenericInterface1().run();
+    }
+
+    @Override
+    public void run() {
+        Class<?> c = getClass();
+        System.out.println("class: " + c);
+        System.out.println("superclass: " + c.getSuperclass());
+        System.out.println("generic superclass: " +c.getGenericSuperclass());
+        System.out.println("interfaces: " + Arrays.asList(c.getInterfaces()));
+        System.out.println("generic interfaces: " + Arrays.asList(c.getGenericInterfaces()));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingGenericInterface2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2011, 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, asrm
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @clean MissingGenericInterface2
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingGenericInterface2.java
+ * @run main TestMissingGenericInterface2
+ */
+
+import java.util.*;
+
+public class TestMissingGenericInterface2 implements MissingGenericInterface2<Integer,String> {
+    public static void main(String... args) {
+        new TestMissingGenericInterface2().run();
+    }
+
+    @Override
+    public void run() {
+        Class<?> c = getClass();
+        System.out.println("class: " + c);
+        System.out.println("superclass: " + c.getSuperclass());
+        System.out.println("generic superclass: " +c.getGenericSuperclass());
+        System.out.println("interfaces: " + Arrays.asList(c.getInterfaces()));
+        System.out.println("generic interfaces: " + Arrays.asList(c.getGenericInterfaces()));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestMissingElement2/TestMissingInterface.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2011, 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, asrm
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6639645
+ * @summary Modeling type implementing missing interfaces
+ * @library ../../../../lib
+ * @build JavacTestingAbstractProcessor Generator
+ * @compile -XprintRounds -processor Generator TestMissingInterface.java
+ * @run main TestMissingInterface
+ */
+
+import java.util.*;
+
+public class TestMissingInterface implements MissingInterface {
+    public static void main(String... args) {
+        new TestMissingInterface().run();
+    }
+
+    @Override
+    public void run() {
+        Class<?> c = getClass();
+        System.out.println("class: " + c);
+        System.out.println("superclass: " + c.getSuperclass());
+        System.out.println("generic superclass: " +c.getGenericSuperclass());
+        System.out.println("interfaces: " + Arrays.asList(c.getInterfaces()));
+        System.out.println("generic interfaces: " + Arrays.asList(c.getGenericInterfaces()));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/warnings/UseImplicit/C1.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+class C1 extends p.C2 { }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/warnings/UseImplicit/TestProcUseImplicitWarning.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6986892
+ * @summary confusing warning given after errors in annotation processing
+ * @library ../../../lib
+ * @build JavacTestingAbstractProcessor TestProcUseImplicitWarning
+ * @clean C1 p.C2
+ * @compile/fail/ref=err.out -XDrawDiagnostics -processor TestProcUseImplicitWarning -Aerror C1.java
+ * @clean C1 p.C2
+ * @compile/ref=warn.out     -XDrawDiagnostics -processor TestProcUseImplicitWarning         C1.java
+ */
+
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import static javax.tools.Diagnostic.Kind.*;
+
+@SupportedOptions("error")
+public class TestProcUseImplicitWarning extends JavacTestingAbstractProcessor {
+
+    int round = 0;
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        round++;
+
+        if (round == 1) {
+            boolean error = options.containsKey("error");
+            if (error)
+                messager.printMessage(ERROR, "error generated per option");
+        }
+
+        return false;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/warnings/UseImplicit/err.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+- compiler.err.proc.messager: error generated per option
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/warnings/UseImplicit/p/C2.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package p;
+
+public class C2 { }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/warnings/UseImplicit/warn.out	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,2 @@
+- compiler.warn.proc.use.implicit
+1 warning
--- a/langtools/test/tools/javac/processing/warnings/gold_0.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/processing/warnings/gold_0.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,1 +1,2 @@
 - compiler.warn.proc.messager: No SourceVersion option given
+1 warning
--- a/langtools/test/tools/javac/processing/warnings/gold_sv_warn_0_2.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/processing/warnings/gold_sv_warn_0_2.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,1 +1,2 @@
 - compiler.warn.proc.processor.incompatible.source.version: RELEASE_0, TestSourceVersionWarnings, 1.2
+1 warning
--- a/langtools/test/tools/javac/processing/warnings/gold_sv_warn_2_3.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/processing/warnings/gold_sv_warn_2_3.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,1 +1,2 @@
 - compiler.warn.proc.processor.incompatible.source.version: RELEASE_2, TestSourceVersionWarnings, 1.3
+1 warning
--- a/langtools/test/tools/javac/processing/warnings/gold_sv_warn_5_6.out	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/processing/warnings/gold_sv_warn_5_6.out	Fri Mar 18 15:44:45 2011 -0700
@@ -1,1 +1,2 @@
 - compiler.warn.proc.processor.incompatible.source.version: RELEASE_5, TestSourceVersionWarnings, 1.6
+1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/util/context/T7021650.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7021650
+ * @summary Fix Context issues
+ * @library ../../lib
+ * @build JavacTestingAbstractProcessor T7021650
+ * @run main T7021650
+ */
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.tools.*;
+
+import com.sun.tools.javac.comp.Attr;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.main.Main;
+import com.sun.tools.javac.processing.JavacProcessingEnvironment;
+import com.sun.tools.javac.util.Context;
+
+public class T7021650 extends JavacTestingAbstractProcessor {
+    public static void main(String... args) throws Exception {
+        new T7021650().run();
+    }
+
+    static File testSrc = new File(System.getProperty("test.src"));
+    static final int MAX_ROUNDS = 3;
+
+    /**
+     * Perform a compilation with custom factories registered in the context,
+     * and verify that corresponding objects are created in each round.
+     */
+    void run() throws Exception {
+        Counter demoCounter = new Counter();
+        Counter myAttrCounter = new Counter();
+
+        Context context = new Context();
+        // Use a custom file manager which creates classloaders for annotation
+        // processors with a sensible delegation parent, so that all instances
+        // of test classes come from the same class loader. This is important
+        // because the test performs class checks on the instances of classes
+        // found in the context for each round or processing.
+        context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() {
+            public JavaFileManager make(Context c) {
+                return new JavacFileManager(c, true, null) {
+                    @Override
+                    protected ClassLoader getClassLoader(URL[] urls) {
+                        return new URLClassLoader(urls, T7021650.class.getClassLoader());
+                    }
+                };
+            }
+        });
+
+        Demo.preRegister(context, demoCounter);
+        MyAttr.preRegister(context, myAttrCounter);
+
+        String[] args = {
+            "-d", ".",
+            "-processor", T7021650.class.getName(),
+            "-XprintRounds",
+            new File(testSrc, T7021650.class.getName() + ".java").getPath()
+        };
+
+        compile(context, args);
+
+        // Expect to create Demo for initial round, then MAX_ROUNDS in which
+        // GenX files are generated, then standard final round of processing.
+        checkEqual("demoCounter", demoCounter.count, MAX_ROUNDS + 2);
+
+        // Expect to create MyAttr for same processing rounds as for Demo,
+        // plus additional context for final compilation.
+        checkEqual("myAttrCounter", myAttrCounter.count, MAX_ROUNDS + 3);
+    }
+
+    void compile(Context context, String... args) throws Exception {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        Main m = new Main("javac", pw);
+        int rc = m.compile(args, context);
+        pw.close();
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        if (rc != 0)
+            throw new Exception("compilation failed unexpectedly: rc=" + rc);
+    }
+
+    void checkEqual(String label, int found, int expect) throws Exception {
+        if (found != expect)
+            throw new Exception("unexpected value for " + label
+                    + ": expected " + expect
+                    + ": found " + found);
+    }
+
+    //---------------
+
+    /*
+     * A custom class unknown to javac but nonetheless registered in the context.
+     */
+    static class Demo {
+        static void preRegister(Context context, final Counter counter) {
+            context.put(Demo.class, new Context.Factory<Demo>() {
+                public Demo make(Context c) {
+                    counter.count++;
+                    return new Demo(c);
+                }
+            });
+        }
+
+        Demo(Context c) {
+            c.put(Demo.class, this);
+        }
+
+        static Demo instance(Context context) {
+            return context.get(Demo.class);
+        }
+    }
+
+    /**
+     * A custom version of a standard javac component.
+     */
+    static class MyAttr extends Attr {
+        static void preRegister(Context context, final Counter counter) {
+            context.put(attrKey, new Context.Factory<Attr>() {
+                public Attr make(Context c) {
+                    counter.count++;
+                    return new MyAttr(c);
+                }
+            });
+        }
+
+        MyAttr(Context c) {
+            super(c);
+        }
+    }
+
+    static class Counter {
+        int count;
+    }
+
+    //---------------
+
+    int round = 0;
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        round++;
+
+        Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
+
+        // verify items in context as expected
+        check("Demo", Demo.instance(context), Demo.class);
+        check("Attr", Attr.instance(context), MyAttr.class);
+
+        // For a few rounds, generate new source files, so that we can check whether
+        // values in the context are correctly handled in subsequent processing rounds
+        if (round <= MAX_ROUNDS) {
+            String pkg = "p";
+            String currClass = "Gen" + round;
+            String curr = pkg + "." + currClass;
+            String next = (pkg + ".Gen" + (round + 1));
+            StringBuilder text = new StringBuilder();
+            text.append("package ").append(pkg).append(";\n");
+            text.append("public class ").append(currClass).append(" {\n");
+            if (round < MAX_ROUNDS)
+                text.append("    ").append(next).append(" x;\n");
+            text.append("}\n");
+
+            try {
+                JavaFileObject fo = filer.createSourceFile(curr);
+                Writer out = fo.openWriter();
+                try {
+                    out.write(text.toString());
+                } finally {
+                    out.close();
+                }
+            } catch (IOException e) {
+                throw new Error(e);
+            }
+        }
+
+        return true;
+    }
+
+    void check(String label, Object o, Class<?> clazz) {
+        if (o == null)
+            throw new IllegalStateException(label + ": no item found");
+        if (!clazz.isAssignableFrom(o.getClass()))
+            throw new IllegalStateException(label + ": unexpected class: " + o.getClass());
+    }
+}
--- a/langtools/test/tools/javac/varargs/6199075/T6199075.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/varargs/6199075/T6199075.java	Fri Mar 18 15:44:45 2011 -0700
@@ -37,6 +37,7 @@
 import com.sun.tools.classfile.Code_attribute;
 import com.sun.tools.classfile.ConstantPool.*;
 import com.sun.tools.classfile.Method;
+import com.sun.tools.javac.api.JavacTool;
 import com.sun.tools.javac.util.List;
 
 import java.io.File;
@@ -47,6 +48,7 @@
 import javax.tools.JavaCompiler;
 import javax.tools.JavaFileObject;
 import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
 public class T6199075 {
@@ -157,11 +159,14 @@
         System.out.println("Bytecode checks made: " + bytecodeCheckCount);
     }
 
+    // Create a single file manager and reuse it for each compile to save time.
+    StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+
     void compileAndCheck(VarargsMethod m1, VarargsMethod m2, TypeKind actual, ArgumentsArity argsArity) throws Exception {
         final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         JavaSource source = new JavaSource(m1, m2, actual, argsArity);
         ErrorChecker ec = new ErrorChecker();
-        JavacTask ct = (JavacTask)tool.getTask(null, null, ec,
+        JavacTask ct = (JavacTask)tool.getTask(null, fm, ec,
                 null, null, Arrays.asList(source));
         ct.generate();
         check(source, ec, m1, m2, actual, argsArity);
--- a/langtools/test/tools/javac/varargs/warning/Warn4.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/varargs/warning/Warn4.java	Fri Mar 18 15:44:45 2011 -0700
@@ -29,6 +29,7 @@
  * @run main Warn4
  */
 import com.sun.source.util.JavacTask;
+import com.sun.tools.javac.api.JavacTool;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Set;
@@ -37,6 +38,7 @@
 import javax.tools.JavaCompiler;
 import javax.tools.JavaFileObject;
 import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
 public class Warn4 {
@@ -187,12 +189,15 @@
         }
     }
 
+    // Create a single file manager and reuse it for each compile to save time.
+    static StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+
     static void test(SourceLevel sourceLevel, TrustMe trustMe, SuppressLevel suppressLevelClient,
             SuppressLevel suppressLevelDecl, ModifierKind modKind, Signature vararg_meth, Signature client_meth) throws Exception {
         final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         JavaSource source = new JavaSource(trustMe, suppressLevelClient, suppressLevelDecl, modKind, vararg_meth, client_meth);
         DiagnosticChecker dc = new DiagnosticChecker();
-        JavacTask ct = (JavacTask)tool.getTask(null, null, dc,
+        JavacTask ct = (JavacTask)tool.getTask(null, fm, dc,
                 Arrays.asList("-Xlint:unchecked", "-source", sourceLevel.sourceKey),
                 null, Arrays.asList(source));
         ct.generate(); //to get mandatory notes
--- a/langtools/test/tools/javac/varargs/warning/Warn5.java	Fri Mar 18 17:56:47 2011 +0300
+++ b/langtools/test/tools/javac/varargs/warning/Warn5.java	Fri Mar 18 15:44:45 2011 -0700
@@ -29,6 +29,7 @@
  * @run main Warn5
  */
 import com.sun.source.util.JavacTask;
+import com.sun.tools.javac.api.JavacTool;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -36,6 +37,7 @@
 import javax.tools.JavaCompiler;
 import javax.tools.JavaFileObject;
 import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
 public class Warn5 {
@@ -207,12 +209,15 @@
         }
     }
 
+    // Create a single file manager and reuse it for each compile to save time.
+    static StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+
     static void test(SourceLevel sourceLevel, XlintOption xlint, TrustMe trustMe, SuppressLevel suppressLevel,
             ModifierKind modKind, MethodKind methKind, SignatureKind sig, BodyKind body) throws Exception {
         final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         JavaSource source = new JavaSource(trustMe, suppressLevel, modKind, methKind, sig, body);
         DiagnosticChecker dc = new DiagnosticChecker();
-        JavacTask ct = (JavacTask)tool.getTask(null, null, dc,
+        JavacTask ct = (JavacTask)tool.getTask(null, fm, dc,
                 Arrays.asList(xlint.getXlintOption(), "-source", sourceLevel.sourceKey), null, Arrays.asList(source));
         ct.analyze();
         check(sourceLevel, dc, source, xlint, trustMe,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6227454/Test.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6227454
+ * @summary package.html and overview.html may not be read fully
+ */
+
+import java.io.*;
+
+import com.sun.javadoc.Doclet;
+import com.sun.javadoc.RootDoc;
+
+public class Test extends Doclet {
+    public static void main(String... args) throws Exception {
+        new Test().run();
+    }
+
+    void run() throws Exception {
+        test("<html><body>ABC      XYZ</body></html>");
+        test("<html><body>ABC      XYZ</BODY></html>");
+        test("<html><BODY>ABC      XYZ</body></html>");
+        test("<html><BODY>ABC      XYZ</BODY></html>");
+        test("<html><BoDy>ABC      XYZ</bOdY></html>");
+        test("<html>      ABC      XYZ</bOdY></html>", "Body tag missing from HTML");
+        test("<html><body>ABC      XYZ       </html>", "Close body tag missing from HTML");
+        test("<html>      ABC      XYZ       </html>", "Body tag missing from HTML");
+        test("<html><body>ABC" + bigText(8192, 40) + "XYZ</body></html>");
+
+        if (errors > 0)
+            throw new Exception(errors + " errors occurred");
+    }
+
+    void test(String text) throws IOException {
+        test(text, null);
+    }
+
+    void test(String text, String expectError) throws IOException {
+        testNum++;
+        System.err.println("test " + testNum);
+        File file = writeFile("overview" + testNum + ".html", text);
+        String thisClassName = Test.class.getName();
+        File testSrc = new File(System.getProperty("test.src"));
+        String[] args = {
+            "-bootclasspath",
+                System.getProperty("java.class.path")
+                + File.pathSeparator
+                + System.getProperty("sun.boot.class.path"),
+            "-classpath", ".",
+            "-package",
+            "-overview", file.getPath(),
+            new File(testSrc, thisClassName + ".java").getPath()
+        };
+
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        int rc = com.sun.tools.javadoc.Main.execute(
+                "javadoc",
+                pw, pw, pw,
+                thisClassName,
+                args);
+        pw.close();
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        System.err.println("javadoc exit: rc=" + rc);
+
+        if (expectError == null) {
+            if (rc != 0)
+                error("unexpected exit from javadoc; rc:" + rc);
+        } else {
+            if (!out.contains(expectError))
+                error("expected error text not found: " + expectError);
+        }
+    }
+
+    String bigText(int lines, int lineLength) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < lineLength; i++)
+            sb.append(String.valueOf(i % 10));
+        sb.append("\n");
+        String line = sb.toString();
+        sb.setLength(0);
+        for (int i = 0; i < lines; i++)
+            sb.append(line);
+        return sb.toString();
+    }
+
+    File writeFile(String path, String body) throws IOException {
+        File f = new File(path);
+        FileWriter out = new FileWriter(f);
+        try {
+            out.write(body);
+        } finally {
+            out.close();
+        }
+        return f;
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int testNum;
+    int errors;
+
+    public static boolean start(RootDoc root) {
+        String text = root.commentText();
+        if (text.length() < 64)
+            System.err.println("text: '" + text + "'");
+        else
+            System.err.println("text: '"
+                    + text.substring(0, 20)
+                    + "..."
+                    + text.substring(text.length() - 20)
+                    + "'");
+        return text.startsWith("ABC") && text.endsWith("XYZ");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/Error.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class Error {
+    Object x // no semicolon
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/JavacWarning.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class JavacWarning {
+    int enum;  // warning in source 1.4
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/JavadocWarning.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class JavadocWarning {
+    /** @see DoesNotExist */
+    int x;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/Test.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6964914
+ * @summary javadoc does not output number of warnings using user written doclet
+ */
+
+import java.io.*;
+
+public class Test {
+    public static void main(String... args) throws Exception {
+        new Test().run();
+    }
+
+    public void run() throws Exception {
+        javadoc("Error.java", "1 error");
+        javadoc("JavacWarning.java", "1 warning");
+        javadoc("JavadocWarning.java", "1 warning");
+        if (errors > 0)
+            throw new Exception(errors + " errors found");
+    }
+
+    void javadoc(String path, String expect) {
+        File testSrc = new File(System.getProperty("test.src"));
+        String[] args = {
+            "-source", "1.4", // enables certain Parser warnings
+            "-bootclasspath", System.getProperty("sun.boot.class.path"),
+            "-classpath", ".",
+            "-package",
+            new File(testSrc, path).getPath()
+        };
+
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        int rc = com.sun.tools.javadoc.Main.execute(
+                "javadoc",
+                pw, pw, pw,
+                com.sun.tools.doclets.standard.Standard.class.getName(),
+                args);
+        pw.close();
+        String out = sw.toString();
+        if (!out.isEmpty())
+            System.err.println(out);
+        System.err.println("javadoc exit: rc=" + rc);
+
+        if (!out.contains(expect))
+            error("expected text not found: " + expect);
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int errors;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/TestStdDoclet.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6964914
+ * @summary javadoc does not output number of warnings using user written doclet
+ */
+
+import java.io.*;
+
+/**
+ * Dummy javadoc comment.
+ * @author jjg
+ * @see DoesNotExist
+ */
+public class TestStdDoclet {
+    public static void main(String... args) throws Exception {
+        new TestStdDoclet().run();
+    }
+
+    /**
+     * More dummy comments.
+     * @throws DoesNotExist   oops, javadoc does not see this
+     * @see DoesNotExist
+     */
+    void run() throws Exception {
+        File javaHome = new File(System.getProperty("java.home"));
+        if (javaHome.getName().equals("jre"))
+            javaHome = javaHome.getParentFile();
+        File javadoc = new File(new File(javaHome, "bin"), "javadoc");
+        File testSrc = new File(System.getProperty("test.src"));
+
+        // run javadoc in separate process to ensure doclet executed under
+        // normal user conditions w.r.t. classloader
+        String thisClassName = TestStdDoclet.class.getName();
+        Process p = new ProcessBuilder()
+            .command(javadoc.getPath(),
+                "-J-Xbootclasspath:" + System.getProperty("sun.boot.class.path"),
+                "-package",
+                new File(testSrc, thisClassName + ".java").getPath())
+            .redirectErrorStream(true)
+            .start();
+
+        int actualDocletWarnCount = 0;
+        int reportedDocletWarnCount = 0;
+        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
+        try {
+            String line;
+            while ((line = in.readLine()) != null) {
+                System.err.println(line);
+                if (line.contains("DoesNotExist"))
+                    actualDocletWarnCount++;
+                if (line.matches("[0-9]+ warning(s)?"))
+                    reportedDocletWarnCount =
+                            Integer.valueOf(line.substring(0, line.indexOf(" ")));
+            }
+        } finally {
+            in.close();
+        }
+        int rc = p.waitFor();
+        if (rc != 0)
+            System.err.println("javadoc failed, rc:" + rc);
+
+        int expectedDocletWarnCount = 2;
+        checkEqual("actual", actualDocletWarnCount, "expected", expectedDocletWarnCount);
+        checkEqual("actual", actualDocletWarnCount, "reported", reportedDocletWarnCount);
+    }
+
+    /**
+     * Private method should not cause a warning.
+     * @see DoesNotExist
+     */
+    private void checkEqual(String l1, int i1, String l2, int i2) throws Exception {
+        if (i1 != i2)
+            throw new Exception(l1 + " warn count, " + i1 + ", does not match "
+                        + l2 + " warn count, " + i2);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6964914/TestUserDoclet.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6964914
+ * @summary javadoc does not output number of warnings using user written doclet
+ */
+
+import java.io.*;
+import com.sun.javadoc.Doclet;
+import com.sun.javadoc.RootDoc;
+
+public class TestUserDoclet extends Doclet {
+    public static void main(String... args) throws Exception {
+        new TestUserDoclet().run();
+    }
+
+    static final String docletWarning = "warning from test doclet";
+
+    /** Main doclet method. */
+    public static boolean start(RootDoc root) {
+        root.printWarning(null, docletWarning);
+        return true;
+    }
+
+    /** Main test method. */
+    void run() throws Exception {
+        File javaHome = new File(System.getProperty("java.home"));
+        if (javaHome.getName().equals("jre"))
+            javaHome = javaHome.getParentFile();
+        File javadoc = new File(new File(javaHome, "bin"), "javadoc");
+        File testSrc = new File(System.getProperty("test.src"));
+        File testClasses = new File(System.getProperty("test.classes"));
+
+        // run javadoc in separate process to ensure doclet executed under
+        // normal user conditions w.r.t. classloader
+        String thisClassName = TestUserDoclet.class.getName();
+        Process p = new ProcessBuilder()
+            .command(javadoc.getPath(),
+                "-J-Xbootclasspath:" + System.getProperty("sun.boot.class.path"),
+                "-doclet", thisClassName,
+                "-docletpath", testClasses.getPath(),
+                new File(testSrc, thisClassName + ".java").getPath())
+            .redirectErrorStream(true)
+            .start();
+
+        int actualDocletWarnCount = 0;
+        int reportedDocletWarnCount = 0;
+        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
+        try {
+            String line;
+            while ((line = in.readLine()) != null) {
+                System.err.println(line);
+                if (line.contains(docletWarning))
+                    actualDocletWarnCount++;
+                if (line.matches("[0-9]+ warning(s)?"))
+                    reportedDocletWarnCount =
+                            Integer.valueOf(line.substring(0, line.indexOf(" ")));
+            }
+        } finally {
+            in.close();
+        }
+        int rc = p.waitFor();
+        if (rc != 0)
+            System.err.println("javadoc failed, rc:" + rc);
+
+        int expectedDocletWarnCount = 1;
+        checkEqual("actual", actualDocletWarnCount, "expected", expectedDocletWarnCount);
+        checkEqual("actual", actualDocletWarnCount, "reported", reportedDocletWarnCount);
+    }
+
+    void checkEqual(String l1, int i1, String l2, int i2) throws Exception {
+        if (i1 != i2)
+            throw new Exception(l1 + " warn count, " + i1 + ", does not match "
+                        + l2 + " warn count, " + i2);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/T6968833.java	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6968833
+ * @summary javadoc reports error but still returns 0
+ */
+
+import java.io.*;
+
+public class T6968833 {
+    public static void main(String... args) throws IOException {
+        new T6968833().run();
+    }
+
+    void run() throws IOException {
+        File srcDir = new File("src");
+        // following file causes error: No public or protected classes found to document.
+        File f = writeFile(srcDir, "Foo.java", "class Foo { }");
+        String[] args = { f.getPath() };
+        int rc = com.sun.tools.javadoc.Main.execute(args);
+        if (rc == 0)
+            throw new Error("Unexpected exit from javadoc: " + rc);
+    }
+
+    File writeFile(File dir, String path, String s) throws IOException {
+        File f = new File(dir, path);
+        f.getParentFile().mkdirs();
+        try (Writer out = new FileWriter(f)) {
+            out.write(s);
+        }
+        return f;
+    }
+}
+
--- a/make/Defs-internal.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/Defs-internal.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -28,21 +28,63 @@
 # not contain rules.
 #
 
-# Indicate that we are visiting a separate repo or component 
+# The build times report is turned off by setting REPORT_BUILD_TIMES to nothing.
+# This is necessary for the target clobber/clean which will erase the
+# directories where the buildtimes are stored.
+REPORT_BUILD_TIMES=1
+# Store the build times in this directory.
+BUILDTIMESDIR=$(ABS_OUTPUTDIR)/tmp/buildtimes
+
+# Record starting time for build of a sub repository.
+define RecordStartTime
+$(MKDIR) -p $(BUILDTIMESDIR)
+$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1
+$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable
+endef
+
+# Indicate that we started to build a sub repository and record starting time. 
 define MakeStart
-$(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n" \
+$(call RecordStartTime,$1)
+$(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n\n" \
 "########################################################################" \
 "########################################################################" \
-"Entering $1 for target $2" \
+"Entering $1 for target(s) $2" \
 "########################################################################"
 endef
 
-define MakeFinish
-$(PRINTF) "%s\n##### %-60.60s #####\n%s\n%s\n\n" \
+# Record ending time and calculate the difference and store it in a
+# easy to read format. Handles builds that cross midnight. Expects
+# that a build will never take 24 hours or more. 
+define RecordEndTime
+$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1
+$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable
+$(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \
+  $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \
+             M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \
+  > $(BUILDTIMESDIR)/build_time_diff_$1
+endef
+
+# Indicate that we are done.
+# Record ending time and print out the total time it took to build.
+define MakeFinish 
+$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,$1),) 
+$(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s #####\n%s\n\n" \
 "########################################################################" \
-"Leaving $1 for target $2" \
+"Leaving $1 for target(s) $2" \
 "########################################################################" \
-"########################################################################"
+$(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \
+"########################################################################" 
+endef
+
+# Find all build_time_* files and print their contents in a list sorted
+# on the name of the sub repository.
+define ReportBuildTimes
+$(PRINTF) "-- Build times ----------\nTarget %s\nStart %s\nEnd   %s\n%s\n%s\n-------------------------\n" \
+$1 \
+"`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \
+"`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \
+"`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \
+"`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`"
 endef
 
 ifdef OPENJDK
--- a/make/corba-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/corba-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -40,17 +40,17 @@
 corba: corba-build
 corba-build:
 	$(MKDIR) -p $(CORBA_OUTPUTDIR)
-	@$(call MakeStart, corba, all)
+	@$(call MakeStart,corba,all)
 	($(CD) $(CORBA_TOPDIR)/make && \
 	 $(MAKE) $(CORBA_BUILD_ARGUMENTS) all)
-	@$(call MakeFinish, corba, all)
+	@$(call MakeFinish,corba,all)
 
 corba-clobber::
 	$(MKDIR) -p $(CORBA_OUTPUTDIR)
-	@$(call MakeStart, corba, clobber)
+	@$(call MakeStart,corba,clobber)
 	($(CD) $(CORBA_TOPDIR)/make &&  \
 	 $(MAKE) $(CORBA_BUILD_ARGUMENTS) clobber)
-	@$(call MakeFinish, corba, clobber)
+	@$(call MakeFinish,corba,clobber)
 
 .PHONY: corba corba-build corba-clobber 
 
--- a/make/deploy-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/deploy-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -116,18 +116,18 @@
 
 deploy-build:
 ifeq ($(BUILD_DEPLOY), true)
-	@$(call MakeStart, deploy, $(DEPLOY_BUILD_TARGETS))
+	@$(call MakeStart,deploy,$(DEPLOY_BUILD_TARGETS))
 	($(CD) $(DEPLOY_TOPDIR)/make && \
 	  $(MAKE) $(DEPLOY_BUILD_TARGETS) $(DEPLOY_BUILD_ARGUMENTS))
-	@$(call MakeFinish, deploy, $(DEPLOY_BUILD_TARGETS))
+	@$(call MakeFinish,deploy,$(DEPLOY_BUILD_TARGETS))
 endif
 
 deploy-clobber::
 ifeq ($(BUILD_DEPLOY), true)
-	@$(call MakeStart, deploy, clobber)
+	@$(call MakeStart,deploy,clobber)
 	($(CD) $(DEPLOY_TOPDIR)/make && \
 	  $(MAKE) clobber $(DEPLOY_BUILD_ARGUMENTS))
-	@$(call MakeFinish, deploy, clobber)
+	@$(call MakeFinish,deploy,clobber)
 endif 
 
 deploy-sanity::
--- a/make/hotspot-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/hotspot-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -96,10 +96,10 @@
 hotspot-build::
 	$(MKDIR) -p $(HOTSPOT_OUTPUTDIR)
 	$(MKDIR) -p $(HOTSPOT_EXPORT_PATH)
-	@$(call MakeStart, hotspot, $(HOTSPOT_TARGET))
+	@$(call MakeStart,hotspot,$(HOTSPOT_TARGET))
 	$(CD) $(HOTSPOT_TOPDIR)/make && \
 	    $(MAKE) $(HOTSPOT_BUILD_ARGUMENTS) $(HOTSPOT_TARGET)
-	@$(call MakeFinish, hotspot, $(HOTSPOT_TARGET))
+	@$(call MakeFinish,hotspot,$(HOTSPOT_TARGET))
 
 #####################
 # .PHONY
--- a/make/install-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/install-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -57,39 +57,39 @@
 
 install-build:
 ifeq ($(BUILD_INSTALL), true)
-	@$(call MakeStart, install, $(INSTALL_BUILD_TARGETS))
+	@$(call MakeStart,install,$(INSTALL_BUILD_TARGETS))
 	($(CD) $(INSTALL_TOPDIR)/make && \
 	  $(MAKE) $(INSTALL_BUILD_TARGETS) $(INSTALL_BUILD_ARGUMENTS))
-	@$(call MakeFinish, install, $(INSTALL_BUILD_TARGETS))
+	@$(call MakeFinish,install,$(INSTALL_BUILD_TARGETS))
 endif
 
 update-patcher:
 ifeq ($(BUILD_INSTALL), true)
 	if [ -r $(INSTALL_TOPDIR)/make/update/Makefile ]; then \
-	  $(call MakeStart, install update, all); \
+	  $(call MakeStart,install_update,all); \
 	  ( $(CD) $(INSTALL_TOPDIR)/make/update && \
 	    $(MAKE) all $(INSTALL_BUILD_ARGUMENTS) ); \
-	  $(call MakeFinish, install, all); \
+	  $(call MakeFinish,install_update,all); \
 	fi
 endif
 
 update-patchgen:
 ifeq ($(BUILD_INSTALL), true)
 	if [ -r $(INSTALL_TOPDIR)/make/update/Makefile ]; then \
-	  $(call MakeStart, install update, patchgen); \
+	  $(call MakeStart,install_update,patchgen); \
 	  ( $(CD) $(INSTALL_TOPDIR)/make/update && \
 	    $(MAKE) patchgen $(INSTALL_BUILD_ARGUMENTS) ); \
-	  $(call MakeFinish, install, patchgen); \
+	  $(call MakeFinish,install_update,patchgen); \
 	fi
 endif
 
 installer:
 ifeq ($(BUILD_INSTALL), true)
 	if [ -r $(INSTALL_TOPDIR)/make/installer/Makefile ]; then \
-	  $(call MakeStart, install installer, all); \
+	  $(call MakeStart,install_installer,all); \
 	  ( $(CD) $(INSTALL_TOPDIR)/make/installer && \
 	    $(MAKE) all $(INSTALL_BUILD_ARGUMENTS) ); \
-	  $(call MakeFinish, install, all); \
+	  $(call MakeFinish,install_installer,all); \
 	fi
 endif
 
@@ -99,10 +99,10 @@
 
 install-clobber:
 ifeq ($(BUILD_INSTALL), true)
-	@$(call MakeStart, install, clobber)
+	@$(call MakeStart,install,clobber)
 	($(CD) $(INSTALL_TOPDIR)/make && \
 	  $(MAKE) clobber $(INSTALL_BUILD_ARGUMENTS))
-	@$(call MakeFinish, install, clobber)
+	@$(call MakeFinish,install,clobber)
 endif
 
 install-sanity:: 
--- a/make/jaxp-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/jaxp-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -40,17 +40,17 @@
 jaxp: jaxp-build
 jaxp-build:
 	$(MKDIR) -p $(JAXP_OUTPUTDIR)
-	@$(call MakeStart, jaxp, all)
+	@$(call MakeStart,jaxp,all)
 	($(CD) $(JAXP_TOPDIR)/make && \
 	 $(MAKE) $(JAXP_BUILD_ARGUMENTS) all)
-	@$(call MakeFinish, jaxp, all)
+	@$(call MakeFinish,jaxp,all)
 
 jaxp-clobber::
 	$(MKDIR) -p $(JAXP_OUTPUTDIR)
-	@$(call MakeStart, jaxp, clobber)
+	@$(call MakeStart,jaxp,clobber)
 	($(CD) $(JAXP_TOPDIR)/make &&  \
 	 $(MAKE) $(JAXP_BUILD_ARGUMENTS) clobber)
-	@$(call MakeFinish, jaxp, clobber)
+	@$(call MakeFinish,jaxp,clobber)
 
 .PHONY: jaxp jaxp-build jaxp-clobber
 
--- a/make/jaxws-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/jaxws-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -40,17 +40,17 @@
 jaxws: jaxws-build
 jaxws-build:
 	$(MKDIR) -p $(JAXWS_OUTPUTDIR)
-	@$(call MakeStart, jaxws, all)
+	@$(call MakeStart,jaxws,all)
 	($(CD) $(JAXWS_TOPDIR)/make && \
 	 $(MAKE) $(JAXWS_BUILD_ARGUMENTS) all)
-	@$(call MakeFinish, jaxws, all)
+	@$(call MakeFinish,jaxws,all)
 
 jaxws-clobber::
 	$(MKDIR) -p $(JAXWS_OUTPUTDIR)
-	@$(call MakeStart, jaxws, clobber)
+	@$(call MakeStart,jaxws,clobber)
 	($(CD) $(JAXWS_TOPDIR)/make &&  \
 	 $(MAKE) $(JAXWS_BUILD_ARGUMENTS) clobber)
-	@$(call MakeFinish, jaxws, clobber)
+	@$(call MakeFinish,jaxws,clobber)
 
 .PHONY: jaxws jaxws-build jaxws-clobber
 
--- a/make/jdk-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/jdk-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -75,16 +75,16 @@
 
 jdk: jdk-build
 jdk-build:
-	@$(call MakeStart, jdk, $(JDK_BUILD_TARGETS))
+	@$(call MakeStart,jdk,$(JDK_BUILD_TARGETS))
 	( $(CD) $(JDK_TOPDIR)/make && \
 	  $(MAKE) $(JDK_BUILD_TARGETS) $(JDK_BUILD_ARGUMENTS) ; )
-	@$(call MakeFinish, jdk, $(JDK_BUILD_TARGETS))
+	@$(call MakeFinish,jdk,$(JDK_BUILD_TARGETS))
 
 jdk-clobber::
-	@$(call MakeStart, jdk, $(JDK_CLOBBER_TARGETS))
+	@$(call MakeStart,jdk,$(JDK_CLOBBER_TARGETS))
 	( $(CD) $(JDK_TOPDIR)/make && \
 	  $(MAKE) $(JDK_CLOBBER_TARGETS) $(JDK_BUILD_ARGUMENTS) ; )
-	@$(call MakeFinish, jdk, $(JDK_CLOBBER_TARGETS))
+	@$(call MakeFinish,jdk,$(JDK_CLOBBER_TARGETS))
 
 jdk-sanity::
 	( $(CD) $(JDK_TOPDIR)/make && \
@@ -92,17 +92,17 @@
 
 compare-images: compare-image
 compare-image:
-	@$(call MakeStart, jdk, compare-image)
+	@$(call MakeStart,jdk,compare-image)
 	( $(CD) $(JDK_TOPDIR)/make && \
 	  $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image )
-	@$(call MakeFinish, jdk, compare-image)
+	@$(call MakeFinish,jdk,compare-image)
 
 compare-images-clobber: compare-image-clobber
 compare-image-clobber:
-	@$(call MakeStart, jdk, compare-image-clobber)
+	@$(call MakeStart,jdk,compare-image-clobber)
 	( $(CD) $(JDK_TOPDIR)/make && \
 	  $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image-clobber )
-	@$(call MakeFinish, jdk, compare-image-clobber)
+	@$(call MakeFinish,jdk,compare-image-clobber)
 
 .PHONY: jdk jdk-build jdk-clobber jdk-sanity 
 
--- a/make/langtools-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/langtools-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -35,17 +35,17 @@
 langtools: langtools-build
 langtools-build:
 	$(MKDIR) -p $(LANGTOOLS_OUTPUTDIR)
-	@$(call MakeStart, langtools, all)
+	@$(call MakeStart,langtools,all)
 	($(CD) $(LANGTOOLS_TOPDIR)/make && \
 	  $(MAKE) $(LANGTOOLS_BUILD_ARGUMENTS) all)
-	@$(call MakeFinish, langtools, all)
+	@$(call MakeFinish,langtools,all)
 
 langtools-clobber::
 	$(MKDIR) -p $(LANGTOOLS_OUTPUTDIR)
-	@$(call MakeStart, langtools, clobber)
+	@$(call MakeStart,langtools,clobber)
 	($(CD) $(LANGTOOLS_TOPDIR)/make &&  \
 	  $(MAKE) $(LANGTOOLS_BUILD_ARGUMENTS) clobber)
-	@$(call MakeFinish, langtools, clobber)
+	@$(call MakeFinish,langtools,clobber)
 
 .PHONY: langtools langtools-build langtools-clobber
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/scripts/webrev.ksh	Fri Mar 18 15:44:45 2011 -0700
@@ -0,0 +1,3182 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+# Use is subject to license terms.
+#
+# This script takes a file list and a workspace and builds a set of html files
+# suitable for doing a code review of source changes via a web page.
+# Documentation is available via 'webrev -h'.
+#
+
+WEBREV_UPDATED=23.18-hg
+
+HTML='<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n'
+
+FRAMEHTML='<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n'
+
+STDHEAD='<meta http-equiv="cache-control" content="no-cache" />
+<meta http-equiv="Pragma" content="no-cache" />
+<meta http-equiv="Expires" content="-1" />
+<!--
+   Note to customizers: the body of the webrev is IDed as SUNWwebrev
+   to allow easy overriding by users of webrev via the userContent.css
+   mechanism available in some browsers.
+
+   For example, to have all "removed" information be red instead of
+   brown, set a rule in your userContent.css file like:
+
+       body#SUNWwebrev span.removed { color: red ! important; }
+-->
+<style type="text/css" media="screen">
+body {
+    background-color: #eeeeee;
+}
+hr {
+    border: none 0;
+    border-top: 1px solid #aaa;
+    height: 1px;
+}
+div.summary {
+    font-size: .8em;
+    border-bottom: 1px solid #aaa;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+div.summary h2 {
+    margin-bottom: 0.3em;
+}
+div.summary table th {
+    text-align: right;
+    vertical-align: top;
+    white-space: nowrap;
+}
+span.lineschanged {
+    font-size: 0.7em;
+}
+span.oldmarker {
+    color: red;
+    font-size: large;
+    font-weight: bold;
+}
+span.newmarker {
+    color: green;
+    font-size: large;
+    font-weight: bold;
+}
+span.removed {
+    color: brown;
+}
+span.changed {
+    color: blue;
+}
+span.new {
+    color: blue;
+    font-weight: bold;
+}
+a.print { font-size: x-small; }
+
+</style>
+
+<style type="text/css" media="print">
+pre { font-size: 0.8em; font-family: courier, monospace; }
+span.removed { color: #444; font-style: italic }
+span.changed { font-weight: bold; }
+span.new { font-weight: bold; }
+span.newmarker { font-size: 1.2em; font-weight: bold; }
+span.oldmarker { font-size: 1.2em; font-weight: bold; }
+a.print {display: none}
+hr { border: none 0; border-top: 1px solid #aaa; height: 1px; }
+</style>
+'
+
+#
+# UDiffs need a slightly different CSS rule for 'new' items (we don't
+# want them to be bolded as we do in cdiffs or sdiffs).
+#
+UDIFFCSS='
+<style type="text/css" media="screen">
+span.new {
+    color: blue;
+    font-weight: normal;
+}
+</style>
+'
+
+#
+# input_cmd | html_quote | output_cmd
+# or
+# html_quote filename | output_cmd
+#
+# Make a piece of source code safe for display in an HTML <pre> block.
+#
+html_quote()
+{
+	sed -e "s/&/\&amp;/g" -e "s/</\&lt;/g" -e "s/>/\&gt;/g" "$@" | expand
+}
+
+#
+# input_cmd | bug2url | output_cmd
+#
+# Scan for bugids and insert <a> links to the relevent bug database.
+#
+bug2url()
+{
+	sed -e 's|[0-9]\{5,\}|<a href=\"'$BUGURL'&\">&</a>|g'
+}
+
+#
+# input_cmd | sac2url | output_cmd
+#
+# Scan for ARC cases and insert <a> links to the relevent SAC database.
+# This is slightly complicated because inside the SWAN, SAC cases are
+# grouped by ARC: PSARC/2006/123.  But on OpenSolaris.org, they are
+# referenced as 2006/123 (without labelling the ARC).
+#
+sac2url()
+{
+	if [[ -z $Oflag ]]; then
+	    sed -e 's|\([A-Z]\{1,2\}ARC\)[ /]\([0-9]\{4\}\)/\([0-9]\{3\}\)|<a href=\"'$SACURL'\1/\2/\3\">\1 \2/\3</a>|g'
+	else
+	    sed -e 's|\([A-Z]\{1,2\}ARC\)[ /]\([0-9]\{4\}\)/\([0-9]\{3\}\)|<a href=\"'$SACURL'/\2/\3\">\1 \2/\3</a>|g'
+	fi
+}
+
+#
+# strip_unchanged <infile> | output_cmd
+#
+# Removes chunks of sdiff documents that have not changed. This makes it
+# easier for a code reviewer to find the bits that have changed.
+#
+# Deleted lines of text are replaced by a horizontal rule. Some
+# identical lines are retained before and after the changed lines to
+# provide some context.  The number of these lines is controlled by the
+# variable C in the $AWK script below.
+#
+# The script detects changed lines as any line that has a "<span class="
+# string embedded (unchanged lines have no particular class and are not
+# part of a <span>).  Blank lines (without a sequence number) are also
+# detected since they flag lines that have been inserted or deleted.
+#
+strip_unchanged()
+{
+	$AWK '
+	BEGIN	{ C = c = 20 }
+	NF == 0 || /span class=/ {
+		if (c > C) {
+			c -= C
+			inx = 0
+			if (c > C) {
+				print "\n</pre><hr></hr><pre>"
+				inx = c % C
+				c = C
+			}
+
+			for (i = 0; i < c; i++)
+				print ln[(inx + i) % C]
+		}
+		c = 0;
+		print
+		next
+	}
+	{	if (c >= C) {
+			ln[c % C] = $0
+			c++;
+			next;
+		}
+		c++;
+		print
+	}
+	END	{ if (c > (C * 2)) print "\n</pre><hr></hr>" }
+
+	' $1
+}
+
+#
+# sdiff_to_html
+#
+# This function takes two files as arguments, obtains their diff, and
+# processes the diff output to present the files as an HTML document with
+# the files displayed side-by-side, differences shown in color.  It also
+# takes a delta comment, rendered as an HTML snippet, as the third
+# argument.  The function takes two files as arguments, then the name of
+# file, the path, and the comment.  The HTML will be delivered on stdout,
+# e.g.
+#
+#   $ sdiff_to_html old/usr/src/tools/scripts/webrev.sh \
+#         new/usr/src/tools/scripts/webrev.sh \
+#         webrev.sh usr/src/tools/scripts \
+#         '<a href="http://monaco.sfbay.sun.com/detail.jsp?cr=1234567">
+#          1234567</a> my bugid' > <file>.html
+#
+# framed_sdiff() is then called which creates $2.frames.html
+# in the webrev tree.
+#
+# FYI: This function is rather unusual in its use of awk.  The initial
+# diff run produces conventional diff output showing changed lines mixed
+# with editing codes.  The changed lines are ignored - we're interested in
+# the editing codes, e.g.
+#
+#      8c8
+#      57a61
+#      63c66,76
+#      68,93d80
+#      106d90
+#      108,110d91
+#
+#  These editing codes are parsed by the awk script and used to generate
+#  another awk script that generates HTML, e.g the above lines would turn
+#  into something like this:
+#
+#      BEGIN { printf "<pre>\n" }
+#      function sp(n) {for (i=0;i<n;i++)printf "\n"}
+#      function wl(n) {printf "<font color=%s>%4d %s </font>\n", n, NR, $0}
+#      NR==8           {wl("#7A7ADD");next}
+#      NR==54          {wl("#7A7ADD");sp(3);next}
+#      NR==56          {wl("#7A7ADD");next}
+#      NR==57          {wl("black");printf "\n"; next}
+#        :               :
+#
+#  This script is then run on the original source file to generate the
+#  HTML that corresponds to the source file.
+#
+#  The two HTML files are then combined into a single piece of HTML that
+#  uses an HTML table construct to present the files side by side.  You'll
+#  notice that the changes are color-coded:
+#
+#   black     - unchanged lines
+#   blue      - changed lines
+#   bold blue - new lines
+#   brown     - deleted lines
+#
+#  Blank lines are inserted in each file to keep unchanged lines in sync
+#  (side-by-side).  This format is familiar to users of sdiff(1) or
+#  Teamware's filemerge tool.
+#
+sdiff_to_html()
+{
+	diff -b $1 $2 > /tmp/$$.diffs
+
+	TNAME=$3
+	TPATH=$4
+	COMMENT=$5
+
+	#
+	#  Now we have the diffs, generate the HTML for the old file.
+	#
+	$AWK '
+	BEGIN	{
+		printf "function sp(n) {for (i=0;i<n;i++)printf \"\\n\"}\n"
+		printf "function removed() "
+		printf "{printf \"<span class=\\\"removed\\\">%%4d %%s</span>\\n\", NR, $0}\n"
+		printf "function changed() "
+		printf "{printf \"<span class=\\\"changed\\\">%%4d %%s</span>\\n\", NR, $0}\n"
+		printf "function bl() {printf \"%%4d %%s\\n\", NR, $0}\n"
+}
+	/^</	{next}
+	/^>/	{next}
+	/^---/	{next}
+
+	{
+	split($1, a, /[cad]/) ;
+	if (index($1, "a")) {
+		if (a[1] == 0) {
+			n = split(a[2], r, /,/);
+			if (n == 1)
+				printf "BEGIN\t\t{sp(1)}\n"
+			else
+				printf "BEGIN\t\t{sp(%d)}\n",\
+				(r[2] - r[1]) + 1
+			next
+		}
+
+		printf "NR==%s\t\t{", a[1]
+		n = split(a[2], r, /,/);
+		s = r[1];
+		if (n == 1)
+			printf "bl();printf \"\\n\"; next}\n"
+		else {
+			n = r[2] - r[1]
+			printf "bl();sp(%d);next}\n",\
+			(r[2] - r[1]) + 1
+		}
+		next
+	}
+	if (index($1, "d")) {
+		n = split(a[1], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		if (n == 1)
+			printf "NR==%s\t\t{removed(); next}\n" , n1
+		else
+			printf "NR==%s,NR==%s\t{removed(); next}\n" , n1, n2
+		next
+	}
+	if (index($1, "c")) {
+		n = split(a[1], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		final = n2
+		d1 = 0
+		if (n == 1)
+			printf "NR==%s\t\t{changed();" , n1
+		else {
+			d1 = n2 - n1
+			printf "NR==%s,NR==%s\t{changed();" , n1, n2
+		}
+		m = split(a[2], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		if (m > 1) {
+			d2  = n2 - n1
+			if (d2 > d1) {
+				if (n > 1) printf "if (NR==%d)", final
+				printf "sp(%d);", d2 - d1
+			}
+		}
+		printf "next}\n" ;
+
+		next
+	}
+	}
+
+	END	{ printf "{printf \"%%4d %%s\\n\", NR, $0 }\n" }
+	' /tmp/$$.diffs > /tmp/$$.file1
+
+	#
+	#  Now generate the HTML for the new file
+	#
+	$AWK '
+	BEGIN	{
+		printf "function sp(n) {for (i=0;i<n;i++)printf \"\\n\"}\n"
+		printf "function new() "
+		printf "{printf \"<span class=\\\"new\\\">%%4d %%s</span>\\n\", NR, $0}\n"
+		printf "function changed() "
+		printf "{printf \"<span class=\\\"changed\\\">%%4d %%s</span>\\n\", NR, $0}\n"
+		printf "function bl() {printf \"%%4d %%s\\n\", NR, $0}\n"
+	}
+
+	/^</	{next}
+	/^>/	{next}
+	/^---/	{next}
+
+	{
+	split($1, a, /[cad]/) ;
+	if (index($1, "d")) {
+		if (a[2] == 0) {
+			n = split(a[1], r, /,/);
+			if (n == 1)
+				printf "BEGIN\t\t{sp(1)}\n"
+			else
+				printf "BEGIN\t\t{sp(%d)}\n",\
+				(r[2] - r[1]) + 1
+			next
+		}
+
+		printf "NR==%s\t\t{", a[2]
+		n = split(a[1], r, /,/);
+		s = r[1];
+		if (n == 1)
+			printf "bl();printf \"\\n\"; next}\n"
+		else {
+			n = r[2] - r[1]
+			printf "bl();sp(%d);next}\n",\
+			(r[2] - r[1]) + 1
+		}
+		next
+	}
+	if (index($1, "a")) {
+		n = split(a[2], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		if (n == 1)
+			printf "NR==%s\t\t{new() ; next}\n" , n1
+		else
+			printf "NR==%s,NR==%s\t{new() ; next}\n" , n1, n2
+		next
+	}
+	if (index($1, "c")) {
+		n = split(a[2], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		final = n2
+		d2 = 0;
+		if (n == 1) {
+			final = n1
+			printf "NR==%s\t\t{changed();" , n1
+		} else {
+			d2 = n2 - n1
+			printf "NR==%s,NR==%s\t{changed();" , n1, n2
+		}
+		m = split(a[1], r, /,/);
+		n1 = r[1]
+		n2 = r[2]
+		if (m > 1) {
+			d1  = n2 - n1
+			if (d1 > d2) {
+				if (n > 1) printf "if (NR==%d)", final
+				printf "sp(%d);", d1 - d2
+			}
+		}
+		printf "next}\n" ;
+		next
+	}
+	}
+	END	{ printf "{printf \"%%4d %%s\\n\", NR, $0 }\n" }
+	' /tmp/$$.diffs > /tmp/$$.file2
+
+	#
+	# Post-process the HTML files by running them back through $AWK
+	#
+	html_quote < $1 | $AWK -f /tmp/$$.file1 > /tmp/$$.file1.html
+
+	html_quote < $2 | $AWK -f /tmp/$$.file2 > /tmp/$$.file2.html
+
+	#
+	# Now combine into a valid HTML file and side-by-side into a table
+	#
+	print "$HTML<head>$STDHEAD"
+	print "<title>$WNAME Sdiff $TPATH </title>"
+	print "</head><body id=\"SUNWwebrev\">"
+	print "<h2>$TPATH/$TNAME</h2>"
+        print "<a class=\"print\" href=\"javascript:print()\">Print this page</a>"
+	print "<pre>$COMMENT</pre>\n"
+	print "<table><tr valign=\"top\">"
+	print "<td><pre>"
+
+	strip_unchanged /tmp/$$.file1.html
+
+	print "</pre></td><td><pre>"
+
+	strip_unchanged /tmp/$$.file2.html
+
+	print "</pre></td>"
+	print "</tr></table>"
+	print "</body></html>"
+
+	framed_sdiff $TNAME $TPATH /tmp/$$.file1.html /tmp/$$.file2.html \
+	    "$COMMENT"
+}
+
+
+#
+# framed_sdiff <filename> <filepath> <lhsfile> <rhsfile> <comment>
+#
+# Expects lefthand and righthand side html files created by sdiff_to_html.
+# We use insert_anchors() to augment those with HTML navigation anchors,
+# and then emit the main frame.  Content is placed into:
+#
+#    $WDIR/DIR/$TNAME.lhs.html
+#    $WDIR/DIR/$TNAME.rhs.html
+#    $WDIR/DIR/$TNAME.frames.html
+#
+# NOTE: We rely on standard usage of $WDIR and $DIR.
+#
+function framed_sdiff
+{
+	typeset TNAME=$1
+	typeset TPATH=$2
+	typeset lhsfile=$3
+	typeset rhsfile=$4
+	typeset comments=$5
+	typeset RTOP
+
+	# Enable html files to access WDIR via a relative path.
+	RTOP=$(relative_dir $TPATH $WDIR)
+
+	# Make the rhs/lhs files and output the frameset file.
+	print "$HTML<head>$STDHEAD" > $WDIR/$DIR/$TNAME.lhs.html
+
+	cat >> $WDIR/$DIR/$TNAME.lhs.html <<-EOF
+	    <script type="text/javascript" src="$RTOP/ancnav.js"></script>
+	    </head>
+	    <body id="SUNWwebrev" onkeypress="keypress(event);">
+	    <a name="0"></a>
+	    <pre>$comments</pre><hr></hr>
+	EOF
+
+	cp $WDIR/$DIR/$TNAME.lhs.html $WDIR/$DIR/$TNAME.rhs.html
+
+	insert_anchors $lhsfile >> $WDIR/$DIR/$TNAME.lhs.html
+	insert_anchors $rhsfile >> $WDIR/$DIR/$TNAME.rhs.html
+
+	close='</body></html>'
+
+	print $close >> $WDIR/$DIR/$TNAME.lhs.html
+	print $close >> $WDIR/$DIR/$TNAME.rhs.html
+
+	print "$FRAMEHTML<head>$STDHEAD" > $WDIR/$DIR/$TNAME.frames.html
+	print "<title>$WNAME Framed-Sdiff " \
+	    "$TPATH/$TNAME</title> </head>" >> $WDIR/$DIR/$TNAME.frames.html
+	cat >> $WDIR/$DIR/$TNAME.frames.html <<-EOF
+	  <frameset rows="*,60">
+	    <frameset cols="50%,50%">
+	      <frame src="$TNAME.lhs.html" scrolling="auto" name="lhs" />
+	      <frame src="$TNAME.rhs.html" scrolling="auto" name="rhs" />
+	    </frameset>
+	  <frame src="$RTOP/ancnav.html" scrolling="no" marginwidth="0"
+	   marginheight="0" name="nav" />
+	  <noframes>
+            <body id="SUNWwebrev">
+	      Alas 'frames' webrev requires that your browser supports frames
+	      and has the feature enabled.
+            </body>
+	  </noframes>
+	  </frameset>
+	</html>
+	EOF
+}
+
+
+#
+# fix_postscript
+#
+# Merge codereview output files to a single conforming postscript file, by:
+# 	- removing all extraneous headers/trailers
+#	- making the page numbers right
+#	- removing pages devoid of contents which confuse some
+#	  postscript readers.
+#
+# From Casper.
+#
+function fix_postscript
+{
+	infile=$1
+
+	cat > /tmp/$$.crmerge.pl << \EOF
+
+	print scalar(<>);		# %!PS-Adobe---
+	print "%%Orientation: Landscape\n";
+
+	$pno = 0;
+	$doprint = 1;
+
+	$page = "";
+
+	while (<>) {
+		next if (/^%%Pages:\s*\d+/);
+
+		if (/^%%Page:/) {
+			if ($pno == 0 || $page =~ /\)S/) {
+				# Header or single page containing text
+				print "%%Page: ? $pno\n" if ($pno > 0);
+				print $page;
+				$pno++;
+			} else {
+				# Empty page, skip it.
+			}
+			$page = "";
+			$doprint = 1;
+			next;
+		}
+
+		# Skip from %%Trailer of one document to Endprolog
+		# %%Page of the next
+		$doprint = 0 if (/^%%Trailer/);
+		$page .= $_ if ($doprint);
+	}
+
+	if ($page =~ /\)S/) {
+		print "%%Page: ? $pno\n";
+		print $page;
+	} else {
+		$pno--;
+	}
+	print "%%Trailer\n%%Pages: $pno\n";
+EOF
+
+	$PERL /tmp/$$.crmerge.pl < $infile
+}
+
+
+#
+# input_cmd | insert_anchors | output_cmd
+#
+# Flag blocks of difference with sequentially numbered invisible
+# anchors.  These are used to drive the frames version of the
+# sdiffs output.
+#
+# NOTE: Anchor zero flags the top of the file irrespective of changes,
+# an additional anchor is also appended to flag the bottom.
+#
+# The script detects changed lines as any line that has a "<span
+# class=" string embedded (unchanged lines have no class set and are
+# not part of a <span>.  Blank lines (without a sequence number)
+# are also detected since they flag lines that have been inserted or
+# deleted.
+#
+function insert_anchors
+{
+	$AWK '
+	function ia() {
+		# This should be able to be a singleton <a /> but that
+		# seems to trigger a bug in firefox a:hover rule processing
+		printf "<a name=\"%d\" id=\"anc%d\"></a>", anc, anc++;
+	}
+
+	BEGIN {
+		anc=1;
+		inblock=1;
+		printf "<pre>\n";
+	}
+	NF == 0 || /^<span class=/ {
+		if (inblock == 0) {
+			ia();
+			inblock=1;
+		}
+		print;
+		next;
+	}
+	{
+		inblock=0;
+		print;
+	}
+	END {
+		ia();
+
+		printf "<b style=\"font-size: large; color: red\">";
+		printf "--- EOF ---</b>"
+        	for(i=0;i<8;i++) printf "\n\n\n\n\n\n\n\n\n\n";
+		printf "</pre>"
+		printf "<form name=\"eof\">";
+		printf "<input name=\"value\" value=\"%d\" type=\"hidden\" />",
+		    anc - 1;
+		printf "</form>";
+	}
+	' $1
+}
+
+
+#
+# relative_dir
+#
+# Print a relative return path from $1 to $2.  For example if
+# $1=/tmp/myreview/raw_files/usr/src/tools/scripts and $2=/tmp/myreview,
+# this function would print "../../../../".
+#
+# In the event that $1 is not in $2 a warning is printed to stderr,
+# and $2 is returned-- the result of this is that the resulting webrev
+# is not relocatable.
+#
+function relative_dir
+{
+    d1=$1
+    d2=$2
+    if [[ "$d1" == "." ]]; then
+	print "."
+    else
+	typeset cur="${d1##$d2?(/)}"
+	typeset ret=""
+	if [[ $d2 == $cur ]]; then   # Should never happen.
+		# Should never happen.
+		print -u2 "\nWARNING: relative_dir: \"$1\" not relative "
+		print -u2 "to \"$2\".  Check input paths.  Framed webrev "
+		print -u2 "will not be relocatable!"
+		print $2
+		return
+	fi
+
+	while [[ -n ${cur} ]];
+	do
+		cur=${cur%%*(/)*([!/])}
+		if [[ -z $ret ]]; then
+			ret=".."
+		else
+			ret="../$ret"
+		fi
+	done
+	print $ret
+    fi
+}
+
+
+#
+# frame_nav_js
+#
+# Emit javascript for frame navigation
+#
+function frame_nav_js
+{
+cat << \EOF
+var myInt;
+var scrolling=0;
+var sfactor = 3;
+var scount=10;
+
+function scrollByPix() {
+	if (scount<=0) {
+		sfactor*=1.2;
+		scount=10;
+	}
+	parent.lhs.scrollBy(0,sfactor);
+	parent.rhs.scrollBy(0,sfactor);
+	scount--;
+}
+
+function scrollToAnc(num) {
+
+	// Update the value of the anchor in the form which we use as
+	// storage for this value.  setAncValue() will take care of
+	// correcting for overflow and underflow of the value and return
+	// us the new value.
+	num = setAncValue(num);
+
+	// Set location and scroll back a little to expose previous
+	// lines.
+	//
+	// Note that this could be improved: it is possible although
+	// complex to compute the x and y position of an anchor, and to
+	// scroll to that location directly.
+	//
+	parent.lhs.location.replace(parent.lhs.location.pathname + "#" + num);
+	parent.rhs.location.replace(parent.rhs.location.pathname + "#" + num);
+
+	parent.lhs.scrollBy(0,-30);
+	parent.rhs.scrollBy(0,-30);
+}
+
+function getAncValue()
+{
+	return (parseInt(parent.nav.document.diff.real.value));
+}
+
+function setAncValue(val)
+{
+	if (val <= 0) {
+		val = 0;
+		parent.nav.document.diff.real.value = val;
+		parent.nav.document.diff.display.value = "BOF";
+		return (val);
+	}
+
+	//
+	// The way we compute the max anchor value is to stash it
+	// inline in the left and right hand side pages-- it's the same
+	// on each side, so we pluck from the left.
+	//
+	maxval = parent.lhs.document.eof.value.value;
+	if (val < maxval) {
+		parent.nav.document.diff.real.value = val;
+		parent.nav.document.diff.display.value = val.toString();
+		return (val);
+	}
+
+	// this must be: val >= maxval
+	val = maxval;
+	parent.nav.document.diff.real.value = val;
+	parent.nav.document.diff.display.value = "EOF";
+	return (val);
+}
+
+function stopScroll() {
+	if (scrolling==1) {
+		clearInterval(myInt);
+		scrolling=0;
+	}
+}
+
+function startScroll() {
+	stopScroll();
+	scrolling=1;
+	myInt=setInterval("scrollByPix()",10);
+}
+
+function handlePress(b) {
+
+	switch (b) {
+	    case 1 :
+		scrollToAnc(-1);
+		break;
+	    case 2 :
+		scrollToAnc(getAncValue() - 1);
+		break;
+	    case 3 :
+		sfactor=-3;
+		startScroll();
+		break;
+	    case 4 :
+		sfactor=3;
+		startScroll();
+		break;
+	    case 5 :
+		scrollToAnc(getAncValue() + 1);
+		break;
+	    case 6 :
+		scrollToAnc(999999);
+		break;
+	}
+}
+
+function handleRelease(b) {
+	stopScroll();
+}
+
+function keypress(ev) {
+	var keynum;
+	var keychar;
+
+	if (window.event) { // IE
+		keynum = ev.keyCode;
+	} else if (ev.which) { // non-IE
+		keynum = ev.which;
+	}
+
+	keychar = String.fromCharCode(keynum);
+
+	if (keychar == "k") {
+		handlePress(2);
+		return (0);
+	} else if (keychar == "j" || keychar == " ") {
+		handlePress(5);
+		return (0);
+	}
+	return (1);
+}
+
+function ValidateDiffNum(){
+	val = parent.nav.document.diff.display.value;
+	if (val == "EOF") {
+		scrollToAnc(999999);
+		return;
+	}
+
+	if (val == "BOF") {
+		scrollToAnc(0);
+		return;
+	}
+
+        i=parseInt(val);
+        if (isNaN(i)) {
+                parent.nav.document.diff.display.value = getAncValue();
+        } else {
+                scrollToAnc(i);
+        }
+        return false;
+}
+
+EOF
+}
+
+#
+# frame_navigation
+#
+# Output anchor navigation file for framed sdiffs.
+#
+function frame_navigation
+{
+	print "$HTML<head>$STDHEAD"
+
+	cat << \EOF
+<title>Anchor Navigation</title>
+<meta http-equiv="Content-Script-Type" content="text/javascript" />
+<meta http-equiv="Content-Type" content="text/html" />
+
+<style type="text/css">
+    div.button td { padding-left: 5px; padding-right: 5px;
+		    background-color: #eee; text-align: center;
+		    border: 1px #444 outset; cursor: pointer; }
+    div.button a { font-weight: bold; color: black }
+    div.button td:hover { background: #ffcc99; }
+</style>
+EOF
+
+	print "<script type=\"text/javascript\" src=\"ancnav.js\"></script>"
+
+	cat << \EOF
+</head>
+<body id="SUNWwebrev" bgcolor="#eeeeee" onload="document.diff.real.focus();"
+	onkeypress="keypress(event);">
+    <noscript lang="javascript">
+      <center>
+	<p><big>Framed Navigation controls require Javascript</big><br />
+	Either this browser is incompatable or javascript is not enabled</p>
+      </center>
+    </noscript>
+    <table width="100%" border="0" align="center">
+	<tr>
+          <td valign="middle" width="25%">Diff navigation:
+          Use 'j' and 'k' for next and previous diffs; or use buttons
+          at right</td>
+	  <td align="center" valign="top" width="50%">
+	    <div class="button">
+	      <table border="0" align="center">
+                  <tr>
+		    <td>
+		      <a onMouseDown="handlePress(1);return true;"
+			 onMouseUp="handleRelease(1);return true;"
+			 onMouseOut="handleRelease(1);return true;"
+			 onClick="return false;"
+			 title="Go to Beginning Of file">BOF</a></td>
+		    <td>
+		      <a onMouseDown="handlePress(3);return true;"
+			 onMouseUp="handleRelease(3);return true;"
+			 onMouseOut="handleRelease(3);return true;"
+			 title="Scroll Up: Press and Hold to accelerate"
+			 onClick="return false;">Scroll Up</a></td>
+		    <td>
+		      <a onMouseDown="handlePress(2);return true;"
+			 onMouseUp="handleRelease(2);return true;"
+			 onMouseOut="handleRelease(2);return true;"
+			 title="Go to previous Diff"
+			 onClick="return false;">Prev Diff</a>
+		    </td></tr>
+
+		  <tr>
+		    <td>
+		      <a onMouseDown="handlePress(6);return true;"
+			 onMouseUp="handleRelease(6);return true;"
+			 onMouseOut="handleRelease(6);return true;"
+			 onClick="return false;"
+			 title="Go to End Of File">EOF</a></td>
+		    <td>
+		      <a onMouseDown="handlePress(4);return true;"
+			 onMouseUp="handleRelease(4);return true;"
+			 onMouseOut="handleRelease(4);return true;"
+			 title="Scroll Down: Press and Hold to accelerate"
+			 onClick="return false;">Scroll Down</a></td>
+		    <td>
+		      <a onMouseDown="handlePress(5);return true;"
+			 onMouseUp="handleRelease(5);return true;"
+			 onMouseOut="handleRelease(5);return true;"
+			 title="Go to next Diff"
+			 onClick="return false;">Next Diff</a></td>
+		  </tr>
+              </table>
+	    </div>
+	  </td>
+	  <th valign="middle" width="25%">
+	    <form action="" name="diff" onsubmit="return ValidateDiffNum();">
+		<input name="display" value="BOF" size="8" type="text" />
+		<input name="real" value="0" size="8" type="hidden" />
+	    </form>
+	  </th>
+	</tr>
+    </table>
+  </body>
+</html>
+EOF
+}
+
+
+
+#
+# diff_to_html <filename> <filepath> { U | C } <comment>
+#
+# Processes the output of diff to produce an HTML file representing either
+# context or unified diffs.
+#
+diff_to_html()
+{
+	TNAME=$1
+	TPATH=$2
+	DIFFTYPE=$3
+	COMMENT=$4
+
+	print "$HTML<head>$STDHEAD"
+	print "<title>$WNAME ${DIFFTYPE}diff $TPATH</title>"
+
+	if [[ $DIFFTYPE == "U" ]]; then
+		print "$UDIFFCSS"
+	fi
+
+	cat <<-EOF
+	</head>
+	<body id="SUNWwebrev">
+	<h2>$TPATH</h2>
+        <a class="print" href="javascript:print()">Print this page</a>
+	<pre>$COMMENT</pre>
+        <pre>
+EOF
+
+	html_quote | $AWK '
+	/^--- new/	{ next }
+	/^\+\+\+ new/	{ next }
+	/^--- old/	{ next }
+	/^\*\*\* old/	{ next }
+	/^\*\*\*\*/	{ next }
+	/^-------/	{ printf "<center><h1>%s</h1></center>\n", $0; next }
+	/^\@\@.*\@\@$/	{ printf "</pre><hr /><pre>\n";
+			  printf "<span class=\"newmarker\">%s</span>\n", $0;
+			  next}
+
+	/^\*\*\*/	{ printf "<hr /><span class=\"oldmarker\">%s</span>\n", $0;
+			  next}
+	/^---/		{ printf "<span class=\"newmarker\">%s</span>\n", $0;
+			  next}
+	/^\+/		{printf "<span class=\"new\">%s</span>\n", $0; next}
+	/^!/		{printf "<span class=\"changed\">%s</span>\n", $0; next}
+	/^-/		{printf "<span class=\"removed\">%s</span>\n", $0; next}
+			{printf "%s\n", $0; next}
+	'
+
+	print "</pre></body></html>\n"
+}
+
+
+#
+# source_to_html { new | old } <filename>
+#
+# Process a plain vanilla source file to transform it into an HTML file.
+#
+source_to_html()
+{
+	WHICH=$1
+	TNAME=$2
+
+	print "$HTML<head>$STDHEAD"
+	print "<title>$WHICH $TNAME</title>"
+	print "<body id=\"SUNWwebrev\">"
+	print "<pre>"
+	html_quote | $AWK '{line += 1 ; printf "%4d %s\n", line, $0 }'
+	print "</pre></body></html>"
+}
+
+#
+# teamwarecomments {text|html} parent-file child-file
+#
+# Find the first delta in the child that's not in the parent.  Get the
+# newest delta from the parent, get all deltas from the child starting
+# with that delta, and then get all info starting with the second oldest
+# delta in that list (the first delta unique to the child).
+#
+# This code adapted from Bill Shannon's "spc" script
+#
+comments_from_teamware()
+{
+	fmt=$1
+	pfile=$PWS/$2
+	cfile=$CWS/$3
+
+	psid=$($SCCS prs -d:I: $pfile 2>/dev/null)
+	if [[ -z "$psid" ]]; then
+	    psid=1.1
+	fi
+
+	set -A sids $($SCCS prs -l -r$psid -d:I: $cfile 2>/dev/null)
+	N=${#sids[@]}
+
+	nawkprg='
+		/^COMMENTS:/	{p=1; next}
+		/^D [0-9]+\.[0-9]+/ {printf "--- %s ---\n", $2; p=0; }
+		NF == 0u	{ next }
+		{if (p==0) next; print $0 }'
+
+	if [[ $N -ge 2 ]]; then
+		sid1=${sids[$((N-2))]}	# Gets 2nd to last sid
+
+		if [[ $fmt == "text" ]]; then
+			$SCCS prs -l -r$sid1 $cfile  2>/dev/null | \
+			    $AWK "$nawkprg"
+			return
+		fi
+
+		$SCCS prs -l -r$sid1 $cfile  2>/dev/null | \
+		    html_quote | bug2url | sac2url | $AWK "$nawkprg"
+	fi
+}
+
+#
+# wxcomments {text|html} filepath
+#
+# Given the pathname of a file, find its location in a "wx" active file
+# list and print the following sccs comment.  Output is either text or
+# HTML; if the latter, embedded bugids (sequence of 5 or more digits) are
+# turned into URLs.
+#
+comments_from_wx()
+{
+	typeset fmt=$1
+	typeset p=$2
+
+	comm=`$AWK '
+	$1 == "'$p'" {
+		do getline ; while (NF > 0)
+		getline
+		while (NF > 0) { print ; getline }
+		exit
+	}' < $wxfile`
+
+	if [[ $fmt == "text" ]]; then
+		print "$comm"
+		return
+	fi
+
+	print "$comm" | html_quote | bug2url | sac2url
+}
+
+comments_from_mercurial()
+{
+	fmt=$1
+	pfile=$PWS/$2
+	cfile=$CWS/$3
+
+        logdir=`dirname $cfile`
+        logf=`basename $cfile`
+        if [ -d $logdir ]; then
+            ( cd $logdir;
+	        active=`hg status $logf 2>/dev/null`
+                # If the output from 'hg status' is not empty, it means the file
+                # hasn't been committed, so don't fetch comments.
+	        if [[ -z $active ]] ; then
+                    if [[ -n $ALL_CREV ]]; then
+                        rev_opt=
+                        for rev in $ALL_CREV; do
+                            rev_opt="$rev_opt --rev $rev"
+                        done
+                        comm=`hg log $rev_opt --follow --template 'rev {rev} : {desc}\n' $logf`
+                    elif [[ -n $FIRST_CREV ]]; then
+		        comm=`hg log --rev $FIRST_CREV:tip --follow --template 'rev {rev} : {desc}\n' $logf`
+                    else
+		        comm=`hg log -l1 --follow --template 'rev {rev} : {desc}\n' $logf`
+                    fi
+	        else
+	            comm=""
+	        fi
+	        if [[ $fmt == "text" ]]; then
+	            print "$comm"
+	            return
+	        fi
+	  
+	        print "$comm" | html_quote | bug2url | sac2url
+                )
+        fi
+}
+
+
+#
+# getcomments {text|html} filepath parentpath
+#
+# Fetch the comments depending on what SCM mode we're in.
+#
+getcomments()
+{
+	typeset fmt=$1
+	typeset p=$2
+	typeset pp=$3
+
+	if [[ -n $wxfile ]]; then
+		comments_from_wx $fmt $p
+	else
+		if [[ $SCM_MODE == "teamware" ]]; then
+			comments_from_teamware $fmt $pp $p
+		elif [[ $SCM_MODE == "mercurial" ]]; then
+			comments_from_mercurial $fmt $pp $p
+		fi
+	fi
+}
+
+#
+# printCI <total-changed> <inserted> <deleted> <modified> <unchanged>
+#
+# Print out Code Inspection figures similar to sccs-prt(1) format.
+#
+function printCI
+{
+	integer tot=$1 ins=$2 del=$3 mod=$4 unc=$5
+	typeset str
+	if (( tot == 1 )); then
+		str="line"
+	else
+		str="lines"
+	fi
+	printf '%d %s changed: %d ins; %d del; %d mod; %d unchg' \
+	    $tot $str $ins $del $mod $unc
+}
+
+
+#
+# difflines <oldfile> <newfile>
+#
+# Calculate and emit number of added, removed, modified and unchanged lines,
+# and total lines changed, the sum of added + removed + modified.
+#
+function difflines
+{
+	integer tot mod del ins unc err
+	typeset filename
+
+	eval $( diff -e $1 $2 | $AWK '
+	# Change range of lines: N,Nc
+	/^[0-9]*,[0-9]*c$/ {
+		n=split(substr($1,1,length($1)-1), counts, ",");
+		if (n != 2) {
+		    error=2
+		    exit;
+		}
+		#
+		# 3,5c means lines 3 , 4 and 5 are changed, a total of 3 lines.
+		# following would be 5 - 3 = 2! Hence +1 for correction.
+		#
+		r=(counts[2]-counts[1])+1;
+
+		#
+		# Now count replacement lines: each represents a change instead
+		# of a delete, so increment c and decrement r.
+		#
+		while (getline != /^\.$/) {
+			c++;
+			r--;
+		}
+		#
+		# If there were more replacement lines than original lines,
+		# then r will be negative; in this case there are no deletions,
+		# but there are r changes that should be counted as adds, and
+		# since r is negative, subtract it from a and add it to c.
+		#
+		if (r < 0) {
+			a-=r;
+			c+=r;
+		}
+
+		#
+		# If there were more original lines than replacement lines, then
+		# r will be positive; in this case, increment d by that much.
+		#
+		if (r > 0) {
+			d+=r;
+		}
+		next;
+	}
+
+	# Change lines: Nc
+	/^[0-9].*c$/ {
+		# The first line is a replacement; any more are additions.
+		if (getline != /^\.$/) {
+			c++;
+			while (getline != /^\.$/) a++;
+		}
+		next;
+	}
+
+	# Add lines: both Na and N,Na
+	/^[0-9].*a$/ {
+		while (getline != /^\.$/) a++;
+		next;
+	}
+
+	# Delete range of lines: N,Nd
+	/^[0-9]*,[0-9]*d$/ {
+		n=split(substr($1,1,length($1)-1), counts, ",");
+		if (n != 2) {
+			error=2
+			exit;
+		}
+		#
+		# 3,5d means lines 3 , 4 and 5 are deleted, a total of 3 lines.
+		# following would be 5 - 3 = 2! Hence +1 for correction.
+		#
+		r=(counts[2]-counts[1])+1;
+		d+=r;
+		next;
+	}
+
+	# Delete line: Nd.   For example 10d says line 10 is deleted.
+	/^[0-9]*d$/ {d++; next}
+
+	# Should not get here!
+	{
+		error=1;
+		exit;
+	}
+
+	# Finish off - print results
+	END {
+		printf("tot=%d;mod=%d;del=%d;ins=%d;err=%d\n",
+		    (c+d+a), c, d, a, error);
+	}' )
+
+	# End of $AWK, Check to see if any trouble occurred.
+	if (( $? > 0 || err > 0 )); then
+		print "Unexpected Error occurred reading" \
+		    "\`diff -e $1 $2\`: \$?=$?, err=" $err
+		return
+	fi
+
+	# Accumulate totals
+	(( TOTL += tot ))
+	(( TMOD += mod ))
+	(( TDEL += del ))
+	(( TINS += ins ))
+	# Calculate unchanged lines
+	unc=`wc -l < $1`
+	if (( unc > 0 )); then
+		(( unc -= del + mod ))
+		(( TUNC += unc ))
+	fi
+	# print summary
+	print "<span class=\"lineschanged\">\c"
+	printCI $tot $ins $del $mod $unc
+	print "</span>"
+}
+
+
+#
+# flist_from_wx
+#
+# Sets up webrev to source its information from a wx-formatted file.
+# Sets the global 'wxfile' variable.
+#
+function flist_from_wx
+{
+	typeset argfile=$1
+	if [[ -n ${argfile%%/*} ]]; then
+		#
+		# If the wx file pathname is relative then make it absolute
+		# because the webrev does a "cd" later on.
+		#
+		wxfile=$PWD/$argfile
+	else
+		wxfile=$argfile
+	fi
+
+	$AWK '{ c = 1; print;
+	  while (getline) {
+		if (NF == 0) { c = -c; continue }
+		if (c > 0) print
+	  }
+	}' $wxfile > $FLIST
+
+	print " Done."
+}
+
+#
+# flist_from_teamware [ <args-to-putback-n> ]
+#
+# Generate the file list by extracting file names from a putback -n.  Some
+# names may come from the "update/create" messages and others from the
+# "currently checked out" warning.  Renames are detected here too.  Extract
+# values for CODEMGR_WS and CODEMGR_PARENT from the output of the putback
+# -n as well, but remove them if they are already defined.
+#
+function flist_from_teamware
+{
+	if [[ -n $codemgr_parent ]]; then
+		if [[ ! -d $codemgr_parent/Codemgr_wsdata ]]; then
+			print -u2 "parent $codemgr_parent doesn't look like a" \
+			    "valid teamware workspace"
+			exit 1
+		fi
+		parent_args="-p $codemgr_parent"
+	fi
+
+	print " File list from: 'putback -n $parent_args $*' ... \c"
+
+	putback -n $parent_args $* 2>&1 |
+	    $AWK '
+		/^update:|^create:/	{print $2}
+		/^Parent workspace:/	{printf("CODEMGR_PARENT=%s\n",$3)}
+		/^Child workspace:/	{printf("CODEMGR_WS=%s\n",$3)}
+		/^The following files are currently checked out/ {p = 1; next}
+		NF == 0			{p=0 ; next}
+		/^rename/		{old=$3}
+		$1 == "to:"		{print $2, old}
+		/^"/			{next}
+		p == 1			{print $1}' |
+	    sort -r -k 1,1 -u | sort > $FLIST
+
+	print " Done."
+}
+
+function outgoing_from_mercurial_forest
+{
+    hg foutgoing --template 'rev: {rev}\n' $OUTPWS | $FILTER | $AWK '
+        BEGIN           {ntree=0}
+        /^comparing/    {next}
+        /^no changes/   {next}
+        /^searching/    {next}
+	/^\[.*\]$/	{tree=substr($1,2,length($1)-2);
+                         trees[ntree++] = tree;
+                         revs[tree]=-1;
+                         next}
+        /^rev:/   {rev=$2+0;
+                   if (revs[tree] == -1 || rev < revs[tree])
+                        { revs[tree] = rev; };
+                  next;}
+        END       {for (tree in trees)
+                        { rev=revs[trees[tree]];
+                          if (rev > 0) 
+                                {printf("%s %d\n",trees[tree],rev-1)}
+                        }}' | while read LINE
+    do
+        set - $LINE
+        TREE=$1
+        REV=$2
+        A=`hg -R $CWS/$TREE log --rev $REV --template '{node}'`
+        FSTAT_OPT="--rev $A"
+        print "Revision: $A $REV" >> $FLIST
+        treestatus $TREE
+    done
+}
+
+function flist_from_mercurial_forest
+{
+    rm -f $FLIST
+    if [ -z "$Nflag" ]; then
+	print " File list from hg foutgoing $PWS ..."
+        outgoing_from_mercurial_forest
+        HG_LIST_FROM_COMMIT=1
+    fi
+    if [ ! -f $FLIST ]; then
+        # hg commit hasn't been run see what is lying around
+	print "\n No outgoing, perhaps you haven't commited."
+	print " File list from hg fstatus -mard ...\c"
+        FSTAT_OPT=
+        fstatus
+        HG_LIST_FROM_COMMIT=0
+    fi
+    print " Done."
+}
+
+#
+# Used when dealing with the result of 'hg foutgoing'
+# When now go down the tree and generate the change list
+#
+function treestatus
+{
+    TREE=$1
+    HGCMD="hg -R $CWS/$TREE status $FSTAT_OPT"
+    
+    $HGCMD -mdn 2>/dev/null | $FILTER | while read F
+    do
+        echo $TREE/$F
+    done >> $FLIST
+
+    # Then all the added files
+    # But some of these could have been "moved" or renamed ones
+    # so let's make sure we get the proper info
+    # hg status -aC will produce something like:
+    #	A subdir/File3
+    #	A subdir/File4
+    #	  File4
+    #	A subdir/File5
+    # The first and last are simple addition while the middle one
+    # is a move/rename
+
+    $HGCMD -aC | $FILTER | while read LINE; do
+	ldone=""
+	while [ -z "$ldone" ]; do
+	    ldone="1"
+	    set - $LINE
+	    if [ $# -eq 2 -a "$1" == "A" ]; then
+		AFILE=$2
+		if read LINE2; then
+		    set - $LINE2
+		    if [ $# -eq 1 ]; then
+			echo $TREE/$AFILE $TREE/$1 >>$FLIST
+		    elif [ $# -eq 2 ]; then
+			echo $TREE/$AFILE >>$FLIST
+			LINE=$LINE2
+			ldone=""
+		    fi
+		else
+		    echo $TREE/$AFILE >>$FLIST
+		fi
+	    fi
+	done
+    done
+    $HGCMD -rn | $FILTER | while read RFILE; do
+	grep "$TREE/$RFILE" $FLIST >/dev/null
+	if [ $? -eq 1 ]; then
+	    echo $TREE/$RFILE >>$FLIST
+	fi
+    done
+}
+
+function fstatus
+{
+    #
+    # forest extension is still being changed. For instance the output
+    # of fstatus used to no prepend the tree path to filenames, but
+    # this has changed recently. AWK code below does try to handle both
+    # cases
+    #
+    hg fstatus -mdn $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
+	/^\[.*\]$/	{tree=substr($1,2,length($1)-2); next}
+	$1 != ""	{n=index($1,tree);
+			 if (n == 0)
+				{ printf("%s/%s\n",tree,$1)}
+			 else
+				{ printf("%s\n",$1)}}' >> $FLIST
+
+    #
+    # There is a bug in the output of fstatus -aC on recent versions: it
+    # inserts a space between the name of the tree and the filename of the
+    # old file. e.g.:
+    #
+    # $ hg fstatus -aC
+    # [.]
+    #
+    # [MyWS]
+    # A MyWS/subdir/File2
+    #  MyWS/ File2
+    #
+    # [MyWS2]
+    #
+
+    hg fstatus -aC $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
+	/^\[.*\]$/	{tree=substr($1,2,length($1)-2); next}
+	/^A .*/		{n=index($2,tree);
+			 if (n == 0)
+				{ printf("A %s/%s\n",tree,$2)}
+			 else
+				{ printf("A %s\n",$2)}; 
+			 next}
+	/^ /		{n=index($1,tree);
+			 if (n == 0)
+				{ printf("%s/%s\n",tree,$1)}
+			 else
+				{ if (NF == 2)
+					printf("%s/%s\n",tree,$2)
+				  else
+					printf("%s\n",$1)
+				};
+			 next}
+	' | while read LINE; do
+	ldone=""
+	while [ -z "$ldone" ]; do
+	    ldone="1"
+	    set - $LINE
+	    if [ $# -eq 2 -a "$1" == "A" ]; then
+		AFILE=$2
+		if read LINE2; then
+		    set - $LINE2
+		    if [ $# -eq 1 ]; then
+			echo $AFILE $1 >>$FLIST
+		    elif [ $# -eq 2 ]; then
+			echo $AFILE >>$FLIST
+			LINE=$LINE2
+			ldone=""
+		    fi
+		else
+		    echo $AFILE >>$FLIST
+		fi
+	    fi
+	done
+    done
+    hg fstatus -rn $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
+	/^\[.*\]$/	{tree=substr($1,2,length($1)-2); next}
+	$1 != ""	{n=index($1,tree);
+			 if (n == 0)
+				{ printf("%s/%s\n",tree,$1)}
+			 else
+				{ printf("%s\n",$1)}}' | while read RFILE; do
+	grep "$RFILE" $FLIST >/dev/null
+	if [ $? -eq 1 ]; then
+	    echo $RFILE >>$FLIST
+	fi
+    done
+}
+
+#
+# flist_from_mercurial $PWS
+#
+# Only local file based repositories are supported at present
+# since even though we can determine the list from the parent finding
+# the changes is harder.
+#
+# We first look for any outgoing files, this is for when the user has
+# run hg commit.  If we don't find any then we look with hg status.
+#
+# We need at least one of default-push or default paths set in .hg/hgrc
+# If neither are set we don't know who to compare with.
+
+function flist_from_mercurial 
+{
+#	if [ "${PWS##ssh://}" != "$PWS" -o \
+#	     "${PWS##http://}" != "$PWS" -o \
+#	     "${PWS##https://}" != "$PWS" ]; then
+#		print "Remote Mercurial repositories not currently supported."
+#		print "Set default and/or default-push to a local repository"
+#		exit
+#	fi
+    if [[ -n $forestflag ]]; then
+        HG_LIST_FROM_COMMIT=
+	flist_from_mercurial_forest
+    else
+        STATUS_REV=
+        if [[ -n $rflag ]]; then
+            STATUS_REV="--rev $PARENT_REV"
+        elif [[ -n $OUTREV ]]; then
+            STATUS_REV="--rev $OUTREV"
+        else
+            # hg commit hasn't been run see what is lying around
+            print "\n No outgoing, perhaps you haven't commited."
+        fi
+	# First let's list all the modified or deleted files
+
+	hg status $STATUS_REV -mdn | $FILTER > $FLIST
+
+	# Then all the added files
+	# But some of these could have been "moved" or renamed ones
+	# so let's make sure we get the proper info
+	# hg status -aC will produce something like:
+	#	A subdir/File3
+	#	A subdir/File4
+	#	  File4
+	#	A subdir/File5
+	# The first and last are simple addition while the middle one
+	# is a move/rename
+
+	hg status $STATUS_REV -aC | $FILTER >$FLIST.temp
+	while read LINE; do
+	    ldone=""
+	    while [ -z "$ldone" ]; do
+		ldone="1"
+		set - $LINE
+		if [ $# -eq 2 -a "$1" == "A" ]; then
+		    AFILE=$2
+		    if read LINE2; then
+			set - $LINE2
+			if [ $# -eq 1 ]; then
+			    echo $AFILE $1 >>$FLIST
+			elif [ $# -eq 2 ]; then
+			    echo $AFILE >>$FLIST
+			    LINE=$LINE2
+			    ldone=""
+			fi
+		    else
+			echo $AFILE >>$FLIST
+		    fi
+		fi
+	    done
+	done < $FLIST.temp
+	hg status $STATUS_REV -rn | $FILTER > $FLIST.temp
+	while read RFILE; do
+	    grep "$RFILE" $FLIST >/dev/null
+	    if [ $? -eq 1 ]; then
+		echo $RFILE >>$FLIST
+	    fi
+	done < $FLIST.temp
+	rm -f $FLIST.temp
+    fi
+}
+
+function env_from_flist
+{
+	[[ -r $FLIST ]] || return
+
+	#
+	# Use "eval" to set env variables that are listed in the file
+	# list.  Then copy those into our local versions of those
+	# variables if they have not been set already.
+	#
+	eval `sed -e "s/#.*$//" $FLIST | grep = `
+
+	[[ -z $codemgr_ws && -n $CODEMGR_WS ]] && codemgr_ws=$CODEMGR_WS
+
+	#
+	# Check to see if CODEMGR_PARENT is set in the flist file.
+	#
+	[[ -z $codemgr_parent && -n $CODEMGR_PARENT ]] && \
+	    codemgr_parent=$CODEMGR_PARENT
+}
+
+#
+# detect_scm
+#
+# We dynamically test the SCM type; this allows future extensions to
+# new SCM types
+#
+function detect_scm
+{
+	#
+	# If CODEMGR_WS is specified in the flist file, we assume teamware.
+	#
+	if [[ -r $FLIST ]]; then
+		egrep '^CODEMGR_WS=' $FLIST > /dev/null 2>&1
+		if [[ $? -eq 0 ]]; then
+			print "teamware"
+			return
+		fi
+	fi
+
+	#
+	# The presence of $CODEMGR_WS and a Codemgr_wsdata directory
+	# is our clue that this is a teamware workspace.
+	# Same if true if current directory has a Codemgr_wsdata sub-dir
+	#
+	if [[ -z "$CODEMGR_WS" ]]; then
+	    CODEMGR_WS=`workspace name 2>/dev/null`
+	fi
+
+	if [[ -n $CODEMGR_WS && -d "$CODEMGR_WS/Codemgr_wsdata" ]]; then
+		print "teamware"
+	elif [[ -d $PWD/Codemgr_wsdata ]]; then
+		print "teamware"
+	elif hg root >/dev/null ; then
+		print "mercurial"
+	else
+		print "unknown"
+	fi
+}
+
+#
+# Extract the parent workspace from the Codemgr_wsdata/parent file
+#
+function parent_from_teamware
+{
+    if [[ -f "$1/Codemgr_wsdata/parent" ]]; then
+	tail -1 "$1/Codemgr_wsdata/parent"
+    fi
+}
+
+function look_for_prog
+{
+	typeset path
+	typeset ppath
+	typeset progname=$1
+
+	DEVTOOLS=
+	OS=`uname`
+	if [[ "$OS" == "SunOS" ]]; then
+	    DEVTOOLS="/java/devtools/`uname -p`/bin"
+	elif [[ "$OS" == "Linux" ]]; then
+	    DEVTOOLS="/java/devtools/linux/bin"
+	fi
+	    
+	ppath=$PATH
+	ppath=$ppath:/usr/sfw/bin:/usr/bin:/usr/sbin
+	ppath=$ppath:/opt/teamware/bin:/opt/onbld/bin
+	ppath=$ppath:/opt/onbld/bin/`uname -p`
+	ppath=$ppath:/java/devtools/share/bin:$DEVTOOLS
+
+	PATH=$ppath prog=`whence $progname`
+	if [[ -n $prog ]]; then
+		print $prog
+	fi
+}
+
+function build_old_new_teamware
+{
+	# If the child's version doesn't exist then
+	# get a readonly copy.
+
+	if [[ ! -f $F && -f SCCS/s.$F ]]; then
+		$SCCS get -s $F
+	fi
+
+	#
+	# Snag new version of file.
+	#
+	rm -f $newdir/$DIR/$F
+	cp $F $newdir/$DIR/$F
+
+	#
+	# Get the parent's version of the file. First see whether the
+	# child's version is checked out and get the parent's version
+	# with keywords expanded or unexpanded as appropriate.
+	#
+	if [ -f $PWS/$PDIR/SCCS/s.$PF -o \
+	    -f $PWS/$PDIR/SCCS/p.$PF ]; then
+		rm -f $olddir/$PDIR/$PF
+		if [ -f SCCS/p.$F ]; then
+			$SCCS get -s -p -k $PWS/$PDIR/$PF \
+			    > $olddir/$PDIR/$PF
+		else
+			$SCCS get -s -p    $PWS/$PDIR/$PF \
+			    > $olddir/$PDIR/$PF
+		fi
+	else
+		if [[ -f $PWS/$PDIR/$PF ]]; then
+			# Parent is not a real workspace, but just a raw
+			# directory tree - use the file that's there as
+			# the old file.
+
+			rm -f $olddir/$DIR/$F
+			cp $PWS/$PDIR/$PF $olddir/$DIR/$F
+		fi
+	fi
+}
+
+#
+# Find the parent for $1
+#
+function find_outrev
+{
+    crev=$1
+    prev=`hg log -r $crev --template '{parents}\n'`
+    if [[ -z "$prev" ]]
+    then
+	# No specific parent means previous changeset is parent
+	prev=`expr $crev - 1`
+    else
+	# Format is either of the following two:
+	# 546:7df6fcf1183b
+	# 548:16f1915bb5cd 547:ffaa4e775815
+	prev=`echo $prev | sed -e 's/\([0-9]*\):.*/\1/'`
+    fi
+    print $prev
+}
+
+function extract_ssh_infos
+{
+    CMD=$1
+    if expr "$CMD" : 'ssh://[^/]*@' >/dev/null; then
+	ssh_user=`echo $CMD | sed -e 's/ssh:\/\/\(.*\)@.*/\1/'`
+	ssh_host=`echo $CMD | sed -e 's/ssh:\/\/.*@\([^/]*\)\/.*/\1/'`
+	ssh_dir=`echo $CMD | sed -e 's/ssh:\/\/.*@[^/]*\/\(.*\)/\1/'`
+    else
+	ssh_user=
+	ssh_host=`echo $CMD | sed -e 's/ssh:\/\/\([^/]*\)\/.*/\1/'`
+	ssh_dir=`echo $CMD | sed -e 's/ssh:\/\/[^/]*\/\(.*\)/\1/'`
+    fi
+    
+}
+
+function build_old_new_mercurial
+{
+	olddir=$1
+	newdir=$2
+	DIR=$3
+	F=$4
+	#
+	# new version of the file.
+	#
+	rm -rf $newdir/$DIR/$F
+	if [ -f $F ]; then
+	    cp $F  $newdir/$DIR/$F
+	fi
+
+	#
+	# Old version of the file.
+	#
+	rm -rf $olddir/$DIR/$F
+
+	if [ -n "$PWS" ]; then
+	    if expr "$PWS" : 'ssh://' >/dev/null
+	    then
+		extract_ssh_infos $PWS
+		if [ -n "$ssh_user" ]; then
+		    parent="ssh -l $ssh_user $ssh_host hg -R $ssh_dir --cwd $ssh_dir"
+		else
+		    parent="ssh $ssh_host hg -R $ssh_dir --cwd $ssh_dir"
+		fi
+	    else
+		parent="hg -R $PWS --cwd $PWS"
+	    fi
+	else
+	    parent=""
+	fi
+
+	if [ -z "$rename" ]; then
+	    if [ -n "$rflag" ]; then
+		parentrev=$PARENT_REV
+	    elif [ "$HG_LIST_FROM_COMMIT" -eq 1 ]; then
+                parentrev=$OUTREV
+	    else
+                if [[ -n $HG_BRANCH ]]; then
+                    parentrev=$HG_BRANCH
+                else
+		    parentrev="tip"
+                fi
+	    fi
+
+	    if [ -n "$parentrev" ]; then
+		if [ -z "$parent" ]; then
+		    hg cat --rev $parentrev --output $olddir/$DIR/$F $F 2>/dev/null
+		else
+		    # when specifying a workspace we have to provide
+		    # the full path
+		    $parent cat --rev $parentrev --output $olddir/$DIR/$F $DIR/$F 2>/dev/null
+		fi
+	    fi
+	else
+	    # It's a rename (or a move), so let's make sure we move
+	    # to the right directory first, then restore it once done
+	    current_dir=`pwd`
+	    cd $CWS/$PDIR
+	    if [ -n "$rflag" ]; then
+		parentrev=$PARENT_REV
+	    elif [ "$HG_LIST_FROM_COMMIT" -eq 1 ]; then
+                parentrev=$OUTREV
+	    fi
+	    if [ -z "$parentrev" ]; then
+		parentrev=`hg log -l1 $PF | $AWK -F: '/changeset/ {print $2}'`
+	    fi
+	    if [ -n "$parentrev" ]; then
+		mkdir -p $olddir/$PDIR
+		if [ -z "$parent" ]; then
+		    hg cat --rev $parentrev --output $olddir/$PDIR/$PF $PF 2>/dev/null
+		else
+		    $parent cat --rev $parentrev --output $olddir/$PDIR/$PF $PDIR/$PF 2>/dev/null
+		fi
+	    fi
+	    cd $current_dir
+	fi
+}
+
+function build_old_new
+{
+	if [[ $SCM_MODE == "teamware" ]]; then
+		build_old_new_teamware $@
+	fi
+
+	if [[ $SCM_MODE == "mercurial" ]]; then
+		build_old_new_mercurial $@
+	fi
+}
+
+
+#
+# Usage message.
+#
+function usage
+{
+	print "Usage:\twebrev [common-options]
+	webrev [common-options] ( <file> | - )
+	webrev [common-options] -w <wx file>
+	webrev [common-options] -l [arguments to 'putback']
+
+Options:
+	-v: Print the version of this tool.
+        -b: Do not ignore changes in the amount of white space.
+        -c <CR#>: Include link to CR (aka bugid) in the main page.
+	-O: Print bugids/arc cases suitable for OpenJDK.
+	-i <filename>: Include <filename> in the index.html file.
+	-o <outdir>: Output webrev to specified directory.
+	-p <compare-against>: Use specified parent wkspc or basis for comparison
+	-w <wxfile>: Use specified wx active file.
+        -u <username>: Use that username instead of 'guessing' one.
+	-m: Forces the use of Mercurial
+	-t: Forces the use of Teamware
+
+Mercurial only options:
+	-r rev: Compare against a specified revision
+	-N: Skip 'hg outgoing', use only 'hg status'
+	-f: Use the forest extension
+
+Environment:
+	WDIR: Control the output directory.
+	WEBREV_BUGURL: Control the URL prefix for bugids.
+	WEBREV_SACURL: Control the URL prefix for ARC cases.
+
+SCM Environment:
+	Teamware: CODEMGR_WS: Workspace location.
+	Teamware: CODEMGR_PARENT: Parent workspace location.
+
+"
+
+	exit 2
+}
+
+#
+#
+# Main program starts here
+#
+#
+LANG="C"
+LC_ALL="C"
+export LANG LC_ALL
+trap "rm -f /tmp/$$.* ; exit" 0 1 2 3 15
+
+set +o noclobber
+
+[[ -z $WDIFF ]] && WDIFF=`look_for_prog wdiff`
+[[ -z $WX ]] && WX=`look_for_prog wx`
+[[ -z $CODEREVIEW ]] && CODEREVIEW=`look_for_prog codereview`
+[[ -z $PS2PDF ]] && PS2PDF=`look_for_prog ps2pdf`
+[[ -z $PERL ]] && PERL=`look_for_prog perl`
+[[ -z $SCCS ]] && SCCS=`look_for_prog sccs`
+[[ -z $AWK ]] && AWK=`look_for_prog nawk`
+[[ -z $AWK ]] && AWK=`look_for_prog gawk`
+[[ -z $AWK ]] && AWK=`look_for_prog awk`
+[[ -z $WSPACE ]] && WSPACE=`look_for_prog workspace`
+[[ -z $JAR ]] && JAR=`look_for_prog jar`
+[[ -z $ZIP ]] && ZIP=`look_for_prog zip`
+[[ -z $GETENT ]] && GETENT=`look_for_prog getent`
+[[ -z $WGET ]] && WGET=`look_for_prog wget`
+
+if uname | grep CYGWIN >/dev/null
+then
+        ISWIN=1
+        # Under windows mercurial outputs '\' instead of '/'
+        FILTER="tr '\\\\' '/'"
+else
+        FILTER="cat"
+fi
+
+if [[ ! -x $PERL ]]; then
+	print -u2 "Error: No perl interpreter found.  Exiting."
+	exit 1
+fi
+
+#
+# These aren't fatal, but we want to note them to the user.
+# We don't warn on the absence of 'wx' until later when we've
+# determined that we actually need to try to invoke it.
+#
+# [[ ! -x $CODEREVIEW ]] && print -u2 "WARNING: codereview(1) not found."
+# [[ ! -x $PS2PDF ]] && print -u2 "WARNING: ps2pdf(1) not found."
+# [[ ! -x $WDIFF ]] && print -u2 "WARNING: wdiff not found."
+
+# Declare global total counters.
+integer TOTL TINS TDEL TMOD TUNC
+
+flist_mode=
+flist_file=
+bflag=
+iflag=
+oflag=
+pflag=
+uflag=
+lflag=
+wflag=
+Oflag=
+rflag=
+Nflag=
+forestflag=
+while getopts "c:i:o:p:r:u:lmtwONvfb" opt
+do
+	case $opt in
+        b)      bflag=1;;
+
+	i)	iflag=1
+		INCLUDE_FILE=$OPTARG;;
+
+	o)	oflag=1
+		WDIR=$OPTARG;;
+
+	p)	pflag=1
+		codemgr_parent=$OPTARG;;
+
+	u)      uflag=1
+		username=$OPTARG;;
+
+        c)      if [[ -z $CRID ]]; then
+                   CRID=$OPTARG
+                else
+                   CRID="$CRID $OPTARG"
+                fi;;
+
+	m)	SCM_MODE="mercurial";;
+
+	t)	SCM_MODE="teamware";;
+
+	#
+	# If -l has been specified, we need to abort further options
+	# processing, because subsequent arguments are going to be
+	# arguments to 'putback -n'.
+	#
+	l)	lflag=1
+		break;;
+
+	w)	wflag=1;;
+
+	O)	Oflag=1;;
+
+	N)	Nflag=1;;
+
+	f)	forestflag=1;;
+
+	r)	rflag=1
+		PARENT_REV=$OPTARG;;
+
+	v)	print "$0 version: $WEBREV_UPDATED";;
+		
+
+	?)	usage;;
+	esac
+done
+
+FLIST=/tmp/$$.flist
+
+if [[ -n $wflag && -n $lflag ]]; then
+	usage
+fi
+
+if [[ -n $forestflag && -n $rflag ]]; then
+    print "The -r <rev> flag is incompatible with the use of forests"
+    exit 2
+fi
+
+#
+# If this manually set as the parent, and it appears to be an earlier webrev,
+# then note that fact and set the parent to the raw_files/new subdirectory.
+#
+if [[ -n $pflag && -d $codemgr_parent/raw_files/new ]]; then
+	parent_webrev="$codemgr_parent"
+	codemgr_parent="$codemgr_parent/raw_files/new"
+fi
+
+if [[ -z $wflag && -z $lflag ]]; then
+	shift $(($OPTIND - 1))
+
+	if [[ $1 == "-" ]]; then
+		cat > $FLIST
+		flist_mode="stdin"
+		flist_done=1
+		shift
+	elif [[ -n $1 ]]; then
+		if [[ ! -r $1 ]]; then
+			print -u2 "$1: no such file or not readable"
+			usage
+		fi
+		cat $1 > $FLIST
+		flist_mode="file"
+		flist_file=$1
+		flist_done=1
+		shift
+	else
+		flist_mode="auto"
+	fi
+fi
+
+#
+# Before we go on to further consider -l and -w, work out which SCM we think
+# is in use.
+#
+if [[ -z $SCM_MODE ]]; then
+    SCM_MODE=`detect_scm $FLIST`
+fi
+if [[ $SCM_MODE == "unknown" ]]; then
+	print -u2 "Unable to determine SCM type currently in use."
+	print -u2 "For teamware: webrev looks for \$CODEMGR_WS either in"
+	print -u2 "              the environment or in the file list."
+	print -u2 "For mercurial: webrev runs 'hg root'."
+	exit 1
+fi
+
+print -u2 "   SCM detected: $SCM_MODE"
+
+
+if [[ $SCM_MODE == "mercurial" ]]; then
+    #
+    # determine Workspace and parent workspace paths
+    #
+    CWS=`hg root | $FILTER`
+    if [[ -n $pflag && -z "$PWS" ]]; then
+	OUTPWS=$codemgr_parent
+        # Let's try to expand it if it's an alias defined in [paths]
+        tmp=`hg path $OUTPWS 2>/dev/null | $FILTER`
+        if [[ -n $tmp ]]; then
+            OUTPWS="$tmp"
+        fi
+        if [[ -n $rflag ]]; then
+	    if expr "$codemgr_parent" : 'ssh://.*' >/dev/null; then
+	        PWS=$codemgr_parent
+	    else
+	        PWS=`hg -R "$codemgr_parent" root 2>/dev/null | $FILTER`
+	    fi
+        fi
+    fi
+    #
+    # OUTPWS is the parent repository to use when using 'hg outgoing'
+    #
+    if [[ -z $Nflag ]]; then
+        if [[ -n $forestflag ]]; then
+            #
+            # for forest we have to rely on properly set default and
+            # default-push because they can be different from the top one.
+            # unless of course it was explicitely speficied with -p
+            if [[ -z $pflag ]]; then
+                OUTPWS=
+            fi
+        else
+            #
+            # Unfortunately mercurial is bugged and doesn't handle
+            # aliases correctly in 'hg path default'
+            # So let's do it ourselves. Sigh...
+            if [[ -z "$OUTPWS" ]]; then
+                OUTPWS=`grep default-push $CWS/.hg/hgrc | $AWK '{print $3}' | $FILTER`
+            fi
+            # Still empty, means no default-push
+            if [[ -z "$OUTPWS" ]]; then
+                OUTPWS=`grep 'default =' $CWS/.hg/hgrc | $AWK '{print $3}' | $FILTER`
+            fi
+            # Let's try to expand it if it's an alias defined in [paths]
+            tmp=`hg path $OUTPWS 2>/dev/null | $FILTER`
+            if [[ -n $tmp ]]; then
+                OUTPWS="$tmp"
+            fi
+        fi
+    fi
+    #
+    # OUTPWS may contain username:password, let's make sure we remove the
+    # sensitive information before we print out anything in the HTML
+    #
+    OUTPWS2=$OUTPWS
+    if [[ -n $OUTPWS ]]; then
+	if [[ `expr "$OUTPWS" : '.*://[^/]*@.*'` -gt 0 ]]; then
+	    # Remove everything between '://' and '@'
+	    OUTPWS2=`echo $OUTPWS | sed -e 's/\(.*:\/\/\).*@\(.*\)/\1\2/'`
+	fi
+    fi
+
+    if [[ -z $HG_BRANCH ]]; then
+        HG_BRANCH=`hg branch`
+        if [ "$HG_BRANCH" == "default" ]; then
+            #
+            # 'default' means no particular branch, so let's cancel that
+            #
+            HG_BRANCH=
+        fi
+    fi
+
+    if [[ -z $forestflag ]]; then
+        if [[ -z $Nflag ]]; then
+            #
+            # If no "-N", always do "hg outgoing" against parent
+            # repository to determine list of outgoing revisions.
+            #
+            ALL_CREV=`hg outgoing -q --template '{rev}\n' $OUTPWS | sort -n`
+            if [[ -n $ALL_CREV ]]; then
+                FIRST_CREV=`echo "$ALL_CREV" | head -1`
+                #
+                # If no "-r", choose revision to compare against by
+                # finding the latest revision not in the outgoing list.
+                #
+                if [[ -z $rflag ]]; then
+                    OUTREV=`find_outrev "$FIRST_CREV"`
+                    if [[ -n $OUTREV ]]; then
+                        HG_LIST_FROM_COMMIT=1
+                    fi
+                fi
+            fi
+        elif [[ -n $rflag ]]; then
+            #
+            # If skipping "hg outgoing" but still comparing against a
+            # specific revision (not the tip), set revision for comment
+            # accumulation.
+            #
+            FIRST_CREV=`hg log --rev $PARENT_REV --template '{rev}'`
+            FIRST_CREV=`expr $FIRST_CREV + 1`
+        fi
+    fi
+    #Let's check if a merge is needed, if so, issue a warning
+    PREV=`hg parent | grep '^tag:.*tip$'`
+    if [[ -z $PREV ]]; then
+        print "WARNING: parent rev is not tip. Maybe an update or merge is needed"
+    fi
+fi
+
+if [[ -n $lflag ]]; then
+	#
+	# If the -l flag is given instead of the name of a file list,
+	# then generate the file list by extracting file names from a
+	# putback -n.
+	#
+	shift $(($OPTIND - 1))
+	if [[ $SCM_MODE == "teamware" ]]; then
+		flist_from_teamware "$*"
+	elif [[ $SCM_MODE == "mercurial" ]]; then
+		flist_from_mercurial
+	fi
+	flist_done=1
+	shift $#
+
+elif [[ -n $wflag ]]; then
+	#
+	# If the -w is given then assume the file list is in Bonwick's "wx"
+	# command format, i.e.  pathname lines alternating with SCCS comment
+	# lines with blank lines as separators.  Use the SCCS comments later
+	# in building the index.html file.
+	#
+	shift $(($OPTIND - 1))
+	wxfile=$1
+	if [[ -z $wxfile && -n $CODEMGR_WS ]]; then
+		if [[ -r $CODEMGR_WS/wx/active ]]; then
+			wxfile=$CODEMGR_WS/wx/active
+		fi
+	fi
+
+	[[ -z $wxfile ]] && print -u2 "wx file not specified, and could not " \
+	    "be auto-detected (check \$CODEMGR_WS)" && exit 1
+
+	print -u2 " File list from: wx 'active' file '$wxfile' ... \c"
+	flist_from_wx $wxfile
+	flist_done=1
+	if [[ -n "$*" ]]; then
+		shift
+	fi
+elif [[ $flist_mode == "stdin" ]]; then
+	print -u2 " File list from: standard input"
+elif [[ $flist_mode == "file" ]]; then
+	print -u2 " File list from: $flist_file"
+fi
+
+if [[ $# -gt 0 ]]; then
+	print -u2 "WARNING: unused arguments: $*"
+fi
+
+if [[ $SCM_MODE == "teamware" ]]; then
+	#
+	# Parent (internally $codemgr_parent) and workspace ($codemgr_ws) can
+	# be set in a number of ways, in decreasing precedence:
+	#
+	#      1) on the command line (only for the parent)
+	#      2) in the user environment
+	#      3) in the flist
+	#      4) automatically based on the workspace (only for the parent)
+	#
+
+	#
+	# Here is case (2): the user environment
+	#
+	[[ -z $codemgr_ws && -n $CODEMGR_WS ]] && codemgr_ws=$CODEMGR_WS
+	[[ -z $codemgr_ws && -n $WSPACE ]] && codemgr_ws=`$WSPACE name`
+	    
+	if [[ -n $codemgr_ws && ! -d $codemgr_ws ]]; then
+		print -u2 "$codemgr_ws: no such workspace"
+		exit 1
+	fi
+
+	[[ -z $codemgr_parent && -n $CODEMGR_PARENT ]] && \
+	    codemgr_parent=$CODEMGR_PARENT
+
+	if [[ -n $codemgr_parent && ! -d $codemgr_parent ]]; then
+		print -u2 "$codemgr_parent: no such directory"
+		exit 1
+	fi
+
+	#
+	# If we're in auto-detect mode and we haven't already gotten the file
+	# list, then see if we can get it by probing for wx.
+	#
+	if [[ -z $flist_done && $flist_mode == "auto" && -n $codemgr_ws ]]; then
+		if [[ ! -x $WX ]]; then
+			print -u2 "WARNING: wx not found!"
+		fi
+
+		#
+		# We need to use wx list -w so that we get renamed files, etc.
+		# but only if a wx active file exists-- otherwise wx will
+		# hang asking us to initialize our wx information.
+		#
+		if [[ -x $WX && -f $codemgr_ws/wx/active ]]; then
+			print -u2 " File list from: 'wx list -w' ... \c"
+			$WX list -w > $FLIST
+			$WX comments > /tmp/$$.wx_comments
+			wxfile=/tmp/$$.wx_comments
+			print -u2 "done"
+			flist_done=1
+		fi
+	fi
+
+	#
+	# If by hook or by crook we've gotten a file list by now (perhaps
+	# from the command line), eval it to extract environment variables from
+	# it: This is step (3).
+	#
+	env_from_flist
+
+	#
+	# Continuing step (3): If we still have no file list, we'll try to get
+	# it from teamware.
+	#
+	if [[ -z $flist_done ]]; then
+		flist_from_teamware
+		env_from_flist
+	fi
+
+	if [[ -z $codemgr_ws && -d $PWD/Codemgr_wsdata ]]; then
+	    codemgr_ws=$PWD
+	fi
+	#
+	# Observe true directory name of CODEMGR_WS, as used later in
+	# webrev title.
+	#
+	if [[ -n $codemgr_ws ]]; then
+	    codemgr_ws=$(cd $codemgr_ws;print $PWD)
+	fi
+
+	if [[ -n $codemgr_parent ]]; then
+	    codemgr_parent=$(cd $codemgr_parent;print $PWD)
+	fi
+
+	#
+	# (4) If we still don't have a value for codemgr_parent, get it
+	# from workspace.
+	#
+	[[ -z $codemgr_parent && -n $WSPACE ]] && codemgr_parent=`$WSPACE parent`
+	[[ -z $codemgr_parent ]] && codemgr_parent=`parent_from_teamware $codemgr_ws`
+
+	if [[ ! -d $codemgr_parent ]]; then
+	    print -u2 "$CODEMGR_PARENT: no such parent workspace"
+	    exit 1
+	fi
+
+	#
+	# Reset CODEMGR_WS to make sure teamware commands are happy.
+	#
+	CODEMGR_WS=$codemgr_ws
+	CWS=$codemgr_ws
+	PWS=$codemgr_parent
+elif [[ $SCM_MODE == "mercurial" ]]; then
+    if [[ -z $flist_done ]]; then
+	flist_from_mercurial $PWS
+    fi
+fi
+
+#
+# If the user didn't specify a -i option, check to see if there is a
+# webrev-info file in the workspace directory.
+#
+if [[ -z $iflag && -r "$CWS/webrev-info" ]]; then
+	iflag=1
+	INCLUDE_FILE="$CWS/webrev-info"
+fi
+
+if [[ -n $iflag ]]; then
+	if [[ ! -r $INCLUDE_FILE ]]; then
+		print -u2 "include file '$INCLUDE_FILE' does not exist or is" \
+		    "not readable."
+		exit 1
+	else
+		#
+		# $INCLUDE_FILE may be a relative path, and the script alters
+		# PWD, so we just stash a copy in /tmp.
+		#
+		cp $INCLUDE_FILE /tmp/$$.include
+	fi
+fi
+
+#
+# Output directory.
+#
+if [[ -z $WDIR ]]; then
+    WDIR=$CWS/webrev
+else
+    # If the output directory doesn't end with '/webrev' or '/webrev/'
+    # then add '/webrev'. This is for backward compatibility
+    if ! expr $WDIR : '.*/webrev/\?$' >/dev/null
+    then
+	WDIR=$WDIR/webrev
+    fi
+fi
+# WDIR=${WDIR:-$CWS/webrev}
+
+#
+# Name of the webrev, derived from the workspace name; in the
+# future this could potentially be an option.
+#
+# Let's keep what's after the last '/'
+WNAME=${CWS##*/}
+
+#
+# If WDIR doesn't start with '/' or 'x:' prepend the current dir
+#
+if [ ${WDIR%%/*} ]; then
+    if [[ -n $ISWIN ]]; then
+        if [ ${WDIR%%[A-Za-z]:*} ]; then
+	    WDIR=$PWD/$WDIR
+        fi
+    else
+	WDIR=$PWD/$WDIR
+    fi
+fi
+
+if [[ ! -d $WDIR ]]; then
+	mkdir -p $WDIR
+	[[ $? != 0 ]] && exit 1
+fi
+
+#
+# Summarize what we're going to do.
+#
+print "      Workspace: $CWS"
+if [[ -n $parent_webrev ]]; then
+    print "Compare against: webrev at $parent_webrev"
+elif [[ -n $OUTPWS2 ]]; then
+    print "Compare against: $OUTPWS2"
+fi
+if [[ -n $HG_BRANCH ]]; then
+    print "         Branch: $HG_BRANCH"
+fi
+if [[ -n $rflag ]]; then
+        print "Compare against version: $PARENT_REV"
+fi
+[[ -n $INCLUDE_FILE ]] && print "      Including: $INCLUDE_FILE"
+print "      Output to: $WDIR"
+
+#
+# Save the file list in the webrev dir
+#
+[[ ! $FLIST -ef $WDIR/file.list ]] && cp $FLIST $WDIR/file.list
+
+#
+#    Bug IDs will be replaced by a URL.  Order of precedence
+#    is: default location, $WEBREV_BUGURL, the -O flag.
+#
+BUGURL='http://monaco.sfbay.sun.com/detail.jsp?cr='
+[[ -n $WEBREV_BUGURL ]] && BUGURL="$WEBREV_BUGURL"
+[[ -n "$Oflag" ]] && \
+    BUGURL='http://bugs.sun.com/bugdatabase/view_bug.do?bug_id='
+
+#
+#    Likewise, ARC cases will be replaced by a URL.  Order of precedence
+#    is: default, $WEBREV_SACURL, the -O flag.
+#
+#    Note that -O also triggers different substitution behavior for
+#    SACURL.  See sac2url().
+#
+SACURL='http://sac.eng.sun.com'
+[[ -n $WEBREV_SACURL ]] && SACURL="$WEBREV_SACURL"
+[[ -n $Oflag ]] && \
+    SACURL='http://www.opensolaris.org/os/community/arc/caselog'
+
+rm -f $WDIR/$WNAME.patch
+rm -f $WDIR/$WNAME.ps
+rm -f $WDIR/$WNAME.pdf
+
+touch $WDIR/$WNAME.patch
+
+print "   Output Files:"
+
+#
+# Clean up the file list: Remove comments, blank lines and env variables.
+#
+sed -e "s/#.*$//" -e "/=/d" -e "/^[   ]*$/d" $FLIST > /tmp/$$.flist.clean
+FLIST=/tmp/$$.flist.clean
+
+#
+# Clean up residual raw files
+#
+if [ -d $WDIR/raw_files ]; then
+    rm -rf $WDIR/raw_files 2>/dev/null
+fi
+
+#
+# Should we ignore changes in white spaces when generating diffs?
+# 
+if [[ -n $bflag ]]; then
+    DIFFOPTS="-t"
+else
+    DIFFOPTS="-bt"
+fi
+#
+# First pass through the files: generate the per-file webrev HTML-files.
+#
+while read LINE
+do
+	set - $LINE
+	P=$1
+
+        if [[ $1 == "Revision:" ]]; then
+            OUTREV=$2
+            continue
+        fi
+	#
+	# Normally, each line in the file list is just a pathname of a
+	# file that has been modified or created in the child.  A file
+	# that is renamed in the child workspace has two names on the
+	# line: new name followed by the old name.
+	#
+	oldname=""
+	oldpath=""
+	rename=
+	if [[ $# -eq 2 ]]; then
+		PP=$2			# old filename
+		oldname=" (was $PP)"
+		oldpath="$PP"
+		rename=1
+        	PDIR=${PP%/*}
+        	if [[ $PDIR == $PP ]]; then
+			PDIR="."   # File at root of workspace
+		fi
+
+		PF=${PP##*/}
+
+	        DIR=${P%/*}
+	        if [[ $DIR == $P ]]; then
+			DIR="."   # File at root of workspace
+		fi
+
+		F=${P##*/}
+        else
+	        DIR=${P%/*}
+	        if [[ "$DIR" == "$P" ]]; then
+			DIR="."   # File at root of workspace
+		fi
+
+		F=${P##*/}
+
+		PP=$P
+		PDIR=$DIR
+		PF=$F
+	fi
+
+        # Make the webrev directory if necessary as it may have been
+        # removed because it was empty
+        if [ ! -d $CWS/$DIR ]; then
+	    mkdir -p $CWS/$DIR
+        fi
+
+	COMM=`getcomments html $P $PP`
+
+	print "\t$P$oldname\n\t\t\c"
+
+	# Make the webrev mirror directory if necessary
+	mkdir -p $WDIR/$DIR
+
+	# cd to the directory so the names are short
+	cd $CWS/$DIR
+
+	#
+	# If we're in OpenSolaris mode, we enforce a minor policy:
+	# help to make sure the reviewer doesn't accidentally publish
+	# source which is in usr/closed/*
+	#
+	if [[ -n $Oflag ]]; then
+		pclosed=${P##usr/closed/}
+		if [[ $pclosed != $P ]]; then
+			print "*** Omitting closed source for OpenSolaris" \
+			    "mode review"
+			continue
+		fi
+	fi
+
+	#
+	# We stash old and new files into parallel directories in /tmp
+	# and do our diffs there.  This makes it possible to generate
+	# clean looking diffs which don't have absolute paths present.
+	#
+	olddir=$WDIR/raw_files/old
+	newdir=$WDIR/raw_files/new
+	mkdir -p $olddir
+	mkdir -p $newdir
+	mkdir -p $olddir/$PDIR
+	mkdir -p $newdir/$DIR
+
+	build_old_new $olddir $newdir $DIR $F
+
+	if [[ ! -f $F && ! -f $olddir/$DIR/$F ]]; then
+		print "*** Error: file not in parent or child"
+		continue
+	fi
+
+	cd $WDIR/raw_files
+	ofile=old/$PDIR/$PF
+	nfile=new/$DIR/$F
+
+	mv_but_nodiff=
+	cmp $ofile $nfile > /dev/null 2>&1
+	if [[ $? == 0 && $rename == 1 ]]; then
+		mv_but_nodiff=1
+	fi
+
+        #
+        # Cleaning up
+        #
+        rm -f $WDIR/$DIR/$F.cdiff.html
+        rm -f $WDIR/$DIR/$F.udiff.html
+        rm -f $WDIR/$DIR/$F.wdiff.html
+        rm -f $WDIR/$DIR/$F.sdiff.html
+        rm -f $WDIR/$DIR/$F-.html
+        rm -f $WDIR/$DIR/$F.html
+
+	its_a_jar=
+	if expr $F : '.*\.jar' >/dev/null; then
+	    its_a_jar=1
+	    # It's a JAR file, let's do it differntly
+	    if [[ -z $JAR ]]; then
+		print "No access to jar, so can't produce diffs for jar files"
+	    else
+		if [ -f $ofile ]; then
+		    $JAR -tvf $ofile >"$ofile".lst
+		fi
+		if [ -f $nfile ]; then
+		    $JAR -tvf $nfile >"$nfile".lst
+		fi
+
+		if [[ -f $ofile && -f $nfile && -z $mv_but_nodiff ]]; then
+
+		    ${CDIFFCMD:-diff -bt -C 5} $ofile.lst $nfile.lst > $WDIR/$DIR/$F.cdiff
+		    diff_to_html $F $DIR/$F "C" "$COMM" < $WDIR/$DIR/$F.cdiff \
+			> $WDIR/$DIR/$F.cdiff.html
+		    print " cdiffs\c"
+
+		    ${UDIFFCMD:-diff -bt -U 5} $ofile.lst $nfile.lst > $WDIR/$DIR/$F.udiff
+		    diff_to_html $F $DIR/$F "U" "$COMM" < $WDIR/$DIR/$F.udiff \
+			> $WDIR/$DIR/$F.udiff.html
+
+		    print " udiffs\c"
+
+		    if [[ -x $WDIFF ]]; then
+			$WDIFF -c "$COMM" \
+			    -t "$WNAME Wdiff $DIR/$F" $ofile.lst $nfile.lst > \
+			    $WDIR/$DIR/$F.wdiff.html 2>/dev/null
+			if [[ $? -eq 0 ]]; then
+			    print " wdiffs\c"
+			else
+			    print " wdiffs[fail]\c"
+			fi
+		    fi
+
+		    sdiff_to_html $ofile $nfile $F $DIR "$COMM" \
+			> $WDIR/$DIR/$F.sdiff.html
+		    print " sdiffs\c"
+
+		    print " frames\c"
+
+		    rm -f $WDIR/$DIR/$F.cdiff $WDIR/$DIR/$F.udiff
+
+		    difflines $ofile.lst $nfile.lst > $WDIR/$DIR/$F.count
+
+		elif [[ -f $ofile && -f $nfile && -n $mv_but_nodiff ]]; then
+		# renamed file: may also have differences
+		    difflines $ofile.lst $nfile.lst > $WDIR/$DIR/$F.count
+		elif [[ -f $nfile ]]; then
+		# new file: count added lines
+		    difflines /dev/null $nfile.lst > $WDIR/$DIR/$F.count
+		elif [[ -f $ofile ]]; then
+		# old file: count deleted lines
+		    difflines $ofile.lst /dev/null > $WDIR/$DIR/$F.count
+		fi
+	    fi
+	else
+	    
+	    #
+	    # If we have old and new versions of the file then run the
+	    # appropriate diffs.  This is complicated by a couple of factors:
+	    #
+	    #	- renames must be handled specially: we emit a 'remove'
+	    #	  diff and an 'add' diff
+	    #	- new files and deleted files must be handled specially
+	    #	- Solaris patch(1m) can't cope with file creation
+	    #	  (and hence renames) as of this writing.
+	    #   - To make matters worse, gnu patch doesn't interpret the
+	    #	  output of Solaris diff properly when it comes to
+	    #	  adds and deletes.  We need to do some "cleansing"
+	    #     transformations:
+	    # 	    [to add a file] @@ -1,0 +X,Y @@  -->  @@ -0,0 +X,Y @@
+	    #	    [to del a file] @@ -X,Y +1,0 @@  -->  @@ -X,Y +0,0 @@
+	    #
+	    cleanse_rmfile="sed 's/^\(@@ [0-9+,-]*\) [0-9+,-]* @@$/\1 +0,0 @@/'"
+	    cleanse_newfile="sed 's/^@@ [0-9+,-]* \([0-9+,-]* @@\)$/@@ -0,0 \1/'"
+
+	    rm -f $WDIR/$DIR/$F.patch
+	    if [[ -z $rename ]]; then
+		if [ ! -f $ofile ]; then
+		    diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
+			> $WDIR/$DIR/$F.patch
+		elif [ ! -f $nfile ]; then
+		    diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
+			> $WDIR/$DIR/$F.patch
+		else
+		    diff -u $ofile $nfile > $WDIR/$DIR/$F.patch
+		fi
+	    else
+		diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
+		    > $WDIR/$DIR/$F.patch
+
+		diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
+		    >> $WDIR/$DIR/$F.patch
+
+	    fi
+
+
+	#
+	# Tack the patch we just made onto the accumulated patch for the
+	# whole wad.
+	#
+	    cat $WDIR/$DIR/$F.patch >> $WDIR/$WNAME.patch
+
+	    print " patch\c"
+
+	    if [[ -f $ofile && -f $nfile && -z $mv_but_nodiff ]]; then
+
+		${CDIFFCMD:-diff -bt -C 5} $ofile $nfile > $WDIR/$DIR/$F.cdiff
+		diff_to_html $F $DIR/$F "C" "$COMM" < $WDIR/$DIR/$F.cdiff \
+		    > $WDIR/$DIR/$F.cdiff.html
+		print " cdiffs\c"
+
+		${UDIFFCMD:-diff -bt -U 5} $ofile $nfile > $WDIR/$DIR/$F.udiff
+		diff_to_html $F $DIR/$F "U" "$COMM" < $WDIR/$DIR/$F.udiff \
+		    > $WDIR/$DIR/$F.udiff.html
+
+		print " udiffs\c"
+
+		if [[ -x $WDIFF ]]; then
+		    $WDIFF -c "$COMM" \
+			-t "$WNAME Wdiff $DIR/$F" $ofile $nfile > \
+			$WDIR/$DIR/$F.wdiff.html 2>/dev/null
+		    if [[ $? -eq 0 ]]; then
+			print " wdiffs\c"
+		    else
+			print " wdiffs[fail]\c"
+		    fi
+		fi
+
+		sdiff_to_html $ofile $nfile $F $DIR "$COMM" \
+		    > $WDIR/$DIR/$F.sdiff.html
+		print " sdiffs\c"
+
+		print " frames\c"
+
+		rm -f $WDIR/$DIR/$F.cdiff $WDIR/$DIR/$F.udiff
+
+		difflines $ofile $nfile > $WDIR/$DIR/$F.count
+
+	    elif [[ -f $ofile && -f $nfile && -n $mv_but_nodiff ]]; then
+		# renamed file: may also have differences
+		difflines $ofile $nfile > $WDIR/$DIR/$F.count
+	    elif [[ -f $nfile ]]; then
+		# new file: count added lines
+		difflines /dev/null $nfile > $WDIR/$DIR/$F.count
+	    elif [[ -f $ofile ]]; then
+		# old file: count deleted lines
+		difflines $ofile /dev/null > $WDIR/$DIR/$F.count
+	    fi
+	fi
+	#
+	# Now we generate the postscript for this file.  We generate diffs
+	# only in the event that there is delta, or the file is new (it seems
+	# tree-killing to print out the contents of deleted files).
+	#
+	if [[ -f $nfile ]]; then
+		ocr=$ofile
+		[[ ! -f $ofile ]] && ocr=/dev/null
+
+		if [[ -z $mv_but_nodiff ]]; then
+			textcomm=`getcomments text $P $PP`
+			if [[ -x $CODEREVIEW ]]; then
+				$CODEREVIEW -y "$textcomm" \
+				    -e $ocr $nfile \
+				    > /tmp/$$.psfile 2>/dev/null &&
+				    cat /tmp/$$.psfile >> $WDIR/$WNAME.ps
+				if [[ $? -eq 0 ]]; then
+					print " ps\c"
+				else
+					print " ps[fail]\c"
+				fi
+			fi
+		fi
+	fi
+
+	if [[ -f $ofile && -z $mv_but_nodiff ]]; then
+	    if [[ -n $its_a_jar ]]; then
+		source_to_html Old $P < $ofile.lst > $WDIR/$DIR/$F-.html
+	    else
+		source_to_html Old $P < $ofile > $WDIR/$DIR/$F-.html
+	    fi
+		print " old\c"
+	fi
+
+	if [[ -f $nfile ]]; then
+	    if [[ -n $its_a_jar ]]; then
+		source_to_html New $P < $nfile.lst > $WDIR/$DIR/$F.html
+	    else
+		source_to_html New $P < $nfile > $WDIR/$DIR/$F.html
+	    fi
+		print " new\c"
+	fi
+
+	print
+done < $FLIST
+
+frame_nav_js > $WDIR/ancnav.js
+frame_navigation > $WDIR/ancnav.html
+
+if [[ -f $WDIR/$WNAME.ps && -x $CODEREVIEW && -x $PS2PDF ]]; then
+	print " Generating PDF: \c"
+	fix_postscript $WDIR/$WNAME.ps | $PS2PDF - > $WDIR/$WNAME.pdf
+	print "Done."
+fi
+
+# Now build the index.html file that contains
+# links to the source files and their diffs.
+
+cd $CWS
+
+# Save total changed lines for Code Inspection.
+print "$TOTL" > $WDIR/TotalChangedLines
+
+print "     index.html: \c"
+INDEXFILE=$WDIR/index.html
+exec 3<&1			# duplicate stdout to FD3.
+exec 1<&-			# Close stdout.
+exec > $INDEXFILE		# Open stdout to index file.
+
+print "$HTML<head>"
+print "<meta name=\"scm\" content=\"$SCM_MODE\" />"
+print "$STDHEAD"
+print "<title>$WNAME</title>"
+print "</head>"
+print "<body id=\"SUNWwebrev\">"
+print "<div class=\"summary\">"
+print "<h2>Code Review for $WNAME</h2>"
+
+print "<table>"
+
+if [[ -z $uflag ]]
+then
+    if [[ $SCM_MODE == "mercurial" ]]
+    then
+        #
+        # Let's try to extract the user name from the .hgrc file
+        #
+	username=`grep '^username' $HOME/.hgrc | sed 's/^username[ ]*=[ ]*\(.*\)/\1/'`
+    fi
+
+    if [[ -z $username ]]
+    then
+        #
+        # Figure out the username and gcos name.  To maintain compatibility
+        # with passwd(4), we must support '&' substitutions.
+        #
+	username=`id | cut -d '(' -f 2 | cut -d ')' -f 1`
+	if [[ -x $GETENT ]]; then
+	    realname=`$GETENT passwd $username | cut -d':' -f 5 | cut -d ',' -f 1`
+	fi
+	userupper=`print "$username" | sed 's/\<./\u&/g'`
+	realname=`print $realname | sed s/\&/$userupper/`
+    fi
+fi
+
+date="on `date`"
+
+if [[ -n "$username" && -n "$realname" ]]; then
+	print "<tr><th>Prepared by:</th>"
+	print "<td>$realname ($username) $date</td></tr>"
+elif [[ -n "$username" ]]; then
+	print "<tr><th>Prepared by:</th><td>$username $date</td></tr>"
+fi
+
+print "<tr><th>Workspace:</th><td>$CWS</td></tr>"
+if [[ -n $parent_webrev ]]; then
+        print "<tr><th>Compare against:</th><td>"
+	print "webrev at $parent_webrev"
+else
+    if [[ -n $OUTPWS2 ]]; then
+        print "<tr><th>Compare against:</th><td>"
+	print "$OUTPWS2"
+    fi
+fi
+print "</td></tr>"
+if [[ -n $rflag ]]; then
+    print "<tr><th>Compare against version:</th><td>$PARENT_REV</td></tr>"
+elif [[ -n $OUTREV ]]; then
+    if [[ -z $forestflag ]]; then
+        print "<tr><th>Compare against version:</th><td>$OUTREV</td></tr>"
+    fi
+fi
+if [[ -n $HG_BRANCH ]]; then
+    print "<tr><th>Branch:</th><td>$HG_BRANCH</td></tr>"
+fi
+
+print "<tr><th>Summary of changes:</th><td>"
+printCI $TOTL $TINS $TDEL $TMOD $TUNC
+print "</td></tr>"
+
+if [[ -f $WDIR/$WNAME.patch ]]; then
+	print "<tr><th>Patch of changes:</th><td>"
+	print "<a href=\"$WNAME.patch\">$WNAME.patch</a></td></tr>"
+fi
+if [[ -f $WDIR/$WNAME.pdf ]]; then
+	print "<tr><th>Printable review:</th><td>"
+	print "<a href=\"$WNAME.pdf\">$WNAME.pdf</a></td></tr>"
+fi
+
+if [[ -n "$iflag" ]]; then
+	print "<tr><th>Author comments:</th><td><div>"
+	cat /tmp/$$.include
+	print "</div></td></tr>"
+fi
+# Add links to referenced CRs, if any
+# external URL has a <title> like:
+# <title>Bug ID: 6641309 Wrong Cookie separator used in HttpURLConnection</title>
+# while internal URL has <title> like:
+# <title>6641309: Wrong Cookie separator used in HttpURLConnection</title>
+#
+if [[ -n $CRID ]]; then
+    for id in $CRID
+    do
+        print "<tr><th>Bug id:</th><td>"
+        url="${BUGURL}${id}"
+        if [[ -n $WGET ]]; then
+            msg=`$WGET -q $url -O - | grep '<title>' | sed 's/<title>\(.*\)<\/title>/\1/' | sed 's/Bug ID://'`
+        fi
+        if [[ -n $msg ]]; then
+            print "<a href=\"$url\">$msg</a>"
+        else
+            print $id | bug2url
+        fi
+        
+        print "</td></tr>"
+    done
+fi
+print "<tr><th>Legend:</th><td>"
+print "<b>Modified file</b><br><font color=red><b>Deleted file</b></font><br><font color=green><b>New file</b></font></td></tr>"
+print "</table>"
+print "</div>"
+
+#
+# Second pass through the files: generate the rest of the index file
+#
+while read LINE
+do
+	set - $LINE
+        if [[ $1 == "Revision:" ]]; then
+            FIRST_CREV=`expr $3 + 1`
+            continue
+        fi
+	P=$1
+
+	if [[ $# == 2 ]]; then
+		PP=$2
+		oldname=" <i>(was $PP)</i>"
+
+	else
+		PP=$P
+		oldname=""
+	fi
+
+	DIR=${P%/*}
+	if [[ $DIR == $P ]]; then
+		DIR="."   # File at root of workspace
+	fi
+
+	# Avoid processing the same file twice.
+	# It's possible for renamed files to
+	# appear twice in the file list
+
+	F=$WDIR/$P
+
+	print "<p><code>"
+
+	# If there's a diffs file, make diffs links
+
+        NODIFFS=
+	if [[ -f $F.cdiff.html ]]; then
+		print "<a href=\"$P.cdiff.html\">Cdiffs</a>"
+		print "<a href=\"$P.udiff.html\">Udiffs</a>"
+
+		if [[ -f $F.wdiff.html && -x $WDIFF ]]; then
+			print "<a href=\"$P.wdiff.html\">Wdiffs</a>"
+		fi
+
+		print "<a href=\"$P.sdiff.html\">Sdiffs</a>"
+
+		print "<a href=\"$P.frames.html\">Frames</a>"
+	else
+                NODIFFS=1
+		print " ------ ------ ------"
+
+		if [[ -x $WDIFF ]]; then
+			print " ------"
+		fi
+
+		print " ------"
+	fi
+
+	# If there's an old file, make the link
+
+        NOOLD=
+	if [[ -f $F-.html ]]; then
+		print "<a href=\"$P-.html\">Old</a>"
+	else
+                NOOLD=1
+		print " ---"
+	fi
+
+	# If there's an new file, make the link
+
+        NONEW=
+	if [[ -f $F.html ]]; then
+		print "<a href=\"$P.html\">New</a>"
+	else
+                NONEW=1
+		print " ---"
+	fi
+
+	if [[ -f $F.patch ]]; then
+		print "<a href=\"$P.patch\">Patch</a>"
+	else
+		print " -----"
+	fi
+
+	if [[ -f $WDIR/raw_files/new/$P ]]; then
+		print "<a href=\"raw_files/new/$P\">Raw</a>"
+	else
+		print " ---"
+	fi
+        print "</code>"
+        if [[ -n $NODIFFS && -z $oldname ]]; then
+            if [[ -n $NOOLD ]]; then
+                print "<font color=green><b>$P</b></font>"
+            elif [[ -n $NONEW ]]; then
+                print "<font color=red><b>$P</b></font>"
+            fi
+        else
+	    print "<b>$P</b> $oldname"
+        fi
+
+	#
+	# Check for usr/closed
+	#
+	if [ ! -z "$Oflag" ]; then
+		if [[ $P == usr/closed/* ]]; then
+			print "&nbsp;&nbsp;<i>Closed source: omitted from" \
+			    "this review</i>"
+		fi
+	fi
+
+	print "</p><blockquote>\c"
+	# Insert delta comments if any
+	comments=`getcomments html $P $PP`
+	if [ -n "$comments" ]; then
+	    print "<pre>$comments</pre>"
+	fi
+
+	# Add additional comments comment
+
+	print "<!-- Add comments to explain changes in $P here -->"
+
+	# Add count of changes.
+
+	if [[ -f $F.count ]]; then
+	    cat $F.count
+	    rm $F.count
+	fi
+        print "</blockquote>"
+done < $FLIST
+
+print
+print
+print "<hr />"
+print "<p style=\"font-size: small\">"
+print "This code review page was prepared using <b>$0</b>"
+print "(vers $WEBREV_UPDATED)."
+print "</body>"
+print "</html>"
+
+if [[ -n $ZIP ]]; then
+    # Let's generate a zip file for convenience
+    cd $WDIR/..
+    if [ -f webrev.zip ]; then
+	rm webrev.zip
+    fi
+    $ZIP -r webrev webrev >/dev/null 2>&1
+fi
+
+exec 1<&-			# Close FD 1.
+exec 1<&3			# dup FD 3 to restore stdout.
+exec 3<&-			# close FD 3.
+
+print "Done."
+print "Output to: $WDIR"
+
--- a/make/sponsors-rules.gmk	Fri Mar 18 17:56:47 2011 +0300
+++ b/make/sponsors-rules.gmk	Fri Mar 18 15:44:45 2011 -0700
@@ -59,10 +59,10 @@
 sponsors-build:
 ifeq ($(ARCH_DATA_MODEL), 32)
   ifeq ($(BUILD_SPONSORS), true)
-	@$(call MakeStart, sponsors, $(SPONSORS_BUILD_TARGETS))
+	@$(call MakeStart,sponsors,$(SPONSORS_BUILD_TARGETS))
 	($(CD) $(SPONSORS_TOPDIR)/make && \
 	  $(MAKE) $(SPONSORS_BUILD_TARGETS) $(SPONSORS_BUILD_ARGUMENTS))
-	@$(call MakeFinish, sponsors, $(SPONSORS_BUILD_TARGETS))
+	@$(call MakeFinish,sponsors,$(SPONSORS_BUILD_TARGETS))
   endif
 endif