Merge
authorysr
Thu, 21 Jan 2010 14:47:01 -0800
changeset 4739 4e7f445290c7
parent 4650 ac73c07a6bf6 (diff)
parent 4738 25586a89c1c3 (current diff)
child 4740 d708800308b7
Merge
--- a/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 09e0b33177af2b98a03c9ca19eedf61440bd1cf6 jdk7-b76
 1d0121b741f029dc4b828e4b36ba6fda92907dd7 jdk7-b77
 4061c66ba1af1a2e27c2c839ba887407dd3ce050 jdk7-b78
+e9c98378f6b9256c0595ef2985ca5899f0c0e274 jdk7-b79
--- a/.hgtags-top-repo	Thu Jan 21 11:33:32 2010 -0800
+++ b/.hgtags-top-repo	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 c8b63075403d53a208104a8a6ea5072c1cb66aab jdk7-b76
 1f17ca8353babb13f4908c1f87d11508232518c8 jdk7-b77
 ab4ae8f4514693a9fe17ca2fec0239d8f8450d2c jdk7-b78
+20aeeb51713990dbea6929a2e100a8bbf5df70d4 jdk7-b79
--- a/corba/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 937144222e2219939101b0129d26a872a7956b13 jdk7-b76
 6881f0383f623394b5ec73f27a5f329ff55d0467 jdk7-b77
 a7f7276b48cd74d8eb1baa83fbf3d1ef4a2603c8 jdk7-b78
+ec0421b5703b677e2226cf4bf7ae4eaafd8061c5 jdk7-b79
--- a/corba/src/share/classes/com/sun/tools/corba/se/idl/constExpr/Expression.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/com/sun/tools/corba/se/idl/constExpr/Expression.java	Thu Jan 21 14:47:01 2010 -0800
@@ -123,7 +123,7 @@
 
   /**
    * Coerces a number to the target type of this expression.
-   * @parm  number  The number to coerce.
+   * @param  obj  The number to coerce.
    * @return  the value of number coerced to the (target) type of
    *  this expression.
    **/
@@ -142,7 +142,7 @@
   /**
    * Coerces an integral value (BigInteger) to its corresponding unsigned
    * representation, if the target type of this expression is unsigned.
-   * @parm b The BigInteger to be coerced.
+   * @param b The BigInteger to be coerced.
    * @return the value of an integral type coerced to its corresponding
    *  unsigned integral type, if the target type of this expression is
    *  unsigned.
@@ -170,7 +170,7 @@
   /**
    * Coerces an integral value (BigInteger) to its corresponding signed
    * representation, if the target type of this expression is signed.
-   * @parm  b  The BigInteger to be coerced.
+   * @param  b  The BigInteger to be coerced.
    * @return  the value of an integral type coerced to its corresponding
    *  signed integral type, if the target type of this expression is
    *  signed.
--- a/corba/src/share/classes/javax/rmi/PortableRemoteObject.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/javax/rmi/PortableRemoteObject.java	Thu Jan 21 14:47:01 2010 -0800
@@ -161,7 +161,7 @@
      * happens implicitly when the object is sent or received as an argument
      * on a remote method call, but in some circumstances it is useful to
      * perform this action by making an explicit call.  See the
-     * {@link Stub#connect} method for more information.
+     * {@link javax.rmi.CORBA.Stub#connect} method for more information.
      * @param target the object to connect.
      * @param source a previously connected object.
      * @throws RemoteException if <code>source</code> is not connected
--- a/corba/src/share/classes/org/omg/CORBA/SetOverrideType.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/CORBA/SetOverrideType.java	Thu Jan 21 14:47:01 2010 -0800
@@ -31,7 +31,7 @@
  * indicate whether policies should replace the
  * existing policies of an <code>Object</code> or be added to them.
  * <P>
- * The method {@link omg.org.CORBA.Object._set_policy_override} takes
+ * The method {@link org.omg.CORBA.Object#_set_policy_override} takes
  * either <code>SetOverrideType.SET_OVERRIDE</code> or
  * <code>SetOverrideType.ADD_OVERRIDE</code> as its second argument.
  * The method <code>_set_policy_override</code>
--- a/corba/src/share/classes/org/omg/CORBA/TCKind.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/CORBA/TCKind.java	Thu Jan 21 14:47:01 2010 -0800
@@ -545,8 +545,6 @@
     * @param  _value the <code>int</code> to convert.  It must be one of
     *         the <code>int</code> constants in the class
     *         <code>TCKind</code>.
-    * @return  a new <code>TCKind</code> instance whose <code>value</code>
-    * field matches the given <code>int</code>
     */
     @Deprecated
     protected TCKind(int _value){
--- a/corba/src/share/classes/org/omg/CORBA/UnknownUserException.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/CORBA/UnknownUserException.java	Thu Jan 21 14:47:01 2010 -0800
@@ -56,7 +56,7 @@
      * Constructs an <code>UnknownUserException</code> object that contains the given
      * <code>Any</code> object.
      *
-     * @ param a an <code>Any</code> object that contains a user exception returned
+     * @param a an <code>Any</code> object that contains a user exception returned
      *         by the server
      */
     public UnknownUserException(Any a) {
--- a/corba/src/share/classes/org/omg/CORBA/portable/ServantObject.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/CORBA/portable/ServantObject.java	Thu Jan 21 14:47:01 2010 -0800
@@ -43,7 +43,6 @@
     /** The real servant. The local stub may cast this field to the expected type, and then
      * invoke the operation directly. Note, the object may or may not be the actual servant
      * instance.
-     * @return The real servant
      */
     public java.lang.Object servant;
 }
--- a/corba/src/share/classes/org/omg/CosNaming/nameservice.idl	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/CosNaming/nameservice.idl	Thu Jan 21 14:47:01 2010 -0800
@@ -256,7 +256,7 @@
  * 
  * @param  n Name of the object <p>
  * 
- * @parm obj The Object to rebind with the given name <p>
+ * @param obj The Object to rebind with the given name <p>
  * 
  * @exception org.omg.CosNaming.NamingContextPackage.NotFound Indicates the name does not identify a binding.<p>
  * 
--- a/corba/src/share/classes/org/omg/PortableInterceptor/Interceptors.idl	Thu Jan 21 11:33:32 2010 -0800
+++ b/corba/src/share/classes/org/omg/PortableInterceptor/Interceptors.idl	Thu Jan 21 14:47:01 2010 -0800
@@ -1730,7 +1730,7 @@
      * <p>
      * Any number of components may exist with the same component ID. 
      * 
-     * @param a_component The IOP.TaggedComponent to add.
+     * @param tagged_component The IOP.TaggedComponent to add.
      */
     void add_ior_component 
       (in IOP::TaggedComponent tagged_component);
@@ -1744,7 +1744,7 @@
      * <p>
      * Any number of components may exist with the same component ID. 
      * 
-     * @param a_component The <code>IOP.TaggedComponent</code> to add. 
+     * @param tagged_component The <code>IOP.TaggedComponent</code> to add. 
      * @param profile_id The profile id of the profile to 
      *     which this component will be added.
      * @exception BAD_PARAM thrown, with a standard minor code of 29, if the 
--- a/hotspot/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 9174bb32e934965288121f75394874eeb1fcb649 jdk7-b76
 455105fc81d941482f8f8056afaa7aa0949c9300 jdk7-b77
 e703499b4b51e3af756ae77c3d5e8b3058a14e4e jdk7-b78
+a5a6adfca6ecefb5894a848debabfe442ff50e25 jdk7-b79
--- a/hotspot/make/hotspot_version	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/make/hotspot_version	Thu Jan 21 14:47:01 2010 -0800
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=17
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=06
+HS_BUILD_NUMBER=07
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=7
--- a/hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -394,6 +394,11 @@
 }
 
 
+bool AbstractInterpreter::can_be_compiled(methodHandle m) {
+  // No special entry points that preclude compilation
+  return true;
+}
+
 // This method tells the deoptimizer how big an interpreted frame must be:
 int AbstractInterpreter::size_activation(methodOop method,
                                          int tempcount,
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -2862,6 +2862,9 @@
 
     // arraycopy stubs used by compilers
     generate_arraycopy_stubs();
+
+    // Don't initialize the platform math functions since sparc
+    // doesn't have intrinsics for these operations.
   }
 
 
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2010 Sun Microsystems, Inc.  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
@@ -2030,6 +2030,54 @@
                                entry_checkcast_arraycopy);
   }
 
+  void generate_math_stubs() {
+    {
+      StubCodeMark mark(this, "StubRoutines", "log");
+      StubRoutines::_intrinsic_log = (double (*)(double)) __ pc();
+
+      __ fld_d(Address(rsp, 4));
+      __ flog();
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "log10");
+      StubRoutines::_intrinsic_log10 = (double (*)(double)) __ pc();
+
+      __ fld_d(Address(rsp, 4));
+      __ flog10();
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "sin");
+      StubRoutines::_intrinsic_sin = (double (*)(double))  __ pc();
+
+      __ fld_d(Address(rsp, 4));
+      __ trigfunc('s');
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "cos");
+      StubRoutines::_intrinsic_cos = (double (*)(double)) __ pc();
+
+      __ fld_d(Address(rsp, 4));
+      __ trigfunc('c');
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "tan");
+      StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc();
+
+      __ fld_d(Address(rsp, 4));
+      __ trigfunc('t');
+      __ ret(0);
+    }
+
+    // The intrinsic version of these seem to return the same value as
+    // the strict version.
+    StubRoutines::_intrinsic_exp = SharedRuntime::dexp;
+    StubRoutines::_intrinsic_pow = SharedRuntime::dpow;
+  }
+
  public:
   // Information about frame layout at time of blocking runtime call.
   // Note that we only have to preserve callee-saved registers since
@@ -2228,6 +2276,8 @@
         MethodHandles::generate_method_handle_stub(_masm, ek);
       }
     }
+
+    generate_math_stubs();
   }
 
 
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2010 Sun Microsystems, Inc.  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
@@ -2731,6 +2731,79 @@
     StubRoutines::_arrayof_oop_arraycopy             = StubRoutines::_oop_arraycopy;
   }
 
+  void generate_math_stubs() {
+    {
+      StubCodeMark mark(this, "StubRoutines", "log");
+      StubRoutines::_intrinsic_log = (double (*)(double)) __ pc();
+
+      __ subq(rsp, 8);
+      __ movdbl(Address(rsp, 0), xmm0);
+      __ fld_d(Address(rsp, 0));
+      __ flog();
+      __ fstp_d(Address(rsp, 0));
+      __ movdbl(xmm0, Address(rsp, 0));
+      __ addq(rsp, 8);
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "log10");
+      StubRoutines::_intrinsic_log10 = (double (*)(double)) __ pc();
+
+      __ subq(rsp, 8);
+      __ movdbl(Address(rsp, 0), xmm0);
+      __ fld_d(Address(rsp, 0));
+      __ flog10();
+      __ fstp_d(Address(rsp, 0));
+      __ movdbl(xmm0, Address(rsp, 0));
+      __ addq(rsp, 8);
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "sin");
+      StubRoutines::_intrinsic_sin = (double (*)(double)) __ pc();
+
+      __ subq(rsp, 8);
+      __ movdbl(Address(rsp, 0), xmm0);
+      __ fld_d(Address(rsp, 0));
+      __ trigfunc('s');
+      __ fstp_d(Address(rsp, 0));
+      __ movdbl(xmm0, Address(rsp, 0));
+      __ addq(rsp, 8);
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "cos");
+      StubRoutines::_intrinsic_cos = (double (*)(double)) __ pc();
+
+      __ subq(rsp, 8);
+      __ movdbl(Address(rsp, 0), xmm0);
+      __ fld_d(Address(rsp, 0));
+      __ trigfunc('c');
+      __ fstp_d(Address(rsp, 0));
+      __ movdbl(xmm0, Address(rsp, 0));
+      __ addq(rsp, 8);
+      __ ret(0);
+    }
+    {
+      StubCodeMark mark(this, "StubRoutines", "tan");
+      StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc();
+
+      __ subq(rsp, 8);
+      __ movdbl(Address(rsp, 0), xmm0);
+      __ fld_d(Address(rsp, 0));
+      __ trigfunc('t');
+      __ fstp_d(Address(rsp, 0));
+      __ movdbl(xmm0, Address(rsp, 0));
+      __ addq(rsp, 8);
+      __ ret(0);
+    }
+
+    // The intrinsic version of these seem to return the same value as
+    // the strict version.
+    StubRoutines::_intrinsic_exp = SharedRuntime::dexp;
+    StubRoutines::_intrinsic_pow = SharedRuntime::dpow;
+  }
+
 #undef __
 #define __ masm->
 
@@ -2945,6 +3018,8 @@
         MethodHandles::generate_method_handle_stub(_masm, ek);
       }
     }
+
+    generate_math_stubs();
   }
 
  public:
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -1431,6 +1431,23 @@
 
 }
 
+// These should never be compiled since the interpreter will prefer
+// the compiled version to the intrinsic version.
+bool AbstractInterpreter::can_be_compiled(methodHandle m) {
+  switch (method_kind(m)) {
+    case Interpreter::java_lang_math_sin     : // fall thru
+    case Interpreter::java_lang_math_cos     : // fall thru
+    case Interpreter::java_lang_math_tan     : // fall thru
+    case Interpreter::java_lang_math_abs     : // fall thru
+    case Interpreter::java_lang_math_log     : // fall thru
+    case Interpreter::java_lang_math_log10   : // fall thru
+    case Interpreter::java_lang_math_sqrt    :
+      return false;
+    default:
+      return true;
+  }
+}
+
 // How much stack a method activation needs in words.
 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
 
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2010 Sun Microsystems, Inc.  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
@@ -1456,6 +1456,23 @@
                                 generate_normal_entry(synchronized);
 }
 
+// These should never be compiled since the interpreter will prefer
+// the compiled version to the intrinsic version.
+bool AbstractInterpreter::can_be_compiled(methodHandle m) {
+  switch (method_kind(m)) {
+    case Interpreter::java_lang_math_sin     : // fall thru
+    case Interpreter::java_lang_math_cos     : // fall thru
+    case Interpreter::java_lang_math_tan     : // fall thru
+    case Interpreter::java_lang_math_abs     : // fall thru
+    case Interpreter::java_lang_math_log     : // fall thru
+    case Interpreter::java_lang_math_log10   : // fall thru
+    case Interpreter::java_lang_math_sqrt    :
+      return false;
+    default:
+      return true;
+  }
+}
+
 // How much stack a method activation needs in words.
 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
   const int entry_size = frame::interpreter_frame_monitor_size();
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,6 +1,6 @@
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008 Red Hat, Inc.
+ * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -239,7 +239,21 @@
 }
 
 bool os::is_allocatable(size_t bytes) {
-  ShouldNotCallThis();
+#ifdef _LP64
+  return true;
+#else
+  if (bytes < 2 * G) {
+    return true;
+  }
+
+  char* addr = reserve_memory(bytes, NULL);
+
+  if (addr != NULL) {
+    release_memory(addr, bytes);
+  }
+
+  return addr != NULL;
+#endif // _LP64
 }
 
 ///////////////////////////////////////////////////////////////////////////////
--- a/hotspot/src/share/vm/c1/c1_LIR.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/c1/c1_LIR.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-2010 Sun Microsystems, Inc.  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
@@ -2000,7 +2000,7 @@
   typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
 
   enum {
-    maxNumberOfOperands = 14,
+    maxNumberOfOperands = 16,
     maxNumberOfInfos = 4
   };
 
--- a/hotspot/src/share/vm/ci/ciField.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/ci/ciField.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -161,6 +161,18 @@
          "bootstrap classes must not create & cache unshared fields");
 }
 
+static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
+  if (holder == NULL)
+    return false;
+  if (holder->name() == ciSymbol::java_lang_System())
+    // Never trust strangely unstable finals:  System.out, etc.
+    return false;
+  // Even if general trusting is disabled, trust system-built closures in these packages.
+  if (holder->is_in_package("java/dyn") || holder->is_in_package("sun/dyn"))
+    return true;
+  return TrustFinalNonStaticFields;
+}
+
 void ciField::initialize_from(fieldDescriptor* fd) {
   // Get the flags, offset, and canonical holder of the field.
   _flags = ciFlags(fd->access_flags());
@@ -172,7 +184,7 @@
     if (!this->is_static()) {
       // A field can be constant if it's a final static field or if it's
       // a final non-static field of a trusted class ({java,sun}.dyn).
-      if (_holder->is_in_package("java/dyn") || _holder->is_in_package("sun/dyn")) {
+      if (trust_final_non_static_fields(_holder)) {
         _is_constant = true;
         return;
       }
--- a/hotspot/src/share/vm/includeDB_compiler2	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/includeDB_compiler2	Thu Jan 21 14:47:01 2010 -0800
@@ -601,6 +601,7 @@
 
 loopTransform.cpp                       addnode.hpp
 loopTransform.cpp                       allocation.inline.hpp
+loopTransform.cpp                       callnode.hpp
 loopTransform.cpp                       connode.hpp
 loopTransform.cpp                       compileLog.hpp
 loopTransform.cpp                       divnode.hpp
--- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -109,6 +109,8 @@
 
   static void       print_method_kind(MethodKind kind)          PRODUCT_RETURN;
 
+  static bool       can_be_compiled(methodHandle m);
+
   // Runtime support
 
   // length = invoke bytecode length (to advance to next bytecode)
--- a/hotspot/src/share/vm/opto/c2_globals.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -154,6 +154,12 @@
   notproduct(bool, TraceProfileTripCount, false,                            \
           "Trace profile loop trip count information")                      \
                                                                             \
+  product(bool, UseLoopPredicate, true,                                     \
+          "Generate a predicate to select fast/slow loop versions")         \
+                                                                            \
+  develop(bool, TraceLoopPredicate, false,                                  \
+          "Trace generation of loop predicates")                            \
+                                                                            \
   develop(bool, OptoCoalesce, true,                                         \
           "Use Conservative Copy Coalescing in the Register Allocator")     \
                                                                             \
--- a/hotspot/src/share/vm/opto/compile.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/compile.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -932,6 +932,7 @@
 
   _intrinsics = NULL;
   _macro_nodes = new GrowableArray<Node*>(comp_arena(), 8,  0, NULL);
+  _predicate_opaqs = new GrowableArray<Node*>(comp_arena(), 8,  0, NULL);
   register_library_intrinsics();
 }
 
@@ -1553,6 +1554,19 @@
   }
 }
 
+//---------------------cleanup_loop_predicates-----------------------
+// Remove the opaque nodes that protect the predicates so that all unused
+// checks and uncommon_traps will be eliminated from the ideal graph
+void Compile::cleanup_loop_predicates(PhaseIterGVN &igvn) {
+  if (predicate_count()==0) return;
+  for (int i = predicate_count(); i > 0; i--) {
+    Node * n = predicate_opaque1_node(i-1);
+    assert(n->Opcode() == Op_Opaque1, "must be");
+    igvn.replace_node(n, n->in(1));
+  }
+  assert(predicate_count()==0, "should be clean!");
+  igvn.optimize();
+}
 
 //------------------------------Optimize---------------------------------------
 // Given a graph, optimize it.
@@ -1594,7 +1608,7 @@
   if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
     {
       TracePhase t2("idealLoop", &_t_idealLoop, true);
-      PhaseIdealLoop ideal_loop( igvn, true );
+      PhaseIdealLoop ideal_loop( igvn, true, UseLoopPredicate);
       loop_opts_cnt--;
       if (major_progress()) print_method("PhaseIdealLoop 1", 2);
       if (failing())  return;
@@ -1602,7 +1616,7 @@
     // Loop opts pass if partial peeling occurred in previous pass
     if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
       TracePhase t3("idealLoop", &_t_idealLoop, true);
-      PhaseIdealLoop ideal_loop( igvn, false );
+      PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate);
       loop_opts_cnt--;
       if (major_progress()) print_method("PhaseIdealLoop 2", 2);
       if (failing())  return;
@@ -1610,7 +1624,7 @@
     // Loop opts pass for loop-unrolling before CCP
     if(major_progress() && (loop_opts_cnt > 0)) {
       TracePhase t4("idealLoop", &_t_idealLoop, true);
-      PhaseIdealLoop ideal_loop( igvn, false );
+      PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate);
       loop_opts_cnt--;
       if (major_progress()) print_method("PhaseIdealLoop 3", 2);
     }
@@ -1648,13 +1662,21 @@
   // peeling, unrolling, etc.
   if(loop_opts_cnt > 0) {
     debug_only( int cnt = 0; );
+    bool loop_predication = UseLoopPredicate;
     while(major_progress() && (loop_opts_cnt > 0)) {
       TracePhase t2("idealLoop", &_t_idealLoop, true);
       assert( cnt++ < 40, "infinite cycle in loop optimization" );
-      PhaseIdealLoop ideal_loop( igvn, true );
+      PhaseIdealLoop ideal_loop( igvn, true, loop_predication);
       loop_opts_cnt--;
       if (major_progress()) print_method("PhaseIdealLoop iterations", 2);
       if (failing())  return;
+      // Perform loop predication optimization during first iteration after CCP.
+      // After that switch it off and cleanup unused loop predicates.
+      if (loop_predication) {
+        loop_predication = false;
+        cleanup_loop_predicates(igvn);
+        if (failing())  return;
+      }
     }
   }
 
--- a/hotspot/src/share/vm/opto/compile.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/compile.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -38,6 +38,7 @@
 class OptoReg;
 class PhaseCFG;
 class PhaseGVN;
+class PhaseIterGVN;
 class PhaseRegAlloc;
 class PhaseCCP;
 class PhaseCCP_DCE;
@@ -172,6 +173,7 @@
   const char*           _failure_reason;        // for record_failure/failing pattern
   GrowableArray<CallGenerator*>* _intrinsics;   // List of intrinsics.
   GrowableArray<Node*>* _macro_nodes;           // List of nodes which need to be expanded before matching.
+  GrowableArray<Node*>* _predicate_opaqs;       // List of Opaque1 nodes for the loop predicates.
   ConnectionGraph*      _congraph;
 #ifndef PRODUCT
   IdealGraphPrinter*    _printer;
@@ -351,7 +353,9 @@
   }
 
   int           macro_count()                   { return _macro_nodes->length(); }
+  int           predicate_count()               { return _predicate_opaqs->length();}
   Node*         macro_node(int idx)             { return _macro_nodes->at(idx); }
+  Node*         predicate_opaque1_node(int idx) { return _predicate_opaqs->at(idx);}
   ConnectionGraph* congraph()                   { return _congraph;}
   void add_macro_node(Node * n) {
     //assert(n->is_macro(), "must be a macro node");
@@ -363,7 +367,19 @@
     // that the node is in the array before attempting to remove it
     if (_macro_nodes->contains(n))
       _macro_nodes->remove(n);
+    // remove from _predicate_opaqs list also if it is there
+    if (predicate_count() > 0 && _predicate_opaqs->contains(n)){
+      _predicate_opaqs->remove(n);
+    }
   }
+  void add_predicate_opaq(Node * n) {
+    assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1");
+    assert(_macro_nodes->contains(n), "should have already been in macro list");
+    _predicate_opaqs->append(n);
+  }
+  // remove the opaque nodes that protect the predicates so that the unused checks and
+  // uncommon traps will be eliminated from the graph.
+  void cleanup_loop_predicates(PhaseIterGVN &igvn);
 
   // Compilation environment.
   Arena*            comp_arena()                { return &_comp_arena; }
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -549,6 +549,10 @@
       // Comparing trip+off vs limit
       Node *bol = iff->in(1);
       if( bol->req() != 2 ) continue; // dead constant test
+      if (!bol->is_Bool()) {
+        assert(UseLoopPredicate && bol->Opcode() == Op_Conv2B, "predicate check only");
+        continue;
+      }
       Node *cmp = bol->in(1);
 
       Node *rc_exp = cmp->in(1);
@@ -875,7 +879,7 @@
 //------------------------------is_invariant-----------------------------
 // Return true if n is invariant
 bool IdealLoopTree::is_invariant(Node* n) const {
-  Node *n_c = _phase->get_ctrl(n);
+  Node *n_c = _phase->has_ctrl(n) ? _phase->get_ctrl(n) : n;
   if (n_c->is_top()) return false;
   return !is_member(_phase->get_loop(n_c));
 }
@@ -1594,7 +1598,7 @@
 bool IdealLoopTree::iteration_split_impl( PhaseIdealLoop *phase, Node_List &old_new ) {
   // Check and remove empty loops (spam micro-benchmarks)
   if( policy_do_remove_empty_loop(phase) )
-    return true;                     // Here we removed an empty loop
+    return true;  // Here we removed an empty loop
 
   bool should_peel = policy_peeling(phase); // Should we peel?
 
@@ -1688,8 +1692,8 @@
     // an even number of trips).  If we are peeling, we might enable some RCE
     // and we'd rather unroll the post-RCE'd loop SO... do not unroll if
     // peeling.
-    if( should_unroll && !should_peel )
-      phase->do_unroll(this,old_new, true);
+      if( should_unroll && !should_peel )
+        phase->do_unroll(this,old_new, true);
 
     // Adjust the pre-loop limits to align the main body
     // iterations.
@@ -1731,9 +1735,9 @@
       _allow_optimizations &&
       !tail()->is_top() ) {     // Also ignore the occasional dead backedge
     if (!_has_call) {
-      if (!iteration_split_impl( phase, old_new )) {
-        return false;
-      }
+        if (!iteration_split_impl( phase, old_new )) {
+          return false;
+        }
     } else if (policy_unswitching(phase)) {
       phase->do_unswitching(this, old_new);
     }
@@ -1746,3 +1750,576 @@
     return false;
   return true;
 }
+
+//-------------------------------is_uncommon_trap_proj----------------------------
+// Return true if proj is the form of "proj->[region->..]call_uct"
+bool PhaseIdealLoop::is_uncommon_trap_proj(ProjNode* proj, bool must_reason_predicate) {
+  int path_limit = 10;
+  assert(proj, "invalid argument");
+  Node* out = proj;
+  for (int ct = 0; ct < path_limit; ct++) {
+    out = out->unique_ctrl_out();
+    if (out == NULL || out->is_Root() || out->is_Start())
+      return false;
+    if (out->is_CallStaticJava()) {
+      int req = out->as_CallStaticJava()->uncommon_trap_request();
+      if (req != 0) {
+        Deoptimization::DeoptReason reason = Deoptimization::trap_request_reason(req);
+        if (!must_reason_predicate || reason == Deoptimization::Reason_predicate){
+           return true;
+        }
+      }
+      return false; // don't do further after call
+    }
+  }
+  return false;
+}
+
+//-------------------------------is_uncommon_trap_if_pattern-------------------------
+// Return true  for "if(test)-> proj -> ...
+//                          |
+//                          V
+//                      other_proj->[region->..]call_uct"
+//
+// "must_reason_predicate" means the uct reason must be Reason_predicate
+bool PhaseIdealLoop::is_uncommon_trap_if_pattern(ProjNode *proj, bool must_reason_predicate) {
+  Node *in0 = proj->in(0);
+  if (!in0->is_If()) return false;
+  IfNode* iff = in0->as_If();
+
+  // we need "If(Conv2B(Opaque1(...)))" pattern for must_reason_predicate
+  if (must_reason_predicate) {
+    if (iff->in(1)->Opcode() != Op_Conv2B ||
+       iff->in(1)->in(1)->Opcode() != Op_Opaque1) {
+      return false;
+    }
+  }
+
+  ProjNode* other_proj = iff->proj_out(1-proj->_con)->as_Proj();
+  return is_uncommon_trap_proj(other_proj, must_reason_predicate);
+}
+
+//------------------------------create_new_if_for_predicate------------------------
+// create a new if above the uct_if_pattern for the predicate to be promoted.
+//
+//          before                                after
+//        ----------                           ----------
+//           ctrl                                 ctrl
+//            |                                     |
+//            |                                     |
+//            v                                     v
+//           iff                                 new_iff
+//          /    \                                /      \
+//         /      \                              /        \
+//        v        v                            v          v
+//  uncommon_proj cont_proj                   if_uct     if_cont
+// \      |        |                           |          |
+//  \     |        |                           |          |
+//   v    v        v                           |          v
+//     rgn       loop                          |         iff
+//      |                                      |        /     \
+//      |                                      |       /       \
+//      v                                      |      v         v
+// uncommon_trap                               | uncommon_proj cont_proj
+//                                           \  \    |           |
+//                                            \  \   |           |
+//                                             v  v  v           v
+//                                               rgn           loop
+//                                                |
+//                                                |
+//                                                v
+//                                           uncommon_trap
+//
+//
+// We will create a region to guard the uct call if there is no one there.
+// The true projecttion (if_cont) of the new_iff is returned.
+ProjNode* PhaseIdealLoop::create_new_if_for_predicate(ProjNode* cont_proj) {
+  assert(is_uncommon_trap_if_pattern(cont_proj, true), "must be a uct if pattern!");
+  IfNode* iff = cont_proj->in(0)->as_If();
+
+  ProjNode *uncommon_proj = iff->proj_out(1 - cont_proj->_con);
+  Node     *rgn   = uncommon_proj->unique_ctrl_out();
+  assert(rgn->is_Region() || rgn->is_Call(), "must be a region or call uct");
+
+  if (!rgn->is_Region()) { // create a region to guard the call
+    assert(rgn->is_Call(), "must be call uct");
+    CallNode* call = rgn->as_Call();
+    rgn = new (C, 1) RegionNode(1);
+    _igvn.set_type(rgn, rgn->bottom_type());
+    rgn->add_req(uncommon_proj);
+    set_idom(rgn, idom(uncommon_proj), dom_depth(uncommon_proj)+1);
+    _igvn.hash_delete(call);
+    call->set_req(0, rgn);
+  }
+
+  // Create new_iff
+  uint  iffdd  = dom_depth(iff);
+  IdealLoopTree* lp = get_loop(iff);
+  IfNode *new_iff = new (C, 2) IfNode(iff->in(0), NULL, iff->_prob, iff->_fcnt);
+  register_node(new_iff, lp, idom(iff), iffdd);
+  Node *if_cont = new (C, 1) IfTrueNode(new_iff);
+  Node *if_uct  = new (C, 1) IfFalseNode(new_iff);
+  if (cont_proj->is_IfFalse()) {
+    // Swap
+    Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp;
+  }
+  register_node(if_cont, lp, new_iff, iffdd);
+  register_node(if_uct, get_loop(rgn), new_iff, iffdd);
+
+  // if_cont to iff
+  _igvn.hash_delete(iff);
+  iff->set_req(0, if_cont);
+  set_idom(iff, if_cont, dom_depth(iff));
+
+  // if_uct to rgn
+  _igvn.hash_delete(rgn);
+  rgn->add_req(if_uct);
+  Node* ridom = idom(rgn);
+  Node* nrdom = dom_lca(ridom, new_iff);
+  set_idom(rgn, nrdom, dom_depth(rgn));
+
+  // rgn must have no phis
+  assert(!rgn->as_Region()->has_phi(), "region must have no phis");
+
+  return if_cont->as_Proj();
+}
+
+//------------------------------find_predicate_insertion_point--------------------------
+// Find a good location to insert a predicate
+ProjNode* PhaseIdealLoop::find_predicate_insertion_point(Node* start_c) {
+  if (start_c == C->root() || !start_c->is_Proj())
+    return NULL;
+  if (is_uncommon_trap_if_pattern(start_c->as_Proj(), true/*Reason_Predicate*/)) {
+    return start_c->as_Proj();
+  }
+  return NULL;
+}
+
+//------------------------------Invariance-----------------------------------
+// Helper class for loop_predication_impl to compute invariance on the fly and
+// clone invariants.
+class Invariance : public StackObj {
+  VectorSet _visited, _invariant;
+  Node_Stack _stack;
+  VectorSet _clone_visited;
+  Node_List _old_new; // map of old to new (clone)
+  IdealLoopTree* _lpt;
+  PhaseIdealLoop* _phase;
+
+  // Helper function to set up the invariance for invariance computation
+  // If n is a known invariant, set up directly. Otherwise, look up the
+  // the possibility to push n onto the stack for further processing.
+  void visit(Node* use, Node* n) {
+    if (_lpt->is_invariant(n)) { // known invariant
+      _invariant.set(n->_idx);
+    } else if (!n->is_CFG()) {
+      Node *n_ctrl = _phase->ctrl_or_self(n);
+      Node *u_ctrl = _phase->ctrl_or_self(use); // self if use is a CFG
+      if (_phase->is_dominator(n_ctrl, u_ctrl)) {
+        _stack.push(n, n->in(0) == NULL ? 1 : 0);
+      }
+    }
+  }
+
+  // Compute invariance for "the_node" and (possibly) all its inputs recursively
+  // on the fly
+  void compute_invariance(Node* n) {
+    assert(_visited.test(n->_idx), "must be");
+    visit(n, n);
+    while (_stack.is_nonempty()) {
+      Node*  n = _stack.node();
+      uint idx = _stack.index();
+      if (idx == n->req()) { // all inputs are processed
+        _stack.pop();
+        // n is invariant if it's inputs are all invariant
+        bool all_inputs_invariant = true;
+        for (uint i = 0; i < n->req(); i++) {
+          Node* in = n->in(i);
+          if (in == NULL) continue;
+          assert(_visited.test(in->_idx), "must have visited input");
+          if (!_invariant.test(in->_idx)) { // bad guy
+            all_inputs_invariant = false;
+            break;
+          }
+        }
+        if (all_inputs_invariant) {
+          _invariant.set(n->_idx); // I am a invariant too
+        }
+      } else { // process next input
+        _stack.set_index(idx + 1);
+        Node* m = n->in(idx);
+        if (m != NULL && !_visited.test_set(m->_idx)) {
+          visit(n, m);
+        }
+      }
+    }
+  }
+
+  // Helper function to set up _old_new map for clone_nodes.
+  // If n is a known invariant, set up directly ("clone" of n == n).
+  // Otherwise, push n onto the stack for real cloning.
+  void clone_visit(Node* n) {
+    assert(_invariant.test(n->_idx), "must be invariant");
+    if (_lpt->is_invariant(n)) { // known invariant
+      _old_new.map(n->_idx, n);
+    } else{ // to be cloned
+      assert (!n->is_CFG(), "should not see CFG here");
+      _stack.push(n, n->in(0) == NULL ? 1 : 0);
+    }
+  }
+
+  // Clone "n" and (possibly) all its inputs recursively
+  void clone_nodes(Node* n, Node* ctrl) {
+    clone_visit(n);
+    while (_stack.is_nonempty()) {
+      Node*  n = _stack.node();
+      uint idx = _stack.index();
+      if (idx == n->req()) { // all inputs processed, clone n!
+        _stack.pop();
+        // clone invariant node
+        Node* n_cl = n->clone();
+        _old_new.map(n->_idx, n_cl);
+        _phase->register_new_node(n_cl, ctrl);
+        for (uint i = 0; i < n->req(); i++) {
+          Node* in = n_cl->in(i);
+          if (in == NULL) continue;
+          n_cl->set_req(i, _old_new[in->_idx]);
+        }
+      } else { // process next input
+        _stack.set_index(idx + 1);
+        Node* m = n->in(idx);
+        if (m != NULL && !_clone_visited.test_set(m->_idx)) {
+          clone_visit(m); // visit the input
+        }
+      }
+    }
+  }
+
+ public:
+  Invariance(Arena* area, IdealLoopTree* lpt) :
+    _lpt(lpt), _phase(lpt->_phase),
+    _visited(area), _invariant(area), _stack(area, 10 /* guess */),
+    _clone_visited(area), _old_new(area)
+  {}
+
+  // Map old to n for invariance computation and clone
+  void map_ctrl(Node* old, Node* n) {
+    assert(old->is_CFG() && n->is_CFG(), "must be");
+    _old_new.map(old->_idx, n); // "clone" of old is n
+    _invariant.set(old->_idx);  // old is invariant
+    _clone_visited.set(old->_idx);
+  }
+
+  // Driver function to compute invariance
+  bool is_invariant(Node* n) {
+    if (!_visited.test_set(n->_idx))
+      compute_invariance(n);
+    return (_invariant.test(n->_idx) != 0);
+  }
+
+  // Driver function to clone invariant
+  Node* clone(Node* n, Node* ctrl) {
+    assert(ctrl->is_CFG(), "must be");
+    assert(_invariant.test(n->_idx), "must be an invariant");
+    if (!_clone_visited.test(n->_idx))
+      clone_nodes(n, ctrl);
+    return _old_new[n->_idx];
+  }
+};
+
+//------------------------------is_range_check_if -----------------------------------
+// Returns true if the predicate of iff is in "scale*iv + offset u< load_range(ptr)" format
+// Note: this function is particularly designed for loop predication. We require load_range
+//       and offset to be loop invariant computed on the fly by "invar"
+bool IdealLoopTree::is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invariance& invar) const {
+  if (!is_loop_exit(iff)) {
+    return false;
+  }
+  if (!iff->in(1)->is_Bool()) {
+    return false;
+  }
+  const BoolNode *bol = iff->in(1)->as_Bool();
+  if (bol->_test._test != BoolTest::lt) {
+    return false;
+  }
+  if (!bol->in(1)->is_Cmp()) {
+    return false;
+  }
+  const CmpNode *cmp = bol->in(1)->as_Cmp();
+  if (cmp->Opcode() != Op_CmpU ) {
+    return false;
+  }
+  if (cmp->in(2)->Opcode() != Op_LoadRange) {
+    return false;
+  }
+  LoadRangeNode* lr = (LoadRangeNode*)cmp->in(2);
+  if (!invar.is_invariant(lr)) { // loadRange must be invariant
+    return false;
+  }
+  Node *iv     = _head->as_CountedLoop()->phi();
+  int   scale  = 0;
+  Node *offset = NULL;
+  if (!phase->is_scaled_iv_plus_offset(cmp->in(1), iv, &scale, &offset)) {
+    return false;
+  }
+  if(offset && !invar.is_invariant(offset)) { // offset must be invariant
+    return false;
+  }
+  return true;
+}
+
+//------------------------------rc_predicate-----------------------------------
+// Create a range check predicate
+//
+// for (i = init; i < limit; i += stride) {
+//    a[scale*i+offset]
+// }
+//
+// Compute max(scale*i + offset) for init <= i < limit and build the predicate
+// as "max(scale*i + offset) u< a.length".
+//
+// There are two cases for max(scale*i + offset):
+// (1) stride*scale > 0
+//   max(scale*i + offset) = scale*(limit-stride) + offset
+// (2) stride*scale < 0
+//   max(scale*i + offset) = scale*init + offset
+BoolNode* PhaseIdealLoop::rc_predicate(Node* ctrl,
+                                       int scale, Node* offset,
+                                       Node* init, Node* limit, Node* stride,
+                                       Node* range) {
+  Node* max_idx_expr  = init;
+  int stride_con = stride->get_int();
+  if ((stride_con > 0) == (scale > 0)) {
+    max_idx_expr = new (C, 3) SubINode(limit, stride);
+    register_new_node(max_idx_expr, ctrl);
+  }
+
+  if (scale != 1) {
+    ConNode* con_scale = _igvn.intcon(scale);
+    max_idx_expr = new (C, 3) MulINode(max_idx_expr, con_scale);
+    register_new_node(max_idx_expr, ctrl);
+  }
+
+  if (offset && (!offset->is_Con() || offset->get_int() != 0)){
+    max_idx_expr = new (C, 3) AddINode(max_idx_expr, offset);
+    register_new_node(max_idx_expr, ctrl);
+  }
+
+  CmpUNode* cmp = new (C, 3) CmpUNode(max_idx_expr, range);
+  register_new_node(cmp, ctrl);
+  BoolNode* bol = new (C, 2) BoolNode(cmp, BoolTest::lt);
+  register_new_node(bol, ctrl);
+  return bol;
+}
+
+//------------------------------ loop_predication_impl--------------------------
+// Insert loop predicates for null checks and range checks
+bool PhaseIdealLoop::loop_predication_impl(IdealLoopTree *loop) {
+  if (!UseLoopPredicate) return false;
+
+  // Too many traps seen?
+  bool tmt = C->too_many_traps(C->method(), 0, Deoptimization::Reason_predicate);
+  int tc = C->trap_count(Deoptimization::Reason_predicate);
+  if (tmt || tc > 0) {
+    if (TraceLoopPredicate) {
+      tty->print_cr("too many predicate traps: %d", tc);
+      C->method()->print(); // which method has too many predicate traps
+      tty->print_cr("");
+    }
+    return false;
+  }
+
+  CountedLoopNode *cl = NULL;
+  if (loop->_head->is_CountedLoop()) {
+    cl = loop->_head->as_CountedLoop();
+    // do nothing for iteration-splitted loops
+    if(!cl->is_normal_loop()) return false;
+  }
+
+  LoopNode *lpn  = loop->_head->as_Loop();
+  Node* entry = lpn->in(LoopNode::EntryControl);
+
+  ProjNode *predicate_proj = find_predicate_insertion_point(entry);
+  if (!predicate_proj){
+#ifndef PRODUCT
+    if (TraceLoopPredicate) {
+      tty->print("missing predicate:");
+      loop->dump_head();
+    }
+#endif
+    return false;
+  }
+
+  ConNode* zero = _igvn.intcon(0);
+  set_ctrl(zero, C->root());
+  Node *cond_false = new (C, 2) Conv2BNode(zero);
+  register_new_node(cond_false, C->root());
+  ConNode* one = _igvn.intcon(1);
+  set_ctrl(one, C->root());
+  Node *cond_true = new (C, 2) Conv2BNode(one);
+  register_new_node(cond_true, C->root());
+
+  ResourceArea *area = Thread::current()->resource_area();
+  Invariance invar(area, loop);
+
+  // Create list of if-projs such that a newer proj dominates all older
+  // projs in the list, and they all dominate loop->tail()
+  Node_List if_proj_list(area);
+  LoopNode *head  = loop->_head->as_Loop();
+  Node *current_proj = loop->tail(); //start from tail
+  while ( current_proj != head ) {
+    if (loop == get_loop(current_proj) && // still in the loop ?
+        current_proj->is_Proj()        && // is a projection  ?
+        current_proj->in(0)->Opcode() == Op_If) { // is a if projection ?
+      if_proj_list.push(current_proj);
+    }
+    current_proj = idom(current_proj);
+  }
+
+  bool hoisted = false; // true if at least one proj is promoted
+  while (if_proj_list.size() > 0) {
+    // Following are changed to nonnull when a predicate can be hoisted
+    ProjNode* new_predicate_proj = NULL;
+    BoolNode* new_predicate_bol   = NULL;
+
+    ProjNode* proj = if_proj_list.pop()->as_Proj();
+    IfNode*   iff  = proj->in(0)->as_If();
+
+    if (!is_uncommon_trap_if_pattern(proj)) {
+      if (loop->is_loop_exit(iff)) {
+        // stop processing the remaining projs in the list because the execution of them
+        // depends on the condition of "iff" (iff->in(1)).
+        break;
+      } else {
+        // Both arms are inside the loop. There are two cases:
+        // (1) there is one backward branch. In this case, any remaining proj
+        //     in the if_proj list post-dominates "iff". So, the condition of "iff"
+        //     does not determine the execution the remining projs directly, and we
+        //     can safely continue.
+        // (2) both arms are forwarded, i.e. a diamond shape. In this case, "proj"
+        //     does not dominate loop->tail(), so it can not be in the if_proj list.
+        continue;
+      }
+    }
+
+    Node*     test = iff->in(1);
+    if (!test->is_Bool()){ //Conv2B, ...
+      continue;
+    }
+    BoolNode* bol = test->as_Bool();
+    if (invar.is_invariant(bol)) {
+      // Invariant test
+      new_predicate_proj = create_new_if_for_predicate(predicate_proj);
+      Node* ctrl = new_predicate_proj->in(0)->as_If()->in(0);
+      new_predicate_bol  = invar.clone(bol, ctrl)->as_Bool();
+      if (TraceLoopPredicate) tty->print("invariant");
+    } else if (cl != NULL && loop->is_range_check_if(iff, this, invar)) {
+      // Range check (only for counted loops)
+      new_predicate_proj = create_new_if_for_predicate(predicate_proj);
+      Node *ctrl = new_predicate_proj->in(0)->as_If()->in(0);
+      const Node*    cmp    = bol->in(1)->as_Cmp();
+      Node*          idx    = cmp->in(1);
+      assert(!invar.is_invariant(idx), "index is variant");
+      assert(cmp->in(2)->Opcode() == Op_LoadRange, "must be");
+      LoadRangeNode* ld_rng = (LoadRangeNode*)cmp->in(2); // LoadRangeNode
+      assert(invar.is_invariant(ld_rng), "load range must be invariant");
+      ld_rng = (LoadRangeNode*)invar.clone(ld_rng, ctrl);
+      int scale    = 1;
+      Node* offset = zero;
+      bool ok = is_scaled_iv_plus_offset(idx, cl->phi(), &scale, &offset);
+      assert(ok, "must be index expression");
+      if (offset && offset != zero) {
+        assert(invar.is_invariant(offset), "offset must be loop invariant");
+        offset = invar.clone(offset, ctrl);
+      }
+      Node* init    = cl->init_trip();
+      Node* limit   = cl->limit();
+      Node* stride  = cl->stride();
+      new_predicate_bol = rc_predicate(ctrl, scale, offset, init, limit, stride, ld_rng);
+      if (TraceLoopPredicate) tty->print("range check");
+    }
+
+    if (new_predicate_proj == NULL) {
+      // The other proj of the "iff" is a uncommon trap projection, and we can assume
+      // the other proj will not be executed ("executed" means uct raised).
+      continue;
+    } else {
+      // Success - attach condition (new_predicate_bol) to predicate if
+      invar.map_ctrl(proj, new_predicate_proj); // so that invariance test can be appropriate
+      IfNode* new_iff = new_predicate_proj->in(0)->as_If();
+
+      // Negate test if necessary
+      if (proj->_con != predicate_proj->_con) {
+        new_predicate_bol = new (C, 2) BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate());
+        register_new_node(new_predicate_bol, new_iff->in(0));
+        if (TraceLoopPredicate) tty->print_cr(" if negated: %d", iff->_idx);
+      } else {
+        if (TraceLoopPredicate) tty->print_cr(" if: %d", iff->_idx);
+      }
+
+      _igvn.hash_delete(new_iff);
+      new_iff->set_req(1, new_predicate_bol);
+
+      _igvn.hash_delete(iff);
+      iff->set_req(1, proj->is_IfFalse() ? cond_false : cond_true);
+
+      Node* ctrl = new_predicate_proj; // new control
+      ProjNode* dp = proj;     // old control
+      assert(get_loop(dp) == loop, "guarenteed at the time of collecting proj");
+      // Find nodes (depends only on the test) off the surviving projection;
+      // move them outside the loop with the control of proj_clone
+      for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) {
+        Node* cd = dp->fast_out(i); // Control-dependent node
+        if (cd->depends_only_on_test()) {
+          assert(cd->in(0) == dp, "");
+          _igvn.hash_delete(cd);
+          cd->set_req(0, ctrl); // ctrl, not NULL
+          set_early_ctrl(cd);
+          _igvn._worklist.push(cd);
+          IdealLoopTree *new_loop = get_loop(get_ctrl(cd));
+          if (new_loop != loop) {
+            if (!loop->_child) loop->_body.yank(cd);
+            if (!new_loop->_child ) new_loop->_body.push(cd);
+          }
+          --i;
+          --imax;
+        }
+      }
+
+      hoisted = true;
+      C->set_major_progress();
+    }
+  } // end while
+
+#ifndef PRODUCT
+    // report that the loop predication has been actually performed
+    // for this loop
+    if (TraceLoopPredicate && hoisted) {
+      tty->print("Loop Predication Performed:");
+      loop->dump_head();
+    }
+#endif
+
+  return hoisted;
+}
+
+//------------------------------loop_predication--------------------------------
+// driver routine for loop predication optimization
+bool IdealLoopTree::loop_predication( PhaseIdealLoop *phase) {
+  bool hoisted = false;
+  // Recursively promote predicates
+  if ( _child ) {
+    hoisted = _child->loop_predication( phase);
+  }
+
+  // self
+  if (!_irreducible && !tail()->is_top()) {
+    hoisted |= phase->loop_predication_impl(this);
+  }
+
+  if ( _next ) { //sibling
+    hoisted |= _next->loop_predication( phase);
+  }
+
+  return hoisted;
+}
--- a/hotspot/src/share/vm/opto/loopnode.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/loopnode.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1420,11 +1420,57 @@
   }
 }
 
+//---------------------collect_potentially_useful_predicates-----------------------
+// Helper function to collect potentially useful predicates to prevent them from
+// being eliminated by PhaseIdealLoop::eliminate_useless_predicates
+void PhaseIdealLoop::collect_potentially_useful_predicates(
+                         IdealLoopTree * loop, Unique_Node_List &useful_predicates) {
+  if (loop->_child) { // child
+    collect_potentially_useful_predicates(loop->_child, useful_predicates);
+  }
+
+  // self (only loops that we can apply loop predication may use their predicates)
+  if (loop->_head->is_Loop()     &&
+      !loop->_irreducible        &&
+      !loop->tail()->is_top()) {
+    LoopNode *lpn  = loop->_head->as_Loop();
+    Node* entry = lpn->in(LoopNode::EntryControl);
+    ProjNode *predicate_proj = find_predicate_insertion_point(entry);
+    if (predicate_proj != NULL ) { // right pattern that can be used by loop predication
+      assert(entry->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
+      useful_predicates.push(entry->in(0)->in(1)->in(1)); // good one
+    }
+  }
+
+  if ( loop->_next ) { // sibling
+    collect_potentially_useful_predicates(loop->_next, useful_predicates);
+  }
+}
+
+//------------------------eliminate_useless_predicates-----------------------------
+// Eliminate all inserted predicates if they could not be used by loop predication.
+void PhaseIdealLoop::eliminate_useless_predicates() {
+  if (C->predicate_count() == 0) return; // no predicate left
+
+  Unique_Node_List useful_predicates; // to store useful predicates
+  if (C->has_loops()) {
+    collect_potentially_useful_predicates(_ltree_root->_child, useful_predicates);
+  }
+
+  for (int i = C->predicate_count(); i > 0; i--) {
+     Node * n = C->predicate_opaque1_node(i-1);
+     assert(n->Opcode() == Op_Opaque1, "must be");
+     if (!useful_predicates.member(n)) { // not in the useful list
+       _igvn.replace_node(n, n->in(1));
+     }
+  }
+}
+
 //=============================================================================
 //----------------------------build_and_optimize-------------------------------
 // Create a PhaseLoop.  Build the ideal Loop tree.  Map each Ideal Node to
 // its corresponding LoopNode.  If 'optimize' is true, do some loop cleanups.
-void PhaseIdealLoop::build_and_optimize(bool do_split_ifs) {
+void PhaseIdealLoop::build_and_optimize(bool do_split_ifs, bool do_loop_pred) {
   int old_progress = C->major_progress();
 
   // Reset major-progress flag for the driver's heuristics
@@ -1577,6 +1623,12 @@
     return;
   }
 
+  // some parser-inserted loop predicates could never be used by loop
+  // predication. Eliminate them before loop optimization
+  if (UseLoopPredicate) {
+    eliminate_useless_predicates();
+  }
+
   // clear out the dead code
   while(_deadlist.size()) {
     _igvn.remove_globally_dead_node(_deadlist.pop());
@@ -1603,7 +1655,7 @@
       // Because RCE opportunities can be masked by split_thru_phi,
       // look for RCE candidates and inhibit split_thru_phi
       // on just their loop-phi's for this pass of loop opts
-      if( SplitIfBlocks && do_split_ifs ) {
+      if (SplitIfBlocks && do_split_ifs) {
         if (lpt->policy_range_check(this)) {
           lpt->_rce_candidate = 1; // = true
         }
@@ -1619,12 +1671,17 @@
     NOT_PRODUCT( if( VerifyLoopOptimizations ) verify(); );
   }
 
+  // Perform loop predication before iteration splitting
+  if (do_loop_pred && C->has_loops() && !C->major_progress()) {
+    _ltree_root->_child->loop_predication(this);
+  }
+
   // Perform iteration-splitting on inner loops.  Split iterations to avoid
   // range checks or one-shot null checks.
 
   // If split-if's didn't hack the graph too bad (no CFG changes)
   // then do loop opts.
-  if( C->has_loops() && !C->major_progress() ) {
+  if (C->has_loops() && !C->major_progress()) {
     memset( worklist.adr(), 0, worklist.Size()*sizeof(Node*) );
     _ltree_root->_child->iteration_split( this, worklist );
     // No verify after peeling!  GCM has hoisted code out of the loop.
@@ -1636,7 +1693,7 @@
   // Do verify graph edges in any case
   NOT_PRODUCT( C->verify_graph_edges(); );
 
-  if( !do_split_ifs ) {
+  if (!do_split_ifs) {
     // We saw major progress in Split-If to get here.  We forced a
     // pass with unrolling and not split-if, however more split-if's
     // might make progress.  If the unrolling didn't make progress
@@ -2763,6 +2820,22 @@
   Node *legal = LCA;            // Walk 'legal' up the IDOM chain
   Node *least = legal;          // Best legal position so far
   while( early != legal ) {     // While not at earliest legal
+#ifdef ASSERT
+    if (legal->is_Start() && !early->is_Root()) {
+      // Bad graph. Print idom path and fail.
+      tty->print_cr( "Bad graph detected in build_loop_late");
+      tty->print("n: ");n->dump(); tty->cr();
+      tty->print("early: ");early->dump(); tty->cr();
+      int ct = 0;
+      Node *dbg_legal = LCA;
+      while(!dbg_legal->is_Start() && ct < 100) {
+        tty->print("idom[%d] ",ct); dbg_legal->dump(); tty->cr();
+        ct++;
+        dbg_legal = idom(dbg_legal);
+      }
+      assert(false, "Bad graph detected in build_loop_late");
+    }
+#endif
     // Find least loop nesting depth
     legal = idom(legal);        // Bump up the IDOM tree
     // Check for lower nesting depth
--- a/hotspot/src/share/vm/opto/loopnode.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/loopnode.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -30,6 +30,7 @@
 class Node;
 class PhaseIdealLoop;
 class VectorSet;
+class Invariance;
 struct small_cache;
 
 //
@@ -325,6 +326,10 @@
   // Returns TRUE if loop tree is structurally changed.
   bool beautify_loops( PhaseIdealLoop *phase );
 
+  // Perform optimization to use the loop predicates for null checks and range checks.
+  // Applies to any loop level (not just the innermost one)
+  bool loop_predication( PhaseIdealLoop *phase);
+
   // Perform iteration-splitting on inner loops.  Split iterations to
   // avoid range checks or one-shot null checks.  Returns false if the
   // current round of loop opts should stop.
@@ -395,6 +400,9 @@
   // into longer memory ops, we may want to increase alignment.
   bool policy_align( PhaseIdealLoop *phase ) const;
 
+  // Return TRUE if "iff" is a range check.
+  bool is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invariance& invar) const;
+
   // Compute loop trip count from profile data
   void compute_profile_trip_cnt( PhaseIdealLoop *phase );
 
@@ -521,9 +529,6 @@
   }
   Node *dom_lca_for_get_late_ctrl_internal( Node *lca, Node *n, Node *tag );
 
-  // true if CFG node d dominates CFG node n
-  bool is_dominator(Node *d, Node *n);
-
   // Helper function for directing control inputs away from CFG split
   // points.
   Node *find_non_split_ctrl( Node *ctrl ) const {
@@ -572,6 +577,17 @@
     assert(n == find_non_split_ctrl(n), "must return legal ctrl" );
     return n;
   }
+  // true if CFG node d dominates CFG node n
+  bool is_dominator(Node *d, Node *n);
+  // return get_ctrl for a data node and self(n) for a CFG node
+  Node* ctrl_or_self(Node* n) {
+    if (has_ctrl(n))
+      return get_ctrl(n);
+    else {
+      assert (n->is_CFG(), "must be a CFG node");
+      return n;
+    }
+  }
 
 private:
   Node *get_ctrl_no_update( Node *i ) const {
@@ -600,7 +616,7 @@
   // Lazy-dazy update of 'get_ctrl' and 'idom_at' mechanisms.  Replace
   // the 'old_node' with 'new_node'.  Kill old-node.  Add a reference
   // from old_node to new_node to support the lazy update.  Reference
-  // replaces loop reference, since that is not neede for dead node.
+  // replaces loop reference, since that is not needed for dead node.
 public:
   void lazy_update( Node *old_node, Node *new_node ) {
     assert( old_node != new_node, "no cycles please" );
@@ -679,11 +695,11 @@
     _dom_lca_tags(C->comp_arena()),
     _verify_me(NULL),
     _verify_only(true) {
-    build_and_optimize(false);
+    build_and_optimize(false, false);
   }
 
   // build the loop tree and perform any requested optimizations
-  void build_and_optimize(bool do_split_if);
+  void build_and_optimize(bool do_split_if, bool do_loop_pred);
 
 public:
   // Dominators for the sea of nodes
@@ -694,13 +710,13 @@
   Node *dom_lca_internal( Node *n1, Node *n2 ) const;
 
   // Compute the Ideal Node to Loop mapping
-  PhaseIdealLoop( PhaseIterGVN &igvn, bool do_split_ifs) :
+  PhaseIdealLoop( PhaseIterGVN &igvn, bool do_split_ifs, bool do_loop_pred) :
     PhaseTransform(Ideal_Loop),
     _igvn(igvn),
     _dom_lca_tags(C->comp_arena()),
     _verify_me(NULL),
     _verify_only(false) {
-    build_and_optimize(do_split_ifs);
+    build_and_optimize(do_split_ifs, do_loop_pred);
   }
 
   // Verify that verify_me made the same decisions as a fresh run.
@@ -710,7 +726,7 @@
     _dom_lca_tags(C->comp_arena()),
     _verify_me(verify_me),
     _verify_only(false) {
-    build_and_optimize(false);
+    build_and_optimize(false, false);
   }
 
   // Build and verify the loop tree without modifying the graph.  This
@@ -790,6 +806,30 @@
   // Return true if exp is a scaled induction var plus (or minus) constant
   bool is_scaled_iv_plus_offset(Node* exp, Node* iv, int* p_scale, Node** p_offset, int depth = 0);
 
+  // Return true if proj is for "proj->[region->..]call_uct"
+  bool is_uncommon_trap_proj(ProjNode* proj, bool must_reason_predicate = false);
+  // Return true for    "if(test)-> proj -> ...
+  //                          |
+  //                          V
+  //                      other_proj->[region->..]call_uct"
+  bool is_uncommon_trap_if_pattern(ProjNode* proj, bool must_reason_predicate = false);
+  // Create a new if above the uncommon_trap_if_pattern for the predicate to be promoted
+  ProjNode* create_new_if_for_predicate(ProjNode* cont_proj);
+  // Find a good location to insert a predicate
+  ProjNode* find_predicate_insertion_point(Node* start_c);
+  // Construct a range check for a predicate if
+  BoolNode* rc_predicate(Node* ctrl,
+                         int scale, Node* offset,
+                         Node* init, Node* limit, Node* stride,
+                         Node* range);
+
+  // Implementation of the loop predication to promote checks outside the loop
+  bool loop_predication_impl(IdealLoopTree *loop);
+
+  // Helper function to collect predicate for eliminating the useless ones
+  void collect_potentially_useful_predicates(IdealLoopTree *loop, Unique_Node_List &predicate_opaque1);
+  void eliminate_useless_predicates();
+
   // Eliminate range-checks and other trip-counter vs loop-invariant tests.
   void do_range_check( IdealLoopTree *loop, Node_List &old_new );
 
@@ -906,7 +946,6 @@
   const TypeInt* filtered_type_from_dominators( Node* val, Node *val_ctrl);
 
   // Helper functions
-  void register_new_node( Node *n, Node *blk );
   Node *spinup( Node *iff, Node *new_false, Node *new_true, Node *region, Node *phi, small_cache *cache );
   Node *find_use_block( Node *use, Node *def, Node *old_false, Node *new_false, Node *old_true, Node *new_true );
   void handle_use( Node *use, Node *def, small_cache *cache, Node *region_dom, Node *new_false, Node *new_true, Node *old_false, Node *old_true );
@@ -918,6 +957,7 @@
 public:
   void set_created_loop_node() { _created_loop_node = true; }
   bool created_loop_node()     { return _created_loop_node; }
+  void register_new_node( Node *n, Node *blk );
 
 #ifndef PRODUCT
   void dump( ) const;
--- a/hotspot/src/share/vm/opto/parse.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/parse.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -430,6 +430,11 @@
     }
   }
 
+  // Return true if the parser should add a loop predicate
+  bool should_add_predicate(int target_bci);
+  // Insert a loop predicate into the graph
+  void add_predicate();
+
   // Note:  Intrinsic generation routines may be found in library_call.cpp.
 
   // Helper function to setup Ideal Call nodes
@@ -491,7 +496,7 @@
 
   void    do_ifnull(BoolTest::mask btest, Node* c);
   void    do_if(BoolTest::mask btest, Node* c);
-  void    repush_if_args();
+  int     repush_if_args();
   void    adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
                               Block* path, Block* other_path);
   IfNode* jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask);
--- a/hotspot/src/share/vm/opto/parse1.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/parse1.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1383,6 +1383,10 @@
     set_parse_bci(iter().cur_bci());
 
     if (bci() == block()->limit()) {
+      // insert a predicate if it falls through to a loop head block
+      if (should_add_predicate(bci())){
+        add_predicate();
+      }
       // Do not walk into the next block until directed by do_all_blocks.
       merge(bci());
       break;
@@ -2083,6 +2087,37 @@
   }
 }
 
+//------------------------------should_add_predicate--------------------------
+bool Parse::should_add_predicate(int target_bci) {
+  if (!UseLoopPredicate) return false;
+  Block* target = successor_for_bci(target_bci);
+  if (target != NULL          &&
+      target->is_loop_head()  &&
+      block()->rpo() < target->rpo()) {
+    return true;
+  }
+  return false;
+}
+
+//------------------------------add_predicate---------------------------------
+void Parse::add_predicate() {
+  assert(UseLoopPredicate,"use only for loop predicate");
+  Node *cont    = _gvn.intcon(1);
+  Node* opq     = _gvn.transform(new (C, 2) Opaque1Node(C, cont));
+  Node *bol     = _gvn.transform(new (C, 2) Conv2BNode(opq));
+  IfNode* iff   = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
+  Node* iffalse = _gvn.transform(new (C, 1) IfFalseNode(iff));
+  C->add_predicate_opaq(opq);
+  {
+    PreserveJVMState pjvms(this);
+    set_control(iffalse);
+    uncommon_trap(Deoptimization::Reason_predicate,
+                  Deoptimization::Action_maybe_recompile);
+  }
+  Node* iftrue = _gvn.transform(new (C, 1) IfTrueNode(iff));
+  set_control(iftrue);
+}
+
 #ifndef PRODUCT
 //------------------------show_parse_info--------------------------------------
 void Parse::show_parse_info() {
--- a/hotspot/src/share/vm/opto/parse2.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/parse2.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -278,6 +278,11 @@
   if (len < 1) {
     // If this is a backward branch, add safepoint
     maybe_add_safepoint(default_dest);
+    if (should_add_predicate(default_dest)){
+      _sp += 1; // set original stack for use by uncommon_trap
+      add_predicate();
+      _sp -= 1;
+    }
     merge(default_dest);
     return;
   }
@@ -324,6 +329,11 @@
 
   if (len < 1) {    // If this is a backward branch, add safepoint
     maybe_add_safepoint(default_dest);
+    if (should_add_predicate(default_dest)){
+      _sp += 1; // set original stack for use by uncommon_trap
+      add_predicate();
+      _sp -= 1;
+    }
     merge(default_dest);
     return;
   }
@@ -731,6 +741,9 @@
   push(_gvn.makecon(ret_addr));
 
   // Flow to the jsr.
+  if (should_add_predicate(jsr_bci)){
+    add_predicate();
+  }
   merge(jsr_bci);
 }
 
@@ -881,7 +894,7 @@
 
 //-------------------------------repush_if_args--------------------------------
 // Push arguments of an "if" bytecode back onto the stack by adjusting _sp.
-inline void Parse::repush_if_args() {
+inline int Parse::repush_if_args() {
 #ifndef PRODUCT
   if (PrintOpto && WizardMode) {
     tty->print("defending against excessive implicit null exceptions on %s @%d in ",
@@ -895,6 +908,7 @@
   assert(argument(0) != NULL, "must exist");
   assert(bc_depth == 1 || argument(1) != NULL, "two must exist");
   _sp += bc_depth;
+  return bc_depth;
 }
 
 //----------------------------------do_ifnull----------------------------------
@@ -954,8 +968,14 @@
       // Update method data
       profile_taken_branch(target_bci);
       adjust_map_after_if(btest, c, prob, branch_block, next_block);
-      if (!stopped())
+      if (!stopped()) {
+        if (should_add_predicate(target_bci)){ // add a predicate if it branches to a loop
+          int nargs = repush_if_args(); // set original stack for uncommon_trap
+          add_predicate();
+          _sp -= nargs;
+        }
         merge(target_bci);
+      }
     }
   }
 
@@ -1076,8 +1096,14 @@
       // Update method data
       profile_taken_branch(target_bci);
       adjust_map_after_if(taken_btest, c, prob, branch_block, next_block);
-      if (!stopped())
+      if (!stopped()) {
+        if (should_add_predicate(target_bci)){ // add a predicate if it branches to a loop
+          int nargs = repush_if_args(); // set original stack for the uncommon_trap
+          add_predicate();
+          _sp -= nargs;
+        }
         merge(target_bci);
+      }
     }
   }
 
@@ -2080,6 +2106,10 @@
     // Update method data
     profile_taken_branch(target_bci);
 
+    // Add loop predicate if it goes to a loop
+    if (should_add_predicate(target_bci)){
+      add_predicate();
+    }
     // Merge the current control into the target basic block
     merge(target_bci);
 
--- a/hotspot/src/share/vm/opto/split_if.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/split_if.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -219,6 +219,7 @@
 
 //------------------------------register_new_node------------------------------
 void PhaseIdealLoop::register_new_node( Node *n, Node *blk ) {
+  assert(!n->is_CFG(), "must be data node");
   _igvn.register_new_node_with_optimizer(n);
   set_ctrl(n, blk);
   IdealLoopTree *loop = get_loop(blk);
--- a/hotspot/src/share/vm/opto/subnode.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/opto/subnode.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -1244,8 +1244,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dcos( d ) );
+  return TypeD::make( StubRoutines::intrinsic_cos( d ) );
 }
 
 //=============================================================================
@@ -1256,8 +1255,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dsin( d ) );
+  return TypeD::make( StubRoutines::intrinsic_sin( d ) );
 }
 
 //=============================================================================
@@ -1268,8 +1266,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dtan( d ) );
+  return TypeD::make( StubRoutines::intrinsic_tan( d ) );
 }
 
 //=============================================================================
@@ -1280,8 +1277,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dlog( d ) );
+  return TypeD::make( StubRoutines::intrinsic_log( d ) );
 }
 
 //=============================================================================
@@ -1292,8 +1288,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dlog10( d ) );
+  return TypeD::make( StubRoutines::intrinsic_log10( d ) );
 }
 
 //=============================================================================
@@ -1304,8 +1299,7 @@
   if( t1 == Type::TOP ) return Type::TOP;
   if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
   double d = t1->getd();
-  if( d < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dexp( d ) );
+  return TypeD::make( StubRoutines::intrinsic_exp( d ) );
 }
 
 
@@ -1323,5 +1317,5 @@
   double d2 = t2->getd();
   if( d1 < 0.0 ) return Type::DOUBLE;
   if( d2 < 0.0 ) return Type::DOUBLE;
-  return TypeD::make( SharedRuntime::dpow( d1, d2 ) );
+  return TypeD::make( StubRoutines::intrinsic_pow( d1, d2 ) );
 }
--- a/hotspot/src/share/vm/runtime/compilationPolicy.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-2010 Sun Microsystems, Inc.  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,6 +74,16 @@
   if (m->is_abstract()) return false;
   if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false;
 
+  // Math intrinsics should never be compiled as this can lead to
+  // monotonicity problems because the interpreter will prefer the
+  // compiled code to the intrinsic version.  This can't happen in
+  // production because the invocation counter can't be incremented
+  // but we shouldn't expose the system to this problem in testing
+  // modes.
+  if (!AbstractInterpreter::can_be_compiled(m)) {
+    return false;
+  }
+
   return !m->is_not_compilable();
 }
 
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1672,7 +1672,8 @@
   "unhandled",
   "constraint",
   "div0_check",
-  "age"
+  "age",
+  "predicate"
 };
 const char* Deoptimization::_trap_action_name[Action_LIMIT] = {
   // Note:  Keep this in sync. with enum DeoptAction.
--- a/hotspot/src/share/vm/runtime/deoptimization.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/deoptimization.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -46,6 +46,7 @@
     Reason_constraint,            // arbitrary runtime constraint violated
     Reason_div0_check,            // a null_check due to division by zero
     Reason_age,                   // nmethod too old; tier threshold reached
+    Reason_predicate,             // compiler generated predicate failed
     Reason_LIMIT,
     // Note:  Keep this enum in sync. with _trap_reason_name.
     Reason_RECORDED_LIMIT = Reason_unloaded   // some are not recorded per bc
--- a/hotspot/src/share/vm/runtime/globals.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -3460,6 +3460,9 @@
   diagnostic(bool, OptimizeMethodHandles, true,                             \
           "when constructing method handles, try to improve them")          \
                                                                             \
+  experimental(bool, TrustFinalNonStaticFields, false,                      \
+          "trust final non-static declarations for constant folding")       \
+                                                                            \
   experimental(bool, EnableInvokeDynamic, false,                            \
           "recognize the invokedynamic instruction")                        \
                                                                             \
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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,6 +97,14 @@
 address StubRoutines::_unsafe_arraycopy                  = NULL;
 address StubRoutines::_generic_arraycopy                 = NULL;
 
+double (* StubRoutines::_intrinsic_log   )(double) = NULL;
+double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
+double (* StubRoutines::_intrinsic_exp   )(double) = NULL;
+double (* StubRoutines::_intrinsic_pow   )(double, double) = NULL;
+double (* StubRoutines::_intrinsic_sin   )(double) = NULL;
+double (* StubRoutines::_intrinsic_cos   )(double) = NULL;
+double (* StubRoutines::_intrinsic_tan   )(double) = NULL;
+
 // Initialization
 //
 // Note: to break cycle with universe initialization, stubs are generated in two phases.
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp	Thu Jan 21 14:47:01 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1997-2010 Sun Microsystems, Inc.  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
@@ -148,6 +148,20 @@
   static address _unsafe_arraycopy;
   static address _generic_arraycopy;
 
+  // These are versions of the java.lang.Math methods which perform
+  // the same operations as the intrinsic version.  They are used for
+  // constant folding in the compiler to ensure equivalence.  If the
+  // intrinsic version returns the same result as the strict version
+  // then they can be set to the appropriate function from
+  // SharedRuntime.
+  static double (*_intrinsic_log)(double);
+  static double (*_intrinsic_log10)(double);
+  static double (*_intrinsic_exp)(double);
+  static double (*_intrinsic_pow)(double, double);
+  static double (*_intrinsic_sin)(double);
+  static double (*_intrinsic_cos)(double);
+  static double (*_intrinsic_tan)(double);
+
  public:
   // Initialization/Testing
   static void    initialize1();                            // must happen before universe::genesis
@@ -245,6 +259,35 @@
   static address unsafe_arraycopy()        { return _unsafe_arraycopy; }
   static address generic_arraycopy()       { return _generic_arraycopy; }
 
+  static double  intrinsic_log(double d) {
+    assert(_intrinsic_log != NULL, "must be defined");
+    return _intrinsic_log(d);
+  }
+  static double  intrinsic_log10(double d) {
+    assert(_intrinsic_log != NULL, "must be defined");
+    return _intrinsic_log10(d);
+  }
+  static double  intrinsic_exp(double d) {
+    assert(_intrinsic_exp != NULL, "must be defined");
+    return _intrinsic_exp(d);
+  }
+  static double  intrinsic_pow(double d, double d2) {
+    assert(_intrinsic_pow != NULL, "must be defined");
+    return _intrinsic_pow(d, d2);
+  }
+  static double  intrinsic_sin(double d) {
+    assert(_intrinsic_sin != NULL, "must be defined");
+    return _intrinsic_sin(d);
+  }
+  static double  intrinsic_cos(double d) {
+    assert(_intrinsic_cos != NULL, "must be defined");
+    return _intrinsic_cos(d);
+  }
+  static double  intrinsic_tan(double d) {
+    assert(_intrinsic_tan != NULL, "must be defined");
+    return _intrinsic_tan(d);
+  }
+
   //
   // Default versions of the above arraycopy functions for platforms which do
   // not have specialized versions
--- a/hotspot/test/compiler/6877254/Test.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/test/compiler/6877254/Test.java	Thu Jan 21 14:47:01 2010 -0800
@@ -26,7 +26,7 @@
  * @bug 6877254
  * @summary Implement StoreCMNode::Ideal to promote its OopStore above the MergeMem
  *
- * @run main/othervm -server -Xcomp -XX:+UseConcMarkSweepGC Test
+ * @run main/othervm -Xcomp Test
  */
 
 public class Test {
--- a/hotspot/test/compiler/6895383/Test.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/test/compiler/6895383/Test.java	Thu Jan 21 14:47:01 2010 -0800
@@ -30,6 +30,9 @@
  * @run main/othervm -Xcomp Test
  */
 
+import java.util.*;
+import java.util.concurrent.*;
+
 public class Test {
     public static void main(String argv[]) {
         Test test = new Test();
--- a/hotspot/test/compiler/6896727/Test.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/hotspot/test/compiler/6896727/Test.java	Thu Jan 21 14:47:01 2010 -0800
@@ -26,7 +26,7 @@
  * @test
  * @bug 6896727
  * @summary nsk/logging/LoggingPermission/LoggingPermission/logperm002 fails with G1, EscapeAnalisys w/o COOPs
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:+DoEscapeAnalysis -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC Test
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:+DoEscapeAnalysis Test
  */
 
 public class Test {
--- a/jaxp/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/jaxp/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 233a4871d3364ec305efd4a58cfd676620a03a90 jdk7-b76
 bfadab8c7b1bf806a49d3e1bc19ec919717f057a jdk7-b77
 7a12d3789e1b07a560fc79568b991818d617ede2 jdk7-b78
+b1005c504358c18694c84e95fec16b28cdce7ae1 jdk7-b79
--- a/jaxws/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/jaxws/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 765d2077d1e652e234d27fe85ba58a986b488503 jdk7-b76
 5b4968c110476085225d3a71c4210fad2c1116c1 jdk7-b77
 fc1c72d1dfbb17db7d46bba8db9afc39cbbb9299 jdk7-b78
+c08894f5b6e594b9b12993e256b96c1b38099632 jdk7-b79
--- a/jdk/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 8fb602395be0f7d5af4e7e93b7df2d960faf9d17 jdk7-b76
 e6a5d095c356a547cf5b3c8885885aca5e91e09b jdk7-b77
 1143e498f813b8223b5e3a696d79da7ff7c25354 jdk7-b78
+918920710d65432a2d54fdf407c1524a5571c4ad jdk7-b79
--- a/jdk/src/share/classes/sun/text/resources/FormatData_be.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_be.java	Thu Jan 21 14:47:01 2010 -0800
@@ -63,7 +63,7 @@
                     "\u0436\u043d\u0456\u045e\u043d\u044f", // august
                     "\u0432\u0435\u0440\u0430\u0441\u043d\u044f", // september
                     "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430", // october
-                    "\u043b\u0438\u0441\u0442\u0430\u043f\u0430\u0434\u0430", // november
+                    "\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430", // november
                     "\u0441\u043d\u0435\u0436\u043d\u044f", // december
                     "" // month 13 if applicable
                 }
@@ -80,7 +80,7 @@
                     "\u0436\u043d\u0432", // abb august
                     "\u0432\u0440\u0441", // abb september
                     "\u043a\u0441\u0442", // abb october
-                    "\u043b\u0441\u0442", // abb november
+                    "\u043b\u0456\u0441", // abb november
                     "\u0441\u043d\u0436", // abb december
                     "" // abb month 13 if applicable
                 }
--- a/jdk/src/share/classes/sun/text/resources/FormatData_de.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_de.java	Thu Jan 21 14:47:01 2010 -0800
@@ -130,7 +130,7 @@
             },
             { "DateTimePatterns",
                 new String[] {
-                    "H.mm' Uhr 'z", // full time pattern
+                    "HH:mm' Uhr 'z", // full time pattern
                     "HH:mm:ss z", // long time pattern
                     "HH:mm:ss", // medium time pattern
                     "HH:mm", // short time pattern
--- a/jdk/src/share/classes/sun/text/resources/FormatData_et.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_et.java	Thu Jan 21 14:47:01 2010 -0800
@@ -50,35 +50,35 @@
         return new Object[][] {
             { "MonthNames",
                 new String[] {
-                    "Jaanuar", // january
-                    "Veebruar", // february
-                    "M\u00e4rts", // march
-                    "Aprill", // april
-                    "Mai", // may
-                    "Juuni", // june
-                    "Juuli", // july
-                    "August", // august
-                    "September", // september
-                    "Oktoober", // october
-                    "November", // november
-                    "Detsember", // december
+                    "jaanuar", // january
+                    "veebruar", // february
+                    "m\u00e4rts", // march
+                    "aprill", // april
+                    "mai", // may
+                    "juuni", // june
+                    "juuli", // july
+                    "august", // august
+                    "september", // september
+                    "oktoober", // october
+                    "november", // november
+                    "detsember", // december
                     "" // month 13 if applicable
                 }
             },
             { "MonthAbbreviations",
                 new String[] {
-                    "Jaan", // abb january
-                    "Veebr", // abb february
-                    "M\u00e4rts", // abb march
-                    "Apr", // abb april
-                    "Mai", // abb may
-                    "Juuni", // abb june
-                    "Juuli", // abb july
-                    "Aug", // abb august
-                    "Sept", // abb september
-                    "Okt", // abb october
-                    "Nov", // abb november
-                    "Dets", // abb december
+                    "jaan", // abb january
+                    "veebr", // abb february
+                    "m\u00e4rts", // abb march
+                    "apr", // abb april
+                    "mai", // abb may
+                    "juuni", // abb june
+                    "juuli", // abb july
+                    "aug", // abb august
+                    "sept", // abb september
+                    "okt", // abb october
+                    "nov", // abb november
+                    "dets", // abb december
                     "" // abb month 13 if applicable
                 }
             },
--- a/jdk/src/share/classes/sun/text/resources/FormatData_fi.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_fi.java	Thu Jan 21 14:47:01 2010 -0800
@@ -133,6 +133,12 @@
                 }
             },
             { "DateTimePatternChars", "GanjkHmsSEDFwWxhKzZ" },
+            { "AmPmMarkers",
+                new String[] {
+                    "ap.", // am marker
+                    "ip."  // pm marker
+                }
+            },
         };
     }
 }
--- a/jdk/src/share/classes/sun/text/resources/FormatData_hr_HR.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_hr_HR.java	Thu Jan 21 14:47:01 2010 -0800
@@ -55,6 +55,19 @@
                     "#,##0%" // percent pattern
                 }
             },
+            { "DateTimePatterns",
+                new String[] {
+                    "HH:mm:ss z", // full time pattern
+                    "HH:mm:ss z", // long time pattern
+                    "HH:mm:ss", // medium time pattern
+                    "HH:mm", // short time pattern
+                    "yyyy. MMMM dd", // full date pattern
+                    "yyyy. MMMM dd", // long date pattern
+                    "dd.MM.yyyy.", // medium date pattern
+                    "dd.MM.yy.", // short date pattern
+                    "{1} {0}" // date-time pattern
+                }
+            }
         };
     }
 }
--- a/jdk/src/share/classes/sun/text/resources/FormatData_hu_HU.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_hu_HU.java	Thu Jan 21 14:47:01 2010 -0800
@@ -51,7 +51,7 @@
             { "NumberPatterns",
                 new String[] {
                     "#,##0.###;-#,##0.###", // decimal pattern
-                    "\u00A4#,##0.##;-\u00A4#,##0.##", // currency pattern
+                    "#,##0.## \u00A4;-#,##0.## \u00A4", // currency pattern
                     "#,##0%" // percent pattern
                 }
             },
--- a/jdk/src/share/classes/sun/text/resources/FormatData_lt.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_lt.java	Thu Jan 21 14:47:01 2010 -0800
@@ -113,7 +113,7 @@
             { "NumberElements",
                 new String[] {
                     ",", // decimal separator
-                    ".", // group (thousands) separator
+                    "\u00a0", // group (thousands) separator
                     ";", // list separator
                     "%", // percent sign
                     "0", // native 0 digit
@@ -133,7 +133,7 @@
                     "HH.mm", // short time pattern
                     "EEEE, yyyy, MMMM d", // full date pattern
                     "EEEE, yyyy, MMMM d", // long date pattern
-                    "yyyy.M.d", // medium date pattern
+                    "yyyy-MM-dd", // medium date pattern
                     "yy.M.d", // short date pattern
                     "{1} {0}" // date-time pattern
                 }
--- a/jdk/src/share/classes/sun/text/resources/FormatData_ro.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_ro.java	Thu Jan 21 14:47:01 2010 -0800
@@ -90,7 +90,7 @@
                     "miercuri", // Wednesday
                     "joi", // Thursday
                     "vineri", // Friday
-                    "s\u00eemb\u0103t\u0103" // Saturday
+                    "s\u00e2mb\u0103t\u0103" // Saturday
                 }
             },
             { "DayAbbreviations",
--- a/jdk/src/share/classes/sun/text/resources/FormatData_uk.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/text/resources/FormatData_uk.java	Thu Jan 21 14:47:01 2010 -0800
@@ -113,7 +113,7 @@
             { "NumberElements",
                 new String[] {
                     ",", // decimal separator
-                    ".", // group (thousands) separator
+                    "\u00a0", // group (thousands) separator
                     ";", // list separator
                     "%", // percent sign
                     "0", // native 0 digit
--- a/jdk/src/share/classes/sun/util/resources/CalendarData_ro.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/CalendarData_ro.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -35,9 +35,5 @@
 # This notice and attribution to Taligent may not be removed.
 # Taligent is a registered trademark of Taligent, Inc.
 
-
-# This bundle is empty because the data of the base bundle
-# is adequate for this locale.
-# The bundle is necessary to prevent the resource
-# bundle lookup from falling back to the default
-# locale.
+firstDayOfWeek=2
+minimalDaysInFirstWeek=1
--- a/jdk/src/share/classes/sun/util/resources/CalendarData_sl.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/CalendarData_sl.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -36,8 +36,4 @@
 # Taligent is a registered trademark of Taligent, Inc.
 
 
-# This bundle is empty because the data of the base bundle
-# is adequate for this locale.
-# The bundle is necessary to prevent the resource
-# bundle lookup from falling back to the default
-# locale.
+firstDayOfWeek=2
--- a/jdk/src/share/classes/sun/util/resources/CurrencyNames_en_CA.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/CurrencyNames_en_CA.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -36,3 +36,4 @@
 # Taligent is a registered trademark of Taligent, Inc.
 
 CAD=$
+USD=US$
--- a/jdk/src/share/classes/sun/util/resources/CurrencyNames_tr_TR.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/CurrencyNames_tr_TR.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -36,4 +36,4 @@
 # Taligent is a registered trademark of Taligent, Inc.
 
 TRL=TL
-TRY=YTL
+TRY=TL
--- a/jdk/src/share/classes/sun/util/resources/CurrencyNames_uk_UA.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/CurrencyNames_uk_UA.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -35,4 +35,4 @@
 # This notice and attribution to Taligent may not be removed.
 # Taligent is a registered trademark of Taligent, Inc.
 
-UAH=\u0433\u0440\u0432.
+UAH=\u0433\u0440\u043b.
--- a/jdk/src/share/classes/sun/util/resources/LocaleNames_es.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/LocaleNames_es.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -38,7 +38,7 @@
 # language names
 # key is ISO 639 language code
 
-aa=afarense
+aa=afar
 ab=abjasio
 ae=av\u00e9stico
 af=afrikaans
@@ -47,16 +47,16 @@
 an=aragon\u00e9s
 ar=\u00e1rabe
 as=asam\u00e9s
-av=avaro
+av=avar
 ay=aimara
-az=azerbaiyano
-ba=bashkiro
+az=azer\u00ed
+ba=bashkir
 be=bielorruso
 bg=b\u00falgaro
-bh=bihar\u00ed
+bh=bihari
 bi=bislama
 bm=bambara
-bn=bengal\u00e9s
+bn=bengal\u00ed
 bo=tibetano
 br=bret\u00f3n
 bs=bosnio
@@ -66,37 +66,37 @@
 co=corso
 cr=cree
 cs=checo
-cu=glagol\u00edtico
+cu=eslavo eclesi\u00e1stico
 cv=chuvash
 cy=gal\u00e9s
 da=dan\u00e9s
 de=alem\u00e1n
 dv=divehi
-dz=butan\u00e9s
+dz=dzongkha
 ee=ewe
 el=griego
 en=ingl\u00e9s
 eo=esperanto
 es=espa\u00f1ol
 et=estonio
-eu=vascuence
-fa=farsi
-ff=fulb\u00e9
+eu=vasco
+fa=persa
+ff=fula
 fi=fin\u00e9s
-fj=fijiano
-fo=faro\u00e9s
+fj=fidjiano
+fo=fero\u00e9s
 fr=franc\u00e9s
-fy=frisio
+fy=fris\u00f3n
 ga=irland\u00e9s
 gd=ga\u00e9lico escoc\u00e9s
 gl=gallego
 gn=guaran\u00ed
-gu=gujarat\u00ed
-gv=manx
+gu=gujarati
+gv=ga\u00e9lico man\u00e9s
 ha=hausa
 he=hebreo
-hi=hind\u00fa
-ho=hiri Motu
+hi=hindi
+ho=hiri motu
 hr=croata
 ht=haitiano
 hu=h\u00fangaro
@@ -104,10 +104,10 @@
 hz=herero
 ia=interlingua
 id=indonesio
-ie=interlingua
-ig=ibo
-ii=yi de sichuan
-ik=inupiak
+ie=interlingue
+ig=igbo
+ii=sichuan yi
+ik=inupiaq
 in=indonesio
 io=ido
 is=island\u00e9s
@@ -118,20 +118,20 @@
 ji=y\u00eddish
 jv=javan\u00e9s
 ka=georgiano
-kg=kikongo
-ki=gikuyu
-kj=kwanyama
-kk=kazajio
+kg=kongo
+ki=kikuyu
+kj=kuanyama
+kk=kazajo
 kl=groenland\u00e9s
-km=camboyano
-kn=kanada
+km=jemer
+kn=canar\u00e9s
 ko=coreano
 kr=kanuri
-ks=cachemir\u00ed
-ku=curdo
+ks=cachemiro
+ku=kurdo
 kv=komi
 kw=c\u00f3rnico
-ky=kirgu\u00eds
+ky=kirghiz
 la=lat\u00edn
 lb=luxemburgu\u00e9s
 lg=ganda
@@ -139,7 +139,7 @@
 ln=lingala
 lo=laosiano
 lt=lituano
-lu=tshiluba
+lu=luba-katanga
 lv=let\u00f3n
 mg=malgache
 mh=marshal\u00e9s
@@ -148,82 +148,82 @@
 ml=malayalam
 mn=mongol
 mo=moldavo
-mr=m\u00e1rata
+mr=marathi
 ms=malayo
 mt=malt\u00e9s
 my=birmano
 na=nauruano
-nb=noruego (bokm\u00e5l)
-nd=ndebele (norte)
+nb=bokmal noruego
+nd=ndebele septentrional
 ne=nepal\u00ed
 ng=ndonga
 nl=neerland\u00e9s
-nn=noruego (nynorsk)
+nn=nynorsk noruego
 no=noruego
-nr=ndebele (sur)
+nr=ndebele meridional
 nv=navajo
 ny=nyanja
 oc=occitano
 oj=ojibwa
 om=oromo
 or=oriya
-os=osetio
+os=os\u00e9tico
 pa=punjab\u00ed
 pi=pali
 pl=polaco
 ps=pashto
 pt=portugu\u00e9s
 qu=quechua
-rm=retorromano 
-rn=rund\u00ed
+rm=retorrom\u00e1nico
+rn=kiroundi
 ro=rumano
 ru=ruso
-rw=ruand\u00e9s
+rw=kinyarwanda
 sa=s\u00e1nscrito
 sc=sardo
-sd=sindino
-se=sami del norte
+sd=sindhi
+se=sami septentrional
 sg=sango
 si=cingal\u00e9s
 sk=eslovaco
-sl=eslovenio
+sl=esloveno
 sm=samoano
-sn=son\u00e9s
+sn=shona
 so=somal\u00ed
 sq=alban\u00e9s
 sr=serbio
-ss=suaziland\u00e9s
-st=sesot\u00e9s
-su=sudan\u00e9s
+ss=siswati
+st=sesotho
+su=sundan\u00e9s
 sv=sueco
-sw=suajili
+sw=swahili
 ta=tamil
 te=telugu
-tg=tajik
+tg=tayiko
 th=tailand\u00e9s
-ti=tigri\u00f1es
+ti=tigri\u00f1a
 tk=turcomano
 tl=tagalo
-tn=sechuan\u00e9s
-to=tongu\u00e9s
+tn=setchwana
+to=tongano
 tr=turco
 ts=tsonga
 tt=t\u00e1rtaro
-tw=tui
-ty=taitiano
-ug=uighur
-uk=ucranio
+tw=twi
+ty=tahitiano
+ug=uigur
+uk=ucraniano
 ur=urdu
-uz=uzbeco
+uz=uzbeko
 ve=venda
 vi=vietnamita
-vo=volapuk
+vo=volap\u00fck
 wa=val\u00f3n
 wo=uolof
 xh=xhosa
 yi=y\u00eddish
 yo=yoruba
-za=chuang
+za=zhuang
 zh=chino
 zu=zul\u00fa
 
--- a/jdk/src/share/classes/sun/util/resources/LocaleNames_fi.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/LocaleNames_fi.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -49,7 +49,7 @@
 en=englanti
 es=espanja
 fi=suomi
-fr=franska
+fr=ranska
 he=heprea
 iw=heprea
 hi=hindi
@@ -80,7 +80,7 @@
 DK=Tanska
 ES=Espanja
 FI=Suomi
-FR=Franska
+FR=Ranska
 GB=Iso-Britannia
 GR=Kreikka
 IE=Irlanti
--- a/jdk/src/share/classes/sun/util/resources/LocaleNames_nl.properties	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/LocaleNames_nl.properties	Thu Jan 21 14:47:01 2010 -0800
@@ -34,14 +34,436 @@
 # This notice and attribution to Taligent may not be removed.
 # Taligent is a registered trademark of Taligent, Inc.
 
-
 # language names
 # key is ISO 639 language code
 
+aa=Afar
+ab=Abchazisch
+ae=Avestisch
+af=Afrikaans
+ak=Akan
+am=Amhaars
+an=Aragonees
+ar=Arabisch
+as=Assamees
+av=Avarisch
+ay=Aymara
+az=Azerbeidzjaans
+ba=Basjkiers
+be=Wit-Russisch
+bg=Bulgaars
+bh=Bihari
+bi=Bislama
+bm=Bambara
+bn=Bengalees
+bo=Tibetaans
+br=Bretons
+bs=Bosnisch
+ca=Catalaans
+ce=Chechen
+ch=Chamorro
+co=Corsicaans
+cr=Cree
+cs=Tsjechisch
+cu=Kerkslavisch
+cv=Tsjoevasjisch
+cy=Welsh
+da=Deens
+de=Duits
+dv=Divehi
+dz=Dzongkha
+ee=Ewe
+el=Grieks
+en=Engels
+eo=Esperanto
+es=Spaans
+et=Estlands
+eu=Baskisch
+fa=Perzisch
+ff=Fulah
+fi=Fins
+fj=Fijisch
+fo=Faer\u00f6ers
+fr=Frans
+fy=Fries
+ga=Iers
+gd=Schots Gaelic
+gl=Galicisch
+gn=Guarani
+gu=Gujarati
+gv=Manx
+ha=Hausa
+he=Hebreeuws
+hi=Hindi
+ho=Hiri Motu
+hr=Kroatisch
+ht=Ha\u00eftiaans
+hu=Hongaars
+hy=Armeens
+hz=Herero
+ia=Interlingua
+id=Indonesisch
+ie=Interlingue
+ig=Igbo
+ii=Sichuan Yi
+ik=Inupiaq
+io=Ido
+is=IJslands
+it=Italiaans
+iu=Inuktitut
+ja=Japans
+jv=Javaans
+ka=Georgisch
+kg=Kongo
+ki=Kikuyu
+kj=Kuanyama
+kk=Kazachs
+kl=Kalaallisut
+km=Khmer
+kn=Kannada
+ko=Koreaans
+kr=Kanuri
+ks=Kashmiri
+ku=Koerdisch
+kv=Komi
+kw=Cornish
+ky=Kirgizisch
+la=Latijn
+lb=Luxemburgs
+lg=Ganda
+li=Limburgs
+ln=Lingala
+lo=Lao
+lt=Litouws
+lu=Luba-Katanga
+lv=Letlands
+mg=Malagasisch
+mh=Marshallees
+mi=Maori
+mk=Macedonisch
+ml=Malayalam
+mn=Mongools
+mo=Moldavisch
+mr=Marathi
+ms=Maleis
+mt=Maltees
+my=Birmees
+na=Nauru
+nb=Noors - Bokm\u00e5l
+nd=Noord-Ndbele
+ne=Nepalees
+ng=Ndonga
 nl=Nederlands
+nn=Noors - Nynorsk
+no=Noors
+nr=Zuid-Ndbele
+nv=Navajo
+ny=Nyanja
+oc=Occitaans
+oj=Ojibwa
+om=Oromo
+or=Oriya
+os=Ossetisch
+pa=Punjabi
+pi=Pali
+pl=Pools
+ps=Pasjtoe
+pt=Portugees
+qu=Quechua
+rm=Reto-Romaans
+rn=Rundi
+ro=Roemeens
+ru=Russisch
+rw=Kinyarwanda
+sa=Sanskriet
+sc=Sardinisch
+sd=Sindhi
+se=Noord-Samisch
+sg=Sango
+si=Singalees
+sk=Slowaaks
+sl=Sloveens
+sm=Samoaans
+sn=Shona
+so=Somalisch
+sq=Albanees
+sr=Servisch
+ss=Swati
+st=Zuid-Sotho
+su=Soendanees
+sv=Zweeds
+sw=Swahili
+ta=Tamil
+te=Teloegoe
+tg=Tadzjieks
+th=Thais
+ti=Tigrinya
+tk=Turkmeens
+tl=Tagalog
+tn=Tswana
+to=Tonga
+tr=Turks
+ts=Tsonga
+tt=Tataars
+tw=Twi
+ty=Tahitisch
+ug=Oeigoers
+uk=Oekra\u00efens
+ur=Urdu
+uz=Oezbeeks
+ve=Venda
+vi=Vietnamees
+vo=Volap\u00fck
+wa=Wallonisch
+wo=Wolof
+xh=Xhosa
+yi=Jiddisch
+yo=Yoruba
+za=Zhuang
+zh=Chinees
+zu=Zulu
 
 # country names
 # key is ISO 3166 country code
 
+AD=Andorra
+AE=Verenigde Arabische Emiraten
+AF=Afghanistan
+AG=Antigua en Barbuda
+AI=Anguilla
+AL=Albani\u00eb
+AM=Armeni\u00eb
+AN=Nederlandse Antillen
+AO=Angola
+AQ=Antarctica
+AR=Argentini\u00eb
+AS=Amerikaans Samoa
+AT=Oostenrijk
+AU=Australi\u00eb
+AW=Aruba
+AX=Alandeilanden
+AZ=Azerbeidzjan
+BA=Bosni\u00eb en Herzegovina
+BB=Barbados
+BD=Bangladesh
+BE=Belgi\u00eb
+BF=Burkina Faso
+BG=Bulgarije
+BH=Bahrein
+BI=Burundi
+BJ=Benin
+BM=Bermuda
+BN=Brunei
+BO=Bolivia
+BR=Brazili\u00eb
+BS=Bahama\u2019s
+BT=Bhutan
+BV=Bouveteiland
+BW=Botswana
+BY=Wit-Rusland
+BZ=Belize
+CA=Canada
+CC=Cocoseilanden
+CD=Congo-Kinshasa
+CF=Centraal-Afrikaanse Republiek
+CG=Congo
+CH=Zwitserland
+CI=Ivoorkust
+CK=Cookeilanden
+CL=Chili
+CM=Kameroen
+CN=China
+CO=Colombia
+CR=Costa Rica
+CS=Servi\u00eb en Montenegro
+CU=Cuba
+CV=Kaapverdi\u00eb
+CX=Christmaseiland
+CY=Cyprus
+CZ=Tsjechi\u00eb
+DE=Duitsland
+DJ=Djibouti
+DK=Denemarken
+DM=Dominica
+DO=Dominicaanse Republiek
+DZ=Algerije
+EC=Ecuador
+EE=Estland
+EG=Egypte
+EH=Westelijke Sahara
+ER=Eritrea
+ES=Spanje
+ET=Ethiopi\u00eb
+FI=Finland
+FJ=Fiji
+FK=Falklandeilanden
+FM=Micronesi\u00eb
+FO=Faer\u00f6er
+FR=Frankrijk
+GA=Gabon
+GB=Verenigd Koninkrijk
+GD=Grenada
+GE=Georgi\u00eb
+GF=Frans-Guyana
+GH=Ghana
+GI=Gibraltar
+GL=Groenland
+GM=Gambia
+GN=Guinee
+GP=Guadeloupe
+GQ=Equatoriaal-Guinea
+GR=Griekenland
+GS=Zuid-Georgi\u00eb en Zuidelijke Sandwicheilanden
+GT=Guatemala
+GU=Guam
+GW=Guinee-Bissau
+GY=Guyana
+HK=Hongkong SAR van China
+HM=Heard- en McDonaldeilanden
+HN=Honduras
+HR=Kroati\u00eb
+HT=Ha\u00efti
+HU=Hongarije
+ID=Indonesi\u00eb
+IE=Ierland
+IL=Isra\u00ebl
+IN=India
+IO=Britse Gebieden in de Indische Oceaan
+IQ=Irak
+IR=Iran
+IS=IJsland
+IT=Itali\u00eb
+JM=Jamaica
+JO=Jordani\u00eb
+JP=Japan
+KE=Kenia
+KG=Kirgizi\u00eb
+KH=Cambodja
+KI=Kiribati
+KM=Comoren
+KN=Saint Kitts en Nevis
+KP=Noord-Korea
+KR=Zuid-Korea
+KW=Koeweit
+KY=Caymaneilanden
+KZ=Kazachstan
+LA=Laos
+LB=Libanon
+LC=Saint Lucia
+LI=Liechtenstein
+LK=Sri Lanka
+LR=Liberia
+LS=Lesotho
+LT=Litouwen
+LU=Luxemburg
+LV=Letland
+LY=Libi\u00eb
+MA=Marokko
+MC=Monaco
+MD=Moldavi\u00eb
+ME=Montenegro
+MG=Madagaskar
+MH=Marshalleilanden
+MK=Macedoni\u00eb
+ML=Mali
+MM=Myanmar
+MN=Mongoli\u00eb
+MO=Macao SAR van China
+MP=Noordelijke Marianeneilanden
+MQ=Martinique
+MR=Mauritani\u00eb
+MS=Montserrat
+MT=Malta
+MU=Mauritius
+MV=Maldiven
+MW=Malawi
+MX=Mexico
+MY=Maleisi\u00eb
+MZ=Mozambique
+NA=Namibi\u00eb
+NC=Nieuw-Caledoni\u00eb
+NE=Niger
+NF=Norfolkeiland
+NG=Nigeria
+NI=Nicaragua
 NL=Nederland
-BE=Belgi\u00eb
+NO=Noorwegen
+NP=Nepal
+NR=Nauru
+NU=Niue
+NZ=Nieuw-Zeeland
+OM=Oman
+PA=Panama
+PE=Peru
+PF=Frans-Polynesi\u00eb
+PG=Papoea-Nieuw-Guinea
+PH=Filipijnen
+PK=Pakistan
+PL=Polen
+PM=Saint Pierre en Miquelon
+PN=Pitcairn
+PR=Puerto Rico
+PS=Palestijns Gebied
+PT=Portugal
+PW=Palau
+PY=Paraguay
+QA=Qatar
+RE=R\u00e9union
+RO=Roemeni\u00eb
+RS=Servi\u00eb
+RU=Rusland
+RW=Rwanda
+SA=Saoedi-Arabi\u00eb
+SB=Salomonseilanden
+SC=Seychellen
+SD=Soedan
+SE=Zweden
+SG=Singapore
+SH=Sint-Helena
+SI=Sloveni\u00eb
+SJ=Svalbard en Jan Mayen
+SK=Slowakije
+SL=Sierra Leone
+SM=San Marino
+SN=Senegal
+SO=Somali\u00eb
+SR=Suriname
+ST=Sao Tom\u00e9 en Principe
+SV=El Salvador
+SY=Syri\u00eb
+SZ=Swaziland
+TC=Turks- en Caicoseilanden
+TD=Tsjaad
+TF=Franse Gebieden in de zuidelijke Indische Oceaan
+TG=Togo
+TH=Thailand
+TJ=Tadzjikistan
+TK=Tokelau
+TL=Oost-Timor
+TM=Turkmenistan
+TN=Tunesi\u00eb
+TO=Tonga
+TR=Turkije
+TT=Trinidad en Tobago
+TV=Tuvalu
+TW=Taiwan
+TZ=Tanzania
+UA=Oekra\u00efne
+UG=Oeganda
+UM=Amerikaanse kleinere afgelegen eilanden
+US=Verenigde Staten
+UY=Uruguay
+UZ=Oezbekistan
+VA=Vaticaanstad
+VC=Saint Vincent en de Grenadines
+VE=Venezuela
+VG=Britse Maagdeneilanden
+VI=Amerikaanse Maagdeneilanden
+VN=Vietnam
+VU=Vanuatu
+WF=Wallis en Futuna
+WS=Samoa
+YE=Jemen
+YT=Mayotte
+ZA=Zuid-Afrika
+ZM=Zambia
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java	Thu Jan 21 14:47:01 2010 -0800
@@ -71,8 +71,8 @@
                                      "Bhutanische Sommerzeit", "BTST"};
         String CAT[] = new String[] {"Zentralafrikanische Zeit", "CAT",
                                      "Zentralafrikanische Sommerzeit", "CAST"};
-        String CET[] = new String[] {"Zentraleurop\u00e4ische Zeit", "CET",
-                                     "Zentraleurop\u00e4ische Sommerzeit", "CEST"};
+        String CET[] = new String[] {"Mitteleurop\u00e4ische Zeit", "MEZ",
+                                     "Mitteleurop\u00e4ische Sommerzeit", "MESZ"};
         String CHAST[] = new String[] {"Chatham Normalzeit", "CHAST",
                                        "Chatham Sommerzeit", "CHADT"};
         String CIT[] = new String[] {"Zentralindonesische Zeit", "CIT",
@@ -83,8 +83,8 @@
                                      "Zentrale Sommerzeit", "CDT"};
         String CTT[] = new String[] {"Chinesische Normalzeit", "CST",
                                      "Chinesische Sommerzeit", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"Kubanische Normalzeit", "CST",
+                                      "Kubanische Sommerzeit", "CDT"};
         String DARWIN[] = new String[] {"Zentrale Normalzeit (Northern Territory)", "CST",
                                         "Zentrale Sommerzeit (Northern Territory)", "CST"};
         String DUBLIN[] = new String[] {"Greenwich Zeit", "GMT",
@@ -93,8 +93,8 @@
                                      "Ostafrikanische Sommerzeit", "EAST"};
         String EASTER[] = new String[] {"Osterinseln Zeit", "EAST",
                                         "Osterinseln Sommerzeit", "EASST"};
-        String EET[] = new String[] {"Osteurop\u00e4ische Zeit", "EET",
-                                     "Osteurop\u00e4ische Sommerzeit", "EEST"};
+        String EET[] = new String[] {"Osteurop\u00e4ische Zeit", "OEZ",
+                                     "Osteurop\u00e4ische Sommerzeit", "OESZ"};
         String EGT[] = new String[] {"Ostgr\u00f6nl\u00e4ndische Zeit", "EGT",
                                      "Ostgr\u00f6nl\u00e4ndische Sommerzeit", "EGST"};
         String EST[] = new String[] {"\u00d6stliche Normalzeit", "EST",
@@ -173,12 +173,12 @@
                                       "Truk Sommerzeit", "TRUST"};
         String ULAT[]= new String[] {"Ulaanbaatar Zeit", "ULAT",
                                      "Ulaanbaatar Sommerzeit", "ULAST"};
-        String WART[] = new String[] {"Argentinische Zeit", "WART",
-                                      "Argentinische Sommerzeit", "WARST"};
+        String WART[] = new String[] {"Westargentinische Zeit", "WART",
+                                      "Westargentinische Sommerzeit", "WARST"};
         String WAT[] = new String[] {"Westafrikanische Zeit", "WAT",
                                      "Westafrikanische Sommerzeit", "WAST"};
-        String WET[] = new String[] {"Westeurop\u00e4ische Zeit", "WET",
-                                     "Westeurop\u00e4ische Sommerzeit", "WEST"};
+        String WET[] = new String[] {"Westeurop\u00e4ische Zeit", "WEZ",
+                                     "Westeurop\u00e4ische Sommerzeit", "WESZ"};
         String WIT[] = new String[] {"Westindonesische Zeit", "WIT",
                                      "Westindonesische Sommerzeit", "WIST"};
         String WST_AUS[] = new String[] {"Westliche Normalzeit (Australien)", "WST",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"Zentral-Westliche Normalzeit (Australien)", "CWST",
+                                              "Zentral-Westliche Sommerzeit (Australien)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "Hora de verano Central", "CDT"};
         String CTT[] = new String[] {"Hora est\u00e1ndar de China", "CST",
                                      "Hora de verano de China", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"Hora est\u00e1ndar de Cuba", "CST",
+                                      "Hora de verano de Cuba", "CDT"};
         String DARWIN[] = new String[] {"Hora est\u00e1ndar Central (territorio del Norte)", "CST",
                                         "Hora de verano Central (territorio del Norte)", "CST"};
         String DUBLIN[] = new String[] {"Hora del Meridiano de Greenwich", "GMT",
@@ -173,8 +173,8 @@
                                      "Hora de verano de Truk", "TRUST"};
         String ULAT[]= new String[] {"Hora de Ulan Bator", "ULAT",
                                      "Hora de verano de Ulan Bator", "ULAST"};
-        String WART[] = new String[] {"Hora de Argentina", "WART",
-                                      "Hora de verano de Argentina", "WARST"};
+        String WART[] = new String[] {"Hora de Argentina Occidental", "WART",
+                                      "Hora de verano de Argentina Occidental", "WARST"};
         String WAT[] = new String[] {"Hora de \u00c1frica Occidental", "WAT",
                                      "Hora de verano de \u00c1frica Occidental", "WAST"};
         String WET[] = new String[] {"Hora de Europa Occidental", "WET",
@@ -595,8 +595,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"Hora est\u00e1ndar de Australia Central y Occidental", "CWST",
+                                              "Hora de verano de Australia Central y Occidental", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "Heure avanc\u00e9e du Centre", "CDT"} ;
         String CTT[] = new String[] {"Heure normale de Chine", "CST",
                                      "Heure avanc\u00e9e de Chine", "CDT"} ;
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"Heure standard de Cuba", "CST",
+                                      "Heure d'\u00e9t\u00e9 de Cuba", "CDT"};
         String DARWIN[] = new String[] {"Heure standard d'Australie centrale (Territoire du Nord)", "CST",
                                         "Heure d'\u00e9t\u00e9 d'Australie centrale (Territoire du Nord)", "CST"};
         String DUBLIN[] = new String[] {"Heure du m\u00e9ridien de Greenwich", "GMT",
@@ -173,8 +173,8 @@
                                       "Heure d'\u00e9t\u00e9 de Truk", "TRUST"};
         String ULAT[]= new String[] {"Heure de l'Ulaanbaatar", "ULAT",
                                      "Heure d'\u00e9t\u00e9 de l'Ulaanbaatar", "ULAST"} ;
-        String WART[] = new String[] {"Heure D'Argentine", "WART",
-                                      "Heure d'\u00e9t\u00e9 D'Argentine", "WARST"} ;
+        String WART[] = new String[] {"Heure D'Argentine de l'Ouest", "WART",
+                                      "Heure d'\u00e9t\u00e9 D'Argentine de l'Ouest", "WARST"} ;
         String WAT[] = new String[] {"Heure d'Afrique de l'Ouest", "WAT",
                                      "Heure d'\u00e9t\u00e9 d'Afrique de l'Ouest", "WAST"} ;
         String WET[] = new String[] {"Heure d'Europe de l'Ouest", "WET",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"Heure standard de l'Australie occidentale (centre)", "CWST",
+                                              "Heure d'\u00e9t\u00e9 de l'Australie occidentale (centre)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "Ora legale USA centrale", "CDT"};
         String CTT[] = new String[] {"Ora solare della Cina", "CST",
                                      "Ora legale della Cina", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"Ora solare Cuba", "CST",
+                                      "Ora legale Cuba", "CDT"};
         String DARWIN[] = new String[] {"Ora centrale standard (Territori del Nord)", "CST",
                                         "Ora estiva centrale (Territori del Nord)", "CST"};
         String DUBLIN[] = new String[] {"Ora media di Greenwich", "GMT",
@@ -173,8 +173,8 @@
                                       "Ora estiva di Truk", "TRUST"};
         String ULAT[]= new String[] {"Ora di Ulaanbaatar", "ULAT",
                                      "Ora estiva di Ulaanbaatar", "ULAST"};
-        String WART[] = new String[] {"Ora dell'Argentina", "WART",
-                                      "Ora estiva dell'Argentina", "WARST"};
+        String WART[] = new String[] {"Ora dell'Argentina occidentale", "WART",
+                                      "Ora estiva dell'Argentina occidentale", "WARST"};
         String WAT[] = new String[] {"Ora dell'Africa occidentale", "WAT",
                                      "Ora estiva dell'Africa occidentale", "WAST"};
         String WET[] = new String[] {"Ora dell'Europa occidentale", "WET",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"Ora solare Australia centrorientale", "CWST",
+                                              "Ora estiva Australia centrorientale", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "\u4e2d\u90e8\u590f\u6642\u9593", "CDT"};
         String CTT[] = new String[] {"\u4e2d\u56fd\u6a19\u6e96\u6642", "CST",
                                      "\u4e2d\u56fd\u590f\u6642\u9593", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"\u30ad\u30e5\u30fc\u30d0\u6a19\u6e96\u6642", "CST",
+                                      "\u30ad\u30e5\u30fc\u30d0\u590f\u6642\u9593", "CDT"};
         String DARWIN[] = new String[] {"\u4e2d\u90e8\u6a19\u6e96\u6642 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CST",
                                         "\u4e2d\u90e8\u590f\u6642\u9593 (\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc)", "CST"};
         String DUBLIN[] = new String[] {"\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642", "GMT",
@@ -173,8 +173,8 @@
                                       "\u30c8\u30e9\u30c3\u30af\u590f\u6642\u9593", "TRUST"};
         String ULAT[]= new String[] {"\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u6642\u9593", "ULAT",
                                      "\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u590f\u6642\u9593", "ULAST"};
-        String WART[] = new String[] {"\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "WART",
-                                      "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u590f\u6642\u9593", "WARST"};
+        String WART[] = new String[] {"\u897f\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "WART",
+                                      "\u897f\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u590f\u6642\u9593", "WARST"};
         String WAT[] = new String[] {"\u897f\u30a2\u30d5\u30ea\u30ab\u6642\u9593", "WAT",
                                      "\u897f\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "WAST"};
         String WET[] = new String[] {"\u897f\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593", "WET",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"\u4e2d\u897f\u90e8\u6a19\u6e96\u6642 (\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2)", "CWST",
+                                              "\u4e2d\u897f\u90e8\u590f\u6642\u9593 (\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"};
         String CTT[] = new String[] {"\uc911\uad6d \ud45c\uc900\uc2dc", "CST",
                                      "\uc911\uad6d \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"\ucfe0\ubc14 \ud45c\uc900\uc2dc", "CST",
+                                      "\ucfe0\ubc14 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"};
         String DARWIN[] = new String[] {"\uc911\ubd80 \ud45c\uc900\uc2dc(\ub178\ub358 \uc9c0\uc5ed)", "CST",
                                         "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04(\ub178\ub358 \uc9c0\uc5ed)", "CST"};
         String DUBLIN[] = new String[] {"\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc", "GMT",
@@ -173,8 +173,8 @@
                                       "\ud2b8\ub8e8\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TRUST"};
         String ULAT[]= new String[] {"\uc6b8\ub780\ubc14\ud0c0\ub974 \uc2dc\uac04", "ULAT",
                                      "\uc6b8\ub780\ubc14\ud0c0\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ULAST"};
-        String WART[] = new String[] {"\uc544\ub974\ud5e8\ud2f0\ub098 \uc2dc\uac04", "WART",
-                                      "\uc544\ub974\ud5e8\ud2f0\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WARST"};
+        String WART[] = new String[] {"\uc11c\ubd80 \uc544\ub974\ud5e8\ud2f0\ub098 \uc2dc\uac04", "WART",
+                                      "\uc11c\ubd80 \uc544\ub974\ud5e8\ud2f0\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WARST"};
         String WAT[] = new String[] {"\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc2dc\uac04", "WAT",
                                      "\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WAST"};
         String WET[] = new String[] {"\uc11c\uc720\ub7fd \uc2dc\uac04", "WET",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"\uc911\uc11c\ubd80 \ud45c\uc900\uc2dc(\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544)", "CWST",
+                                              "\uc911\uc11c\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04(\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java	Thu Jan 21 14:47:01 2010 -0800
@@ -45,8 +45,8 @@
     protected final Object[][] getContents() {
         String ACT[] = new String[] {"Acre, normaltid", "ACT",
                                      "Acre, sommartid", "ACST"};
-        String ADELAIDE[] = new String[] {"Central Standard Time (S\u00f6dra Australien)", "CST",
-                                          "Central Summer Time (S\u00f6dra Australien)", "CST"};
+        String ADELAIDE[] = new String[] {"Central normaltid (S\u00f6dra Australien)", "CST",
+                                          "Central sommartid (S\u00f6dra Australien)", "CST"};
         String AGT[] = new String[] {"Argentina, normaltid", "ART",
                                      "Argentina, sommartid", "ARST"};
         String AKST[] = new String[] {"Alaska, normaltid", "AKST",
@@ -61,10 +61,10 @@
                                      "Atlantisk sommartid", "ADT"};
         String BDT[] = new String[] {"Bangladesh, normaltid", "BDT",
                                      "Bangladesh, sommartid", "BDST"};
-        String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST",
-                                          "Eastern Summer Time (Queensland)", "EST"};
-        String BROKEN_HILL[] = new String[] {"Central Standard Time (S\u00f6dra Australien/Nya Sydwales)", "CST",
-                                             "Central Summer Time (S\u00f6dra Australien/Nya Sydwales)", "CST"};
+        String BRISBANE[] = new String[] {"\u00d6stlig normaltid (Queensland)", "EST",
+                                          "\u00d6stlig sommartid (Queensland)", "EST"};
+        String BROKEN_HILL[] = new String[] {"Central normaltid (S\u00f6dra Australien/Nya Sydwales)", "CST",
+                                             "Central sommartid (S\u00f6dra Australien/Nya Sydwales)", "CST"};
         String BRT[] = new String[] {"Brasilien, normaltid", "BRT",
                                      "Brasilien, sommartid", "BRST"};
         String BTT[] = new String[] {"Bhutan, normaltid", "BTT",
@@ -83,10 +83,10 @@
                                      "Central sommartid", "CDT"};
         String CTT[] = new String[] {"Kina, normaltid", "CST",
                                      "Kina, sommartid", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
-        String DARWIN[] = new String[] {"Central Standard Time (Nordterritoriet)", "CST",
-                                        "Central Summer Time (Nordterritoriet)", "CST"};
+        String CUBA[] = new String[] {"Kuba, normaltid", "CST",
+                                      "Kuba, sommartid", "CDT"};
+        String DARWIN[] = new String[] {"Central normaltid (Nordterritoriet)", "CST",
+                                        "Central sommartid (Nordterritoriet)", "CST"};
         String DUBLIN[] = new String[] {"Greenwichtid", "GMT",
                                         "Irland, sommartid", "IST"};
         String EAT[] = new String[] {"\u00d6stafrikansk tid", "EAT",
@@ -99,8 +99,8 @@
                                      "\u00d6stgr\u00f6nl\u00e4ndsk sommartid", "EGST"};
         String EST[] = new String[] {"Eastern, normaltid", "EST",
                                      "Eastern, sommartid", "EDT"};
-        String EST_NSW[] = new String[] {"Eastern Standard Time (Nya Sydwales)", "EST",
-                                         "Eastern Summer Time (Nya Sydwales)", "EST"};
+        String EST_NSW[] = new String[] {"Eastern, normaltid (Nya Sydwales)", "EST",
+                                         "Eastern, sommartid (Nya Sydwales)", "EST"};
         String GHMT[] = new String[] {"Ghana, normaltid", "GMT",
                                       "Ghana, sommartid", "GHST"};
         String GAMBIER[] =  new String[] {"Gambier, normaltid", "GAMT",
@@ -163,34 +163,34 @@
                                      "Salomon\u00f6arna, sommartid", "SBST"};
         String SGT[] = new String[] {"Singapore, normaltid", "SGT",
                                      "Singapore, sommartid", "SGST"};
-        String SLST[] = new String[] {"Greenwich Mean Time", "GMT",
+        String SLST[] = new String[] {"Greenwichtid", "GMT",
                                       "Sierra Leone, sommartid", "SLST"};
-        String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmanien)", "EST",
-                                          "Eastern Summer Time (Tasmanien)", "EST"};
+        String TASMANIA[] = new String[] {"Eastern, normaltid (Tasmanien)", "EST",
+                                          "Eastern, sommartid (Tasmanien)", "EST"};
         String TMT[] = new String[] {"Turkmenistan, normaltid", "TMT",
                                      "Turkmenistan, sommartid", "TMST"};
         String TRUT[] = new String[] {"Truk, normaltid", "TRUT",
                                       "Truk, sommartid", "TRUST"};
         String ULAT[]= new String[] {"Ulaanbaatar, normaltid", "ULAT",
                                      "Ulaanbaatar, sommartid", "ULAST"};
-        String WART[] = new String[] {"Argentina, normaltid", "WART",
-                                      "Argentina, sommartid", "WARST"};
+        String WART[] = new String[] {"V\u00e4stargentina, normaltid", "WART",
+                                      "V\u00e4stargentina, sommartid", "WARST"};
         String WAT[] = new String[] {"V\u00e4stafrikansk tid", "WAT",
                                      "V\u00e4stafrikansk sommartid", "WAST"};
         String WET[] = new String[] {"V\u00e4steuropeisk tid", "WET",
                                      "V\u00e4steuropeisk sommartid", "WEST"};
         String WIT[] = new String[] {"V\u00e4stindonesisk tid", "WIT",
                                      "V\u00e4stindonesisk sommartid", "WIST"};
-        String WST_AUS[] = new String[] {"Western Standard Time (Australien)", "WST",
-                                         "Western Summer Time (Australien)", "WST"};
+        String WST_AUS[] = new String[] {"V\u00e4stlig normaltid (Australien)", "WST",
+                                         "V\u00e4stlig sommartid (Australien)", "WST"};
         String SAMOA[] = new String[] {"Samoa, normaltid", "SST",
                                        "Samoa, sommartid", "SDT"};
         String WST_SAMOA[] = new String[] {"V\u00e4stsamoansk tid", "WST",
                                            "V\u00e4stsamoansk sommartid", "WSST"};
         String ChST[] = new String[] {"Chamorro, normaltid", "ChST",
                                       "Chamorro, sommartid", "ChDT"};
-        String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST",
-                                          "Eastern Summer Time (Victoria)", "EST"};
+        String VICTORIA[] = new String[] {"\u00d6stlig normaltid (Victoria)", "EST",
+                                          "\u00d6stlig sommartid (Victoria)", "EST"};
         String UTC[] = new String[] {"Koordinerad universell tid", "UTC",
                                      "Koordinerad universell tid", "UTC"};
         String UZT[] = new String[] {"Uzbekistan, normaltid", "UZT",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"Central v\u00e4stlig normaltid (Australien)", "CWST",
+                                              "Central v\u00e4stlig sommartid (Australien)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "\u4e2d\u592e\u590f\u4ee4\u65f6", "CDT"};
         String CTT[] = new String[] {"\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4", "CST",
                                      "\u4e2d\u56fd\u590f\u4ee4\u65f6", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"\u53e4\u5df4\u6807\u51c6\u65f6\u95f4", "CST",
+                                      "\u53e4\u5df4\u590f\u4ee4\u65f6", "CDT"};
         String DARWIN[] = new String[] {"\u4e2d\u592e\u6807\u51c6\u65f6\u95f4\uff08\u5317\u9886\u5730\uff09", "CST",
                                         "\u4e2d\u592e\u590f\u4ee4\u65f6\uff08\u5317\u9886\u5730\uff09", "CST"};
         String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u65f6\u95f4", "GMT",
@@ -173,8 +173,8 @@
                                       "\u7279\u9c81\u514b\u590f\u4ee4\u65f6", "TRUST"};
         String ULAT[]= new String[] {"\u5e93\u4f26\u65f6\u95f4", "ULAT",
                                      "\u5e93\u4f26\u590f\u4ee4\u65f6", "ULAST"};
-        String WART[] = new String[] {"\u963f\u6839\u5ef7\u65f6\u95f4", "WART",
-                                      "\u963f\u6839\u5ef7\u590f\u4ee4\u65f6", "WARST"};
+        String WART[] = new String[] {"\u897f\u963f\u6839\u5ef7\u65f6\u95f4", "WART",
+                                      "\u897f\u963f\u6839\u5ef7\u590f\u4ee4\u65f6", "WARST"};
         String WAT[] = new String[] {"\u897f\u975e\u65f6\u95f4", "WAT",
                                      "\u897f\u975e\u590f\u4ee4\u65f6", "WAST"};
         String WET[] = new String[] {"\u897f\u6b27\u65f6\u95f4", "WET",
@@ -594,8 +594,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"\u4e2d\u897f\u90e8\u6807\u51c6\u65f6\u95f4\uff08\u6fb3\u5927\u5229\u4e9a\uff09", "CWST",
+                                              "\u4e2d\u897f\u90e8\u590f\u4ee4\u65f6\uff08\u6fb3\u5927\u5229\u4e9a\uff09", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java	Thu Jan 21 14:47:01 2010 -0800
@@ -83,8 +83,8 @@
                                      "\u4e2d\u592e\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"};
         String CTT[] = new String[] {"\u4e2d\u570b\u6a19\u6e96\u6642\u9593", "CST",
                                      "\u4e2d\u570b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"};
-        String CUBA[] = new String[] {"Cuba Standard Time", "CST",
-                                      "Cuba Daylight Time", "CDT"};
+        String CUBA[] = new String[] {"\u53e4\u5df4\u6a19\u6e96\u6642\u9593", "CST",
+                                      "\u53e4\u5df4\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"};
         String DARWIN[] = new String[] {"\u4e2d\u90e8\u6a19\u6e96\u6642\u9593 (\u5317\u90e8\u5404\u5730\u5340)", "CST",
                                         "\u4e2d\u90e8\u590f\u4ee4\u6642\u9593 (\u5317\u90e8\u5404\u5730\u5340)", "CST"};
         String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u5e73\u5747\u6642\u9593", "GMT",
@@ -173,8 +173,8 @@
                                       "\u7279\u9b6f\u514b\u590f\u4ee4\u6642\u9593", "TRUST"};
         String ULAT[]= new String[] {"\u5eab\u502b\u6642\u9593", "ULAT",
                                      "\u5eab\u502b\u590f\u4ee4\u6642\u9593", "ULAST"};
-          String WART[] = new String[] {"\u963f\u6839\u5ef7\u6642\u9593", "WART",
-                                      "\u963f\u6839\u5ef7\u590f\u4ee4\u6642\u9593", "WARST"};
+          String WART[] = new String[] {"\u897f\u963f\u6839\u5ef7\u6642\u9593", "WART",
+                                      "\u897f\u963f\u6839\u5ef7\u590f\u4ee4\u6642\u9593", "WARST"};
         String WAT[] = new String[] {"\u897f\u975e\u6642\u9593", "WAT",
                                      "\u897f\u975e\u590f\u4ee4\u6642\u9593", "WAST"};
         String WET[] = new String[] {"\u897f\u6b50\u6642\u9593", "WET",
@@ -551,7 +551,8 @@
             {"Asia/Samarkand", UZT},
             {"Asia/Seoul", KST},
             {"Asia/Singapore", SGT},
-            {"Asia/Taipei", CTT},
+            {"Asia/Taipei", new String[] {"\u53f0\u7063\u6a19\u6e96\u6642\u9593", "TST",
+                                          "\u53f0\u7063\u590f\u4ee4\u6642\u9593", "TDT"}},
             {"Asia/Tel_Aviv", ISRAEL},
             {"Asia/Tashkent", UZT},
             {"Asia/Tbilisi", new String[] {"\u55ac\u6cbb\u4e9e\u6642\u9593", "GET",
@@ -594,8 +595,8 @@
             {"Australia/Canberra", EST_NSW},
             {"Australia/Currie", EST_NSW},
             {"Australia/Darwin", DARWIN},
-            {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
-                                              "Central Western Summer Time (Australia)", "CWST"}},
+            {"Australia/Eucla", new String[] {"\u4e2d\u897f\u90e8\u6a19\u6e96\u6642\u9593 (\u6fb3\u5927\u5229\u4e9e)", "CWST",
+                                              "\u4e2d\u897f\u90e8\u65e5\u5149\u7bc0\u7d04\u6642\u9593 (\u6fb3\u5927\u5229\u4e9e)", "CWST"}},
             {"Australia/Hobart", TASMANIA},
             {"Australia/LHI", LORD_HOWE},
             {"Australia/Lindeman", BRISBANE},
--- a/jdk/src/share/native/java/util/zip/zlib-1.2.3/zutil.h	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/src/share/native/java/util/zip/zlib-1.2.3/zutil.h	Thu Jan 21 14:47:01 2010 -0800
@@ -220,7 +220,8 @@
 #  endif
 #  ifdef WIN32
      /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-#    if !defined(vsnprintf) && !defined(NO_vsnprintf)
+#    if !defined(vsnprintf) && !defined(NO_vsnprintf) && (!defined(_MSC_VER) || (_MSC_VER < 1500))
+       /* Only needed before Visual Studio 2008 */
 #      define vsnprintf _vsnprintf
 #    endif
 #  endif
--- a/jdk/test/ProblemList.txt	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/test/ProblemList.txt	Thu Jan 21 14:47:01 2010 -0800
@@ -571,6 +571,7 @@
 javax/print/attribute/GetCopiesSupported.java			generic-all
 javax/print/attribute/SidesPageRangesTest.java			generic-all
 javax/print/attribute/SupportedPrintableAreas.java		generic-all
+javax/print/attribute/AttributeTest.java                        generic-all
 
 # Only print test left, excluding just because all print tests have been
 javax/print/attribute/MediaMappingsTest.java 			generic-all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/DialogMargins.java	Thu Jan 21 14:47:01 2010 -0800
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2001-2010 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4485755 6361370 6448717 5080051
+ * @summary dialog doesn't have way to specify margins
+ *          for 6361370, verify exception for offline printer in Windows
+ *          for 6448717, faster display of print dialog
+ *          for 6500903, verify status of printer if accepting jobs or not
+ * @author prr
+ * @run main/manual DialogMargins
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.print.*;
+import javax.print.*;
+import javax.print.attribute.*;
+import javax.print.attribute.standard.*;
+
+public class DialogMargins extends Frame {
+
+  public DialogMargins() {
+     super("Dialog Margins Test");
+
+    Button printButton = new Button ("Print ...");
+    add("Center", printButton);
+    printButton.addActionListener(new ActionListener() {
+                public void actionPerformed (ActionEvent e) {
+                     new MarginsPrinter();
+                }
+    });
+
+    addWindowListener (new WindowAdapter() {
+         public void windowClosing (WindowEvent e) {
+            dispose();
+         }
+
+     });
+
+     pack();
+     setVisible (true);
+  }
+
+class MarginsPrinter implements Printable {
+
+  PrinterJob myPrinterJob;
+  PageFormat myPageFormat;
+
+  public MarginsPrinter() {
+      PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+      //aset.add(MediaSizeName.ISO_A4);
+      //aset.add(new MediaPrintableArea(0f,0f,210f,297f,MediaPrintableArea.MM));
+      myPrinterJob = PrinterJob.getPrinterJob();
+      myPageFormat = myPrinterJob.pageDialog(aset);
+      myPrinterJob.setPrintable(this, myPageFormat);
+      //myPrinterJob.setPrintable(this);
+      if (myPrinterJob.printDialog(aset)) {
+          try {
+             //PrintRequestAttributeSet newaset =
+                   //new HashPrintRequestAttributeSet();
+              myPrinterJob.print(aset);
+
+          } catch (PrinterException pe ) {
+              System.out.println("DialogMargins Exception caught:" + pe);
+          }
+      }
+   }
+
+  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
+
+     if (pageIndex > 0) {
+        return Printable.NO_SUCH_PAGE;
+     }
+
+     Graphics2D g2d = (Graphics2D)graphics;
+     g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
+     g2d.drawString("ORIGIN("+pageFormat.getImageableX()+","+
+                             pageFormat.getImageableY()+")", 20, 20);
+     g2d.drawString("X THIS WAY", 200, 50);
+     g2d.drawString("Y THIS WAY", 60 , 200);
+     g2d.drawString("Graphics is " + g2d.getClass().getName(), 100, 100);
+     g2d.drawRect(0,0,(int)pageFormat.getImageableWidth(),
+                      (int)pageFormat.getImageableHeight());
+     g2d.setColor(Color.black);
+     g2d.drawRect(1,1,(int)pageFormat.getImageableWidth()-2,
+                      (int)pageFormat.getImageableHeight()-2);
+
+     return  Printable.PAGE_EXISTS;
+  }
+
+}
+  public static void main( String[] args) {
+
+  String[] instructions =
+        {
+         "You must have a printer available to perform this test",
+         "Specify various pageformats and compare the printed results with the",
+         "request."
+       };
+      Sysout.createDialog( );
+      Sysout.printInstructions( instructions );
+
+     new DialogMargins();
+  }
+}
+
+
+class Sysout {
+   private static TestDialog dialog;
+
+   public static void createDialogWithInstructions( String[] instructions )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      dialog.printInstructions( instructions );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+
+   public static void createDialog( )
+    {
+      dialog = new TestDialog( new Frame(), "Instructions" );
+      String[] defInstr = { "Instructions will appear here. ", "" } ;
+      dialog.printInstructions( defInstr );
+      dialog.show();
+      println( "Any messages for the tester will display here." );
+    }
+
+
+   public static void printInstructions( String[] instructions )
+    {
+      dialog.printInstructions( instructions );
+    }
+
+
+   public static void println( String messageIn )
+    {
+      dialog.displayMessage( messageIn );
+    }
+
+}// Sysout  class
+
+/**
+  This is part of the standard test machinery.  It provides a place for the
+   test instructions to be displayed, and a place for interactive messages
+   to the user to be displayed.
+  To have the test instructions displayed, see Sysout.
+  To have a message to the user be displayed, see Sysout.
+  Do not call anything in this dialog directly.
+  */
+class TestDialog extends Dialog {
+
+   TextArea instructionsText;
+   TextArea messageText;
+   int maxStringLength = 80;
+
+   //DO NOT call this directly, go through Sysout
+   public TestDialog( Frame frame, String name )
+    {
+      super( frame, name );
+      int scrollBoth = TextArea.SCROLLBARS_BOTH;
+      instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+      add( "North", instructionsText );
+
+      messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+      add("Center", messageText);
+
+      pack();
+
+      show();
+    }// TestDialog()
+
+   //DO NOT call this directly, go through Sysout
+   public void printInstructions( String[] instructions )
+    {
+      //Clear out any current instructions
+      instructionsText.setText( "" );
+
+      //Go down array of instruction strings
+
+      String printStr, remainingStr;
+      for( int i=0; i < instructions.length; i++ )
+       {
+         //chop up each into pieces maxSringLength long
+         remainingStr = instructions[ i ];
+         while( remainingStr.length() > 0 )
+          {
+            //if longer than max then chop off first max chars to print
+            if( remainingStr.length() >= maxStringLength )
+             {
+               //Try to chop on a word boundary
+               int posOfSpace = remainingStr.
+                  lastIndexOf( ' ', maxStringLength - 1 );
+
+               if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+               printStr = remainingStr.substring( 0, posOfSpace + 1 );
+               remainingStr = remainingStr.substring( posOfSpace + 1 );
+             }
+            //else just print
+            else
+             {
+               printStr = remainingStr;
+               remainingStr = "";
+             }
+
+            instructionsText.append( printStr + "\n" );
+
+          }// while
+
+       }// for
+
+    }//printInstructions()
+
+   //DO NOT call this directly, go through Sysout
+   public void displayMessage( String messageIn )
+    {
+      messageText.append( messageIn + "\n" );
+    }
+
+ }// TestDialog  class
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/StreamPrintingOrientation.java	Thu Jan 21 14:47:01 2010 -0800
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2003-2010 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4904236
+ * @summary You would see a cross-platform print dialog being popped up. Check whether orientation is shown as LANDSCAPE. Click 'OK'. 'streamexample.ps' will be created in the same dir where this application was executed. Pass if the orientation in the ps file is landscape.
+ * @run main/manual StreamPrintingOrientation
+ */
+
+import java.awt.*;
+import java.awt.print.*;
+import javax.print.*;
+import javax.print.attribute.standard.*;
+import javax.print.attribute.*;
+import java.io.FileOutputStream;
+import java.io.File;
+import java.util.Locale;
+
+class StreamPrintingOrientation implements Printable {
+        /**
+         * Constructor
+         */
+         public StreamPrintingOrientation() {
+                super();
+        }
+        /**
+         * Starts the application.
+         */
+        public static void main(java.lang.String[] args) {
+                StreamPrintingOrientation pd = new StreamPrintingOrientation();
+                PrinterJob pj = PrinterJob.getPrinterJob();
+                HashPrintRequestAttributeSet prSet = new HashPrintRequestAttributeSet();
+                PrintService service = null;
+
+                FileOutputStream fos = null;
+                File f = null, f1 = null;
+                String mType = "application/postscript";
+
+                try {
+                        f = new File("streamexample.ps");
+                        fos = new FileOutputStream(f);
+                        StreamPrintServiceFactory[] factories = PrinterJob.lookupStreamPrintServices(mType);
+                        if (factories.length > 0)
+                                service = factories[0].getPrintService(fos);
+
+                        if (service != null) {
+                                System.out.println("Stream Print Service "+service);
+                                pj.setPrintService(service);
+                        } else {
+                                throw new RuntimeException("No stream Print Service available.");
+                        }
+                } catch (Exception e) {
+                        e.printStackTrace();
+                }
+
+                pj.setPrintable(pd);
+                prSet.add(OrientationRequested.LANDSCAPE);
+                prSet.add(new Copies(3));
+                prSet.add(new JobName("orientation test", null));
+                System.out.println("open PrintDialog..");
+                if (pj.printDialog(prSet)) {
+                        try {
+                                System.out.println("\nValues in attr set passed to print method");
+                                Attribute attr[] = prSet.toArray();
+                                for (int x = 0; x < attr.length; x ++) {
+                                        System.out.println("Name "+attr[x].getName()+"  "+attr[x]);
+                                }
+                                System.out.println("About to print the data ...");
+                                if (service != null) {
+                                        System.out.println("TEST: calling Print");
+                                        pj.print(prSet);
+                                        System.out.println("TEST: Printed");
+                                }
+                        }
+                        catch (PrinterException pe) {
+                                pe.printStackTrace();
+                        }
+                }
+
+        }
+
+        //printable interface
+        public int print(Graphics g, PageFormat pf, int pi) throws PrinterException {
+
+                if (pi > 0) {
+                        return Printable.NO_SUCH_PAGE;
+                }
+                // Simply draw two rectangles
+                Graphics2D g2 = (Graphics2D)g;
+                g2.setColor(Color.black);
+                g2.translate(pf.getImageableX(), pf.getImageableY());
+                System.out.println("StreamPrinting Test Width "+pf.getWidth()+" Height "+pf.getHeight());
+                g2.drawRect(1,1,200,300);
+                g2.drawRect(1,1,25,25);
+                return Printable.PAGE_EXISTS;
+        }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/attribute/AttributeTest.java	Thu Jan 21 14:47:01 2010 -0800
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2006-2010 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6387255
+ * @summary  Tests conflict of Media values returned by isAttrValueSupported and getSupportedAttrValues.  No runtime exception should be thrown.
+ * @run main AttributeTest
+ */
+import javax.print.*;
+import javax.print.attribute.standard.*;
+import javax.print.attribute.*;
+
+public class AttributeTest {
+
+        public AttributeTest() {
+
+                PrintService service[] = PrintServiceLookup.lookupPrintServices(null, null);
+
+                if (service.length == 0) {
+                        throw new RuntimeException("No printer found.  TEST ABORTED");
+                }
+
+                for (int x = 0; x < service.length; x ++) {
+                        DocFlavor flavors[] = service[x].getSupportedDocFlavors();
+
+                        for (int y = 0; y < flavors.length; y ++) {
+                                Object attrVal = service[x].getSupportedAttributeValues(Media.class, flavors[y], null);
+                                if (attrVal == null) {
+                                        continue;
+                                }
+                                Media attr[] = (Media[]) attrVal;
+                                for (int z = 0; z < attr.length; z ++) {
+                                        if (!service[x].isAttributeValueSupported(attr[z], flavors[y], null)) {
+                                                throw new RuntimeException("ERROR: There is a conflict between getSupportedAttrValues " +
+                                                " and isAttributeValueSupported, for the attribute: " + attr[z] +
+                                                ", where the flavor is: " + flavors[y] + " and the print service is: " +
+                                                service[x] + "\n");
+                                        }
+                                }
+                        }
+                }
+
+                System.out.println("Test Passed");
+        }
+
+        public static void main (String args[]) {
+                AttributeTest test = new AttributeTest();
+        }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/attribute/ServiceDialogTest.java	Thu Jan 21 14:47:01 2010 -0800
@@ -0,0 +1,307 @@
+/*
+ * Copyright 2004-2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+
+/**
+ * @test
+ * @bug 4910388 4871089 4998624
+ * @summary Confirm that
+ *      1. After choosing Reverse Landscape in the system default print
+ *       Print Service (2nd in the list), it
+ *          will reset to portrait in "Test Printer"
+ *      2. Print To File button is not cleared when switching between the
+ *         2nd service (system default printer) and Test Printer.
+ *      3. Make sure "Postscript" printer is the default and make sure the
+ *         "print to file" button is disabled.  File Dialog should not be
+ *         shown after pressing print button.
+ *
+ * @run main/manual ServiceDialogTest
+ */
+import java.awt.*;
+import javax.print.*;
+import javax.print.attribute.standard.*;
+import javax.print.attribute.*;
+import javax.print.event.*;
+import java.io.*;
+import java.util.Locale;
+
+public class ServiceDialogTest {
+        /**
+         * Constructor
+         */
+         public ServiceDialogTest() {
+                super();
+        }
+        /**
+         * Starts the application.
+         */
+        public static void main(java.lang.String[] args) {
+                ServiceDialogTest pd = new ServiceDialogTest();
+                PrintService services[] = new PrintService[3];
+                services[1] = PrintServiceLookup.lookupDefaultPrintService();
+
+                FileOutputStream fos = null;
+                File f = null;
+                String mType = "application/postscript";
+                DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
+                try {
+                        f = new File("streamexample.ps");
+                        fos = new FileOutputStream(f);
+                        StreamPrintServiceFactory[] factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor, mType);
+                        if (factories.length > 0) {
+                                services[0] = factories[0].getPrintService(fos);
+                        } else {
+                                throw new RuntimeException("No StreamPrintService available which would support "+flavor");
+                        }
+
+                        services[2] = new TestPrintService("Test Printer");
+
+            //System.out.println("is "+flavor+" supported? "+services[0].isDocFlavorSupported(flavor));
+            //System.out.println("is Orientation supported? "+services[0].isAttributeCategorySupported(OrientationRequested.class));
+            //System.out.println("is REVERSE PORTRAIT supported ? "+services[0].isAttributeValueSupported(OrientationRequested.REVERSE_PORTRAIT, flavor, null));
+
+            HashPrintRequestAttributeSet prSet = new HashPrintRequestAttributeSet();
+            prSet.add(new Destination(new File("./dest.prn").toURI()));
+            PrintService selService = ServiceUI.printDialog(null, 200, 200, services, services[0], flavor, prSet);
+                        Attribute attr[] = prSet.toArray();
+                        for (int x = 0; x < attr.length; x ++) {
+                                System.out.println(attr[x]);
+                        }
+
+                        //DocPrintJob pj = service.createPrintJob();
+                        //PrintDocument prDoc = new PrintDocument();
+                        //pj.print(prDoc, null);
+
+                } catch (Exception e) {
+                        e.printStackTrace();
+                }
+        }
+}
+
+
+class TestPrintService implements PrintService
+{
+
+    private static DocFlavor textByteFlavor = null;
+    private static final DocFlavor supportedDocFlavors[] = (new DocFlavor[] {
+             javax.print.DocFlavor.INPUT_STREAM.JPEG
+    });
+
+    private static final Class serviceAttrCats[] = (new Class[] {
+             javax.print.attribute.standard.PrinterName.class
+    });
+
+    private static final Class otherAttrCats[] = (new Class [] {
+             javax.print.attribute.standard.Copies.class,
+             javax.print.attribute.standard.OrientationRequested.class,
+             javax.print.attribute.standard.Destination.class,
+    });
+
+    private String printer = null;
+
+    public TestPrintService() {
+    }
+
+    public TestPrintService(String printerName) {
+        if (printerName == null) {
+            throw new IllegalArgumentException("null printer name");
+        } else {
+            printer = printerName;
+        }
+    }
+
+    public String getName()
+    {
+        return printer;
+    }
+
+
+    public DocPrintJob createPrintJob()
+    {
+        return  null;
+    }
+
+    public PrintServiceAttributeSet getUpdatedAttributes()
+    {
+        return null;
+    }
+
+
+    public void addPrintServiceAttributeListener(PrintServiceAttributeListener printserviceattributelistener)
+    {
+    }
+
+    public void removePrintServiceAttributeListener(PrintServiceAttributeListener printserviceattributelistener)
+    {
+    }
+
+    public PrintServiceAttribute getAttribute(Class category)
+    {
+        return null;
+    }
+
+    public PrintServiceAttributeSet getAttributes()
+    {
+        HashPrintServiceAttributeSet aSet = new HashPrintServiceAttributeSet();
+            return aSet;
+    }
+
+    public DocFlavor[] getSupportedDocFlavors()
+    {
+        int i = supportedDocFlavors.length;
+        DocFlavor adocflavor[] = new DocFlavor[i];
+        System.arraycopy(supportedDocFlavors, 0, adocflavor, 0, i);
+        return adocflavor;
+    }
+
+    public boolean isDocFlavorSupported(DocFlavor docflavor)
+    {
+        for (int i = 0; i < supportedDocFlavors.length; i++) {
+            if (docflavor.equals(supportedDocFlavors[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public Class[] getSupportedAttributeCategories()
+    {
+        int i = otherAttrCats.length;
+        Class aclass[] = new Class[i];
+        System.arraycopy(otherAttrCats, 0, aclass, 0, otherAttrCats.length);
+        return aclass;
+    }
+
+    public boolean isAttributeCategorySupported(Class category)
+    {
+        if (category == null) {
+            throw new NullPointerException("null category");
+        }
+
+        for (int i = 0; i < otherAttrCats.length; i++) {
+            if (category == otherAttrCats[i]) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean isAttributeValueSupported(Attribute attrval, DocFlavor flavor, AttributeSet attributes) {
+
+        if (attrval == OrientationRequested.PORTRAIT)
+                return true;
+        else if (attrval == OrientationRequested.LANDSCAPE)
+                return true;
+                else
+                        return false;
+    }
+
+    public Object getDefaultAttributeValue(Class category)
+    {
+        if (category == null) {
+            throw new NullPointerException("null category");
+        }
+        if (category == javax.print.attribute.standard.Copies.class)
+                return new Copies(1);
+
+        if (category == javax.print.attribute.standard.OrientationRequested.class)
+                return OrientationRequested.PORTRAIT;
+
+        return null;
+    }
+
+    public Object getSupportedAttributeValues(Class category, DocFlavor docflavor, AttributeSet attributeset)
+    {
+        if (category == null) {
+            throw new NullPointerException("null category");
+        }
+
+        if (docflavor != null) {
+            if (!isDocFlavorSupported(docflavor)) {
+                throw new IllegalArgumentException(docflavor + " is an unsupported flavor");
+            }
+        }
+        if (!isAttributeCategorySupported(category)) {
+            return null;
+        }
+        if (category == javax.print.attribute.standard.Copies.class ) {
+               return new CopiesSupported(1, 5);
+        }
+        if (category == javax.print.attribute.standard.OrientationRequested.class ) {
+               OrientationRequested req[] = { OrientationRequested.PORTRAIT, OrientationRequested.LANDSCAPE };
+               return req;
+        }
+
+        return null;
+    }
+
+    public AttributeSet getUnsupportedAttributes(DocFlavor docflavor, AttributeSet attributeset) {
+
+        if (docflavor != null && !isDocFlavorSupported(docflavor)) {
+            throw new IllegalArgumentException("flavor " + docflavor + "is not supported");
+        }
+        if (attributeset == null) {
+            return null;
+        }
+
+        HashAttributeSet hashattributeset = new HashAttributeSet();
+        Attribute attributearray[] = attributeset.toArray();
+        for (int i = 0; i < attributearray.length; i++) {
+            try {
+                Attribute attribute = attributearray[i];
+                if (!isAttributeCategorySupported(attribute.getCategory())) {
+                     hashattributeset.add(attribute);
+                } else {
+                  if (!isAttributeValueSupported(attribute, docflavor, attributeset)) {
+                     hashattributeset.add(attribute);
+                  }
+                }
+            }
+            catch (ClassCastException classcastexception) {
+
+            }
+        }
+
+        if (hashattributeset.isEmpty()) {
+            return null;
+        }
+        return hashattributeset;
+    }
+
+    public ServiceUIFactory getServiceUIFactory() {
+        return null;
+    }
+
+    public String toString() {
+        return "Printer : " + getName();
+    }
+
+    public boolean equals(Object obj) {
+        return obj == this || (obj instanceof TestPrintService) && ((TestPrintService)obj).getName().equals(getName());
+    }
+
+    public int hashCode() {
+        return getClass().hashCode() + getName().hashCode();
+    }
+
+}
--- a/jdk/test/javax/print/attribute/SidesPageRangesTest.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/test/javax/print/attribute/SidesPageRangesTest.java	Thu Jan 21 14:47:01 2010 -0800
@@ -64,7 +64,7 @@
                         System.out.println("\nPageRanges Attribute category is supported");
                 } else {
                         System.out.println("\nPageRanges Attribute category is not supported. terminating...");
-                        System.exit(1);
+                        return;
                 }
 
                 flavors = defService.getSupportedDocFlavors();
--- a/jdk/test/sun/text/resources/LocaleData	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/test/sun/text/resources/LocaleData	Thu Jan 21 14:47:01 2010 -0800
@@ -673,8 +673,8 @@
 FormatData/es_VE/NumberElements/1=.
 FormatData/es_VE/NumberElements/2=;
 
-# bug #4099810, 4290801
-CurrencyNames/uk_UA/UAH=\u0433\u0440\u0432.
+# bug #4099810, 4290801, 6868106
+CurrencyNames/uk_UA/UAH=\u0433\u0440\u043b.
 FormatData/uk_UA/NumberPatterns/0=#,##0.###;-#,##0.###
 # FormatData/uk_UA/NumberPatterns/1=#,##0.## '\u0433\u0440\u0432.';-#,##0.## '\u0433\u0440\u0432.' # Changed; see bug 4122840
 FormatData/uk_UA/NumberPatterns/2=#,##0%
@@ -5526,3 +5526,575 @@
 # BL, MF (6627549)
 LocaleNames//BL=Saint Barth\u00e9lemy
 LocaleNames//MF=Saint Martin
+
+# bug 6609737
+FormatData/de/DateTimePatterns/0=HH:mm' Uhr 'z
+TimeZoneNames/de/CET/1=Mitteleurop\u00e4ische Zeit
+TimeZoneNames/de/CET/2=MEZ
+TimeZoneNames/de/CET/3=Mitteleurop\u00e4ische Sommerzeit
+TimeZoneNames/de/CET/4=MESZ
+TimeZoneNames/de/EET/2=OEZ
+TimeZoneNames/de/EET/4=OESZ
+TimeZoneNames/de/WET/2=WEZ
+TimeZoneNames/de/WET/4=WESZ
+
+# bug 6610748
+FormatData/fi/AmPmMarkers/0=ap.
+FormatData/fi/AmPmMarkers/1=ip.
+
+# bug 6507067 
+TimeZoneNames/zh_TW/Asia\/Taipei/1=\u53f0\u7063\u6a19\u6e96\u6642\u9593
+TimeZoneNames/zh_TW/Asia\/Taipei/2=TST
+
+# bug 6645271
+FormatData/hr_HR/DateTimePatterns/6=dd.MM.yyyy.
+FormatData/hr_HR/DateTimePatterns/7=dd.MM.yy.
+
+# bug 6873931
+CurrencyNames/tr_TR/TRY=TL
+
+#bug 6450945
+CalendarData/ro/firstDayOfWeek=2
+CalendarData/ro/minimalDaysInFirstWeek=1
+FormatData/ro/DayNames/6=s\u00e2mb\u0103t\u0103
+
+#bug 6645268
+LocaleNames/fi/fr=ranska
+LocaleNames/fi/FR=Ranska
+LocaleNames/fi_FI/fr=ranska
+LocaleNames/fi_FI/FR=Ranska
+
+# bug 6646611, 6914413
+FormatData/be_BY/MonthNames/10=\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430
+FormatData/be_BY/MonthAbbreviations/10=\u043b\u0456\u0441
+
+# bug 6645405
+FormatData/hu_HU/NumberPatterns/1=#,##0.## \u00A4;-#,##0.## \u00A4
+
+# bug 6650730
+FormatData/lt/NumberElements/1=\u00a0
+FormatData/lt/DateTimePatterns/6=yyyy-MM-dd
+
+#bug 6910489
+CalendarData/sl/firstDayOfWeek=2
+
+# bug 6573250
+CurrencyNames/en_CA/USD=US$
+
+# bug 6870908
+FormatData/et/MonthNames/0=jaanuar
+FormatData/et/MonthNames/1=veebruar
+FormatData/et/MonthNames/2=m\u00e4rts
+FormatData/et/MonthNames/3=aprill
+FormatData/et/MonthNames/4=mai
+FormatData/et/MonthNames/5=juuni
+FormatData/et/MonthNames/6=juuli
+FormatData/et/MonthNames/7=august
+FormatData/et/MonthNames/8=september
+FormatData/et/MonthNames/9=oktoober
+FormatData/et/MonthNames/10=november
+FormatData/et/MonthNames/11=detsember
+FormatData/et/MonthAbbreviations/0=jaan
+FormatData/et/MonthAbbreviations/1=veebr
+FormatData/et/MonthAbbreviations/2=m\u00e4rts
+FormatData/et/MonthAbbreviations/3=apr
+FormatData/et/MonthAbbreviations/4=mai
+FormatData/et/MonthAbbreviations/5=juuni
+FormatData/et/MonthAbbreviations/6=juuli
+FormatData/et/MonthAbbreviations/7=aug
+FormatData/et/MonthAbbreviations/8=sept
+FormatData/et/MonthAbbreviations/9=okt
+FormatData/et/MonthAbbreviations/10=nov
+FormatData/et/MonthAbbreviations/11=dets
+
+# bug 6585666
+LocaleNames/es/aa=afar
+LocaleNames/es/av=avar
+LocaleNames/es/az=azer\u00ed
+LocaleNames/es/ba=bashkir
+LocaleNames/es/bh=bihari
+LocaleNames/es/bn=bengal\u00ed
+LocaleNames/es/cu=eslavo eclesi\u00e1stico
+LocaleNames/es/dz=dzongkha
+LocaleNames/es/eu=vasco
+LocaleNames/es/fa=persa
+LocaleNames/es/ff=fula
+LocaleNames/es/fj=fidjiano
+LocaleNames/es/fo=fero\u00e9s
+LocaleNames/es/fy=fris\u00f3n
+LocaleNames/es/gu=gujarati
+LocaleNames/es/gv=ga\u00e9lico man\u00e9s
+LocaleNames/es/hi=hindi
+LocaleNames/es/ho=hiri motu
+LocaleNames/es/ie=interlingue
+LocaleNames/es/ig=igbo
+LocaleNames/es/ii=sichuan yi
+LocaleNames/es/ik=inupiaq
+LocaleNames/es/kg=kongo
+LocaleNames/es/ki=kikuyu
+LocaleNames/es/kj=kuanyama
+LocaleNames/es/kk=kazajo
+LocaleNames/es/km=jemer
+LocaleNames/es/kn=canar\u00e9s
+LocaleNames/es/ks=cachemiro
+LocaleNames/es/ku=kurdo
+LocaleNames/es/ky=kirghiz
+LocaleNames/es/lu=luba-katanga
+LocaleNames/es/mr=marathi
+LocaleNames/es/nb=bokmal noruego
+LocaleNames/es/nd=ndebele septentrional
+LocaleNames/es/nn=nynorsk noruego
+LocaleNames/es/nr=ndebele meridional
+LocaleNames/es/os=os\u00e9tico
+LocaleNames/es/rm=retorrom\u00e1nico
+LocaleNames/es/rn=kiroundi
+LocaleNames/es/rw=kinyarwanda
+LocaleNames/es/sd=sindhi
+LocaleNames/es/se=sami septentrional
+LocaleNames/es/sl=esloveno
+LocaleNames/es/sn=shona
+LocaleNames/es/ss=siswati
+LocaleNames/es/st=sesotho
+LocaleNames/es/su=sundan\u00e9s
+LocaleNames/es/sw=swahili
+LocaleNames/es/tg=tayiko
+LocaleNames/es/ti=tigri\u00f1a
+LocaleNames/es/tn=setchwana
+LocaleNames/es/to=tongano
+LocaleNames/es/tw=twi
+LocaleNames/es/ty=tahitiano
+LocaleNames/es/ug=uigur
+LocaleNames/es/uk=ucraniano
+LocaleNames/es/uz=uzbeko
+LocaleNames/es/vo=volap\u00fck
+LocaleNames/es/za=zhuang
+
+# bug 6716626 - language
+LocaleNames/nl/aa=Afar
+LocaleNames/nl/ab=Abchazisch
+LocaleNames/nl/ae=Avestisch
+LocaleNames/nl/af=Afrikaans
+LocaleNames/nl/ak=Akan
+LocaleNames/nl/am=Amhaars
+LocaleNames/nl/an=Aragonees
+LocaleNames/nl/ar=Arabisch
+LocaleNames/nl/as=Assamees
+LocaleNames/nl/av=Avarisch
+LocaleNames/nl/ay=Aymara
+LocaleNames/nl/az=Azerbeidzjaans
+LocaleNames/nl/ba=Basjkiers
+LocaleNames/nl/be=Wit-Russisch
+LocaleNames/nl/bg=Bulgaars
+LocaleNames/nl/bh=Bihari
+LocaleNames/nl/bi=Bislama
+LocaleNames/nl/bm=Bambara
+LocaleNames/nl/bn=Bengalees
+LocaleNames/nl/bo=Tibetaans
+LocaleNames/nl/br=Bretons
+LocaleNames/nl/bs=Bosnisch
+LocaleNames/nl/ca=Catalaans
+LocaleNames/nl/ce=Chechen
+LocaleNames/nl/ch=Chamorro
+LocaleNames/nl/co=Corsicaans
+LocaleNames/nl/cr=Cree
+LocaleNames/nl/cs=Tsjechisch
+LocaleNames/nl/cu=Kerkslavisch
+LocaleNames/nl/cv=Tsjoevasjisch
+LocaleNames/nl/cy=Welsh
+LocaleNames/nl/da=Deens
+LocaleNames/nl/de=Duits
+LocaleNames/nl/dv=Divehi
+LocaleNames/nl/dz=Dzongkha
+LocaleNames/nl/ee=Ewe
+LocaleNames/nl/el=Grieks
+LocaleNames/nl/en=Engels
+LocaleNames/nl/eo=Esperanto
+LocaleNames/nl/es=Spaans
+LocaleNames/nl/et=Estlands
+LocaleNames/nl/eu=Baskisch
+LocaleNames/nl/fa=Perzisch
+LocaleNames/nl/ff=Fulah
+LocaleNames/nl/fi=Fins
+LocaleNames/nl/fj=Fijisch
+LocaleNames/nl/fo=Faer\u00f6ers
+LocaleNames/nl/fr=Frans
+LocaleNames/nl/fy=Fries
+LocaleNames/nl/ga=Iers
+LocaleNames/nl/gd=Schots Gaelic
+LocaleNames/nl/gl=Galicisch
+LocaleNames/nl/gn=Guarani
+LocaleNames/nl/gu=Gujarati
+LocaleNames/nl/gv=Manx
+LocaleNames/nl/ha=Hausa
+LocaleNames/nl/he=Hebreeuws
+LocaleNames/nl/hi=Hindi
+LocaleNames/nl/ho=Hiri Motu
+LocaleNames/nl/hr=Kroatisch
+LocaleNames/nl/ht=Ha\u00eftiaans
+LocaleNames/nl/hu=Hongaars
+LocaleNames/nl/hy=Armeens
+LocaleNames/nl/hz=Herero
+LocaleNames/nl/ia=Interlingua
+LocaleNames/nl/id=Indonesisch
+LocaleNames/nl/ie=Interlingue
+LocaleNames/nl/ig=Igbo
+LocaleNames/nl/ii=Sichuan Yi
+LocaleNames/nl/ik=Inupiaq
+LocaleNames/nl/io=Ido
+LocaleNames/nl/is=IJslands
+LocaleNames/nl/it=Italiaans
+LocaleNames/nl/iu=Inuktitut
+LocaleNames/nl/ja=Japans
+LocaleNames/nl/jv=Javaans
+LocaleNames/nl/ka=Georgisch
+LocaleNames/nl/kg=Kongo
+LocaleNames/nl/ki=Kikuyu
+LocaleNames/nl/kj=Kuanyama
+LocaleNames/nl/kk=Kazachs
+LocaleNames/nl/kl=Kalaallisut
+LocaleNames/nl/km=Khmer
+LocaleNames/nl/kn=Kannada
+LocaleNames/nl/ko=Koreaans
+LocaleNames/nl/kr=Kanuri
+LocaleNames/nl/ks=Kashmiri
+LocaleNames/nl/ku=Koerdisch
+LocaleNames/nl/kv=Komi
+LocaleNames/nl/kw=Cornish
+LocaleNames/nl/ky=Kirgizisch
+LocaleNames/nl/la=Latijn
+LocaleNames/nl/lb=Luxemburgs
+LocaleNames/nl/lg=Ganda
+LocaleNames/nl/li=Limburgs
+LocaleNames/nl/ln=Lingala
+LocaleNames/nl/lo=Lao
+LocaleNames/nl/lt=Litouws
+LocaleNames/nl/lu=Luba-Katanga
+LocaleNames/nl/lv=Letlands
+LocaleNames/nl/mg=Malagasisch
+LocaleNames/nl/mh=Marshallees
+LocaleNames/nl/mi=Maori
+LocaleNames/nl/mk=Macedonisch
+LocaleNames/nl/ml=Malayalam
+LocaleNames/nl/mn=Mongools
+LocaleNames/nl/mo=Moldavisch
+LocaleNames/nl/mr=Marathi
+LocaleNames/nl/ms=Maleis
+LocaleNames/nl/mt=Maltees
+LocaleNames/nl/my=Birmees
+LocaleNames/nl/na=Nauru
+LocaleNames/nl/nb=Noors - Bokm\u00e5l
+LocaleNames/nl/nd=Noord-Ndbele
+LocaleNames/nl/ne=Nepalees
+LocaleNames/nl/ng=Ndonga
+LocaleNames/nl/nl=Nederlands
+LocaleNames/nl/nn=Noors - Nynorsk
+LocaleNames/nl/no=Noors
+LocaleNames/nl/nr=Zuid-Ndbele
+LocaleNames/nl/nv=Navajo
+LocaleNames/nl/ny=Nyanja
+LocaleNames/nl/oc=Occitaans
+LocaleNames/nl/oj=Ojibwa
+LocaleNames/nl/om=Oromo
+LocaleNames/nl/or=Oriya
+LocaleNames/nl/os=Ossetisch
+LocaleNames/nl/pa=Punjabi
+LocaleNames/nl/pi=Pali
+LocaleNames/nl/pl=Pools
+LocaleNames/nl/ps=Pasjtoe
+LocaleNames/nl/pt=Portugees
+LocaleNames/nl/qu=Quechua
+LocaleNames/nl/rm=Reto-Romaans
+LocaleNames/nl/rn=Rundi
+LocaleNames/nl/ro=Roemeens
+LocaleNames/nl/ru=Russisch
+LocaleNames/nl/rw=Kinyarwanda
+LocaleNames/nl/sa=Sanskriet
+LocaleNames/nl/sc=Sardinisch
+LocaleNames/nl/sd=Sindhi
+LocaleNames/nl/se=Noord-Samisch
+LocaleNames/nl/sg=Sango
+LocaleNames/nl/si=Singalees
+LocaleNames/nl/sk=Slowaaks
+LocaleNames/nl/sl=Sloveens
+LocaleNames/nl/sm=Samoaans
+LocaleNames/nl/sn=Shona
+LocaleNames/nl/so=Somalisch
+LocaleNames/nl/sq=Albanees
+LocaleNames/nl/sr=Servisch
+LocaleNames/nl/ss=Swati
+LocaleNames/nl/st=Zuid-Sotho
+LocaleNames/nl/su=Soendanees
+LocaleNames/nl/sv=Zweeds
+LocaleNames/nl/sw=Swahili
+LocaleNames/nl/ta=Tamil
+LocaleNames/nl/te=Teloegoe
+LocaleNames/nl/tg=Tadzjieks
+LocaleNames/nl/th=Thais
+LocaleNames/nl/ti=Tigrinya
+LocaleNames/nl/tk=Turkmeens
+LocaleNames/nl/tl=Tagalog
+LocaleNames/nl/tn=Tswana
+LocaleNames/nl/to=Tonga
+LocaleNames/nl/tr=Turks
+LocaleNames/nl/ts=Tsonga
+LocaleNames/nl/tt=Tataars
+LocaleNames/nl/tw=Twi
+LocaleNames/nl/ty=Tahitisch
+LocaleNames/nl/ug=Oeigoers
+LocaleNames/nl/uk=Oekra\u00efens
+LocaleNames/nl/ur=Urdu
+LocaleNames/nl/uz=Oezbeeks
+LocaleNames/nl/ve=Venda
+LocaleNames/nl/vi=Vietnamees
+LocaleNames/nl/vo=Volap\u00fck
+LocaleNames/nl/wa=Wallonisch
+LocaleNames/nl/wo=Wolof
+LocaleNames/nl/xh=Xhosa
+LocaleNames/nl/yi=Jiddisch
+LocaleNames/nl/yo=Yoruba
+LocaleNames/nl/za=Zhuang
+LocaleNames/nl/zh=Chinees
+LocaleNames/nl/zu=Zulu
+
+# bug 6716626 - country
+LocaleNames/nl/AD=Andorra
+LocaleNames/nl/AE=Verenigde Arabische Emiraten
+LocaleNames/nl/AF=Afghanistan
+LocaleNames/nl/AG=Antigua en Barbuda
+LocaleNames/nl/AI=Anguilla
+LocaleNames/nl/AL=Albani\u00eb
+LocaleNames/nl/AM=Armeni\u00eb
+LocaleNames/nl/AN=Nederlandse Antillen
+LocaleNames/nl/AO=Angola
+LocaleNames/nl/AQ=Antarctica
+LocaleNames/nl/AR=Argentini\u00eb
+LocaleNames/nl/AS=Amerikaans Samoa
+LocaleNames/nl/AT=Oostenrijk
+LocaleNames/nl/AU=Australi\u00eb
+LocaleNames/nl/AW=Aruba
+LocaleNames/nl/AX=Alandeilanden
+LocaleNames/nl/AZ=Azerbeidzjan
+LocaleNames/nl/BA=Bosni\u00eb en Herzegovina
+LocaleNames/nl/BB=Barbados
+LocaleNames/nl/BD=Bangladesh
+LocaleNames/nl/BE=Belgi\u00eb
+LocaleNames/nl/BF=Burkina Faso
+LocaleNames/nl/BG=Bulgarije
+LocaleNames/nl/BH=Bahrein
+LocaleNames/nl/BI=Burundi
+LocaleNames/nl/BJ=Benin
+LocaleNames/nl/BM=Bermuda
+LocaleNames/nl/BN=Brunei
+LocaleNames/nl/BO=Bolivia
+LocaleNames/nl/BR=Brazili\u00eb
+LocaleNames/nl/BS=Bahama\u2019s
+LocaleNames/nl/BT=Bhutan
+LocaleNames/nl/BV=Bouveteiland
+LocaleNames/nl/BW=Botswana
+LocaleNames/nl/BY=Wit-Rusland
+LocaleNames/nl/BZ=Belize
+LocaleNames/nl/CA=Canada
+LocaleNames/nl/CC=Cocoseilanden
+LocaleNames/nl/CD=Congo-Kinshasa
+LocaleNames/nl/CF=Centraal-Afrikaanse Republiek
+LocaleNames/nl/CG=Congo
+LocaleNames/nl/CH=Zwitserland
+LocaleNames/nl/CI=Ivoorkust
+LocaleNames/nl/CK=Cookeilanden
+LocaleNames/nl/CL=Chili
+LocaleNames/nl/CM=Kameroen
+LocaleNames/nl/CN=China
+LocaleNames/nl/CO=Colombia
+LocaleNames/nl/CR=Costa Rica
+LocaleNames/nl/CS=Servi\u00eb en Montenegro
+LocaleNames/nl/CU=Cuba
+LocaleNames/nl/CV=Kaapverdi\u00eb
+LocaleNames/nl/CX=Christmaseiland
+LocaleNames/nl/CY=Cyprus
+LocaleNames/nl/CZ=Tsjechi\u00eb
+LocaleNames/nl/DE=Duitsland
+LocaleNames/nl/DJ=Djibouti
+LocaleNames/nl/DK=Denemarken
+LocaleNames/nl/DM=Dominica
+LocaleNames/nl/DO=Dominicaanse Republiek
+LocaleNames/nl/DZ=Algerije
+LocaleNames/nl/EC=Ecuador
+LocaleNames/nl/EE=Estland
+LocaleNames/nl/EG=Egypte
+LocaleNames/nl/EH=Westelijke Sahara
+LocaleNames/nl/ER=Eritrea
+LocaleNames/nl/ES=Spanje
+LocaleNames/nl/ET=Ethiopi\u00eb
+LocaleNames/nl/FI=Finland
+LocaleNames/nl/FJ=Fiji
+LocaleNames/nl/FK=Falklandeilanden
+LocaleNames/nl/FM=Micronesi\u00eb
+LocaleNames/nl/FO=Faer\u00f6er
+LocaleNames/nl/FR=Frankrijk
+LocaleNames/nl/GA=Gabon
+LocaleNames/nl/GB=Verenigd Koninkrijk
+LocaleNames/nl/GD=Grenada
+LocaleNames/nl/GE=Georgi\u00eb
+LocaleNames/nl/GF=Frans-Guyana
+LocaleNames/nl/GH=Ghana
+LocaleNames/nl/GI=Gibraltar
+LocaleNames/nl/GL=Groenland
+LocaleNames/nl/GM=Gambia
+LocaleNames/nl/GN=Guinee
+LocaleNames/nl/GP=Guadeloupe
+LocaleNames/nl/GQ=Equatoriaal-Guinea
+LocaleNames/nl/GR=Griekenland
+LocaleNames/nl/GS=Zuid-Georgi\u00eb en Zuidelijke Sandwicheilanden
+LocaleNames/nl/GT=Guatemala
+LocaleNames/nl/GU=Guam
+LocaleNames/nl/GW=Guinee-Bissau
+LocaleNames/nl/GY=Guyana
+LocaleNames/nl/HK=Hongkong SAR van China
+LocaleNames/nl/HM=Heard- en McDonaldeilanden
+LocaleNames/nl/HN=Honduras
+LocaleNames/nl/HR=Kroati\u00eb
+LocaleNames/nl/HT=Ha\u00efti
+LocaleNames/nl/HU=Hongarije
+LocaleNames/nl/ID=Indonesi\u00eb
+LocaleNames/nl/IE=Ierland
+LocaleNames/nl/IL=Isra\u00ebl
+LocaleNames/nl/IN=India
+LocaleNames/nl/IO=Britse Gebieden in de Indische Oceaan
+LocaleNames/nl/IQ=Irak
+LocaleNames/nl/IR=Iran
+LocaleNames/nl/IS=IJsland
+LocaleNames/nl/IT=Itali\u00eb
+LocaleNames/nl/JM=Jamaica
+LocaleNames/nl/JO=Jordani\u00eb
+LocaleNames/nl/JP=Japan
+LocaleNames/nl/KE=Kenia
+LocaleNames/nl/KG=Kirgizi\u00eb
+LocaleNames/nl/KH=Cambodja
+LocaleNames/nl/KI=Kiribati
+LocaleNames/nl/KM=Comoren
+LocaleNames/nl/KN=Saint Kitts en Nevis
+LocaleNames/nl/KP=Noord-Korea
+LocaleNames/nl/KR=Zuid-Korea
+LocaleNames/nl/KW=Koeweit
+LocaleNames/nl/KY=Caymaneilanden
+LocaleNames/nl/KZ=Kazachstan
+LocaleNames/nl/LA=Laos
+LocaleNames/nl/LB=Libanon
+LocaleNames/nl/LC=Saint Lucia
+LocaleNames/nl/LI=Liechtenstein
+LocaleNames/nl/LK=Sri Lanka
+LocaleNames/nl/LR=Liberia
+LocaleNames/nl/LS=Lesotho
+LocaleNames/nl/LT=Litouwen
+LocaleNames/nl/LU=Luxemburg
+LocaleNames/nl/LV=Letland
+LocaleNames/nl/LY=Libi\u00eb
+LocaleNames/nl/MA=Marokko
+LocaleNames/nl/MC=Monaco
+LocaleNames/nl/MD=Moldavi\u00eb
+LocaleNames/nl/ME=Montenegro
+LocaleNames/nl/MG=Madagaskar
+LocaleNames/nl/MH=Marshalleilanden
+LocaleNames/nl/MK=Macedoni\u00eb
+LocaleNames/nl/ML=Mali
+LocaleNames/nl/MM=Myanmar
+LocaleNames/nl/MN=Mongoli\u00eb
+LocaleNames/nl/MO=Macao SAR van China
+LocaleNames/nl/MP=Noordelijke Marianeneilanden
+LocaleNames/nl/MQ=Martinique
+LocaleNames/nl/MR=Mauritani\u00eb
+LocaleNames/nl/MS=Montserrat
+LocaleNames/nl/MT=Malta
+LocaleNames/nl/MU=Mauritius
+LocaleNames/nl/MV=Maldiven
+LocaleNames/nl/MW=Malawi
+LocaleNames/nl/MX=Mexico
+LocaleNames/nl/MY=Maleisi\u00eb
+LocaleNames/nl/MZ=Mozambique
+LocaleNames/nl/NA=Namibi\u00eb
+LocaleNames/nl/NC=Nieuw-Caledoni\u00eb
+LocaleNames/nl/NE=Niger
+LocaleNames/nl/NF=Norfolkeiland
+LocaleNames/nl/NG=Nigeria
+LocaleNames/nl/NI=Nicaragua
+LocaleNames/nl/NL=Nederland
+LocaleNames/nl/NO=Noorwegen
+LocaleNames/nl/NP=Nepal
+LocaleNames/nl/NR=Nauru
+LocaleNames/nl/NU=Niue
+LocaleNames/nl/NZ=Nieuw-Zeeland
+LocaleNames/nl/OM=Oman
+LocaleNames/nl/PA=Panama
+LocaleNames/nl/PE=Peru
+LocaleNames/nl/PF=Frans-Polynesi\u00eb
+LocaleNames/nl/PG=Papoea-Nieuw-Guinea
+LocaleNames/nl/PH=Filipijnen
+LocaleNames/nl/PK=Pakistan
+LocaleNames/nl/PL=Polen
+LocaleNames/nl/PM=Saint Pierre en Miquelon
+LocaleNames/nl/PN=Pitcairn
+LocaleNames/nl/PR=Puerto Rico
+LocaleNames/nl/PS=Palestijns Gebied
+LocaleNames/nl/PT=Portugal
+LocaleNames/nl/PW=Palau
+LocaleNames/nl/PY=Paraguay
+LocaleNames/nl/QA=Qatar
+LocaleNames/nl/RE=R\u00e9union
+LocaleNames/nl/RO=Roemeni\u00eb
+LocaleNames/nl/RS=Servi\u00eb
+LocaleNames/nl/RU=Rusland
+LocaleNames/nl/RW=Rwanda
+LocaleNames/nl/SA=Saoedi-Arabi\u00eb
+LocaleNames/nl/SB=Salomonseilanden
+LocaleNames/nl/SC=Seychellen
+LocaleNames/nl/SD=Soedan
+LocaleNames/nl/SE=Zweden
+LocaleNames/nl/SG=Singapore
+LocaleNames/nl/SH=Sint-Helena
+LocaleNames/nl/SI=Sloveni\u00eb
+LocaleNames/nl/SJ=Svalbard en Jan Mayen
+LocaleNames/nl/SK=Slowakije
+LocaleNames/nl/SL=Sierra Leone
+LocaleNames/nl/SM=San Marino
+LocaleNames/nl/SN=Senegal
+LocaleNames/nl/SO=Somali\u00eb
+LocaleNames/nl/SR=Suriname
+LocaleNames/nl/ST=Sao Tom\u00e9 en Principe
+LocaleNames/nl/SV=El Salvador
+LocaleNames/nl/SY=Syri\u00eb
+LocaleNames/nl/SZ=Swaziland
+LocaleNames/nl/TC=Turks- en Caicoseilanden
+LocaleNames/nl/TD=Tsjaad
+LocaleNames/nl/TF=Franse Gebieden in de zuidelijke Indische Oceaan
+LocaleNames/nl/TG=Togo
+LocaleNames/nl/TH=Thailand
+LocaleNames/nl/TJ=Tadzjikistan
+LocaleNames/nl/TK=Tokelau
+LocaleNames/nl/TL=Oost-Timor
+LocaleNames/nl/TM=Turkmenistan
+LocaleNames/nl/TN=Tunesi\u00eb
+LocaleNames/nl/TO=Tonga
+LocaleNames/nl/TR=Turkije
+LocaleNames/nl/TT=Trinidad en Tobago
+LocaleNames/nl/TV=Tuvalu
+LocaleNames/nl/TW=Taiwan
+LocaleNames/nl/TZ=Tanzania
+LocaleNames/nl/UA=Oekra\u00efne
+LocaleNames/nl/UG=Oeganda
+LocaleNames/nl/UM=Amerikaanse kleinere afgelegen eilanden
+LocaleNames/nl/US=Verenigde Staten
+LocaleNames/nl/UY=Uruguay
+LocaleNames/nl/UZ=Oezbekistan
+LocaleNames/nl/VA=Vaticaanstad
+LocaleNames/nl/VC=Saint Vincent en de Grenadines
+LocaleNames/nl/VE=Venezuela
+LocaleNames/nl/VG=Britse Maagdeneilanden
+LocaleNames/nl/VI=Amerikaanse Maagdeneilanden
+LocaleNames/nl/VN=Vietnam
+LocaleNames/nl/VU=Vanuatu
+LocaleNames/nl/WF=Wallis en Futuna
+LocaleNames/nl/WS=Samoa
+LocaleNames/nl/YE=Jemen
+LocaleNames/nl/YT=Mayotte
+LocaleNames/nl/ZA=Zuid-Afrika
+LocaleNames/nl/ZM=Zambia
--- a/jdk/test/sun/text/resources/LocaleDataTest.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java	Thu Jan 21 14:47:01 2010 -0800
@@ -31,7 +31,8 @@
  *      5102005 5074431 6182685 6208712 6277020 6245766 6351682 6386647 6379382
  *      6414459 6455680 6498742 6558863 6488119 6547501 6497154 6558856 6481177
  *      6379214 6485516 6486607 4225362 4494727 6533691 6531591 6531593 6570259
- *      6509039
+ *      6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611
+ *      6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413
  * @summary Verify locale data
  *
  */
@@ -255,6 +256,15 @@
             index = key.length();
         resTag = key.substring(oldIndex, index);
 
+        // TimeZone name may have "/" in it, for example "Asia/Taipei", so use "Asia\/Taipei in LocaleData.
+        if(resTag.endsWith("\\")) {
+            resTag = resTag.substring(0, resTag.length() - 1);
+            oldIndex = index;
+            index = key.indexOf("/", oldIndex + 1);
+            if (index == -1) index = key.length();
+            resTag += key.substring(oldIndex, index);
+        }
+
         if (index < key.length() - 1)
             qualifier = key.substring(index + 1);
         else
--- a/jdk/test/sun/util/resources/Locale/Bug4429024.java	Thu Jan 21 11:33:32 2010 -0800
+++ b/jdk/test/sun/util/resources/Locale/Bug4429024.java	Thu Jan 21 14:47:01 2010 -0800
@@ -46,7 +46,7 @@
                     { "en", "englanti" },
                     { "es", "espanja" },
                     { "fi", "suomi" },
-                    { "fr", "franska" },
+                    { "fr", "ranska" },
                     { "he", "heprea" },
                     { "hi", "hindi" },
                     { "it", "italia" },
@@ -75,7 +75,7 @@
                     { "DK", "Tanska" },
                     { "ES", "Espanja" },
                     { "FI", "Suomi" },
-                    { "FR", "Franska" },
+                    { "FR", "Ranska" },
                     { "GB", "Iso-Britannia" },
                     { "GR", "Kreikka" },
                     { "IE", "Irlanti" },
--- a/langtools/.hgtags	Thu Jan 21 11:33:32 2010 -0800
+++ b/langtools/.hgtags	Thu Jan 21 14:47:01 2010 -0800
@@ -53,3 +53,4 @@
 8fb9b4be3cb1574302acde90549a4d333ef51e93 jdk7-b76
 0398ae15b90ac76d87ee21844453e95ff8613e43 jdk7-b77
 acc1e40a5874ebf32bebcb6ada565b3b40b7461c jdk7-b78
+ac5b4c5644ce54585e5287563dde2b006fa664f4 jdk7-b79
--- a/make/Defs-internal.gmk	Thu Jan 21 11:33:32 2010 -0800
+++ b/make/Defs-internal.gmk	Thu Jan 21 14:47:01 2010 -0800
@@ -231,9 +231,11 @@
 ifndef NO_DOCS
   # Default value (we want javadoc run)
   GENERATE_DOCS=true
-  # No DOCS build when JDK_UPDATE_VERSION set
-  ifdef JDK_UPDATE_VERSION
-    GENERATE_DOCS=false
+  # No DOCS build when JDK_UPDATE_VERSION set on non-OPENJDK builds
+  ifndef OPENJDK
+    ifdef JDK_UPDATE_VERSION
+      GENERATE_DOCS=false
+    endif
   endif
   # If langtools, corba, jaxp, and jaxws are not being built, 
   #   a full jdk javadoc is not possible